實(shí)操教程|YOLOv5實(shí)現(xiàn)自定義對(duì)象訓(xùn)練與OpenVINO部署全解析

極市導(dǎo)讀
本文從數(shù)據(jù)準(zhǔn)備、模型訓(xùn)練與模型轉(zhuǎn)換部署三個(gè)部分詳細(xì)介紹了如何使用YOLOv5訓(xùn)練自定義對(duì)象檢測(cè)。 >>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿
大家好,前面寫了一個(gè)OpenVINO部署YOLOv5推理的教程,收到很多反饋!這里就再寫了一篇如何使用YOLOv5訓(xùn)練自定義對(duì)象檢測(cè),從數(shù)據(jù)準(zhǔn)備到推理整個(gè)環(huán)節(jié),幫助大家更好的使用YOLOv5來解決實(shí)際問題。整個(gè)文章主要分為三個(gè)部分,分別是數(shù)據(jù)準(zhǔn)備與YOLO格式數(shù)據(jù)轉(zhuǎn)換,模型訓(xùn)練與推理測(cè)試,模型轉(zhuǎn)換為ONNX與部署。
數(shù)據(jù)下載與準(zhǔn)備
數(shù)據(jù)下載我參考了別人提到一個(gè)Open Imag數(shù)據(jù)集的下載工具,github地址如下:
https://github.com/EscVM/OIDv4_ToolKit
用這個(gè)工具可以很方便的下載想要的數(shù)據(jù),Open Image數(shù)據(jù)集包括包括100W+張圖像,對(duì)象檢測(cè)支持600個(gè)類別,所以很多圖像都可以通過這個(gè)來下載,避免自己收集圖像數(shù)據(jù)與標(biāo)注數(shù)據(jù)的時(shí)間。所以首先需要執(zhí)行
git clone https://github.com/EscVM/OIDv4_ToolKit
然后運(yùn)行
pip3 install -r requirements.txt
安裝好所有依賴,之后再下載數(shù)據(jù)集
python3 main.py downloader --classes Apple Orange --type_csv validation
意思是下載蘋果跟橘子兩個(gè)類別的圖像標(biāo)注數(shù)據(jù)。下載好的數(shù)據(jù)集文件夾結(jié)構(gòu)如下:

分為三個(gè)文件夾,分別對(duì)應(yīng)訓(xùn)練集、測(cè)試集、驗(yàn)證集。其中jpg文件是每個(gè)圖像,labels里面的txt同名文件是每個(gè)圖像中對(duì)象標(biāo)注信息,格式如下:
name_of_the_class left top right bottomname_of_the_class 對(duì)象類別名稱left top標(biāo)注框左上角坐標(biāo)right bottom 標(biāo)注框右下角坐標(biāo)
轉(zhuǎn)換為YOLO標(biāo)注格式數(shù)據(jù),首先看一下標(biāo)注文本文件與圖像的文件夾結(jié)構(gòu)

其中images是所有圖像的集合,labels是所有標(biāo)簽信息集合。train表示訓(xùn)練集、valid表示測(cè)試集。這里需要注意的是,labels信息中的標(biāo)簽信息YOLO格式標(biāo)注框需要把原始標(biāo)注信息的標(biāo)注框格式從:
Left top right bottom
轉(zhuǎn)換為
Center_x, center_y, width, height
并歸一化到0~1之間,這部分我寫了一個(gè)腳本來完成label標(biāo)簽的生成。代碼如下:
for f in files: if os.path.isfile(os.path.join(current_dir, f)): image = cv.imread(os.path.join(current_dir, f)) label_file = os.path.join(current_dir, "label", f.replace(".jpg", ".txt")) yolo_label = f.replace(".jpg", ".txt") data_label_text_f = os.path.join(valid_label_dir, yolo_label) file_write_obj = open(data_label_text_f, 'w') with open(label_file) as f: boxes = [line.strip() for line in f.readlines()] clazz_index = -1 # create new file for box in boxes: anno_info = box.split(" ") if anno_info[0] == "Cricket": print("class name: ", anno_info[0] + " ball") x1 = float(anno_info[2]) y1 = float(anno_info[3]) x2 = float(anno_info[4]) y2 = float(anno_info[5]) clazz_index = 0 else: print("class name: ", anno_info[0]) x1 = float(anno_info[1]) y1 = float(anno_info[2]) x2 = float(anno_info[3]) y2 = float(anno_info[4]) clazz_index = 1 h, w, c = image.shape cx = (x1 + (x2 - x1) / 2) / w cy = (y1 + (y2 - y1) / 2) / h sw = (x2 - x1) / w sh = (y2 - y1) / h file_write_obj.write("%d %f %f %f %f\n"%(clazz_index, cx, cy, sw, sh)) # cv.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)),(0, 0, 255), 2, 8) file_write_obj.close()最后需要?jiǎng)?chuàng)建一個(gè)dataset.ymal文件,放在與data文件夾同一層,它的內(nèi)容如下:
# train andval datasets (image directory or *.txt file with image paths)train:football_training/data/images/train/val: football_training/data/images/valid/# number ofclassesnc: 2# class namesnames:['Cricketball', 'Football']
其中
Cricketball與Football是我從Open Image中下載的兩個(gè)類別數(shù)據(jù)。nc:2 表示識(shí)別兩個(gè)類別。
這樣就完成了整個(gè)數(shù)據(jù)集準(zhǔn)備部分。
模型訓(xùn)練與推理測(cè)試
這里我分別基于yolov5l.ymal與yolov5s.ymal完成了模型訓(xùn)練,需要修改的只有一個(gè)地方,就是把類別數(shù)目從80改為2。圖示如下:

然后執(zhí)行訓(xùn)練腳本的命令行如下:
python train.py --data --epochs 300 football_training/dataset.yaml --cfg football_traing/yolov5l.yaml --weights '' --batch-size 1推薦的參數(shù)中沒有這么小的batchi-size,我是用筆記本訓(xùn)練,發(fā)現(xiàn)2就爆內(nèi)存了,人窮!有條件的把這個(gè)參數(shù)調(diào)大點(diǎn),效果會(huì)好!訓(xùn)練時(shí)可以通過tensorboard查看訓(xùn)練實(shí)時(shí)變換,圖示如下:

最終每個(gè)類別的AP得分


最終訓(xùn)練完成得到best.pt文件

運(yùn)行測(cè)試視頻
python detect.py --source football_training/test.mp4 --weights football_training/best.pt --conf 0.5ONNX格式推理部署
通過下面的腳本轉(zhuǎn)換為ONNX文件
python models/export.py --weights football_training/best.pt --img 640 --batch 1然后再轉(zhuǎn)換為OpenVINO的IR中間文件格式
運(yùn)行效果如下:
如果覺得有用,就請(qǐng)分享到朋友圈吧!
公眾號(hào)后臺(tái)回復(fù)“82”獲取CVPR 2021-LightTrack直播回放及PPT~

# CV技術(shù)社群邀請(qǐng)函 #
備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測(cè)-深圳)
即可申請(qǐng)加入極市目標(biāo)檢測(cè)/圖像分割/工業(yè)檢測(cè)/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群
每月大咖直播分享、真實(shí)項(xiàng)目需求對(duì)接、求職內(nèi)推、算法競(jìng)賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動(dòng)交流~

