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é)果咋么樣~