8.3 目標檢測——無人機檢測
前言
目標檢測在工業界應用廣泛,例如工業生產線上的品質檢測、監控工業場景中的安全問題、機器人的自主導航等,可以提高生產效率和產品品質,降低生產成本,也可以提高工作環境的安全性,減少事故發生,由此可見目標檢測意義重大。
本小節,將介紹工業界中的熱寵YOLOv5,並通過無人機場景檢測任務進行實現。
本小節內容豐富,包括:
- VisDrone資料集介紹
- 目標檢測常見資料格式介紹:VoC, COCO, YOLO
- YOLOv1-YOLOv8 概述:瞭解YOLO發展歷史,各版本模型優點,缺點
- YOLOv5 原始程式碼結構剖析及使用步驟:瞭解優秀的專案代碼結構,設計
- YOLOv5在VisDrone資料集上的多組實驗,瞭解不同容量的YOLOv5能力
資料模組
VisDrone資料集介紹
VisDrone資料集是一個大規模的用於視覺目標檢測、跟蹤和計數等任務的資料集,由天津大學整理於2018年發佈,論文為Vision Meets Drones: A Challenge,可通過github下載。
其中包含多個任務,這裡採用VisDrone-DET資料集,進行目標檢測案例學習,VisDrone-DET也就是VisDrone2018。
VisDrone-DET中,總共包含10209張,劃分為了4個資料集,額外給出了一個1610張模擬的測試集-dev,訓練集6471張,驗證集548張,測試集-dev1610張,測試集-challenge 1580張。
資料特點:圖片解析度較大、目標小、目標存在一定程度遮擋,部分是嚴重遮擋(例如汽車)。
下面介紹資料集目錄組織形式與標籤含義。
資料包含annotations和images兩個資料夾,分別存儲標注資訊txt檔,圖片jpg檔,檔案名保持一致。
標籤txt檔中,一行表示一個標注框,一行有8個資訊,例如
495,473,120,46,1,4,0,1
507,447,107,38,1,4,0,1
分別表示:
<bbox_left>,<bbox_top>,<bbox_width>,<bbox_height>,<score>,<object_category>,<truncation>,<occlusion>
Copy
- bbox:前四個為bbox信息;
- score:表示標注框的置信度,取值為0或1,0表示忽略,1表示可用。
- object_category: 目標類別,0-11,分別是,gnored regions(0), pedestrian(1), people(2), bicycle(3), car(4), van(5), truck(6), tricycle(7), awning-tricycle(8), bus(9), motor(10), others(11)
- truncation:截斷程度,取值為0,1。0表示無截斷,1表示目標有1%~50%的區域再當前幀(圖像)之外。
- occlusion:遮擋程度,0-2。0表示無遮擋,1表示1%-50%遮擋,2表示50%-100%遮擋。
對於本案例使用,僅需要剔除score=0的bbox。
目標檢測資料集格式
瞭解資料之後,需要把資料集轉換為代碼可以接收的形式。與分類分割任務不同,目標檢測領域的資料格式相對固定,一般不需要自己重寫資料載入模組,而是跟隨代碼框架的要求來適配。
目標檢測目前主流的有三種格式,VOC格式、COCO格式、YOLO格式,下面分別介紹。
VOC資料集格式如下:
圖像位於JPEGImages資料夾。
標注檔位於Annotations資料夾中,標注檔與影像檔檔案名應當相同,並且XML格式描述目標的位置和類別等資訊,bbox形式為xmin、xmax、ymin、ymax。
COCO資料集格式如下:
圖像位於images資料夾中。
標注文件位於annotations資料夾下的instances_train2017.json,所有標注均存儲在一個json中,並通過特定欄位獲取圖片對應的標籤資訊。bbox形式為xmin, ymin, w, h。
YOLO資料格式如下:
圖像位於images資料夾下。
標注檔位於labels資料夾下,標注檔與影像檔檔案名應當相同,並且以txt檔存儲標籤資訊。txt中一行是一個標注框,一行的格式為:
class x_center y_center width height,其中bbox的數值需要除以長/寬,使得值為0-1之間。
在這裡側面證明了YOLO模型的強大,以往演算法開發要適應資料集的格式,而現在yolo系列模型被廣泛使用,使得大家願意接受YOLO資料格式。
標籤資料轉換代碼
在目標檢測任務開發過程中,無法避免資料集之間的轉換,這裡推薦repo,可以實現三種資料格式之間的互相轉換。
在本案例中,適合自行編寫腳本進行轉換,這裡yolov5官方也給出了代碼,因此直接複用即可。
推薦yolov5中使用的幾個小函數:
- 資料夾的創建, Path物件可直接.mkdir(),並且可設置遞迴及判斷存在與否。
from pathlib import Path
(dir / 'labels').mkdir(parents=True, exist_ok=True) # make labels directory
Copy
- pbar顯示進度, 將可反覆運算物件用tqdm包一下,並且設置列印的字串資訊格式desc
- pbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')
Copy
使用配套代碼,運行即可得到與images資料夾在同級目錄下的labels資料夾
python visdrone2yolo.py --data-path /mnt/chapter-8/data/visdrone
Copy
到這裡yolo格式資料集已經準備好,如何在代碼中使用及配置,這部分放到模型模組中的yolo框架講解部分。
模型模組
在資料模組,講解了目標檢測中資料集常見的格式,並且已經轉換稱為yolo格式,等待使用。
若是在分類或分割中,我們會手寫代碼進行實驗,然而在目標檢測,絕大多數是不需要的,原因有
- 目標檢測中涉及多個模組,重新造輪子的時間成本高,容易出bug;
- 目標檢測可用成熟的“框架”(可用的repo)很多,如ultralytics的yolov3/yolov5/yolov8,mmdetection,paddledetction等,感謝前人的工作!
- 成熟的"框架"指,功能齊全,滿足絕大多數場景,受眾多,經得起時間的考驗,可以放心使用。
在圖像分割的實驗中就指出,凡是有系列的,優先考慮,因此,這裡選擇ultralytics的yolov5,它是目前為止(2023年3月10日07:07:25)star最高的目標檢測開原始程式碼倉庫,已經36K,足以證明yolov5的穩定性與可靠性。
yolo系列簡介
YOLOv1 |
YOLOv2 |
YOLOv3 |
YOLOv4 |
YOLOv5 |
YOLOv6 |
YOLOv7 |
YOLOv8 |
|
---|---|---|---|---|---|---|---|---|
時間 |
2015.6.8 |
2016.12.25 |
2018.4.8 |
2020.4.23 |
2020.6.10 |
2022.6.23 |
2022.7.7 |
2023.1 |
作者 |
Joseph Redmon |
Joseph Redmon |
Joseph Redmon |
Alexey Bochkovskiy |
Ultralytics |
美團 |
Alexey Bochkovskiy |
Ultralytics |
深度學習目標檢測框架發展快10年時間,只有yolo(You Only Look Once)系列久經不衰,截至目前公認的版本已經到了v8,很難有人能將v1-v8的細節全部吃透。
在校有時間的同學十分建議從v1-v8認真學習,這樣可以理解目標檢測的發展,鍛煉科研意識,掌握代碼能力。
對於工作繁忙的工程師來說,它們只是解決問題的工具,瞭解工具的優點與缺點,有的放矢的應用在各個項目場景也是不錯的選擇。
為此,特地總結yolov1-v8的特點,為後續使用工具打下基礎。
參考deephub的文章,可以看到yolo系列主流的模型發展歷程。
yolov1:2015年提出的one-stage目標檢測演算法,與當時的Fater RCNN(two-stage)共同稱為當時最受歡迎的檢測模型。特點為anchor-free:沒有anchor的概念,每個cell直接輸出bbox。每個cell僅輸出2個bbox,每個cell輸出向量為(20+ (4+1)*2),20為20個類,1為bbox概率,4為bbox資訊,一張圖片最終變為7×7的特徵圖,一個cell只能預測1個類,因此定位粗糙,小目標不友好,對重疊物體檢測能力差。
yolov2:針對yolov1定位不精准問題,借鑒faster rcnn的anchor-base的概念,並且引入k-means實現anchor的自動配置。
yolov3:劃時代意義的目標檢測演算法,也奠定了目標檢測之後的範式,backone+neck+多尺度。yolov3網路結構簡單,並且採用多尺度特徵圖實現不同尺寸目標的檢測,速度與精度在當時都是優於其他模型。yolov3採用的是手動配置的33=9種anchor,anchor的參數設置是通過k-means對標籤進行聚類發現的,*3種尺寸,3種長寬比。
yolov4:yolov4發佈前有個小插曲,那就是YOLO之父Jeseph Redmon,由於“無法忽視工作帶來的負面影響”,公開宣佈隱退。好在有大神接了他的大旗,在yolov3推出快2年的時間,yolov3的改進版v4終於在2020年來了,yolov4開始,可以認為是一個分割點,更準確地說yolov3是後續模型的分割點。借助paperswithcode的一個精度圖,可以看到yolov3在coco的map是30-40之間,而往後v4-v8已經來到50-60的區間,已經不在一個檔次。
對於yolov4,它對當時深度學習的多種tricks進行了實驗,集成到yolov3上進行改進,精度和速度都得到大幅度提升。它使用了大量tricks,包括WRC、CSP、CmBN、SAT、 Mish activation、Mosaic data augmentation、CutMix、CmBN、DropBlock regularization 和 CIoU loss、GIoU loss。
yolov5:在yolov4發佈後短短2個月,yolov5橫空出世,並且帶來了多種大小的模型, nano/s/m/l/x等尺寸,可適用於多種場景,同時配備高品質的開原始程式碼倉庫,短時間內就受到了廣泛關注。yolov5資料增強上使用了Mosaic資料增強、自我調整錨框計算、自我調整圖片縮放(推理時採用最小填充原則,加速推理)、融合新網路模組Focus、CSP結、FPN+PAN,GIOU_Loss,以及預測框篩選的DIOU_nms、
yolov6:2022年由美團提出的速度更快的檢測模型,主打是速度,因此模型特點是backbone與neck的設計都為了適應硬體的運算,使用了Rep-Pan和EfficientRep塊,head部分用瞭解耦的形式,在訓練策略方面採用了anchor-free、SimOTA標記策略、SIoU盒回歸的損失。
yolov7:在yolov6推出不到半個月,yolov7也發佈了,yolov7團隊與yolov4團隊一致,屬於官方YOLO團隊(yolov4團隊接過yolo之父Jeseph Redmon的大旗)。yolov7同樣從速度方面做了許多優化,例如記憶體訪問成本、I / O比率、element-wise、啟動函數等,以及模型重參數化(re-parameterization)。
yolov8:yolov5的團隊——ultralytics打造的集成圖像分類、圖像分割、目標檢測於一體的結構,目前github位址並為採用yolov8而是採用ultralytics。發佈2個多月後,論文仍舊未發佈,具體優化內容請關注官方github,從代碼中觀察吧。
yolov5 代碼結構講解
根據廣大工程師“用腳投票”的結果,本案例採用ultralytics的yolov5來實現目標檢測,並學習代碼中優秀的設計思想,同時剖析用戶如何使用yolov5倉庫代碼。
後續建議跟進yolov8!
學習yolov5之前,推薦閱讀yolov5的readme,其中包含了許多學習資料。
下圖為yolov5(2023.03版)的代碼結構,邏輯相當清晰,可分三個模組,三個模組是圖像分類、圖像分割和目標檢測。
目標檢測分為data、models、utils和運行腳本部分。
- data:存放的主要是資料超參數配置yaml檔。
- models:存放的是各模型的yaml設定檔,即模型創建依賴於yaml檔。
- utils:存放各功能模組,如,資料增強augmentations.py, 自動計算anchor功能autoanchor.py,啟動函數activations.py, fastapi介面等等。
檢測模型的訓練、驗證、推理分別在:train.py, val.py, detect.py中。下面將重點講解train.py的運行機制。
yolov5 訓練機制講解
train.py有600多行,並且調用了許多函數,一開始接觸會感到困難。
不過不用擔心,它還是pytorch框架,仍舊逃離不了基礎核心模組, dataloader, module,loss, scheduler,反覆運算訓練。
下面依次簡要的說明train.py中是如何訓練的。
參數配置模組
使用parse_opt()進行參數包裝,訓練時可指定模型、資料集配置yaml路徑,超參數配置yaml路徑等內容。
資料模組
man() --> train()-->create_dataloader(): 第188行,調用了create_dataloader()函數,並且傳入了資料集配置yaml檔中的訓練集路徑。
utils/dataloders.py-->LoadImagesAndLabels(): 在函數內部採用LoadImagesAndLabels()類實現pytorch的dataset的生成,class LoadImagesAndLabels(Dataset), 代碼有483行,裡面實現了許多資料檢測、資料載入功能,但是核心與pytorch的dataset是一致的,重點關注init中做了哪些初始化,以及getitem如何從磁片載入圖片並且做資料預處理、資料增強的即可。
模型模組
第125行實現模型創建,可以看到是通過配置資訊進行創建的,這裡的配置資訊來自參數配置模組中--cfg或者指定預訓練模型--weights,
model = Model(cfg or ckpt['model'].yaml, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device) # create
再看往裡看 DetectionModel繼承自BaseModel,BaseModel集成nn.Module,裡邊細節就可通過nn.Module的基礎知識一步一步剖析。
反覆運算訓練模組
核心功能在,262行
262行:主迴圈
for epoch in range(start_epoch, epochs): # epoch ------------------------------------------------------------------
284行:batch迴圈
for i, (imgs, targets, paths, _) in pbar: # batch -------------------------------------------------------------
310行:前向推理,計算loss,反向傳播
pred = model(imgs) # forward
loss, loss_items = compute_loss(pred, targets.to(device)) # loss scaled by batch_size
scaler.scale(loss).backward()
344行:epoch維度變更學習率,因此在batch的迴圈之外
lr = [x['lr'] for x in optimizer.param_groups] # for loggers
scheduler.step()
Copy
日誌輸出模組
在runs資料夾下會有train資料夾,每一次實驗會以exp{實驗次序}創建資料夾,在下面會保存訓練過程中的一系列有價值內容。
如下圖所示,會有這些檔
weights:訓練好的模型權重,包括last.pt, best.pt
hyp.yaml:訓練時的超參數,便於複現
results.png:訓練曲線,便於分析訓練情況,調整超參數
results.csv:訓練指標記錄表格
train_batch2.jpg:訓練資料集,bbox繪製情況,十分有用,可用於檢測資料標籤是否處理正確!
val_batch0_labels.jpg:驗證資料集,bbox驗證情況
val_batch2_pred.jpg:模型預測出的bbox在驗證集上的情況。
混淆矩陣:針對標籤的預測的情況進行混淆矩陣觀察,這個混淆矩陣是轉置了的,行是預測,列才是真實標籤,以下圖為例,汽車這個類別中,有78%的汽車框被預測為了汽車,有19%的汽車框沒有被檢測到,剩下2%的汽車框被檢測出來了,但是分類時分為了van(箱式貨櫃車)。
PR_curve:PR曲線是各類別的AP情況
P_curve和R_curve:是觀察模型對各類別分類情況,可用於挑選分類概率閾值, 橫軸表示選擇的閾值,縱軸是對應的值。可以看到閾值越小召回率越高,反之,精確度越低。
labels_correlogram.jpg:是借助seaborn的pairplot,繪製的多變數的二維分析相關性統計分析圖。以列為基礎,第一列是x與其它資料的關係,第一列,第一行,表示x的整體分佈,可以看到是相對於中心點0.5對稱的,表明矩形框在寬這個維度,左邊有的數量與右邊有的數量是一致的,並且呈現中間多,兩邊少的情況。
第一列,第二行,表示x與y的分佈情況,同labels.jpg中第三幅圖一樣,觀察矩形框整體情況是寬度偏中間,高度偏中間與中下部。
第一列,第三行,表示x與w的分佈情況,呈現一個梯形,這個很合理,因為當x靠近圖片的最左邊的時候,即物體在圖像的邊界時,這個物體一般不會很大,否則根據拍照的基礎原理,肯定會將鏡頭朝向主要物體,並放置在鏡頭中央,不至於在邊界處。
第一列,第四行,表示x與h的分佈情況。
第二列,第二行,是y的整體分佈,可以看到是偏向0-0.5之間。
第三列,第三行,是w的整體分佈。
第四列,第四行,是h的整體分佈。
yolov5 訓練VisDrone步驟
第一步:設置資料集配置yaml檔,首先到detection\yolov5-master\data\下複製一份yaml,命名為mydrone.yaml,設置好路徑即可,這裡yolo資料格式只需要images路徑就能通過相對路徑尋找到labels。同時設置好檢測類別數量與名稱
path: G:\deep_learning_data\VisDrone # dataset root dir
train: VisDrone2019-DET-train\\images # train images (relative to 'path') 128 images
val: VisDrone2019-DET-val\\images # val images (relative to 'path') 128 images
test: # test images (optional)
nc: 10 # number of classes
names: ['pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor']
Copy
第二步:將預訓練模型下載到code/chapter-8/03_detection/yolov5-master下,下載方式為github。
第三步:在終端,運行訓練指令,即可在runs/train下面看到對應日誌.
python train.py --imgsz 640 --batch 16 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8
Copy
對比實驗
實驗一:visdrone資料集特點是解析度大,一般的640,1000的尺寸無法滿足要求,為此,進行了5種尺寸的訓練,用於觀察不同解析度對精度的影響
實驗二:yolov5提供多種尺寸的模型,這裡觀察s/m/l三種尺寸的模型對精度的影響。
實驗三:同時觀察yolov5自帶的三種不同強度的資料增強帶來怎樣的精度變化。
更新:所有實驗權重、實驗檔已經上傳雲盤:連結:https://pan.baidu.com/s/11kQJcCka2VyR5ToF-N0BOQ 提取碼:op4x
實驗一/二:不同輸入尺寸對模型精度的變化
python train.py --imgsz 640 --batch 24 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-low.yaml
python train.py --imgsz 960 --batch 16 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-low.yaml
python train.py --imgsz 1280 --batch 12 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-low.yaml
python train.py --imgsz 1600 --batch 8 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-low.yaml
python train.py --imgsz 1920 --batch 6 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-low.yaml
Copy
map50/map50:95 |
640 |
960 |
1280 |
1600 |
1920 |
|
---|---|---|---|---|---|---|
yolov5s |
0.33/0.18 |
0.44/0.26 |
0.50/0.30 |
0.54/0.33 |
0.55/0.34 |
exp0-4 |
yolov5m |
0.38/0.21 |
0.48/0.30 |
0.53/0.33 |
0.57/0.36 |
0.59/0.38 |
exp11-15 |
yolov5l |
0.40/0.23 |
0.50/0.31 |
0.55/0.35 |
0.57/0.37 |
0.60/0.39 |
exp16-20 |
從上圖可以看出:
- 隨著尺寸增大,精度得到提高,且1920仍未達到瓶頸,可繼續增加圖片尺寸來獲得精度提高。
- 隨著模型容量增大,精度得到提高;可根據任務難以程度選擇合適容量的模型。
- 在size和模型容量兩者間可以選擇更適合的方式來漲點,即size也可以漲點,換大模型也可以漲點,如果不能同時採用,則根據上下游條件進行取捨。
實驗三:不同資料增強方法的變化
這裡套用yolov5提供的三種強度的資料增強方法,觀察精度變化。
python train.py --imgsz 960 --batch 16 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-low.yaml
python train.py --imgsz 960 --batch 16 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-med.yaml
python train.py --imgsz 960 --batch 16 --epochs 100 --data mydrone.yaml --weights yolov5s.pt --workers 8 --hyp data/hyps/hyp.scratch-high.yaml
Copy
scratch-low |
scratch-med |
scratch-high |
||
---|---|---|---|---|
map50/map50:95 |
0.44/0.26 |
0.44/0.26 |
0.43/0.26 |
exp5-7 |
從結果可知,yolov5中自帶的low, med, high在本案例中效果都一樣,並無差別。
模型推理
訓練好模型後,可通過detect.py進行推理並觀察結果,detect.py提供了多個參數介面
- weights:訓練好的.pt文件,.pt檔中存儲了模型結構,因此無需額外指定模型結構的yaml檔
- source:需要檢測的資料來源,支援圖片、視頻、攝像頭、網路視頻url等
- data:資料集yaml檔,關聯檢測的類別名稱
- imgsz:圖像輸入大小
- conf-thres:檢測框置信度閾值
- iou-thres:非極大值抑制時的iou閾值設置
- half:採用半精度(Float 16)進行推理,可提升推理速度,但有一定精度損失
其它配置參數可看代碼注釋,這面介紹detect.py中的核心代碼結構,觀察其是如何實現推理的。
第一部分,資料載入讀取,對於資料的載入與讀取,採用utils/dataloders.py中實現的3個類來實現包裝,並進行反覆運算。如LoadStreams、LoadScreenshots、LoadImages,對於三個類的實例,在使用時,採用for迴圈進行依次取出資料
dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt, vid_stride=vid_stride)
dataset = LoadScreenshots(source, img_size=imgsz, stride=stride, auto=pt)
dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt, vid_stride=vid_stride)
for path, im, im0s, vid_cap, s in dataset:
Copy
第二部分,模型載入,使用models/common.py中的DetectMultiBackend類實現,該類支持多種計算後端如pytorch\onnx\tensorrt\jit\dnn等等。其中,pytorch模型是通過models/experimental.py中的attempt_load()函數實現載入。attempt_load()需要的一個核心參數就是.pt檔路徑。然後根據.pt內資訊完成模型創建、權重載入等工作。
model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data, fp16=half)
model = attempt_load(weights if isinstance(weights, list) else w, device=device, inplace=True, fuse=fuse)
Copy
第三部分,推理與保存,推理主要兩個步驟,模型前向傳播,經過NMS後得到最終輸出矩形框。對於結果視覺化,這裡採用Annotator類實現繪製,首先將圖像傳入Annottor,進行產生實體,後續通過annotator.box_label()進行bbox與labels的繪製。
pred = model(im, augment=augment, visualize=visualize)
pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)
# ------------------------------------------------------------------------------------------------
annotator = Annotator(im0, line_width=line_thickness, example=str(names))
annotator.box_label(xyxy, label, color=colors(c, True))
Copy
運行以下推理指令,即可在.runs/detect/exp*下獲得結果,下圖為航拍視頻推理示例
python detect.py --weights ./runs/train/exp2/best.pt --source G:\DJI_0690.MP4 --data data/mydrone.yaml --imgsz 1280 --half
python detect.py --weights best.pt --source G:\DJI_0690.MP4 --data data/mydrone.yaml --imgsz 1280
Copy
到這裡,yolov5代碼就講解完畢,yolov5代碼庫還有許多值得學習的地方,這裡由於篇幅關係,作為拓展閱讀推薦給大家:
- 模型匯出為TFLite, ONNX, CoreML, TensorRT:https://github.com/ultralytics/yolov5/issues/251
- TTA(test time augmentation): https://github.com/ultralytics/yolov5/issues/303
- 模型剪枝:https://github.com/ultralytics/yolov5/issues/304
- yolov5訓練技巧總結:https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results
- yolov5模型集成:https://github.com/ultralytics/yolov5/issues/318
小結
本案例介紹了yolov5實現無人機視角的目標檢測,主要涉及以下知識點:
- Visdrone資料集介紹與標籤含義解析,會有模糊程度與遮擋程度的兩個額外標注資訊。
- 目標檢測常見資料形式:voc,coco,yolo形式,三者的bbox形式均不一樣,使用時需要注意轉換。xmin,ymin,xmax,ymax; xmin, ymin, w, h; x_center, y_center, w, h
- yolov1-v8模型簡介:簡要介紹v1-v8的模型特點,便於後續有的放矢的選擇使用。
- yolov5代碼結構介紹:剖析yolov5專案代碼結構,並分析如何進行訓練、推理。
- 自訂資料集訓練過程:詳細介紹自己的資料集要如何使用yolov5進行訓練的過程,核心在於瞭解yolov5的資料載入形式與模型載入形式都通過yaml檔進行管理。
- 對比實驗:分析解析度、模型容量、資料增強方法帶來的精度變化,對後續重要超參數設置具有指導性意義。
本案例已近萬字,可以快速用代碼實現目標檢測,但是對於目標檢測的學習來說,還遠不夠,案例初衷還是通過具體的專案,來鞏固pytorch基礎知識。
最後,可以發現,即使是採用yaml來管理資料和模型,在實現的時候還會繼承dataset和dataloader,以及nn.Module,由此可見第三章和第四章的概念有多麼重要。
對於想要深入瞭解目標檢測的朋友,推薦學習:
- 非深度學習目標檢測時期的檢測方法;
- faster rcnn + yolov3的詳細理論過程與代碼實現
- yolov3後時代下的,anchor-free, one-stage的檢測模型
- 特定問題目標檢測:小目標檢測, 旋轉目標檢測,密集場景目標檢測,超大解析度圖像目標檢測、遮擋場景目標檢測等等
留言列表