YOLOv3实现鱼类目标检测
YOLOv3實(shí)現(xiàn)魚類目標(biāo)檢測
我將以一個(gè)項(xiàng)目實(shí)例,記錄如何用YOLOv3訓(xùn)練自己的數(shù)據(jù)集。
在開始之前,首先了解一下YOLO系列代表性的DarkNet網(wǎng)絡(luò)。
如下圖所示,是YOLOv3中使用的DarkNet-53的結(jié)構(gòu),幾種核心結(jié)構(gòu)是:
DBL: 是yolo_v3的基本組件。就是卷積+BN+Leaky relu。對于v3來說,BN和leaky relu已經(jīng)是和卷積層不可分離的部分了(最后一層卷積除外),共同構(gòu)成了最小組件。
resn:n代表數(shù)字,有res1,res2, … ,res8等等,表示這個(gè)res_block里含有多少個(gè)res_unit。這是yolo_v3的大組件,yolo_v3開始借鑒了ResNet的殘差結(jié)構(gòu),使用這種結(jié)構(gòu)可以讓網(wǎng)絡(luò)結(jié)構(gòu)更深(從v2的darknet-19上升到v3的darknet-53,前者沒有殘差結(jié)構(gòu))。
concat:張量拼接。將darknet中間層和后面的某一層的上采樣進(jìn)行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會(huì)擴(kuò)充張量的維度,而add只是直接相加不會(huì)導(dǎo)致張量維度的改變。
下圖是v3著名的Darknet53網(wǎng)絡(luò)圖,它融合了YOLOv2, Darknet19,以及其他新型的殘差網(wǎng)絡(luò),由連續(xù)的3x3和1x1卷積層組合而成,一共有53個(gè)卷積層。
任務(wù):魚類目標(biāo)檢測
數(shù)據(jù)集描述:3類(tinca,gold_fish,stingray),900張圖片
數(shù)據(jù)集格式:VOC
- 進(jìn)入YOLO官網(wǎng),跑通Demo
YOLO: Real-Time Object Detection?pjreddie.com
- 準(zhǔn)備自己的數(shù)據(jù)集 ,以VOC為例,如果只進(jìn)行目標(biāo)檢測,下列幾個(gè)文件夾要準(zhǔn)備好,將圖片保存在VOC的JPEGImages目錄下
- 利用工具進(jìn)行圖片標(biāo)注并生成XML文件,將用LabelImg標(biāo)注好得到的XML文件放到Annotations文件夾下。注意,需要和圖片名相同,標(biāo)注圖片類別時(shí)要統(tǒng)一用小寫字母,否則會(huì)出錯(cuò)
這樣,VOC格式的數(shù)據(jù)集制作基本完成。
2. 開始調(diào)試模型
- 修改Makefile
*建議GPU和CUDNN都改為1,會(huì)極大地加快訓(xùn)練速度,OPENCV可以有選擇的開
*修改完成后記得要重新make才能生效
- 修改voc_label.py
- python voc_label.py
- 修改cfg文件中的voc.data
- 修改data/voc.names
*修改為自己數(shù)據(jù)集的類別名稱
- 下載預(yù)訓(xùn)練卷積層權(quán)重,放在項(xiàng)目根目錄即可
*我也把權(quán)重文件上傳到了網(wǎng)盤,多一種下載選擇
鏈接:?https://pan.baidu.com/s/1ZBICNgOQa4DKSKUnA09jVA?提取碼: bymq
- 修改cfg/yolov3-voc.cfg
*一定看清楚修改的網(wǎng)絡(luò)層數(shù)和數(shù)值計(jì)算方法,而且,訓(xùn)練過程中,要把testing相關(guān)注釋掉
# Trainingbatch=64subdivisions=32 #每批訓(xùn)練的個(gè)數(shù)=batch/subvisions,根據(jù)自己GPU顯存進(jìn)行修改,顯存不夠改大一些 # Testing # batch=1 # subdivisions=1 width=416 height=416 channels=3 momentum=0.9 decay=0.0005 angle=0 saturation = 1.5 exposure = 1.5 hue=.1learning_rate=0.001 burn_in=1000 max_batches = 50200 #訓(xùn)練步數(shù) policy=steps steps=40000,45000 #開始衰減的步數(shù) scales=.1,.1[convolutional] batch_normalize=1 filters=32 size=3 stride=1 pad=1 activation=leaky.....[convolutional] size=1 stride=1 pad=1 filters=24 #filters = 3 * ( classes + 5 ) here,filters=3*(3+5) activation=linear[yolo] mask = 6,7,8 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=3 #修改為自己的類別數(shù) num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=1[route] layers = -4[convolutional] batch_normalize=1 filters=256 size=1 stride=1 pad=1 activation=leaky[upsample] stride=2[route] layers = -1, 61[convolutional] batch_normalize=1 filters=256 size=1 stride=1 pad=1 activation=leaky[convolutional] batch_normalize=1 size=3 stride=1 pad=1 filters=512 activation=leaky[convolutional] batch_normalize=1 filters=256 size=1 stride=1 pad=1 activation=leaky[convolutional] batch_normalize=1 size=3 stride=1 pad=1 filters=512 activation=leaky[convolutional] batch_normalize=1 filters=256 size=1 stride=1 pad=1 activation=leaky[convolutional] batch_normalize=1 size=3 stride=1 pad=1 filters=512 activation=leaky[convolutional] size=1 stride=1 pad=1 filters=24 #filters = 3 * ( classes + 5 ) here,filters=3*(3+5) activation=linear[yolo] mask = 3,4,5 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=3 #修改為自己的類別數(shù) num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=1[route] layers = -4[convolutional] batch_normalize=1 filters=128 size=1 stride=1 pad=1 activation=leaky[upsample] stride=2[route] layers = -1, 36[convolutional] batch_normalize=1 filters=128 size=1 stride=1 pad=1 activation=leaky[convolutional] batch_normalize=1 size=3 stride=1 pad=1 filters=256 activation=leaky[convolutional] batch_normalize=1 filters=128 size=1 stride=1 pad=1 activation=leaky[convolutional] batch_normalize=1 size=3 stride=1 pad=1 filters=256 activation=leaky[convolutional] batch_normalize=1 filters=128 size=1 stride=1 pad=1 activation=leaky[convolutional] batch_normalize=1 size=3 stride=1 pad=1 filters=256 activation=leaky[convolutional] size=1 stride=1 pad=1 filters=24 #filters = 3 * ( classes + 5 ) here,filters=3*(3+5) activation=linear[yolo] mask = 0,1,2 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 classes=3 #修改為自己的類別數(shù) num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=1- 開始訓(xùn)練,權(quán)重文件會(huì)保存在backup文件夾下
*利用gpu訓(xùn)練的速度非常快,經(jīng)過20000次以上迭代后,loss差不多就降到0.1以下
- 測試
*修改cfg/yolov3-voc.cfg中,將training相關(guān)注釋掉,打開testing開關(guān)
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_26000.weights xxx.jpg’總結(jié):
YOLO系列是目標(biāo)檢測領(lǐng)域的標(biāo)志性網(wǎng)絡(luò),它速度快,經(jīng)過幾個(gè)版本的進(jìn)化后,在準(zhǔn)確率上也有了很多的提升,希望通過我的介紹,能夠?qū)OLO的思想有所了解,也希望能給您更多的啟發(fā),有更多的想法建議,歡迎留言交流
?
任何程序錯(cuò)誤,以及技術(shù)疑問或需要解答的,請掃碼添加作者VX
總結(jié)
以上是生活随笔為你收集整理的YOLOv3实现鱼类目标检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一次创建springboot框架项目
- 下一篇: python调用cv2.findCont