基于colab的yolov3-tensorflow訓練自己的資料集(全小白教程)
- 1.站在巨人的肩上
- 2.colab的使用
- 1. 創建谷歌賬號;
- 2. 創建云盤;
- 3.掛載云盤檔案夾
- 3.YOLOV3-Tensorflow
- 1.下載原始碼
- 2.下載Labelimg標注工具
- 3.創建VOC檔案夾
- 4.標注影像
- 5.分割訓練集與測驗集
- 6.放入yolov3.weights檔案
- 7.上傳檔案夾
- 4.在colab服務器上進行訓練
- 1.服務器基本設定
- 2.掛載colab檔案夾
- 3.生成tfrecord檔案
- 4.遷移訓練
- 5.測驗模型
- 總結
本文原創:轉載請說明來源
1.站在巨人的肩上
github原始碼:https://github.com/zzh8829/yolov3-tf2
參考B站視頻:https://www.bilibili.com/video/BV1YK4y1E7zd(colab使用)
https://www.bilibili.com/video/BV1r5411t7Db?t=1536&p=2(訓練)
2.colab的使用
colab是谷歌推出的免費GPU使用的云服務器平臺(說實話,用完之后感覺谷歌還是一個良心企業),想深入了解的可以去谷歌官網了解,
1. 創建谷歌賬號;
**前情提示**:使用谷歌的時候,最好要有能“科學”上網的工具,不然中間某一步可能就進行不下去了,
大家下載裝好谷歌瀏覽器,然后注冊一個谷歌賬號就行,這個比較簡單,需要自己的手機號,就不多說了,
2. 創建云盤;

登錄號賬號,可以在谷歌瀏覽器的右上方你頭像的左邊按鈕里面找到云端硬碟,點擊進去,

在左上方點擊新建然后點擊關聯更多應用

在搜索里面找到colabratory,安裝好后,回傳云端硬碟新建,可以直接看到該應用了,
3.掛載云盤檔案夾
由于colab設計的初衷是供大家短期使用,所以每次使用colab服務器,里面的檔案都會被清除,建議大家把工程檔案放到云盤,然后進行掛載,不然colab服務器不會保存你的檔案,掛載操作我會放到下面一起講解,
3.YOLOV3-Tensorflow
1.下載原始碼
本教程使用的原始碼地址是:https://github.com/zzh8829/yolov3-tf2,大家下載后解壓放在一個全英文路徑就行了,
2.下載Labelimg標注工具
不會使用的同學,可以參考https://www.jianshu.com/p/ff99d430150f,保證能打開軟體界面后,看下面內容,
3.創建VOC檔案夾

各位一定要嚴格按照這樣的格式進行創建,不要做修改,直接照著搬就行了,(這里有兩個py檔案是我寫的腳本,后續會說)
- yolov3-tf2-master
- VOCdevkit
- VOC2012
- Annotation
- ImageSets
- Main - JPEGImages
- VOC2012
現在檔案夾里面的內容都是空的,接下來,把所有需要標注的檔案放進JPEGImages里面,注意要是jpg格式的圖片,
下面的代碼是用于格式化圖片名稱的,這樣方便后續查看,
# -*- coding:utf-8 -*-
import os
class ImageRename():
def __init__(self):
self.path = 'E:\yolov3-tf2-master\VOCdevkit\VOC2012\JPEGImages'
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 0
for item in filelist:
if item.endswith('.jpg'):
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), '0000' + format(str(i), '0>3s') + '.jpg')
os.rename(src, dst)
i = i + 1
if __name__ == '__main__':
newname = ImageRename()
newname.rename()

效果就像這樣,
4.標注影像

打開labelimg,我們需要注意把第三個圈住的地方改成pascalVOC模式,然后點擊open Dir找到剛剛我們的JPEGImages檔案夾,然后點Change Save Dir把標注好的xml檔案存到Annotation里,然后就是進行標注作業,操作都是圖形化的,很簡單,能看懂,如果實在不懂的,可以看看這方面的教程,主要是要把路徑設定正確,
特別注意:在標注的時候,你的資料集有多少類別,就相應的在data檔案夾里,復制voc2012.names檔案,然后改成你想要的(我這里改成了face_voc2012.names),檔案里面存放的是你的類,一類一行,本教程用的是一類就是face,(在所有操作中,需要注意你的檔案名和地址,方面與我的教程有所不同時,自己修改)

標注完成后,會生成這樣的xml檔案,那就代表完成標注作業了,
5.分割訓練集與測驗集

在ImageSets里的Main里創建py檔案,原始碼我放下面,作用就是分割好訓練集與測驗集
import os,glob
path = r'E:\yolov3-tf2-master\VOCdevkit\VOC2012\JPEGImages'
path_list = os.listdir(path)
path_list.sort()
print(len(path_list))
with open('train.txt', "w", encoding='utf-8') as f:
for i in path_list[0:int(len(path_list)*0.8)]: #80%作為訓練集,20%作為測驗集
sentences = i[:-4]+'\n'
f.write(sentences)
with open('val.txt', "w", encoding='utf-8') as f:
for i in path_list[int(len(path_list)*0.8):-1]:
sentences = i[:-4]+'\n'
f.write(sentences)

其實這里面存放的就是圖片的地址,
6.放入yolov3.weights檔案
在https://pjreddie.com/media/files/yolov3.weights下載yolov3.weights放在data檔案夾下,
7.上傳檔案夾
做完上面的步驟,我們把檔案夾上傳到我的云端硬碟,

4.在colab服務器上進行訓練
1.服務器基本設定
在云端硬碟新建中選擇colab進入服務器,點擊左上方修改,點擊筆記本設定,選擇GPU,

然后點擊右上方連接到托管的運行時,即可連接使用colab服務器了,

2.掛載colab檔案夾
需要說明的是:colab服務器使用的是Linux系統,IDE是jupyter notebook,小白的話需要懂一些基礎操作,(比如運行代碼需要在前面加感嘆號)
在界面上方點擊**+代碼**,添加代碼塊,盡量多添加幾條,

然后在代碼塊中鍵入一下代碼,盡量一行一個代碼塊,方面查看,
import os
from google.colab import drive
drive.mount('/content/drive')
%cd /content/drive
%ls
%cd My\ Drive/
%cd /content/drive/MyDrive/yolov3-tf2-master
!pip install -r requirements-gpu.txt #下載所需要的第三方庫
!python convert.py #將weights檔案轉換成tensorflow所需要的tf檔案
3.生成tfrecord檔案
這個操作是這個tensorflow版本特有的操作,目的應該是將所有訓練集和測驗集的地址全部存入一個地址,方便讀取,
python tools/voc2012.py --data_dir ./VOCdevkit/VOC2012 --split train --output_file ./data/voc_train.tfrecord --classes ./data/face_voc2012.names #訓練集
python tools/voc2012.py --data_dir ./VOCdevkit/VOC2012 --split val --output_file ./data/voc_val.tfrecord --classes ./data/face_voc2012.names #測驗集
執行完后,會在data檔案夾下生成voc_train.tfrecord和voc_val.tfrecord,那就代表生成tfrecord檔案成功了,
4.遷移訓練
下面的代碼用于訓練,引數較多,不過都應該都可以看懂,一一對應就好,
python train.py --dataset ./data/voc_train.tfrecord --val_dataset ./data/voc_val.tfrecord --classes ./data/face_voc2012.names --num_classes 1 --mode fit --transfer darknet --batch_size 32 --epochs 20 --weights ./checkpoints/yolov3.tf --weights_num_classes 80
如果你訓練的類目與我有所不同,請修改 num_classes,其他的可以保持不動,
還有一點需要注意的就是:在訓練程序中,可以會出現loss還未降到20,就過早停止訓練的情況WARNING:tensorflow:Unresolved object in checkpoint: (root).layer-8 W0428 16:43:05.946897 140396833212224 util.py:150] Unresolved object in checkpoint: (root).layer-8 WARNING:tensorflow:Unresolved object in checkpoint: (root).layer-9 W0428 16:43:05.947242 140396833212224 util.py:150] Unresolved object in checkpoint: (root).layer-9 Epoch 00003: early stopping
這時候我們需要打開train.py進行修改
callbacks = [
ReduceLROnPlateau(verbose=1),
EarlyStopping(patience=3, verbose=1),#我們需要修改這里的patience,改成4或者更大
ModelCheckpoint('checkpoints/yolov3_train_{epoch}.tf',
verbose=1, save_weights_only=True),
TensorBoard(log_dir='logs')
]

本教程標注了45張人臉作為訓練,訓練步數epoch設定為了20,用時219秒,loss就降到了73,不得不說這比在darknet上訓練快多了,我快感動哭了,,,,
不過大家自己做的時候,要盡量保證loss降到20以下,這樣模型才準確,
完成訓練后,模型會保存到./checkpoints/,在下面一步會用到
5.測驗模型
測驗模型用下面的代碼,注意有與我不同的地方,請自己修改,比如權重檔案地址,和圖片地址,特別注意:這里把threshold設定為 0.3,因為原始碼的最高分為0.5,所以不設定的話,可能會導致顯示不出來,
python detect.py --classes ./data/face_voc2012.names --num_classes 1 --weights ./checkpoints/yolov3_train_20.tf --image ./VOCdevkit/VOC2012/JPEGImages/0000016.jpg
--yolo_score_threshold 0.3
本教程測驗的效果如下

總結
總的來說,整個流程會有點復雜,但是絕對不難,相信各位仔細操作,就可以跑出結果,對于更高階的檢測,比如連接攝像頭和其他,可以看原始碼的說明檔案,由于我目前沒有設備所以就沒有演示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291174.html
標籤:AI
