一舔涎。 windows GPU 版本的 darknet 環(huán)境
環(huán)境:(基本都是按照github上的要求的來的,之前試過沒按照上面的版本來逗爹,失敗了亡嫌,不掙扎了~ )
1. VS2015 ?? community 免費的社區(qū)版本,這個裝在哪個位置隨意掘而。
2.? CUDA9.1 cudnn7.1 ?? 使用默認安裝位置(CUDA安裝在 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1挟冠,cudnn解壓出來直接覆蓋該目錄)。CUDA安裝過程中黑屏沒關(guān)系袍睡,只是小小的黑一下而已知染。
3. opencv3.4.0 ? 將opencv-3.4.0-vc14_vc15.exe解壓出來,C盤建個名為“opencv_3.0”的目錄斑胜,然后把解壓出來的東西扔進去控淡,目錄結(jié)構(gòu)如下(C:\opencv_3.0\opencv\build)
4. darknet windows版本:github路徑:https://github.com/AlexeyAB/darknet(下載的時候是2018.10.7)
二。 在VS2015上編譯DEMO
1.? 打開 darknet-master\build\darknet\darknet.sln? 這個是GPU版本的(darknet_no_gpu.sln 這個是CPU版本的止潘,如果只跑前向掺炭,用這個完全沒問題,如果要訓練凭戴,還是GPU版本的吧涧狮,CPU版本的實在是太慢了!)
2. 如下圖么夫,打開后者冤,右擊選中部分,點重新生成档痪,如果是按照我上面的流程安裝的環(huán)境涉枫,應該不要修改配置就能直接使用。darknet-master\build\darknet\x64? 中會生成 darknet.exe
三钞它。 訓練自己的數(shù)據(jù)集
1.? 搜集訓練樣本(不使用開源數(shù)據(jù)集)
使用網(wǎng)絡(luò)爬蟲拜银,爬取樣本圖片殊鞭。網(wǎng)絡(luò)爬蟲我?guī)缀跏切“祝蔷W(wǎng)上隨便找的一個比較快且穩(wěn)定的爬蟲腳本(原版在哪里暫時找不到了尼桶,找到了再加上去)操灿,總共爬了7W多張,可怕泵督。返十。没陡。
2. 訓練的 yolo label 標注
標注工具是基于網(wǎng)上的一個版本改的唯沮,基于opencv(http://www.cnblogs.com/louyihang-loves-baiyan/p/4457462.html)咆蒿。
標樣本的時候,取了前1W張圖片秩冈,然后當標了幾百張的時候發(fā)現(xiàn)越來越多重復的圖片了本缠,最終,我只標了接近1000張圖片入问,實在是懶得標了~丹锹!
標注的代碼里面會將圖片縮放成固定大小,方便我去標芬失。
yolo的label格式是這樣的:類別下標(第幾個類別楣黍,從0開始) ? ? 中心點x坐標 ? 中心點y坐標 ? 目標寬度 ? 目標高度 ?? (后面4個值都是實際像素點值除以實際寬高的,也就是占比)
每張圖片都對應一個label文件棱烂,比如圖片名字是1.jpg租漂,那么它的標注文件就是1.txt。
3. 準備訓練前的東西
1. 標簽名字文件:pikaqiu.names 里面每行存放著標簽的名字(該文件一般放在data目錄颊糜,這里我訓練的是皮卡丘檢測哩治,所以就一個標簽)
2. data文件(一般放在cfg目錄):如圖,從上到下分別為類別數(shù)量芭析,訓練集位置锚扎,測試集位置吞瞪,標簽名字文件馁启,模型備份路徑
3. ?訓練集(pikaqiu_train.txt)和測試集(pikaqiu_test.txt )位置文件:存放圖片的位置,在當前目錄芍秆,每張圖片都會有對應的label文件:
訓練集
圖片和對應的label文件
4. 網(wǎng)絡(luò)配置文件(再cfg/yolov3-voc.cfg的基礎(chǔ)上改的):
batch:batchSize數(shù)惯疙,每batch個樣本更新一次參數(shù)。
subdivisions:如果內(nèi)存不夠大妖啥,將batch分割為subdivisions個子batch霉颠,每個子batch的大小為batch/subdivisions。在darknet代碼中荆虱,會將batch/subdivisions命名為batch蒿偎。
width:網(wǎng)絡(luò)輸入的寬度 ? height:網(wǎng)絡(luò)輸入的高度 ? channels:網(wǎng)絡(luò)輸入的通道數(shù)
momentum:動量
decay:權(quán)重衰減正則項朽们,防止過擬合
angle:通過旋轉(zhuǎn)角度來生成更多訓練樣本
saturation :通過調(diào)整飽和度來生成更多訓練樣本
exposure :通過調(diào)整曝光量來生成更多訓練樣本
hue:通過調(diào)整色調(diào)來生成更多訓練樣本
learning_rate:初始學習率
max_batches:訓練達到max_batches后停止學習
policy:調(diào)整學習率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
steps:根據(jù)batch_num調(diào)整學習率
scales:學習率變化的比例诉位,累計相乘
anchors:預選框骑脱,可以手工挑選,也可以通過k means 從訓練樣本中學出
num:預選框的個數(shù)苍糠,即anchors總數(shù)
mask:當前屬于第幾個預選框
classes:網(wǎng)絡(luò)需要識別的物體種類數(shù)(這里我要訓的模型只有一個類別叁丧,所以填1)
jitter: 通過抖動增加噪聲來抑制過擬合
ignore_thresh:過濾閾值和truth_thresh待研究
random:設(shè)置為0,表示關(guān)閉多尺度訓練(顯存小可以設(shè)置0)
yolo層前面的卷積層的filters數(shù)目是怎么計算的:3x(classes+5)岳瞭,和聚類數(shù)目分布有關(guān)拥娄。如果想修改默認anchors數(shù)值,使用k-means即可瞳筏。
4. 訓練及測試
直接從頭開始訓練(開始loss比較大稚瘾,慢慢來,會降下去的):build\darknet\x64\darknet.exe detector train .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg
訓練的過程中backup目錄里面每到一定迭代次數(shù)姚炕,會有模型參數(shù)文件保存下來(比如yolov3_pikaqiu_1000.weights)孟抗。
基于前面訓練的模型繼續(xù)訓:build\darknet\x64\darknet.exe detector train .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg backup\yolov3_pikaqiu_2500.weights
用生成的模型測試圖片:build\darknet\x64\darknet.exe detector test .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg backup\yolov3_pikaqiu_19800.weights
用生成的模型測試視頻:build\darknet\x64\darknet.exe detector demo .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg backup\yolov3_pikaqiu_19800.weights -i 0 -thresh 0.25 pikaqiu2.mp4
5. anchors說明:
配置文件里面的9個anchor寬高,實際使用的時候是根據(jù)訓練的樣本钻心,通過k-means算法計算出來的點凄硼,上面圖片中用的默認的配置點,不是計算的捷沸,因為當時做這個的時候我還不懂a(chǎn)nchor摊沉,哈哈。k-mean的原理說明可以參考:https://blog.csdn.net/hrsstudy/article/details/71173305 痒给,生成anchor的腳本用的https://github.com/AlexeyAB/darknet/blob/master/scripts/gen_anchors.py 這個腳本说墨,這個腳本用在YOLOV3上有個BUG,write_anchors_to_file函數(shù)中anchors[i][0]*=width_in_cfg_file/32.
anchors[i][1]*=height_in_cfg_file/32. 這兩行“/32”是不對的苍柏,yolov2才這么用尼斧,yolov3的anchor值是基于網(wǎng)絡(luò)輸入分辨率的,而不是基于feature map试吁,所以要把 /32 去掉就OK了棺棵。
以上所有用到的東西(爬蟲腳本spider_baidu_pic.py,label標注代碼mark_tool.cpp熄捍,opencv, vs2015, cuda9.1 CUDNN7.1烛恤, darknet windows 2018.10.7版本,皮卡丘檢測所有用到的文件和樣本余耽,label缚柏, 訓練出來的模型)我全部存在了網(wǎng)盤里備份,需要的可以下載試試:
鏈接:https://pan.baidu.com/s/10h8j5OWbdle-Pm2sopLlKw 密碼:olxl
第一次寫博客碟贾,記錄自己的學習過程币喧,備份轨域,強化記憶,寫的不好大家見諒杀餐。