說明:我的電腦是個16年3500元買的筆記本(勇氣可嘉:)
環境:額外的包之類的,我用的anaconda,可以非常容易安裝各類包,如果運行顯示缺包,那就去environment去安裝對應的包。
我的版本:python 3.7.4 - tensorflow 1.13.1 - numpy 1.16.0 - keras 2.2.4
1. 下載Github上面的文件
直接下載zip。本文是針對以上文件內容的微小改動來訓練自己的數據
2. 下載預訓練的權值
下載完成後放入上面解壓文件的目錄下 C:\Users\...\Desktop\keras-yolo3-master,下文所述“[目錄]”,皆指向此目錄
3. 下載數據集文件(自己製作也行,自己製作參考其他博客)
https://pan.baidu.com/s/15ewJZoav2ebmkqBf2bPyeA 提取碼:anv2
此處爲博主z649431508收集的數據集,放在代碼同一目錄下解壓(去掉外面多套的文件夾VOCdevkit,沒有多套請忽略該提示)。
解壓後可以把裏面文件刪除只保留:Annotations、ImageSets和JPEGImages。
將ImageSets\Main 文件夾下的txt文件全部刪掉
用python寫個腳本生成一個txt文件,仿照下圖形式,裏面的內容一直到009963(也就是該數據集裏面最後一張圖片),完事後這個train.txt放到 \VOCdevkit\VOC2007\ImageSets\Main下(這裏如果覺得數據集太多可以設置idx<5000)
python代碼如下:
idx = 1
f = open('train.txt', 'w')
while idx < 9964:
f.write('{:0>6d}'.format(idx) + '\n')
idx += 1
f.close()
4. 修改相關文件配置
- 修改voc_annotation.py,將class改爲:classes = ["person"](我們只識別人所以只保留person),將sets改爲:sets=[('2007', 'train')]
- 修改model_data/voc_classes.txt 和 coco_classes.txt,刪除多餘類,只保留person(這一行)
- 修改yolov3-tiny.cfg,將[yolo]下的classes改爲=1,將[yolo]上的[convolutional]下的filter改爲filters=18 [因爲3 * ( classes + x + y + w + h + score )],因爲tiny yolov3只有兩個不同輸出分支張量,所以總共需要修改兩處[yolo]和其上面的[convolutional]下的內容
- 修改train.py裏面,找到anchors_path,改爲anchors_path = 'model_data/tiny_yolo_anchors.txt'
- 修改yolo.py裏面,修改使得 "anchors_path": 'model_data/tiny_yolo_anchors.txt'
5. 生成.txt文件
運行anaconda prompt(以下“運行”所指,皆爲在anaconda prompt下鍵入指令)
- 運行voc_annotation.py
- 目錄下會生成名字前綴爲2007_的txt文件,然後刪掉它們的前綴 "2007_",得到train.txt內容如下,每行的內容前面是路徑,後面五個數字爲一組,前四個是標記的box的xywh,後面一個0表示person。
- (可選)運行kmeans.py文件,利用kmeans算法找到最合適的6個不同尺寸的anchor,用此文件替換model_data下的anchor文件。根據我自己的數據集,得到如下anchor
6. 運行 convert.py 將之前下載的預訓練權重(30M文件)轉化成keras網絡的權重(生成 .h5 文件)
python convert.py -w yolov3-tiny.cfg yolov3-tiny.weights model_data/tiny_yolo_weights.h5
6.x 如果不訓練,此時可以直接運行驗證別人訓練好的網絡的性能(*)
python yolo_video.py --image
test/person.jpg(要在目錄下創建test文件夾,裏面放上一張圖片命名person.jpg)
7. 訓練網絡
python train.py
下面的圖片是我整合所有圖片數據集後進行訓練的結果,因爲圖片太多,所有我修改了50+50epoch,改爲15+5epoch
8. 測試自己得到的權值
在 logs/000/下有你剛剛('~')訓練得到的權值文件 trained_weights_stage_1.h5(前15epoch得到) 以及 trained_weights_final.h5(15+5epoch得到)
修改 yolo.py:"model_path": 'logs/000/trained_weights_final.h5'
9. 效果
運行 6.x 所述內容
我通過整合數據並且加入自己標記的數據後,一共有10000張圖片,其中4000張包含人的。在只解封最後兩層訓練了15個epoch,然後解封所有層訓練了5個epoch。訓練後的效果感覺上其實不如官網權重的效果好,不過也不差太多。
10. 其他
附yolov3-tiny網絡參數和結構圖:
參考:
https://www.jianshu.com/p/d76adef49293
https://blog.csdn.net/lly1122334/article/details/89019891