【深度學(xué)習(xí)】從0學(xué)習(xí)YOLOV5:科大訊飛X光安檢檢測(cè)
賽事背景
X光安檢是目前在城市軌交、鐵路、機(jī)場(chǎng)、物流業(yè)廣泛使用的物檢手段。使用人工智能技術(shù),輔助一線安檢員進(jìn)行X光安檢判圖,可以有效降低因?yàn)榘矙z員經(jīng)驗(yàn)、能力或工作狀態(tài)造成的錯(cuò)漏檢問題。在實(shí)際場(chǎng)景中,因待檢測(cè)物品的多樣性、成像角度、重疊遮擋等問題,X光安檢圖像檢測(cè)算法研究存在一定挑戰(zhàn)。
比賽鏈接:http://challenge.xfyun.cn/topic/info?type=Xray-2022&ch=ds22-dw-zmt05
賽事任務(wù)
本賽事的任務(wù)是:基于科大訊飛提供的真實(shí)X光安檢圖像集構(gòu)建檢測(cè)模型,對(duì)X光安檢圖像中的指定類別的物品進(jìn)行檢測(cè)。
評(píng)審規(guī)則
數(shù)據(jù)說(shuō)明
此次比賽提供帶標(biāo)注的訓(xùn)練數(shù)據(jù),即待檢測(cè)物品在包裹中的X光圖像及其標(biāo)注文件。
本次比賽標(biāo)注文件中的類別為8類,包括:
刀(knife)、剪刀(scissors)、打火機(jī)(lighter)、優(yōu)盤(USBFlashDisk)、壓力容器(pressure)、帶噴嘴塑料瓶(plasticBottleWithaNozzle)、公章(seal)、電池(battery)。

待識(shí)別物品的X光成像示意圖如圖所示。
比賽提供的X光圖像及其矩形框標(biāo)注的文件按照數(shù)據(jù)來(lái)源存放在不同的文件夾中,圖像文件采用jpg格式,標(biāo)注文件采用xml格式,各字段含義參照voc數(shù)據(jù)集。voc各字段含義對(duì)應(yīng)表為:
filename 文件名 size 圖像尺寸 width 圖像寬度 height 圖像高度 depth 圖像深度 object 圖像中的目標(biāo),可能有多個(gè) name 該目標(biāo)的標(biāo)簽名稱 bndbox 該目標(biāo)的標(biāo)注框 xmin 該目標(biāo)的左上角寬度方向坐標(biāo) ymin 該目標(biāo)的左上角高度方向坐標(biāo) xmax 該目標(biāo)的右下角寬度方向坐標(biāo) ymax 該目標(biāo)的右下角高度方向坐標(biāo)
評(píng)估指標(biāo)
評(píng)測(cè)方式采用計(jì)算mAP(IoU = 0.5)的方式。首先計(jì)算每個(gè)類的AP:
根據(jù)預(yù)測(cè)框和標(biāo)注框的IoU是否達(dá)到閾值0.5判斷該預(yù)測(cè)框是真陽(yáng)性還是假陽(yáng)性; 每個(gè)預(yù)測(cè)框的置信度進(jìn)行從高到低排序; 計(jì)算精確率和召回率,計(jì)算PR值; 繪制PR曲線并計(jì)算AP值。 然后計(jì)算mAP:把所有類的AP值求平均得到mAP。
作品提交要求
選手需要提交json格式文件,詳情見示例。其中,坐標(biāo)值必須為大于0的正數(shù)且不能超過(guò)圖像的寬高。
按照賽題數(shù)據(jù)頁(yè)面2022gamedatasettest1.txt里面的順序組織json
提交文件需按序排列,首先按圖片順序排列,然后按類別順序排列,置信度順序隨意。圖片順序,請(qǐng)按照?qǐng)D片編號(hào)順序。

(b) 類別順序,請(qǐng)參照下列順序:{'knife': 1, 'scissors': 2, 'lighter': 3, 'USBFlashDisk': 4, 'pressure': 5, 'plasticBottleWithaNozzle': 6, 'seal': 7, 'battery': 8}
初賽結(jié)束后進(jìn)入決賽的選手需要提交模型文件和詳細(xì)的實(shí)驗(yàn)過(guò)程說(shuō)明文檔。其中,模型大小不能超過(guò)600MB,鼓勵(lì)使用模型壓縮和輕量化方法,并酌情加分;提交的模型須為單模型,禁止使用多模型融合方法;說(shuō)明文檔須實(shí)事求是、清晰明了,本領(lǐng)域研究者可據(jù)此復(fù)現(xiàn)結(jié)果。建議參賽者在參加初賽過(guò)程中記錄實(shí)驗(yàn)過(guò)程。
數(shù)據(jù)下載
| 文件名 | 下載 |
|---|---|
| X光安檢圖像檢測(cè)挑戰(zhàn)賽2022一階段公開數(shù)據(jù).zip | 點(diǎn)擊下載 |
| 2022gamedatasettest1.txt | 點(diǎn)擊下載 |
解題過(guò)程
賽題是一個(gè)典型的物體檢測(cè)賽題,接下來(lái)我們講解具體的訓(xùn)練和解題過(guò)程。我們選擇使用YOLOV5來(lái)訓(xùn)練和進(jìn)行預(yù)測(cè)。
步驟1:讀取并轉(zhuǎn)換數(shù)據(jù)集
首先我們需要讀取所有的圖片路徑,并嘗試將圖片轉(zhuǎn)換為YOLO格式。
train_anns = glob.glob('訊飛研究院-X光安檢圖像檢測(cè)挑戰(zhàn)賽2022公開數(shù)據(jù)/訓(xùn)練集/*/XML/*.xml')
train_paths = glob.glob('訊飛研究院-X光安檢圖像檢測(cè)挑戰(zhàn)賽2022公開數(shù)據(jù)/訓(xùn)練集/*/*.jpg')
Yolo標(biāo)注格式保存在.txt文件中,一共5個(gè)數(shù)據(jù),用空格隔開,舉例說(shuō)明如下圖所示:
假設(shè)圖像的高和寬分別為h, w,bbox的左上角坐標(biāo)為(x1, y2),右下角坐標(biāo)為(x2, y2),則可求得bbox中心坐標(biāo)(x_c, y_c)為:
假設(shè)Yolo的5個(gè)數(shù)據(jù)分別為:, , , , ,則有對(duì)應(yīng)關(guān)系:
具體的從XML轉(zhuǎn)換為Yolo格式的代碼為:
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd
classes = ["knife", 'scissors', 'lighter', 'USBFlashDisk', 'pressure', 'plasticBottleWithaNozzle', 'seal', 'battery'] # 改成自己的類別
abs_path = os.getcwd()
print(abs_path)
def convert(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = (box[0] + box[1]) / 2.0 - 1
y = (box[2] + box[3]) / 2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return x, y, w, h
def convert_annotation(in_path, out_path):
in_file = open(in_path, encoding='UTF-8')
out_file = open(out_path, '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'):
cls = obj.find('name').text
if cls not in classes:
continue
cls_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))
b1, b2, b3, b4 = b
# 標(biāo)注越界修正
if b2 > w:
b2 = w
if b4 > h:
b4 = h
b = (b1, b2, b3, b4)
bb = convert((w, h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
存儲(chǔ)的數(shù)據(jù)文件夾參考:
- xray
-image
- train#存放訓(xùn)練圖片
- x.jpg
- val##存放驗(yàn)證圖片
-label
- train#存放訓(xùn)練label
- x.txt
- val#存放驗(yàn)證label
步驟2:定義yaml
在Yolo中數(shù)據(jù)集(需要提前下載https://github.com/ultralytics/yolov5)配置通過(guò)yaml格式給出,可以參考如下的格式:
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/xray # dataset root dir
train: images/train # train images (relative to 'path') 128 images
val: images/val # train images (relative to 'path') 128 images
# Classes
nc: 8 # number of classes
names: ["knife", 'scissors', 'lighter', 'USBFlashDisk', 'pressure', 'plasticBottleWithaNozzle', 'seal', 'battery'] # class names
注意此時(shí)的yaml里面的path需要xray文件夾寫為相對(duì)路徑。
步驟3:訓(xùn)練模型
batch:訓(xùn)練時(shí)batch size epoch:訓(xùn)練輪數(shù) data:yaml文件路徑
python3 train.py --img 640 --batch 2 --epochs 30 --data data/xunfei-xray2022.yaml --weights yolov5x.pt
步驟4:模型預(yù)測(cè)
save-txt:表示將預(yù)測(cè)結(jié)果寫為txt
python3 detect.py --weights runs/train/exp7/weights/best.pt --source test1/domain1/ --save-txt
最終將預(yù)測(cè)結(jié)果轉(zhuǎn)換為比賽需要的json格式即可,比賽的json格式為制定文件順序,并在每個(gè)文件的列表內(nèi)部寫每個(gè)類別的預(yù)測(cè)結(jié)果。

往期精彩回顧
適合初學(xué)者入門人工智能的路線及資料下載 (圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載 中國(guó)大學(xué)慕課《機(jī)器學(xué)習(xí)》(黃海廣主講) 機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印 《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼
