YOLOv3实现鱼类目标检测
YOLOv3實現魚類目標檢測
我將以一個項目實例,記錄如何用YOLOv3訓練自己的數據集。
在開始之前,首先了解一下YOLO系列代表性的DarkNet網絡。
如下圖所示,是YOLOv3中使用的DarkNet-53的結構,幾種核心結構是:
DBL: 是yolo_v3的基本組件。就是卷積+BN+Leaky relu。對于v3來說,BN和leaky relu已經是和卷積層不可分離的部分了(最后一層卷積除外),共同構成了最小組件。
resn:n代表數字,有res1,res2, … ,res8等等,表示這個res_block里含有多少個res_unit。這是yolo_v3的大組件,yolo_v3開始借鑒了ResNet的殘差結構,使用這種結構可以讓網絡結構更深(從v2的darknet-19上升到v3的darknet-53,前者沒有殘差結構)。
concat:張量拼接。將darknet中間層和后面的某一層的上采樣進行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。
下圖是v3著名的Darknet53網絡圖,它融合了YOLOv2, Darknet19,以及其他新型的殘差網絡,由連續的3x3和1x1卷積層組合而成,一共有53個卷積層。
任務:魚類目標檢測
數據集描述:3類(tinca,gold_fish,stingray),900張圖片
數據集格式:VOC
- 進入YOLO官網,跑通Demo
YOLO: Real-Time Object Detection?pjreddie.com
- 準備自己的數據集 ,以VOC為例,如果只進行目標檢測,下列幾個文件夾要準備好,將圖片保存在VOC的JPEGImages目錄下
- 利用工具進行圖片標注并生成XML文件,將用LabelImg標注好得到的XML文件放到Annotations文件夾下。注意,需要和圖片名相同,標注圖片類別時要統一用小寫字母,否則會出錯
這樣,VOC格式的數據集制作基本完成。
2. 開始調試模型
- 修改Makefile
*建議GPU和CUDNN都改為1,會極大地加快訓練速度,OPENCV可以有選擇的開
*修改完成后記得要重新make才能生效
- 修改voc_label.py
- python voc_label.py
- 修改cfg文件中的voc.data
- 修改data/voc.names
*修改為自己數據集的類別名稱
- 下載預訓練卷積層權重,放在項目根目錄即可
*我也把權重文件上傳到了網盤,多一種下載選擇
鏈接:?https://pan.baidu.com/s/1ZBICNgOQa4DKSKUnA09jVA?提取碼: bymq
- 修改cfg/yolov3-voc.cfg
*一定看清楚修改的網絡層數和數值計算方法,而且,訓練過程中,要把testing相關注釋掉
# Trainingbatch=64subdivisions=32 #每批訓練的個數=batch/subvisions,根據自己GPU顯存進行修改,顯存不夠改大一些 # 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 #訓練步數 policy=steps steps=40000,45000 #開始衰減的步數 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 #修改為自己的類別數 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 #修改為自己的類別數 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 #修改為自己的類別數 num=9 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=1- 開始訓練,權重文件會保存在backup文件夾下
*利用gpu訓練的速度非常快,經過20000次以上迭代后,loss差不多就降到0.1以下
- 測試
*修改cfg/yolov3-voc.cfg中,將training相關注釋掉,打開testing開關
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_26000.weights xxx.jpg’總結:
YOLO系列是目標檢測領域的標志性網絡,它速度快,經過幾個版本的進化后,在準確率上也有了很多的提升,希望通過我的介紹,能夠對YOLO的思想有所了解,也希望能給您更多的啟發,有更多的想法建議,歡迎留言交流
?
任何程序錯誤,以及技術疑問或需要解答的,請掃碼添加作者VX
總結
以上是生活随笔為你收集整理的YOLOv3实现鱼类目标检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一次创建springboot框架项目
- 下一篇: python调用cv2.findCont