專案簡介:
代碼地址:
github地址:https://github.com/RichardoMrMu/yolov5-fire-smoke-detect
gitee地址:https://gitee.com/mumuU1156/yolov5-fire-smoke-detect
歡迎start或提出你的issue、改進建議,
本專案使用yolov5實作自然狀態中火源或者煙霧的檢測,使用c++實作,并用tensorrt加速,在Jetson Xavier nx上整個專案的推理時間在30ms左右,即33FPS的速度,
You can see video play in BILIBILI, or YOUTUBE.
效果

如果你想在預訓練模型上進行微調,可以嘗試yolov5的官方pretrained模型,然后在對應資料集上進行訓練,根據教程將pytorch的模型轉為tensorrt使用的engine檔案,
Speed
| Backbone | before TensorRT | TensortRT(detection) | FPS(detection) |
|---|---|---|---|
| Yolov5s-640-float16 | 100ms | 60-70ms | 14 ~ 18 |
| Yolov5m-640-float16 | 120ms | 70-75ms | 13 ~ 14 |
| Yolov5s-640-int8 | 30-40ms | 25 ~ 33 | |
| Yolov5m-640-int8 | 50-60ms | 16 ~ 20 |
DataSet
本案例使用資料集包含MIT協議互聯網下載圖片和MIT協議公開資料集,共有6675張圖片,分別檢測煙霧和火災
資料集圖片格式是VOC資料格式,VOC資料是每個影像檔案對應一個同名的xml檔案,xml檔案內包含對應圖片的基本資訊,比如檔案名、來源、影像尺寸以及影像中包含的物體區域資訊和類別資訊等,
xml檔案中包含以下欄位:
-
filename,表示影像名稱,
-
size,表示影像尺寸,包括:影像寬度、影像高度、影像深度,
<size> <width>500</width> <height>375</height> <depth>3</depth> </size> -
object欄位,表示每個物體,包括:
標簽 說明 name 物體類別名稱 pose 關于目標物體姿態描述(非必須欄位) truncated 如果物體的遮擋超過15-20%并且位于邊界框之外,請標記為 truncated(非必須欄位)difficult 難以識別的物體標記為 difficult(非必須欄位)bndbox子標簽 (xmin,ymin) 左上角坐標,(xmax,ymax) 右下角坐標,
將這6675張圖片按9:1比例隨機切分,切分后包含6008張圖片的訓練集和667張圖片的驗證集,提供處理好的資料集,下載地址,包含以下檔案夾和檔案:images,annotations,labels.txt, train_list.txt和 val_list.txt,分別圖片、xml標注檔案、存盤類別資訊、訓練樣本串列、驗證樣本串列,訓練樣本串列和驗證樣本串列的每一行格式為:圖片路徑 對應的xml路徑,例如images/fire_00348.jpg annotations/fire_00348.xml,
最終資料集檔案組織結構為:
├── dataset
├── annotations
│ ├── fire_000001.xml
│ ├── fire_000002.xml
│ ├── fire_000003.xml
│ | ...
├── images
│ ├── fire_000001.jpg
│ ├── fire_000003.jpg
│ ├── fire_000003.jpg
│ | ...
├── label_list.txt
├── train.txt
└── valid.txt
專案使用
這個專案中,需要檢測的yolov5,我選擇yolov5s模型,并通過yolov5s.pt->yolov5s.wts->yolov5s.engine,獲取engine file,同時你也可以參考tensorrtx official readme,
0.Python Code
你可以下載這個python倉庫的代碼進行訓練,推理等操作,也可以直接下載模型,
python倉庫的操作步驟,請參看該倉庫的README.md,或者參考這篇文章,
1. requirement
請注意,下列流程,我在Jetson Xavier nx和Jetson nano上完整實作過,你同樣可以在ubuntu系統上實作,如果想在windows上測驗,需要你自己摸索,
Jetson nano or Jetson Xavier nx
Jetpack 4.5.1
python3 with default(jetson nano or jetson xavier nx has default python3 with tensorrt 7.1.3.0 )
tensorrt 7.1.3.0
torch 1.8.0
torchvision 0.9.0
torch2trt 0.3.0
onnx 1.4.1
opencv-python 4.5.3.56
protobuf 3.17.3
scipy 1.5.4
2. 下載yolov5-fire-smoke-detect
如果你已經有了yolov5s.engine,那么僅下載{yolov5-fire-smoke-detect}倉庫,然后修改{yolov5-deepsort-tensorrt}/src/main.cpp中
char* yolo_engine = "";為自己模型的位置 ,執行編譯鏈接即可,如果沒有這個檔案,請參考3往后的步驟,
// 下載c++專案代碼
git clone https://github.com/RichardoMrMu/yolov5-fire-smoke-detect
// {}代表該專案的絕對路徑
cd {yolov5-fire-smoke-detect}
mkdir build
// 修改{yolov5-fire-smoke-detect}/src/main.cpp中deepsort
//char* yolo_engine = ""; 為自己模型的位置
// frame = capture.open("");將open中換成mp4所在的路徑,或者如果使用usb攝像頭,就寫成capture.open(0)
// 然后執行編譯鏈接即可
cmake ..
make
// make成功后,會在build檔案夾下生成一個yolosort二進制檔案 運行即可
./yolofire // 運行二進制檔案
3. 將pytorch的模型轉為tensorrt支持的模型檔案
因為python自身速度的問題和pytorch原生模型速度的問題,如果將檢測部分的yolov5模型和track模塊特征提取的模型轉為tensorrt,速度會快10倍左右,
- 下載yolov5官方代碼和模型
請注意,我下面使用的yolov5代碼版本是yolov5-5,即v5.0版本,所以,如果你想自己訓練模型替換engine file,請確保的yolov5代碼版本是v5.0,
// 下載v5.0
git clone -b v5.0 https://github.com/ultralytics/yolov5.git
cd yolov5
mkdir weights
cd weights
// download https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt
// 這里使用yolov5s模型
wget https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt
- 下載并配置tensorrt
git clone https://github.com/wang-xinyu/tensorrtx
- 將pytorch的yolov5s.pt模型檔案轉為wst檔案
將tensorrtx下的get_wts.py檔案拷貝到yolov5檔案夾下,然后將下載好的或者訓練好的yolov5s.pt模型轉換為wts模型
cp tensorrtx/gen_wts.py yolov5/
cd yolov5
python3 gen_wts.py -w ./weights/yolov5s.pt -o ./weights/yolov5s.wts
// a file 'yolov5s.wts' will be generated.
你可以在 yolov5/weights/找到yolov5s.wts模型
- 編譯
tensorrtx/yolov5專案并獲取tensorrt engine file
此處請注意,如果你是自己訓練的模型,那么要將yololayer.h中的CLASS_NUM,INPUT_H,INPUT_W修改為自己的引數,即檔案的20,21,22行,因為此處是二分類,即火焰和煙,因此CLASS_NUM為2,
cd tensorrtx/yolov5
// update CLASS_NUM as 2 in yololayer.h
mkdir build
cd build
cp {ultralytics}/yolov5/yolov5s.wts {tensorrtx}/yolov5/build
cmake ..
make
// yolov5s
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s
// test your engine file
sudo ./yolov5 -d yolov5s.engine ../samples
然后你就得到了yolov5.engine檔案,你需要將這個檔案放到我的專案中,你可以創建一個{yolov5-fire-smoke-detect}/resources檔案夾放模型,
cd {yolov5-fire-smoke-detect}
mkdir resources
cp {tensorrtx}/yolov5/build/yolov5s.engine {yolov5-fire-smoke-detect}/resources
經過以上的步驟,獲得了yolov5.engine,將這個檔案放到相應的位置,即可編譯運行該專案,
如果你遇到問題,請在github專案yolov5-fire-smoke-detect的issue中提問題,或者在這篇文章下評論,歡迎討論,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/353543.html
標籤:其他
下一篇:1.4 DICOM影像CT值計算
