日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

YOLOv3实现鱼类目标检测

發(fā)布時(shí)間:2025/3/11 目标检测 94 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YOLOv3实现鱼类目标检测 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

  • 準(zhǔn)備工作:
    • 進(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
    import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')] #替換為自己的數(shù)據(jù)集 classes = ["tinca", "gold_fish", "stingray"] #修改為自己的類別def convert(size, box):dw = 1./(size[0])dh = 1./(size[1])x = (box[0] + box[1])/2.0 - 1y = (box[2] + box[3])/2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h) def convert_annotation(year, image_id):in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id)) #將數(shù)據(jù)集放于當(dāng)前目錄下out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')tree=ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult)==1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))bb = convert((w,h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') wd = getcwd() for year, image_set in sets:if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):os.makedirs('VOCdevkit/VOC%s/labels/'%(year))image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()list_file = open('%s_%s.txt'%(year, image_set), 'w')for image_id in image_ids:list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))convert_annotation(year, image_id)list_file.close() os.system("cat 2007_train.txt 2007_val.txt > train.txt") #修改為自己的數(shù)據(jù)集用作訓(xùn)練
    • python voc_label.py

    • 修改cfg文件中的voc.data
    classes= 3 #修改為自己的類別數(shù) train = /darknet/data/voc/train.txt #修改為自己的路徑 valid = /darknet/data/voc/2007_test.txt #修改為自己的路徑 names =/data/voc.names backup = /home/learner/darknet/backup #修改為自己的路徑,輸出的權(quán)重信息將存儲(chǔ)其內(nèi)
    • 修改data/voc.names

    *修改為自己數(shù)據(jù)集的類別名稱

    • 下載預(yù)訓(xùn)練卷積層權(quán)重,放在項(xiàng)目根目錄即可
    wget https://pjreddie.com/media/files/darknet53.conv.74

    *我也把權(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文件夾下
    ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 gpus 0,1,2 #根據(jù)自己機(jī)器的實(shí)際情況選擇gpu數(shù)

    *利用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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。