【YOLOv5】【模型压缩与加速】【量化】FP32、FP16、INT8

量化是将模型参数的存储类型从高精度存储降到低精度存储,从而达到减小模型体积大小、加快模型推理速度的效果。

目录

FP32量化

FP16量化

INT8量化

FP32量化

这个直接使用yolov5的export导出32位存储的 engine格式模型即可

python export.py --weights runs/train/exp4/weights/best.pt --include onnx engine --device 0

可以看到32位浮点型模型的onnx大小为7.1MB,engine大小为9.5MB。

 然后我们用32位的engine模型进行推理

python detect.py --weights runs/train/exp4/weights/FP32.engine --source ikunData/images

其每张照片的推理速度为4.9ms,比我们用原模型推理的速度要快上一倍(9.5ms)。

 32位engine模型的检测效果如下图所示。

FP16量化

python export.py --weights runs/train/exp4/weights/best.pt --include onnx engine --half --device 0

从32位浮点型转为16位浮点型的onnx模型大小减小了一半,从7.1MB减小到了3.6MB,其engine模型大小从9.5MB减小到了6.1MB,模型压缩效果模型。

再看看16位的模型加速效果

python detect.py --weights runs/train/exp4/weights/FP16.engine --source ikunData/images

此时的模型已经从32位的4.9ms推理速度提高到了2.3ms,加速效果明显。

与之同时,16位模型的检测效果却与32位的效果基本一样,在模型体积减小,推理速度加快的情况下,能够达到检测效果基本一样,说明16位量化效果十分成功。

INT8量化

我们还可以进一步量化,我们可以将模型量化为int8位存储,但是由于yolov5自带的export的int8导出效果好像并不好,因此int8量化要复杂一下。

我们首先拿到onnx格式的模型,这个我们在FP32量化的时候已经拿到了,在网上搜罗了一番,勉强可以找到一个将onnx转换为int8存储的engine的代码,但是由于这个代码有点年份了,使用到的TensorRT的版本老了,新的TensorRT已经不支持一些属性。

于是,经过一晚上加一下午代码的愉悦修改

具体请看【yolov5】onnx的INT8量化engine-CSDN博客

终于把代码给改对了,最后拿到的模型大小只有4MB。

 但是int8的推理速度和FP16的差不多。

Int8目标检测的效果也要差上一些,从图中可以看到有些鸡没有被检测到,可见改用int8存储后的模型精度要差上一些。

在Jetson Nano上使用TensorRT加速Yolov5的推理可以按照以下步骤进行: 1. 安装TensorRT和Yolov5:首先确保你已经在Jetson Nano上安装了JetPack SDK,该包中包含了TensorRT和CUDA等必要的组件。你可以从NVIDIA官方网站下载并安装JetPack SDK。然后,你可以从Yolov5的GitHub页面获取Yolov5的代码。 2. 将Yolov5模型转换为TensorRT引擎:在Yolov5代码的根目录下,有一个`yolov5s.yaml`文件,它定义了模型的结构和超参数。你可以使用`convert.py`脚本将模型转换为TensorRT引擎。具体命令如下: ``` python convert.py --weights yolov5s.pt --cfg yolov5s.yaml --output yolov5s.engine ``` 这将生成一个名为`yolov5s.engine`的TensorRT引擎文件。 3. 编写推理代码:使用TensorRT引擎进行推理,可以使用Jetson Inference库。首先,确保你已经在Jetson Nano上安装了Jetson Inference库。然后,创建一个新的Python文件,并添加以下代码: ```python import ctypes import numpy as np import cv2 import jetson.inference import jetson.utils ctypes.CDLL('libnvinfer_plugin.so', mode=ctypes.RTLD_GLOBAL) engine_path = 'yolov5s.engine' input_width = 640 input_height = 640 # 加载TensorRT引擎 trt_yolov5 = jetson.inference.detectNet(engine_path, threshold=0.5) # 加载输入图像 input_image = jetson.utils.loadImage('input.jpg') input_image = jetson.utils.cudaFromNumpy(input_image) # 设置网络的输入尺寸 trt_yolov5.SetInputWidth(input_width) trt_yolov5.SetInputHeight(input_height) # 进行目标检测 detections = trt_yolov5.Detect(input_image, input_width, input_height) # 处理检测结果 for detection in detections: class_name = trt_yolov5.GetClassDesc(detection.ClassID) print(f'Object: {class_name}, Confidence: {detection.Confidence:.2f}') left = int(detection.Left) top = int(detection.Top)
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值