yolov5魚苗檢測(cè)計(jì)數(shù):從數(shù)據(jù)標(biāo)注到訓(xùn)練

向AI轉(zhuǎn)型的程序員都關(guān)注了這個(gè)號(hào)??????
機(jī)器學(xué)習(xí)AI算法工程?? 公眾號(hào):datayx
目標(biāo)檢測(cè)yolov5 v6.0版,pytorch實(shí)現(xiàn),包含了目標(biāo)檢測(cè)數(shù)據(jù)標(biāo)注,數(shù)據(jù)集增強(qiáng),訓(xùn)練自定義數(shù)據(jù)集全流程。
一.環(huán)境
Python >= 3.7
Pytorch >= 1.7.x
二.標(biāo)注工具
pip install labelImg ==1.8.6
安裝完畢后,鍵入命令:
labelImg
或者下載工具 labelImg.exe?
項(xiàng)目全部代碼,數(shù)據(jù)集,標(biāo)注工具,預(yù)訓(xùn)練模型獲取方式:
關(guān)注微信公眾號(hào) datanlp? 然后回復(fù)?魚苗?即可獲取。
半自動(dòng)標(biāo)注
如果數(shù)據(jù)集較多,可以先手動(dòng)標(biāo)注少量,然后訓(xùn)練出初版模型,然后用初版模型預(yù)測(cè)進(jìn)行預(yù)標(biāo)注,最后人工檢查。
步驟:
1.將待標(biāo)注圖像放入auto_label/images
2.修改auto_label.py的第62至65行如下的內(nèi)容:
path = r"auto_label/images" #待標(biāo)注圖片路徑
xml_path = r"auto_label/images" #輸出的xml標(biāo)注文件保存路徑
yolo_model_weight='./weight/IDCard_v6x_best.pt' #模型文件路徑
data_conf = './data/custom_data.yaml' #數(shù)據(jù)集配置文件路徑
3.運(yùn)行auto_label.py
三.數(shù)據(jù)集增強(qiáng)
步驟:
1.將標(biāo)注數(shù)據(jù)集的標(biāo)簽(xml文件)放入./DataAugForObjectDetection/data/Annotations
2.將標(biāo)注數(shù)據(jù)集的圖片放入./DataAugForObjectDetection/data/images
3.修改./DataAugForObjectDetection/DataAugmentForObejctDetection.py/中的need_aug_num,即每張圖片需要擴(kuò)增的數(shù)量,然后運(yùn)行./DataAugForObjectDetection/DataAugmentForObejctDetection.py
注意:DataAugmentForObejctDetection_pool.py 是多進(jìn)程增強(qiáng)版本,耗時(shí)較少。代碼中的process不宜設(shè)置過大否則可能會(huì)報(bào)錯(cuò),默認(rèn)即可。
四.數(shù)據(jù)集格式轉(zhuǎn)換
將?VOC?的數(shù)據(jù)集轉(zhuǎn)換成?YOLOv5?訓(xùn)練需要用到的格式。
步驟:
1.將標(biāo)注數(shù)據(jù)集的標(biāo)簽(xml文件)放入./datasets/Annotations
2.將標(biāo)注數(shù)據(jù)集的圖片放入./datasets/images
3.將voc_to_coco.py中的class_names改為數(shù)據(jù)集中標(biāo)注的類別名稱,運(yùn)行 voc_to_coco.py
額外說明
需要生成每個(gè)圖片對(duì)應(yīng)的?.txt?文件,其規(guī)范如下:
每一行都是一個(gè)目標(biāo)
類別序號(hào)是零索引開始的(從0開始)
每一行的坐標(biāo)?
class x_center y_center width height?格式框坐標(biāo)必須采用歸一化的 xywh格式(從0到1)。如果您的框以像素為單位,則將
x_center和width除以圖像寬度,將y_center和height除以圖像高度。
生成的?.txt?例子:
1 0.1830000086920336 0.1396396430209279 0.13400000636465847 0.15915916301310062
1 0.5240000248886645 0.29129129834473133 0.0800000037997961 0.16816817224025726
1 0.6060000287834555 0.29579580295830965 0.08400000398978591 0.1771771814674139
1 0.6760000321082771 0.25375375989824533 0.10000000474974513 0.21321321837604046
0 0.39300001866649836 0.2552552614361048 0.17800000845454633 0.2822822891175747
0 0.7200000341981649 0.5570570705458522 0.25200001196935773 0.4294294398277998
0 0.7720000366680324 0.2567567629739642 0.1520000072196126 0.23123123683035374
如果數(shù)據(jù)標(biāo)簽沒生成正確,則會(huì)報(bào)錯(cuò)
mlc = int(np.concatenate(dataset.labels, 0)[:, 0].max()) # max label class
File "D:\app\anaconda3\lib\site-packages\numpy\core\_methods.py", line 40, in _amax
return umr_maximum(a, axis, None, out, keepdims, initial, where)
ValueError: zero-size array to reduction operation maximum which has no identity
五.修改數(shù)據(jù)集配置文件
在?data/目錄下修改數(shù)據(jù)集配置文件?custom_data.yaml ,文件內(nèi)容如下
# 目標(biāo)類型數(shù)量,按自己的數(shù)據(jù)集來改
nc: 3
#目標(biāo)類型名稱,按自己的數(shù)據(jù)集來改
names: ['person', 'head', 'helmet']
六.聚類得出先驗(yàn)框(Yolov5 內(nèi)部已做適配,可選)
步驟:
1.將./gen_anchors/clauculate_anchors.py的CLASS_NAMES改為數(shù)據(jù)集中標(biāo)注的類別名稱
2.運(yùn)行?./gen_anchors/clauculate_anchors.py
跑完會(huì)生成一個(gè)文件?anchors.txt,里面有得出的建議先驗(yàn)框:
Best Anchors :
[257, 114, 309, 75, 327, 243]
[439, 59, 469, 347, 488, 117]
[497, 460, 500, 240, 500, 172]
七.修改模型配置文件
在文件夾?./models?下選擇一個(gè)你需要的模型然后復(fù)制一份出來(選擇的預(yù)訓(xùn)練模型pt文件模型名稱必須與模型配置文件yaml對(duì)應(yīng),否則加載模型會(huì)報(bào)錯(cuò)),將文件開頭的?nc =?修改為數(shù)據(jù)集的分類數(shù),修改第六步獲取的先驗(yàn)框anchors(可選)。
比如,預(yù)訓(xùn)練模型是yolov5s.pt,就需要復(fù)制一份./models/yolov5s.yaml,重命名為custom_yolov5.yaml。
然后修改custom_yolov5.yaml中的 nc和anchors(可選)。
# parameters
nc: 1 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [257, 114, 309, 75, 327, 243] # P3/8
- [439, 59, 469, 347, 488, 117] # P4/16
- [497, 460, 500, 240, 500, 172] # P5/32
八.開始訓(xùn)練
1.將預(yù)訓(xùn)練模型下載放置在weight目錄下;
2.修改train.py中的第454行weights預(yù)訓(xùn)練模型的路徑;
3.修改train.py中的第455行cfg模型配置文件路徑
4.修改train.py中的第455行batch-size
5.運(yùn)行train.py
注意 workers=0 #必須為0
注意:
如果代碼是 從github 重新clone下來的,需要
注釋掉 utils/loggers/init.py 的wandb,不然程序會(huì)提示你需要注冊(cè)wandb用戶
修改如下:
# try:
# import wandb
#
# assert hasattr(wandb, '__version__') # verify package import not local dir
# if pkg.parse_version(wandb.__version__) >= pkg.parse_version('0.12.2') and RANK in [0, -1]:
# try:
# wandb_login_success = wandb.login(timeout=30)
# except wandb.errors.UsageError: # known non-TTY terminal issue
# wandb_login_success = False
# if not wandb_login_success:
# wandb = None
# except (ImportError, AssertionError):
# wandb = None
wandb = None
train.py開頭添加
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
File "/home/lkz/.virtualenvs/lkztor/lib64/python3.6/site-packages/torch/nn/modules/module.py", line 1102, in _call_impl
return forward_call(*input, **kwargs)
File "/data/disk2/pact/yolov5_v6.0/models/common.py", line 47, in forward
return self.act(self.bn(self.conv(x)))
File "/home/lkz/.virtualenvs/lkztor/lib64/python3.6/site-packages/torch/nn/modules/module.py", line 1102, in _call_impl
return forward_call(*input, **kwargs)
File "/home/lkz/.virtualenvs/lkztor/lib64/python3.6/site-packages/torch/nn/modules/conv.py", line 446, in forward
return self._conv_forward(input, self.weight, self.bias)
File "/home/lkz/.virtualenvs/lkztor/lib64/python3.6/site-packages/torch/nn/modules/conv.py", line 443, in _conv_forward
self.padding, self.dilation, self.groups)
RuntimeError: Unable to find a valid cuDNN algorithm to run convolution
顯存不足導(dǎo)致
解決辦法:減小batchzise
訓(xùn)練模型保存
開啟訓(xùn)練之后,權(quán)重會(huì)保存在?./runs?文件夾里面的每個(gè)?exp?文件里面的 weights
批量預(yù)測(cè)步驟:
1.修改predict.py 內(nèi)第218行weights 模型文件.pt路徑,219行source 待預(yù)測(cè)圖像路徑,220行data 數(shù)據(jù)集配置文件路徑
2.其他參數(shù)可默認(rèn),運(yùn)行predict.py
單張預(yù)測(cè)步驟:
1.修改detect_image_only.py內(nèi)第97行至100行的模型路徑,數(shù)據(jù)集配置文件路徑等內(nèi)容
2.運(yùn)行detect_image_only.py
部署代碼簡(jiǎn)化:
yolo5_inference目錄下是清理掉無關(guān)代碼后的模型部署推理代碼,只需關(guān)注某幾個(gè)參數(shù)即可。


機(jī)器學(xué)習(xí)算法AI大數(shù)據(jù)技術(shù)
?搜索公眾號(hào)添加:?datanlp
長(zhǎng)按圖片,識(shí)別二維碼
閱讀過本文的人還看了以下文章:
TensorFlow 2.0深度學(xué)習(xí)案例實(shí)戰(zhàn)
基于40萬表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測(cè)
《基于深度學(xué)習(xí)的自然語言處理》中/英PDF
Deep Learning 中文版初版-周志華團(tuán)隊(duì)
【全套視頻課】最全的目標(biāo)檢測(cè)算法系列講解,通俗易懂!
《美團(tuán)機(jī)器學(xué)習(xí)實(shí)踐》_美團(tuán)算法團(tuán)隊(duì).pdf
《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》高清中文PDF+源碼
《深度學(xué)習(xí):基于Keras的Python實(shí)踐》PDF和代碼
python就業(yè)班學(xué)習(xí)視頻,從入門到實(shí)戰(zhàn)項(xiàng)目
2019最新《PyTorch自然語言處理》英、中文版PDF+源碼
《21個(gè)項(xiàng)目玩轉(zhuǎn)深度學(xué)習(xí):基于TensorFlow的實(shí)踐詳解》完整版PDF+附書代碼
《深度學(xué)習(xí)之pytorch》pdf+附書源碼
PyTorch深度學(xué)習(xí)快速實(shí)戰(zhàn)入門《pytorch-handbook》
【下載】豆瓣評(píng)分8.1,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》PDF+完整源碼
汽車行業(yè)完整知識(shí)圖譜項(xiàng)目實(shí)戰(zhàn)視頻(全23課)
李沐大神開源《動(dòng)手學(xué)深度學(xué)習(xí)》,加州伯克利深度學(xué)習(xí)(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計(jì)學(xué)習(xí)方法》最新資源全套!
《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》最新2018版中英PDF+源碼
將機(jī)器學(xué)習(xí)模型部署為REST API
FashionAI服裝屬性標(biāo)簽圖像識(shí)別Top1-5方案分享
重要開源!CNN-RNN-CTC 實(shí)現(xiàn)手寫漢字識(shí)別
同樣是機(jī)器學(xué)習(xí)算法工程師,你的面試為什么過不了?
前海征信大數(shù)據(jù)算法:風(fēng)險(xiǎn)概率預(yù)測(cè)
【Keras】完整實(shí)現(xiàn)‘交通標(biāo)志’分類、‘票據(jù)’分類兩個(gè)項(xiàng)目,讓你掌握深度學(xué)習(xí)圖像分類
VGG16遷移學(xué)習(xí),實(shí)現(xiàn)醫(yī)學(xué)圖像識(shí)別分類工程項(xiàng)目
特征工程(二) :文本數(shù)據(jù)的展開、過濾和分塊
如何利用全新的決策樹集成級(jí)聯(lián)結(jié)構(gòu)gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
全球AI挑戰(zhàn)-場(chǎng)景分類的比賽源碼(多模型融合)
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在線識(shí)別手寫中文網(wǎng)站
中科院Kaggle全球文本匹配競(jìng)賽華人第1名團(tuán)隊(duì)-深度學(xué)習(xí)與特征工程
不斷更新資源
深度學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、python
?搜索公眾號(hào)添加:?datayx??
