天天看點

darknet + yolo3 訓練自己的資料集

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):

darknet + yolo3 訓練自己的資料集

建議各位看官把資料下下來,解壓看看,跟我的思路,齊步走!一二一。。。

(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)

darknet + yolo3 訓練自己的資料集

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/)

darknet + yolo3 訓練自己的資料集

(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的路徑

然後跑吧!

繼續閱讀