深度學習目標檢測:YOLOv5實現車輛檢測(含車輛檢測數據集+訓練代碼)

https://blog.csdn.net/guyuealian/article/details/128099672

深度學習目標檢測:YOLOv5實現車輛檢測(含車輛檢測數據集+訓練代碼)
目錄
 
深度學習目標檢測:YOLOv5實現車輛檢測(含車輛檢測數據集+訓練代碼)
 
1. 前言
 
2. 車輛檢測數據集說明
 
(1)車輛檢測數據集
 
(2)自定義數據集
 
3. 基於YOLOv5的車輛檢測模型訓練
 
(1)YOLOv5安裝
 
(2)準備Train和Test數據
 
(3)配置數據文件
 
(4)配置模型文件
 
(5)重新聚類Anchor(可選)
 
(6)開始訓練
 
(7)可視化訓練過程
 
(8)常見的錯誤
 
4. Python版本車輛檢測效果
 
5. Android版本車輛檢測效果
 
6.項目源碼下載
 
1. 前言
本篇博客,我們將手把手教你搭建一個基於YOLOv5的車輛目標檢測項目。目前,基於YOLOv5s的車輛平均精度平均值mAP_0.5=0.57192,mAP_0.5:0.95=0.41403,基本滿足業務的性能需求。另外,爲了能部署在手機Android平臺上,本人對YOLOv5s進行了模型輕量化,開發了一個輕量級的版本yolov5s05_416和yolov5s05_320,在普通Android手機上可以達到實時的檢測和識別效果,CPU(4線程)約30ms左右,GPU約25ms左右 ,基本滿足業務的性能需求。
 
先展示一下Python版本車輛檢測Demo效果:
 
 
【尊重原創,轉載請註明出處】https://panjinquan.blog.csdn.net/article/details/128099672
 
更多項目《智能駕駛 車牌檢測和識別》系列文章請參考:
 
智能駕駛 車牌檢測和識別(一)《CCPD車牌數據集》:https://blog.csdn.net/guyuealian/article/details/128704181
智能駕駛 車牌檢測和識別(二)《YOLOv5實現車牌檢測(含車牌檢測數據集和訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128704068
智能駕駛 車牌檢測和識別(三)《CRNN和LPRNet實現車牌識別(含車牌識別數據集和訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128704209
智能駕駛 車牌檢測和識別(四)《Android實現車牌檢測和識別(可實時車牌識別)》:https://blog.csdn.net/guyuealian/article/details/128704242
智能駕駛 車牌檢測和識別(五)《C++實現車牌檢測和識別(可實時車牌識別)》:https://blog.csdn.net/guyuealian/article/details/128704276
智能駕駛 紅綠燈檢測(一)《紅綠燈(交通信號燈)數據集》:https://blog.csdn.net/guyuealian/article/details/128222850
智能駕駛 紅綠燈檢測(二)《YOLOv5實現紅綠燈檢測(含紅綠燈數據集+訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128240198
智能駕駛 紅綠燈檢測(三)《Android實現紅綠燈檢測(含Android源碼 可實時運行)》:https://blog.csdn.net/guyuealian/article/details/128240334
智能駕駛 車輛檢測(一)《UA-DETRAC BITVehicle車輛檢測數據集》:https://blog.csdn.net/guyuealian/article/details/127907325
 
智能駕駛 車輛檢測(二)《YOLOv5實現車輛檢測(含車輛檢測數據集+訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128099672
 
智能駕駛 車輛檢測(三)《Android實現車輛檢測(含Android源碼 可實時運行)》:https://blog.csdn.net/guyuealian/article/details/128190532
 
2. 車輛檢測數據集說明
(1)車輛檢測數據集
目前收集了約10W+的車輛檢測數據集:UA-DETRAC車輛檢測數據集+Vehicle-Dataset車輛檢測數據集+BITVehicle車輛檢測數據集: 
 
關於車輛檢測數據集使用說明和下載,詳見另一篇博客說明:《UA-DETRAC BITVehicle車輛檢測數據集(含下載地址)》
 
(2)自定義數據集
如果需要增/刪類別數據進行訓練,或者需要自定數據集進行訓練,可參考如下步驟:
 
採集圖片,建議不少於200張圖片
使用Labelme等標註工具,對目標進行拉框標註:labelme工具:GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).
將標註格式轉換爲VOC數據格式,參考工具:labelme/labelme2voc.py at main · wkentaro/labelme · GitHub
生成訓練集train.txt和驗證集val.txt文件列表
修改engine/configs/voc_local.yaml的train和val的數據路徑
重新開始訓練
 
 
3. 基於YOLOv5的車輛檢測模型訓練
(1)YOLOv5安裝
訓練Pipeline採用YOLOv5: https://github.com/ultralytics/yolov5 , 原始代碼訓練需要轉換爲YOLO的格式,不支持VOC的數據格式。爲了適配VOC數據,本人新增了LoadVOCImagesAndLabels用於解析VOC數據集,以便正常訓練。另外,爲了方便測試,還增加demo.py文件,可支持對圖片,視頻和攝像頭的測試。
 
Python依賴環境,使用pip安裝即可,項目代碼都在Ubuntu系統和Windows系統驗證正常運行,請放心使用;若出現異常,大概率是相關依賴包版本沒有完全對應
 
 
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow
PyYAML>=5.3.1
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.41.0
tensorboard>=2.4.1
seaborn>=0.11.0
pandas
thop  # FLOPs computation
pybaseutils==0.6.5
 
 項目安裝教程請參考(初學者入門,麻煩先看完下面教程,配置好開發環境):
 
項目開發使用教程和常見問題和解決方法
視頻教程:1 手把手教你安裝CUDA和cuDNN(1)
視頻教程:2 手把手教你安裝CUDA和cuDNN(2)
視頻教程:3 如何用Anaconda創建pycharm環境
視頻教程:4 如何在pycharm中使用Anaconda創建的python環境
(2)準備Train和Test數據
下載車輛檢測數據集,總共約10W+的圖片:UA-DETRAC車輛檢測數據集+Vehicle-Dataset車輛檢測數據集+BITVehicle車輛檢測數據集
 
 
 
考慮到UA-DETRAC車輛檢測數據集比較大,其訓練的模型的檢測效果相對比較好,因此後續以UA-DETRAC車輛檢測數據集爲示例,說明訓練過程。其他數據集訓練,請根據自己環境,適當修改即可。
 
(3)配置數據文件
修改訓練和測試數據的路徑:engine/configs/voc_local.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: ""  # dataset root dir
 
# 注意數據路徑分隔符使用【/】,不是【\】
# 項目不要出現含有中文字符的目錄文件或路徑,否則會出現很多異常!!!!!!!!
train:
  - "D:/path/to/UA-DETRAC/DETRAC-VOC/DETRAC-train-voc/train.txt"
  - "D:/path/to/UA-DETRAC/DETRAC-VOC/DETRAC-test-voc/test.txt" # 做模型性能測試時,測試集不要加入,避免指標有歧義
 
val:
  - "D:/path/to/UA-DETRAC/DETRAC-VOC/DETRAC-test-voc/test.txt"
 
test:  # test images (optional)
data_type: voc
 
# 1.設置類別個數,和要訓練的類別名稱,ID號從0開始遞增
nc: 4  # number of classes
names: { 'car': 0, 'bus': 1,  'van': 2,'others': 3 }
# 2.如果你想合併幾個類別進行訓練,比如將'[car','bus','van']看作一類,others看作另一類,則
#nc: 2  # number of classes
#names: { 'car': 0, 'bus': 0,  'van': 0,'others': 1 }
# 3.如果你想合併所有類別爲一個大類,進行訓練: unique表示合併所有類爲單獨一個類別
#nc: 1  # number of classes
#names: { "unique": 0 }
 
如果你想合併幾個類別進行訓練,比如將'[car','bus','van']看作一類,others看作另一類,則修改engine/configs/voc_local.yaml:
nc: 2  # number of classes
names: { 'car': 0, 'bus': 0,  'van': 0,'others': 1 }
 如果你想合併所有類別爲一個大類,進行訓練: unique表示合併所有類爲單獨一個類別
nc: 1  # number of classes
names: { "unique": 0 }
(4)配置模型文件
官方YOLOv5給出了YOLOv5l,YOLOv5m,YOLOv5s等模型。考慮到手機端CPU/GPU性能比較弱雞,直接部署yolov5s運行速度十分慢。所以本人在yolov5s基礎上進行模型輕量化處理,即將yolov5s的模型的channels通道數全部都減少一半,並且模型輸入由原來的640×640降低到416×416或者320×320,該輕量化的模型我稱之爲yolov5s05。從性能來看,yolov5s05比yolov5s快5多倍,而mAP下降了10%(0.57→0.47),對於手機端,這精度勉強可以接受。
 
下面是yolov5s05和yolov5s的參數量和計算量對比:
 
模型 input-size params(M) GFLOPs mAP0.5
yolov5s 640×640 7.2 16.5 0.57192
yolov5s05 416×416 1.7 1.8 0.47022
yolov5s05 320×320 1.7 1.1 0.44788
(5)重新聚類Anchor(可選)
官方yolov5s的Anchor是基於COCO數據集進行聚類獲得(詳見models/yolov5s.yaml文件)
 
  
 
對於yolov5s05的Anchor,由於輸入大小640縮小到320,其對應的Anchor也應該縮小一倍:
 
 
 
一點建議:
 
官方yolov5s的Anchor是基於COCO數據集進行聚類獲得,不同數據集需要做適當的調整,其最優Anchor建議重新進行聚類 。
當然你要是覺得麻煩就跳過,不需要重新聚類Anchor,這個影響不是特別大。如果你需要重新聚類,請參考engine/kmeans_anchor/demo.py文件
(6)開始訓練
整套訓練代碼非常簡單操作,用戶只需要將相同類別的數據放在同一個目錄下,並填寫好對應的數據路徑,即可開始訓練了。
 
修改訓練超參文件: data/hyps/hyp.scratch-v1.yaml (可以修改訓練學習率,數據增強等方式,使用默認即可)
Linux系統終端運行,訓練yolov5s或輕量化版本yolov5s05_416或者yolov5s05_320 (選擇其中一個訓練即可)
#!/usr/bin/env bash
 
#--------------訓練yolov5s--------------
# 輸出項目名稱路徑
project="runs/yolov5s_640"
# 訓練和測試數據的路徑
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="yolov5s.yaml"
# 訓練超參數文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 預訓練文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 640 --workers 4 --project $project
 
 
#--------------訓練輕量化版本yolov5s05_416--------------
# 輸出項目名稱路徑
project="runs/yolov5s05_416"
# 訓練和測試數據的路徑
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="yolov5s05_416.yaml"
# 訓練超參數文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 預訓練文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 416 --workers 4 --project $project
 
 
#--------------訓練輕量化版本yolov5s05_320--------------
# 輸出項目名稱路徑
project="runs/yolov5s05_320"
# 訓練和測試數據的路徑
data="engine/configs/voc_local.yaml"
# YOLOv5模型配置文件
cfg="yolov5s05_320.yaml"
# 訓練超參數文件
hyp="data/hyps/hyp.scratch-v1.yaml"
# 預訓練文件
weights="engine/pretrained/yolov5s.pt"
python train.py --data $data --cfg $cfg --hyp $hyp --weights $weights --batch-size 16 --imgsz 320 --workers 4 --project $project
 
 
 
 
Windows系統終端運行,yolov5s或輕量化版本yolov5s05_416或者yolov5s05_320 (選擇其中一個訓練即可)
#!/usr/bin/env bash
 
#--------------訓練yolov5s--------------
python train.py --data engine/configs/voc_local.yaml --cfg yolov5s.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 640 --workers 4 --project runs/yolov5s_640
 
 
 
#--------------訓練輕量化版本yolov5s05_416--------------
python train.py --data engine/configs/voc_local.yaml --cfg yolov5s05_416.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 416 --workers 4 --project runs/yolov5s05_416
 
 
 
#--------------訓練輕量化版本yolov5s05_320--------------
python train.py --data engine/configs/voc_local.yaml --cfg yolov5s05_320.yaml --hyp data/hyps/hyp.scratch-v1.yaml --weights engine/pretrained/yolov5s.pt --batch-size 16 --imgsz 320 --workers 4 --project runs/yolov5s05_320
 
 
開始訓練:
 
 
訓練數據量比較大,訓練時間比較長,請耐心等待哈
訓練完成後,在模型輸出目錄中有個results.csv文件,記錄每個epoch測試的結果,如loss,mAP等信息
訓練模型收斂後,yolov5s車輛檢測的mAP指標大約mAP_0.5=0.57192;而,yolov5s05_416 mAP_0.5=0.47022左右;yolov5s05_320 mAP_0.5=0.44788左右
 
 
 
(7)可視化訓練過程
訓練過程可視化工具是使用Tensorboard,使用方法:
 
# 基本方法
tensorboard --logdir=path/to/log/
# 例如
tensorboard --logdir ./data/model/yolov5s_640
 
 
 
 
當然,在輸出目錄,也保存很多性能指標的圖片
 
這是訓練epoch的可視化圖,可以看到mAP隨着Epoch訓練,逐漸提高
 
 
這是每個類別的F1-Score分數
 
 
這是模型的PR曲線
 
 
這是混淆矩陣:
 
 
(8)常見的錯誤
YOLOv5 BUG修復記錄
 項目安裝教程請參考:項目開發使用教程和常見問題和解決方法   
項目不要出現含有中文字符的目錄文件或路徑,否則會出現很多異常!!!!!!!!
4. Python版本車輛檢測效果
demo.py文件用於推理和測試模型的效果,填寫好配置文件,模型文件以及測試圖片即可運行測試了
 
測試圖片
# 測試圖片(Linux系統)
image_dir='data/car-test' # 測試圖片的目錄
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/car-result" # 保存檢測結果
python demo.py --image_dir $image_dir --weights $weights --out_dir $out_dir
Windows系統,請將$image_dir, $weights ,$out_dir等變量代替爲對應的變量值即可,如
 
# 測試圖片(Windows系統)
python demo.py --image_dir data/car-test --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/car-result
測試視頻文件
# 測試視頻文件(Linux系統)
video_file="data/car-video.mp4" # path/to/video.mp4 測試視頻文件,如*.mp4,*.avi等
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/car-result" # 保存檢測結果
python demo.py --video_file $video_file --weights $weights --out_dir $out_dir
# 測試視頻文件(Windows系統)
python demo.py --video_file data/car-video.mp4 --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/car-result
 測試攝像頭
# 測試攝像頭(Linux系統)
video_file=0 # 測試攝像頭ID
weights="data/model/yolov5s_640/weights/best.pt" # 模型文件
out_dir="runs/car-result" # 保存檢測結果
python demo.py --video_file $video_file --weights $weights --out_dir $out_dir
# 測試攝像頭(Windows系統)
python demo.py --video_file 0 --weights data/model/yolov5s_640/weights/best.pt --out_dir runs/car-result
 
 
 
如果想進一步提高模型的性能,可以嘗試:
 
​增加訓練的樣本數據: 目前只有10W+的數據量,建議根據自己的業務場景,採集相關數據,提高模型泛化能力
使用參數量更大的模型: 本教程使用的YOLOv5s,其參數量才7.2M,而YOLOv5x的參數量有86.7M,理論上其精度更高,但推理速度也較慢。
嘗試不同數據增強的組合進行訓練
5. Android版本車輛檢測效果
已經完成Android版本車輛檢測模型算法開發,APP在普通Android手機上可以達到實時的檢測和識別效果,CPU(4線程)約30ms左右,GPU約20ms左右 ,基本滿足業務的性能需求。詳細說明請查看《Android實現車輛檢測(含Android源碼,可實時運行)》
 
Android Demo體驗:
 
 
 
6.項目源碼下載
整套項目源碼內容包含:車輛檢測數據集 + YOLOv5訓練代碼和測試代碼
 
整套項目下載地址:深度學習目標檢測:YOLOv5實現車輛檢測(含車輛檢測數據集+訓練代碼)
 
(1)車輛檢測數據集:UA-DETRAC BITVehicle車輛檢測數據集(含下載地址)
 
UA-DETRAC車輛檢測數據集
Vehicle-Dataset車輛檢測數據集
BIT-Vehicle車輛檢測數據集
(2)YOLOv5訓練代碼和測試代碼(Pytorch)
 
整套YOLOv5項目工程的訓練代碼和測試代碼
支持高精度版本yolov5s訓練和測試
支持輕量化版本yolov5s05_320和yolov5s05_416訓練和測試
項目源碼自帶訓練好的模型文件,可直接運行測試Demo
根據本篇博文說明,簡單配置即可開始訓練
更多項目《智能駕駛 車牌檢測和識別》系列文章請參考:
 
智能駕駛 車牌檢測和識別(一)《CCPD車牌數據集》:https://blog.csdn.net/guyuealian/article/details/128704181
智能駕駛 車牌檢測和識別(二)《YOLOv5實現車牌檢測(含車牌檢測數據集和訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128704068
智能駕駛 車牌檢測和識別(三)《CRNN和LPRNet實現車牌識別(含車牌識別數據集和訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128704209
智能駕駛 車牌檢測和識別(四)《Android實現車牌檢測和識別(可實時車牌識別)》:https://blog.csdn.net/guyuealian/article/details/128704242
智能駕駛 車牌檢測和識別(五)《C++實現車牌檢測和識別(可實時車牌識別)》:https://blog.csdn.net/guyuealian/article/details/128704276
智能駕駛 紅綠燈檢測(一)《紅綠燈(交通信號燈)數據集》:https://blog.csdn.net/guyuealian/article/details/128222850
智能駕駛 紅綠燈檢測(二)《YOLOv5實現紅綠燈檢測(含紅綠燈數據集+訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128240198
智能駕駛 紅綠燈檢測(三)《Android實現紅綠燈檢測(含Android源碼 可實時運行)》:https://blog.csdn.net/guyuealian/article/details/128240334
智能駕駛 車輛檢測(一)《UA-DETRAC BITVehicle車輛檢測數據集》:https://blog.csdn.net/guyuealian/article/details/127907325
 
智能駕駛 車輛檢測(二)《YOLOv5實現車輛檢測(含車輛檢測數據集+訓練代碼)》:https://blog.csdn.net/guyuealian/article/details/128099672
 
智能駕駛 車輛檢測(三)《Android實現車輛檢測(含Android源碼 可實時運行)》:https://blog.csdn.net/guyuealian/article/details/128190532
————————————————
版權聲明:本文爲CSDN博主「AI喫大瓜」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/guyuealian/article/details/128099672
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章