[轉(zhuǎn)]Yolo訓(xùn)練自己的數(shù)據(jù)集教程 Newest(2016-12-23)

refer

Yolo darknet訓(xùn)練自己的數(shù)據(jù)集教程(Newest 2016.12.23)

經(jīng)過兩天的折騰終于搞定了Yolo訓(xùn)練自己的數(shù)據(jù)集的過程,整個過程其實并不繁瑣,只是網(wǎng)上一些過時的教程已經(jīng)不適用了,依照那個反而讓大家各種出出錯,加之Yolo中文教程過少,因此本大神再次放一個,如果大家有任何問題直接在文章后面評論即可,筆者看到之后給予第一時間回復(fù)。

先插一句,Atom中文不能跟隨窗口wrap文字的同學(xué),打開settingview,設(shè)置soft wrap即可,百度上的答案真的是渣

Yolo簡介

在訓(xùn)練數(shù)據(jù)集之前,相信大家對yolo應(yīng)該有一些了解,本文所采用的測試環(huán)境為:Ubuntu 16.04 + opencv2.4 + cuda8 + cudnn5.1 PLUS GTX1080,當(dāng)然這個硬件不是必須,在下只是偶爾裝一下逼。Yolo基于darknet編寫,而編譯draknet的時候最好安裝一下opencv,因為沒有opencv圖不會自動彈出,沒有那種快感,你懂得,不知道如何安裝opencv的同學(xué)去我之前寫的幾個博客中搜尋。均能夠找到最新的答案。

yolo之所以快,是因為它的方法和fastrcnn以及其他detect算法不同,而采用了很多ssd的思想,在最新的更新中,yolo也改進(jìn)了他們的算法,在pascal voc數(shù)據(jù)集上取得了不錯的結(jié)果。本文將主要利用yolo來做realtime detect,對自己的數(shù)據(jù)進(jìn)行訓(xùn)練和預(yù)測。

開始開車

OK,閑話不多說,讓我們直接上車,這次是無人駕駛,速度比較快,大家系好安全帶。

Step 1 編譯darknet,并熟悉目錄結(jié)構(gòu)

第一部分沒有什么說的,很簡單其實,首先clone代碼到本地~目錄:

cd ~
git clone https://github.com/pjreddie/darknet
cd darknet
make
這個時候我們在home根目錄就有了darknet了。直接編譯,不需要修改任何參數(shù),當(dāng)然如何你是土豪,你有GTX1080,像我一樣(手動裝比)。可以編譯一下Makefile里面的參數(shù)。為了防止大家出錯我還是說一下,直接改標(biāo)志為:

GPU=1
CUDNN=1
OPENCV=0
DEBUG=0
如果你的cuda沒有設(shè)置環(huán)境變量,nvcc的路徑也設(shè)置一下:

NVCC=/usr/local/cuda/bin/nvcc
不要想的很復(fù)雜其實很簡單。ok,現(xiàn)在直接make,編譯就可以了。

**Step 2 準(zhǔn)備自己的數(shù)據(jù)集 **

好了我們現(xiàn)在有了darktnet,但是我要那個匡出物體的掉炸天的圖怎么搞?莫慌,我們先用darknet自帶的測試數(shù)據(jù)來測試一下。 首先呢,yolo這個網(wǎng)絡(luò)是訓(xùn)練VOC數(shù)據(jù)集得來的,20中物體都能識別出來,我們直接下載已經(jīng)訓(xùn)練好的權(quán)重然后來預(yù)測一張圖片看看:

wget http://pjreddie.com/media/files/yolo.weights
這時候我們就下載好了yolo.weights,在darknet目錄下。然后我們就可以用這個權(quán)重來預(yù)測啦!

./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
detect命令意思是,檢測,后面還有i一個命令是detector train,后者是訓(xùn)練的命令,預(yù)測用detect,cfg/yolo.cfg就是yolo這個網(wǎng)絡(luò)的結(jié)構(gòu)文件,后面是權(quán)重,最后后面是圖片。 ok,enter你就可以看到狗和自行車了!~ 這就搞定了darknet,那么問題來了。自己的數(shù)據(jù)集怎么準(zhǔn)備呢? 重點來了重點來了: * images 準(zhǔn)備

首先,把你的圖片放到一個/images 文件夾下面,文件名的名字要有規(guī)律,比如0001.jpg,0002.jpg….0100.jpg;

xml 準(zhǔn)備
我相信很多人都需要用圖片標(biāo)注工具來對圖片生成標(biāo)注信息來訓(xùn)練,但是圖片標(biāo)注工具生成的多半是xml的標(biāo)簽信息。darknet需要的label并不是xml格式,而是一張圖片一個txt的形式,txt中是你標(biāo)注的物體方框坐標(biāo)。后面我會放出幾個腳本來處理。

xml 轉(zhuǎn) darknet label
xml轉(zhuǎn)為darknet需要的label形式,一張圖片一個標(biāo)注信息。

生成圖片路徑 最后一部我們要生成兩個txt文件,一個是train.txt,一個是valid.txt,train.txt包含了你訓(xùn)練圖片需要的圖片路徑,沒一行都是一張圖片的路徑,為了防止出錯,后面我放出一個統(tǒng)一的腳本生成這個train.txt。
Step 3 訓(xùn)練之前修改darknet參數(shù)

接下來就要修改darknet的參數(shù)了,只要修改/cfg/voc.data 文件,因為yolo是為了voc而存在的,為了不修改源代碼的情況下來訓(xùn)練我們的數(shù)據(jù),建議直接修改voc.data而不是修改voc.data文件名。修改內(nèi)容如下:

classes= 20
train = /home/pjreddie/data/voc/train.txt
valid = /home/pjreddie/data/voc/2007_test.txt
names = data/voc.names
backup = /home/pjreddie/backup/

這里,classes就是你數(shù)據(jù)集的類別,names你的新建一個,在data下面,然后在這里指向它,仿照voc.names 新建即可。 修改train.txt valid.txt的路徑,用絕對路徑哦,防止出錯,因為你darknet和數(shù)據(jù)可能不再一個目錄。 ok,這就setup完了,接著直接訓(xùn)練。 不過訓(xùn)練之前獲取一個預(yù)處理的權(quán)重:

curl -O http://pjreddie.com/media/files/darknet19_448.conv.23
然后,train:

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
對了,如果你上面改了voc.data的文件名,這里也要改,所以說其實改也是可以的。然后yolo-voc.cfg就可以不改了。

Step 4 yolo訓(xùn)練出的模型預(yù)測

./darknet detect cfg/yolo-voc.cfg /backup/voc.weights data/sample.jpg
這里不要和直接copy我的代碼,cfg/yolo-voc.cfg就是我們訓(xùn)練的網(wǎng)絡(luò)。后面是訓(xùn)練保存的權(quán)重,最后是你要預(yù)測的圖片。 OK,看看結(jié)果咋么樣~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容