2018年年中的時候,一不小心接觸到了物體檢測屆的一位佼佼者,一階段檢測架構yolo,于是花了幾個月研究并記錄下來。直到最近,在工作上要用到物體檢測,我第一反應就是yolo3,于是把訓練的步驟和過程詳細記錄下來,給各位分享分享。
首先,如果你想用tensorflow版的yolo3去訓練,肯定會搜到https://github.com/qqwweee/keras-yolo3 這個github的開源項目,但是我告訴你,這個開源項目的訓練程式,可以跑通,但是你是得不出正确結果的,這個開源項目,除開trian過程,其他的都沒多大問題,唯獨訓練過程,是不對的!并且,其訓練速度遠不及darknet本身的c++代碼要高效。但是他的開源代碼有非常好的用處。一個是跟python銜接,利于python使用者開發;另一方面,他的代碼對圖像增強和yolo3的優化有非常好的借鑒作用。待會咱們再說這個開源項目。
咱們先去我的窩把代碼下下來:https://github.com/robbebluecp/keras-yolo3-core (手動滑?)
來,咱們開始訓練自己的資料吧。依舊先以voc資料為例。
一、準備資料(我幫整理好了。。。)
資料連結:https://lzy-public-data.oss-cn-beijing.aliyuncs.com/voc2007.tar
檔案夾包括至少五個檔案(我用的是mac電腦,我的檔案夾路徑:/Users/yvan/data/voc2007):
建議各位看官把資料下下來,解壓看看,跟我的思路,齊步走!一二一。。。
(1)images是存放了所有圖檔的檔案夾
(2)lables檔案夾存放着每個圖檔的相關資料
(3)train.txt記錄着每張訓練集圖檔的絕對路徑
(4)test.txt記錄着每張測試集圖檔的絕對路徑
(5)class.txt記錄着所有類别的名稱
相關資料這裡詳細解釋一下:
每一行資料由5個元素組成,分别是:類别ID,x相對坐标值,y相對坐标值,w相對值,h相對值
1)類别ID:每個類别對應的ID号(假設為1)
然後,我們假設如下圖檔,圖檔的寬為:200,高為500;狗狗的A坐标(x1, y1), B坐标(x2, y2)
2)x相對坐标值:(x1 + x2) / 2 / 200
3)y相對坐标值:(y1 + y2) / 2 / 500
4)w相對值:(x2 - x1) / 200
5)h相對值:(y2 - y1) / 500
那其中一行的資料就是:1 (x1 + x2) / 2 / 200 (y1 + y2) / 2 / 500 (x2 - x1) / 200 (y2 - y1) / 500
二、darknet安裝
https://pjreddie.com/darknet/install/
官網已經說得非常詳細了,這裡再簡述一下
1、下載下傳
git clone https://github.com/pjreddie/darknet.git
cd darknet
然後咱們配置一下
2、配置
打開Makefile
vim Makefile
然後咱們修改頭幾行
#是否安裝GPU版
GPU=1
#安裝GPU肯定得需要CUDNN驅動
CUDNN=1
#是否安裝opencv支援,這個需要預先安裝opencv(建議裝上)
OPENCV=1
3、編譯安裝
make
沒有error就準備嗨皮吧!
四、下載下傳我重構的代碼吧。。。
git clone https://github.com/yfyvan/keras-yolo3-core.git
五、生成配置
以下操作假設:1、darknet架構已經裝好;2、資料集檔案夾無誤;3、keras-yolo3-core代碼clone完畢
1、cd keras-yolo3-core
2、python3 darknet.GenerateConfig('/Users/yvan/darknet/darknet', '/Users/yvan/data/voc2007').run()
或:python3 darknet.GenerateConfig('/Users/yvan/darknet/darknet', '/Users/yvan/data/voc2007').run()
其中:
“/Users/yvan/darknet/darknet”是darknet架構路徑
“/Users/yvan/data/voc2007”是資料集的路徑
如果不報錯,你會發現!
在darknet的cfg檔案夾多出了train_meta.cfg 和train_net.cfg兩個檔案,一個是資料配置檔案,一個是網絡配置檔案
在darknet的data檔案夾多出了class.txt檔案,是類别的記錄檔案
這裡,簡述一下train_net.cfg的重要參數:(引自:https://blog.csdn.net/qq_43211132/article/details/88679979)
batch:類似于keras的batch概念,一批訓練樣本的大小
subdivisions:一批樣本拆分子樣本的大小(防止記憶體溢出)。我重構的darknet.GenerateConfig可以對上述倆參數做設定
max_batches:類似于keras的epoch,指疊代的次數
其中非主要參數,各位移步引用博文進行參觀- -
六、開始訓練
cd "darknet路徑"
./darknet detector train cfg/train_meta.cfg cfg/train_net.cfg
七、輸出監控(參考:https://timebutt.github.io/static/understanding-yolov2-training-output/)
(1)8指的是目前疊代次數
(2)2691.69說是總體損失,這點我不太清楚。2577.05是平均損失。
(3)0.000000是學習率。我也很好奇為何是0.00000,在我的GPU電腦能正确顯示,有知道的大佬歡迎戳
以上是重點需要關心的輸出
八、其他常用指令
# 從0開始訓練
./darknet detector train cfg/train_meta.cfg cfg/train_net.cfg
# 加載預訓練模型
# wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train cfg/train_meta.cfg cfg/train_net.cfg darknet53.conv.74
# 多GPU訓練
./darknet detector train cfg/train_meta.cfg cfg/train_net.cfg -gpu 0,1,2,3,4,5,6
# 斷點訓練
./darknet detector train cfg/train_meta.cfg cfg/train_net.cfg backup/xxx.backup
九、模型轉換
訓練完後,你能在darknet/backup下發現一個訓練權重檔案xxx.weights
1、改下名字吧,改成model_yolo.weights
2、拉回到keras-yolo3-core/model_data
3、把darknet/cfg的train_net.cfg也拉回來,改成model_yolo.cfg吧
4、那個darknet/data的class.txt也拉回來
5、cd keras-yolo3-core
運作
python3 darknet.Convert(model_data/train_net.cfg, model_data/model_yolo.weights, model_data/model_yolo.h5)
十、預測
找到keras-yolo3-core的predict代碼
修改三處:
(1)model_file_path
就是model_data/model_yolo.h5
(2)image_file_path
model_data/model_yolo.h5
(3)class_file_path
class.txt的路徑
然後跑吧!