jetson系列——基于yolov5对火源或者烟雾的检测,使用tensorrtc++和int8加速(代码片段)

RichardorMu RichardorMu     2023-01-30     214

关键词:

项目简介:

代码地址:
github地址:https://github.com/RichardoMrMu/yolov5-fire-smoke-detect
gitee地址:https://gitee.com/mumuU1156/yolov5-fire-smoke-detect
欢迎start或提出你的issue、改进建议。
本项目使用yolov5实现自然状态中火源或者烟雾的检测,使用c++实现,并用tensorrt加速,尝试了不同大小的模型,同时使用int8加速,在Jetson Xavier nx上整个项目的推理时间在30ms左右,即33FPS的速度。
You can see video play in BILIBILI, or YOUTUBE.

如果你想从头开始尝试训练模型,你可以查看 yolov5-fire-smoke-detect-python这个仓库,并阅读他的readme,帮助你是用python去训练一个自己的烟雾和火焰检测模型,并使用c++去部属到边缘设备上。

效果

如果你想在预训练模型上进行微调,可以尝试yolov5的官方pretrained模型,然后在对应数据集上进行训练,根据教程将pytorch的模型转为tensorrt使用的engine文件。

Speed

Backbonebefore TensorRTTensortRT(detection)FPS(detection)
Yolov5s-640-float16100ms60-70ms14 ~ 18
Yolov5m-640-float16120ms70-75ms13 ~ 14
Yolov5s-640-int830-40ms25 ~ 33
Yolov5m-640-int850-60ms16 ~ 20

Achieve and Experiment

  • Int8.
  • yolov5-s
  • yolov5-m

Comming soon

  • Faster and use less memory.

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.txtval_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

你可以下载这个yolov5-fire-smoke-detect-python的代码进行训练,推理等操作,也可以直接下载模型
python仓库的操作步骤,请参看该仓库的README.md

1. requirement

请注意,下列流程,我在Jetson Xavier nxJetson 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倍左右。

  1. 下载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
  1. 下载并配置tensorrt
git clone https://github.com/wang-xinyu/tensorrtx
  1. 将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模型

  1. 编译tensorrtx/yolov5项目并获取tensorrt engine file
    此处请注意,如果你是自己训练的模型,那么要将yololayer.h中的CLASS_NUMINPUT_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,将这个文件放到相应的位置。即可编译运行该项目。

INT8 Quantization int8模型量化

int8量化和之前的float16有些许差别,tensorrt的int8量化需要图片的calibration,正如tensorrtx readme所说。
对于一般的yolo模型训练,你可能需要下载coco_calid.zip,你可以通过这个google drive url or BAIDUYUN — 密码是a9wh . 随后解压到project/build/.
然后你需要将yolov5.cpp文件中第十行的USE_FLOAT16 改成USE_INT8
然后重新编译运行:

cmake ..
make 
// yolov5s
sudo ./yolov5 -s yolov5s.wts yolov5s-int8.engine s
// testyour engine file
sudo ./yolov5 -d yolov5s-int8.engine ../samples

这样你就得到了int8量化的yolov5模型了,你可以尝试一下,是否加速了。

如果你遇到问题,请在github项目yolov5-fire-smoke-detect的issue中提问题,或者在这篇文章下评论。欢迎讨论。

基于b/s架构搭建一个支持多路摄像头的实时处理系统----基于websocket使用yolov5系列模型

文章大纲多路摄像头使用yolov5增加视频检测能力调整yolov5的目录结构符合自己的项目yolov5调用本地模型文件进行视频图像的推理torchhubloadcustom方法yolov5的函数位置变化,letter_box,dataset去哪了?添加yolo检测能力获得当前图像的推... 查看详情

智能火焰与烟雾检测系统(python+yolov5深度学习模型+清新界面)(代码片段)

...持图片、视频火焰检测并进行结果可视化。本文详细介绍基于智能火焰与烟雾检测系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面。在界面中可以选择各种图片、视频进行检测识别;可对图像中存... 查看详情

基于b/s架构搭建一个支持多路摄像头的实时处理系统----使用yolov5系列模型

...地址多路摄像头使用yolov5增加视频检测能力个人觉的yolo系列的模型虽然效果不错,但是项目整体的使用离那些Apache项目还稍稍有点差距。我们需要针对他做一些小的调整,让项目更整齐,更 查看详情

模型推理英伟达jetson系列边缘盒子性能测评

 本文记录了英伟达Jetson系列边缘盒子的性能测评小结。 测评的AIBox是分别来自浪潮、研智、米文,盒子型号包括浪潮JetsonXavierNX、研智JetsonXavierNX、米文JetsonNano、米文JetsonTX2NX、米文JetsonXavierNX、米文JetsonAGXXavier,数据... 查看详情

目标检测论文解读复现之八:基于yolov5s的滑雪人员检测研究

...点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮助大家解答疑惑。解读的系列文章,本人已进行创新点代码复现,有需要的朋友可关注私信我。 查看详情

英伟达jetson系列盒子参数(jetson参数)信息

https://developer.nvidia.com/embedded/jetson-modules我们的目前是这三款,对应4核、6核、8核,分不清,就top按1查下核数 查看详情

deepstream系列之最大化性能配置(代码片段)

点击查看系列文章目录0背景在jetson或dGPU上部署视频分析pipeline时,为了发挥硬件的最大性能,需要合理正确的进行配置,本文对相关配置要点进行一个汇总,供参考。1配置内容1.1设置jetson模式将jetson设置为最大性能模式,并且... 查看详情

毕设系列-检测专题-基于卷积神经网络的动物识别系统

...可能不太了解数据的处理,所以我们就这期视频做个衍生系列,主要是希望通过这些系列来教会大家如何训练和使用自己的数据 查看详情

基于b/s架构搭建一个支持多路摄像头的实时处理系统----使用yolov5模型基于gpu多进程处理视频流

...理加速多少?CPUGPU学习路径与参考文献参考项目项目地址系列文章:参考:使用python多进程进行基于websocket的实时视频流处理基于b/s架构搭建一个支持多路摄像头的实时处理系统(1)----基于websocket使用yolov5系列模 查看详情

模型推理英伟达jetson系列边缘盒子硬件参数汇总

 本文详细介绍了英伟达Jetson边缘盒子硬件参数,有助于你的AI部署。 最近手上来了很多AI边缘盒子,其中就英伟达的来说,已基本集齐了Jetson系列的盒子,包括JetsonNano、JetsonTX2NX、JetsonTX2、JetsonXavierNX、JetsonAGXX... 查看详情

yolov5详细解读(代码片段)

YOLOV5检测算法详解学习前言本文主要是对基于深度学习的目标检测算法进行细节解读,以YOLOV5为例;基于深度学习的目标检测整体流程基于深度学习的目标检测主要包括训练和测试两个部分。训练阶段训练的目的是利用... 查看详情

基于yolov5的目标追踪(非yolov5+deepsort版)(代码片段)

...目标框选2.5OpenCV画线、画框、画点等3源码地址1效果演示基于yolov5的目标跟踪(非yolov5+deepsort版)注:目标跟踪,全网都用的是。仅用 可以实现吗?可以。该视频效果实现的是手动暂停正在播放的视频࿰... 查看详情

githubyolov5开源代码项目系列讲解------源码下载环境配置及运行

本专栏将从安装到实例运用全方位系列讲解 GitHubYOLOv5开源代码。专栏地址:GitHubYOLOv5开源代码项目系列讲解目录1源码下载及环境配置2利用Yolov5进行预测2.1对项目提供图片进行预测 2.2对自己收集的图片进行预测2.3对自己收... 查看详情

改进yolov5系列:8.增加acmix结构的修改,自注意力和卷积集成(代码片段)

YOLOAir:助力YOLO论文改进🏆、不同数据集改进🏆、创新点改进👇💡YOLOAir项目:基于YOLOv5代码框架,结合不同模块来构建不同的YOLO目标检测模型。🌟本项目包含大量的改进方式,降低改进难度,改进点包... 查看详情

yolov8模型学习笔记

...世的YOLOv8算法吧。值得一提的是,YOLOv8相较于先前的YOLO系列算法,其目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。此外,现在各个YOLO系列改进算法都在COCO上面有明显性能提升,但是... 查看详情

芒果改进yolov5系列:首发使用最新wise-iou损失函数,具有动态聚焦机制的边界框回归损失,yolo涨点神器,超越ciou,siou性能,提出了bbr的基于注意力的损失wiou函数

查看详情

芒果改进目录一览|改进yolov5yolov7等yolo模型全系列目录(代码片段)

芒果改进系列必读🔥博客内的改进文章,内均包含多种模型改进方式,均适用于YOLOv5系列以及YOLOv7系列改进(重点)!!!🔥专栏创新点教程均有不少同学反应和我说已经在自己的数据集上有... 查看详情

yolov5改进助力涨点

🚀🚀🚀对YOLOv5进行一系列改进,助力模型涨点(具体源码可以私信我)看到都会回复YOLOv5改进损失函数(EIOU、alphaIOU等)📈添加注意力机制(CBAM、SE等)📌结合最新特征金字塔网... 查看详情