(24)目标检测算法之YOLOv6 (2)量化与部署详解

news2024/11/15 19:32:26

目标检测算法之YOLOv6 (2)量化与部署详解

    1. 详解量化训练方式
    1. 详解部署方法:onnx 、openvnio、 tensorrt
    1. YLOLOv6目前发布的模型:从模型大小方面来看,可分为微小型(Nano),小(Small),中(Medium),大模型(Large);从用户使用场景方面来看,可分为基础版(base),进阶版(advance),高精版(high-precision)。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

1. 量化

  • 对于量化新手同学,我们推荐选择基础版(base)模型,并直接采用 PTQ 的方式进行模型量化并部署。

1.1 基础版模型PTQ量化(推荐)

  • 模型训练完成后,首先参考ONNX模型导出生成对应的ONNX模型,然后根据以下命令进行 PTQ生成 TRT 量化模型
python deploy/TensorRT/onnx_to_trt.py -m ./yolov6s_base.onnx \
                                      -d int8 \
                                      --batch-size 32 \
                                      --num-calib-batch 4 \
                                      --calib-img-dir ../coco/images/train2017/  \
                                      --calib-cache ./yolov6s_base-int8-4x32.cache

1.2 进阶版RepOPT

进阶版模型大量采用重参数化结构,但在提升模型精度的同时,也为模型的量化带来了困难,该模型直接采用 PTQ 部署一般很难获得可接受的量化精度。为此,我们针对进阶版模型准备了一套基于 RepOPT 算法的量化流程。该方案需要首先采用 RepOPT 结构重新训练网络,然后再基于该网络预训练权重进行模型量化。该网络的部署模型结构与原网络基于 RepVGG 版本的 deploy 模型完全一致。

  • RepOpt两阶段训练
  • RepOptimizer给出了一种量化友好的重参数化网络训练范式。该方法采用优化器Optimizer的重参数化操作来代替结构的重参数化过程,从而保持网络结构在train和deploy阶段保持一致。该方法分为两个步骤: 步骤一: 超参数搜索(Hyper-Search)。该阶段通过训练LinearAddBlock获得超参数scale(通过 scale.pt 的形式存储),来初始化RepOPT结构的Optimizer。您可以直接使用我们所发布的超参数预训练模型,跳过该步骤;或者选择重新搜索获得自己的超参数scale
python tools/train.py --batch 32 --conf configs/repopt/yolov6s_hs.py --data data/coco.yaml --device 0

已发布的scale.pt见:yolov6n_scale.pt、yolov6t_scale.pt、yolov6s_scale.pt、yolov6m_scale.pt.

  • 步骤二: 模型训练,载入上一步所得scale.pt文件,config中配置flag training_mode='hyper_search',训练代码如下,获得预训练模型yolov6s_reopt.pt.
python -m torch.distributed.launch --nproc_per_node 8 tools/train.py \
									--batch 256 \
									--conf configs/repopt/yolov6s_opt.py \
									--data data/coco.yaml \
									--epoch 300 \
									--device 0,1,2,3,4,5,6,7 \
									--name yolov6s_coco_repopt # yolov6l_coco

1.3 量化感知训练

  • 对生产的RepOPT预训练模型进行QAT提升量化精度,该步骤依赖于pytorch_quantization,请先参考教程安装。该过程需要首先通过calib过程获得一个calib.pt文件,然后传入第二步进行QAT训练.
  • 步骤一: 数据校准(Calibration)。
CUDA_VISIBLE_DEVICES=0 python tools/train.py \
       --data ./data/coco.yaml \
       --output-dir ./runs/opt_train_v6s_ptq \
       --conf configs/repopt/yolov6s_opt_qat.py \
       --quant \
       --calib \
       --batch 32 \
       --workers 0

步骤二: 量化感知训练(QAT)。该过程结合了CWD蒸馏,加载calib.pt文件,训练10个epoch即可获得量化精度的提升,获得量化模型yolov6s_reopt_qat.pt

CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node=8 \
       tools/train.py \
       --data ./data/coco.yaml \
       --output-dir ./runs/opt_train_v6s_qat  \
       --conf configs/repopt/yolov6s_opt_qat.py \
       --quant \
       --distill \
       --distill_feat \
       --batch 128 \
       --epochs 10 \
       --workers 32 \
       --teacher_model_path ./assets/yolov6s_v2_reopt_43.1.pt \
       --device 0,1,2,3,4,5,6,7

1.4 量化模型导出及转换

  • 导入前两步所得pt模型,导出成ONNX模型。
python3 qat_export.py --weights yolov6s_reopt.pt --quant-weights yolov6s_reopt_qat.pt --graph-opt --export-batch-size 1

执行该步骤可以得到带QDQ算子的ONNX模型,和不带QDQ算子的ONNX模型及对应的cache文件(带_remove_qdq_后缀),然后在目标部署环境下使用trtexec工具来生成trt模型进行部署,例如:

trtexec --workspace=1024 --percentile=99 --streams=1 --onnx=***_remove_qdq.onnx --calib=***_remove_qdq_add_insert_

1.5 TRT模型精度测试

YOLOv6提供了TRT模型精度测试的脚本,使用如下:

python deploy/TensorRT/eval_yolo_trt.py \
       --imgs-dir ../data/coco/images/val2017/ \
       --annotations ../data/coco/annotations/instances_val2017.json \
       -m ***_remove_qdq.trt

2. 部署

2.1 ONNX 模型导出

  • 环境依赖
pip install onnx>=1.10.0
  • 导出脚本
python ./deploy/ONNX/export_onnx.py \
    --weights yolov6s.pt \
    --img 640 \
    --batch 1 \
    --simplify
  • Description of all arguments
--weights : yolov6 模型权重路径

--img : 模型输入图片尺寸,默认640

--batch : 模型输入的批大小

--half : 是否导出半精度(fp16)模型

--inplace : 是否需要设置Detect()类inplace为True

--simplify : 是否采用onnx-sim简化模型,端到端导出模型不支持简化

--end2end : 是否需要导出端到端的onnx模型,仅支持 onnxruntime 和 TensorRT >= 8.0.0

--trt-version : TensorRT 版本,支持7或8

--ort : 是否为 onnxruntime 后端导出模型

--with-preprocess : 是否需要预处理操作(bgr2rgb和归一化)

--topk-all : 保留每张图像的topK个目标

--iou-thres : NMS算法使用的IOU阈值

--conf-thres : NMS算法使用的置信度阈值

--device : 导出时用的环境设备,如显卡0或CPU
  • 下载

    • YOLOv6-N
    • YOLOv6-S
    • YOLOv6-M
    • YOLOv6-L
  • 端到端导出模型

    • 现在 YOLOv6 支持 onnxruntime 和 TensorRT 的端到端检测!
    • 如果你想在 TensorRT 中部署,请确保你已经安装了 TensorRT!
  • onnxruntime 后端

使用方式
python ./deploy/ONNX/export_onnx.py \
    --weights yolov6s.pt \
    --img 640 \
    --batch 1 \
    --end2end \
    --ort
您将获得带有 NMS 操作的 onnx 模型。
  • TensorRT 后端 (TensorRT version == 7.2.3.4)
使用方式
python ./deploy/ONNX/export_onnx.py \
    --weights yolov6s.pt \
    --img 640 \
    --batch 1 \
    --end2end \
    --trt-version 7
您将获得带有 BatchedNMSDynamic_TRT 插件的 onnx 模型。
  • TensorRT 后端 (TensorRT version>= 8.0.0)
使用方式
python ./deploy/ONNX/export_onnx.py \
    --weights yolov6s.pt \
    --img 640 \
    --batch 1 \
    --end2end \
    --trt-version 8
您将获得带有 BatchedNMSDynamic_TRT 插件的 onnx 模型。
  • 输出描述,onnx 输出如图所示:
    在这里插入图片描述

num_dets 表示其批次中每个图像中的目标数

det_boxes 表示 topk(100) 目标的坐标信息 [x0,y0,x1,y1] .

det_scores 表示每个 topk(100) 个对象的置信度分数

det_classes 表示每个 topk(100) 个对象的类别

您可以使用 trtexec 工具导出 TensorRT 引擎。

  • 使用方式
trtexec --onnx=yolov6s.onnx \
        --saveEngine=yolov6s.engine \
        --workspace=8192 # 8GB
        --fp16 # if export TensorRT fp16 model
  • 评估 TensorRT 模型性能,当我们得到 TensorRT 模型后,我们可以通过以下方式评估其性能:
python deploy/ONNX/eval_trt.py --weights yolov6s.engine --batch-size=1 --data data/coco.yaml
  • 动态批量推理,YOLOv6支持动态批量导出和推理,请参考以下教程:

    • export ONNX model with dynamic batch

    • export TensorRT model with dynamic batch

2.2 YOLOv6-TensorRT(C++)

  • 环境依赖
TensorRT-8.2.3.0
OpenCV-4.1.0
  • 第一步:获取onnx模型,按照指引 ONNX README 将 pt 模型转换为 onnx 模型 yolov6n.onnx.
python ./deploy/ONNX/export_onnx.py \
    --weights yolov6n.pt \
    --img 640 \
    --batch 1
  • 第二步:准备序列化引擎文件,按照指引 post training README 转换并保存序列化引擎文件 yolov6.engine.
python3 onnx_to_tensorrt.py --fp16 --int8 -v \
        --max_calibration_size=${MAX_CALIBRATION_SIZE} \
        --calibration-data=${CALIBRATION_DATA} \
        --calibration-cache=${CACHE_FILENAME} \
        --preprocess_func=${PREPROCESS_FUNC} \
        --explicit-batch \
        --onnx ${ONNX_MODEL} -o ${OUTPUT}
  • 第三步:构建 demo,按照指引TensorRT Installation Guide 安装 TensorRT.
    并且您应该在 CMakeLists.txt 中设置 TensorRT 路径和 CUDA 路径。

  • 如果您训练自定义数据集,您可能需要修改 num_classimage width, image heightclass name 的值。

const int num_class = 80;
static const int INPUT_W = 640;
static const int INPUT_H = 640;
static const char* class_names[] = {
        "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
        "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
        "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
        "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
        "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
        "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
        "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
        "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
        "hair drier", "toothbrush"
    };
  • 构建 demo:
mkdir build
cd build
cmake ..
make
  • 运行 demo:
./yolov6 ../you.engine -i image_path
  • 测试图像,您可以使用 .trt 权重对图像进行测试,只需提供图像目录的路径及其注释路径。
python3 deploy/TensorRT/eval_yolo_trt.py -v -m model.trt \
--imgs-dir /workdir/datasets/coco/images/val2017 \
--annotations /workdir/datasets/coco/annotations/instances_val2017.json \
--conf-thres 0.40 --iou-thres 0.45

2.3 OpenVINO 模型导出

  • 环境依赖
pip install --upgrade pip
pip install openvino-dev
  • 导出脚本
python deploy/OpenVINO/export_openvino.py --weights yolov6s.pt --img 640 --batch 1
  • 速度测试
benchmark_app -m yolov6s_openvino/yolov6s.xml -i data/images/image1.jpg -d CPU -niter 100 -progress

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【单周期CPU】LoongArch | 32位寄存器DR | 32位的程序计数器PC | 通用寄存器堆Registers | 32位RAM存储器

前言:本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本时序逻辑部件设计。 💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 2017.…

黑马微信小程序登录弹窗问题与解决的说明

1.问题 1.1开发者工具报错 [getFuzzyLocation] is not authorized如何解决? 1.2弹窗问题 2.解决方法 2.1开发工具报错问题 首先登录微信公众平台,找到开发管理。如下图 然后开通wx.getFuzzyLocation 申请模版,通过速度很多,…

24小时不定时价格监测如何做到

在做电商平台的数据监测时,品牌需要对线上监测的数据进行不定时监测,这是因为品牌做价格监测的目的是为了管控渠道,如果对店铺只能在特定的时间进行监测,那对于其他时间段的低价行为将不被发现,这也会使品牌渠道管控的…

【Redis】配置

🎯Redis 配置 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为 redis.windows.conf)。 1、查看配置 语法如下通过 config get 命令查看或设置配置项。 CONFIG GET 配置的名字 使用 * 号获取所有配置项 127.0.0.1:6379>…

Parsing error: Unexpected token :

如果你创建的是Vue3的项目还报这个错误的话,很可能就是.eslintrc.js配置的问题。 我为了省事把vue2项目的.eslintrc.js复制到vue3的项目了。。 .eslintrc.js module.exports {root: true,env: {node: true,},extends: [plugin:vue/vue3-essential,eslint:recomm…

【哈士奇赠书活动 - 29期】- 〖人工智能与ChatGPT〗

文章目录 ⭐️ 赠书 - 《人工智能与ChatGPT》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《人工智能与ChatGPT》 ⭐️ 内容简介 人们相信人工智能可以为这个时代的技术带来突破,而ChatGPT则使这种希望成为现实。现在&#xff0…

自定义View实战《弹幕》

自定义View实战《弹幕》 前言一、步骤讲解二、缓存优化三、弹幕框架DanmakuFlameMaster介绍DanmakuFlameMasterDanmakuFlameMaster的使用 四、初步实现的完整代码总结 前言 前面已经学习了自定义的View《渐变色的文字》是继承View的。现在我们在继承ViewGroup来实现我们的《弹…

C++【初识哈希】

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 🌇前言🏙️正文1、哈希思想2、哈希函数2.1、哈希函数的设计原则2.2、常见的哈希函数 3、哈希…

曹操最有名的4首诗

在中国帝王级的人物中间,真正称得上诗人的,曹操必定是最杰出一个。 曹操简介: 曹操(155年-220年正月庚子),字孟德,一名吉利,小字阿瞒,沛国谯(今…

Redis实现用户签到

用户签到 现在许多的APP或者网上应用为了提高用户的活跃度,都会设置一个每日签到的活动,签到完成后会给予一定的奖励,从而达到其目的。 而记录用户的签到信息可以使用如下一张数据库表来进行记录。 在用户数量并不多的情况下,数…

排序算法--冒泡排序(Java语言)

冒泡排序(Bubble Sort)是啥? 冒泡排序是一种简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素…

Android:Lifecycle

整体架构 LifecycleOwner Lifecycle持有者 在ComponentActivity中new出来,所以Activity和Fragment自带 实现了LifecycleOwner接口的类 可以获得生命周期信息类Lifecycle Fragment和Activity都已经实现了该接口 Lifecycle Registry 生命周期注册器 可以提交生命周…

栈板识别的思考

0.啰嗦几句 最近公司又变动了,所以又做了一个关于视觉的项目。简单说就是栈板定位,主要应用在AGV叉车上,当然这一套流程基本适用于所有的视觉项目。主要是看算法的设计和一些人为的经验。 1.结果图 可以看到在图像上3个托盘都分割出来了&am…

青少年机器人技术一级核心知识点:机械结构及模型(三)

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

2024考研408-计算机组成原理第七章-输入输出系统学习笔记

文章目录 前言一、IO系统基本概念1.1、输入/输出系统基本概念1.1.1、现代计算机的结构1.1.2、常见的I/O设备1.1.3、主机与I/O设备如何进行交互?(认识I/O接口)1.1.4、I/O系统的基本组成(I/O硬件、I/O软件)本节回顾 1.2、…

标配8155,智驾延续「高低配」,小鹏G6能否挽回颜面?

对于小鹏汽车来说,G6就是最后的尊严。 高工智能汽车研究院监测数据显示,2023年1-5月,小鹏汽车交付量为3.22万辆,同比上年同期下滑39.81%,是「蔚小理」三家新势力中唯一下滑的一家。 去年上市的G9(何小鹏口中…

基于声音信号的工业设备异常检测

异常检测主要目标是将异常事件与正常事件区分开来,因此才有了“异常”一词。本文将介绍基于声音信号的工业机械异常检测,使用的数据集是MIMII声音数据集,该数据集很容易在网上获得。 异常检测的任务可以通过多种方式实现。其中最简单的一种方…

Hadoop基础——HDFS知识点梳理

HDFS基础知识 1. 介绍一下HDFS组成架构? 组成部分: HDFS Client,NameNode,DataNodeSecondary NameNode( HA模式下是 StandBy NameNode) Client: 客户端 文件切分,文件上传HDFS时,client将文件切分成一个一个的block&#xff0…

玩转中文AI模型攻略——ModaHub魔搭社区攻略

目录 1. 注册和登录: 2. 浏览和搜索: 3. ModaHub排行榜: 4. AI应用导航: 5. 向量数据库: 6. 企业Chatbot: ModaHub魔搭社区是一个中文AI模型开源社区,旨在为开发者和研究者提供一个交流、…

抓住出海中东热潮,茄子科技(海外SHAREit Group)有效助力游戏企业出海

近年来,随着国际形势的紧张,不少中国出海企业在海外市场营收受到了不同程度的影响。为摆脱这一困境,大家开始将目光瞄准了海外新兴市场,其中中东以其高速的增长,量利双收的回报赢得了不少中国出海企业的青睐。 与此同…