ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO-World 模型部署指南:基于 easydeploy 的 ONNX / TensorRT 端到端导出与推理

YOLO-World 模型部署指南:基于 easydeploy 的 ONNX / TensorRT 端到端导出与推理 人工智能计算机视觉深度学习【免费下载链接】YOLO-World[CVPR 2024] Real-Time Open-Vocabulary Object Detection项目地址https://gitcode.com/gh_mirrors/yo/YOLO-World点击查看免费下载YOLO-World 是一个支持开放词汇检测Open-Vocabulary Detection的实时目标检测框架训练完成后的模型需要经过格式转换才能在 ONNX Runtime、TensorRT 等推理后端上高效运行。本文以仓库中 deploy/easydeploy/README_zh-CN.md 及其配套的 模型转换教程 为主线结合仓库源码系统讲解 easydeploy 部署子工程的背景、端到端 ONNX 导出、仅导出 BackboneNeck、ONNX Runtime 推理以及 TensorRT 引擎构建的完整流程帮助你掌握一套不依赖 MMDeploy 的轻量部署方案。一、easydeploy独立的轻量级部署子工程1.1 设计动机传统 MMYOLO 模型部署通常依赖 MMDeploy 体系配置繁琐、学习成本高。为此仓库将 easydeploy 作为独立的部署 project 提供意图剥离 MMDeploy 当前的体系单独支持用户完成模型训练后的转换和部署功能降低学习和工程成本见 deploy/easydeploy/README_zh-CN.md。当前 easydeploy 支持将模型转换为ONNX和TensorRT两种格式后续会继续支持 ncnn 等其他推理平台。整个部署子工程位于 deploy/easydeploy/目录结构如下backbone/针对不同后端定制的 Focus 模块实现DeployFocus、NcnnFocus、GConvFocusbbox_code/各算法的 bbox decoder 实现nms/ONNX NMS、TensorRT EfficientNMS / BatchedNMS 算子封装model/核心的DeployModel包装器以及后端包装器ORTWrapper、TRTWrappertools/export_onnx.py导出脚本、build_engine.py构建 TensorRT 引擎、image-demo.py推理演示examples/纯 ONNX Runtime OpenCV 的轻量推理示例main_onnxruntime.py等。1.2 与 YOLO-World 官方部署脚本的分工仓库根目录还提供了面向 YOLO-World 开放词汇特性的官方部署脚本 deploy/export_onnx.py它在 easydeploy 的DeployModel基础上增加了--custom-text自定义文本提示词、--add-padding、--without-nms、--without-bbox-decoder用于 INT8 量化等参数并在导出前调用baseModel.reparameterize([texts])将文本特征编码进检测器对应 yolo_world/models/detectors/yolo_world.py 的reparameterize方法。两套脚本共用同一套 easydeploy 核心代码本文以 easydeploy 原生的 tools/export_onnx.py 为主进行讲解并在文末补充 YOLO-World 特性参数。二、环境依赖与准备工作2.1 安装基础依赖导出 ONNX 模型需要安装 onnxpip install onnx如需在导出时简化模型可可选安装 onnx-simplifierpip install onnx-simplifier注意请确保在仓库根目录下运行相关脚本避免无法找到相关依赖包。2.2 后端矩阵easydeploy 内部通过枚举定义了一套后端名称见 deploy/easydeploy/model/backend.py后端枚举取值说明ONNXRUNTIMEonnxruntimeONNX Runtime导出时默认后端TENSORRT8tensorrt8TensorRT 8.xTENSORRT7tensorrt7TensorRT 7.xOPENVINOopenvinoOpenVINONCNN/RKNN/HORIZONX3/AX620A等各自取值嵌入式后端当前以--model-only方式导出从 export_onnx.py 主流程 可以看到只有onnxruntime、openvino、tensorrt8、tensorrt7四个后端支持把后处理bbox decode NMS一起导出其他后端因无法导出后处理脚本会自动将model_only置为 True只导出骨干网络部分。三、导出后端支持的端到端 ONNX 模型3.1 命令行参数详解使用 deploy/easydeploy/tools/export_onnx.py 将 MMYOLO 模型转换为 ONNX各参数含义如下参数默认值说明config必填构建模型使用的配置文件例如configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.pycheckpoint必填训练得到的权重文件例如yolov5s.pth--work-dir./work_dir转换后模型保存路径--img-size[640, 640]转换模型时输入的尺寸高 宽--batch-size1转换后模型的输入 batch size--devicecuda:0转换模型使用的设备--simplify关闭是否用 onnx-simplifier 简化导出的 ONNX需要先安装 onnxsim--opset11导出 ONNX 的 opset 版本--backendonnxruntime导出后处理针对的后端onnxruntime/tensorrt8/tensorrt7--pre-topk1000进入 NMS 之前筛选候选框的个数阈值--keep-topk100NMS 之后输出的候选框个数阈值--iou-threshold0.65NMS 中过滤重复框的 IoU 阈值--score-threshold0.25NMS 中过滤候选框的得分阈值--model-only关闭仅导出 backbone neck不包含后处理这些默认值都能在 export_onnx.py 的参数解析代码 中找到对应实现。值得注意的是--img-size支持传 1 个或 2 个值若只传一个值脚本会用args.img_size * 2 if len(args.img_size) 1 else 1将其翻倍为[h, w]。3.2 端到端导出示例python ./projects/easydeploy/tools/export.py \ configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ yolov5s.pth \ --work-dir work_dir \ --img-size 640 640 \ --batch 1 \ --device cpu \ --simplify \ --opset 11 \ --backend 1 \ --pre-topk 1000 \ --keep-topk 100 \ --iou-threshold 0.65 \ --score-threshold 0.25说明原文档示例中的--batch、--backend 1写法是 MMYOLO 早期版本参数当前仓库 export_onnx.py 中的实际参数名为--batch-size和--backend onnxruntime|tensorrt8|tensorrt7字符串请以当前仓库参数为准。导出后可以利用后端自带工具如 TensorRT 的trtexec或下文介绍的build_engine.py读取该 ONNX再转换为后端原生格式如.engine/.plan。MMYOLO 目前支持TensorRT8、TensorRT7、ONNXRuntime后端的端到端模型转换且仅支持静态 shape模型的导出与转换动态 batch 或动态长宽的端到端转换会在未来版本继续支持。3.3 端到端模型的输入输出约定端到端转换得到的 ONNX 模型输入输出如下输入名images尺寸640x640由--img-size决定输出名num_dets尺寸1x1表示检测目标数量输出名boxes尺寸1x100x4表示检测框坐标格式为x1y1x2y2输出名scores尺寸1x100表示检测框的分数输出名labels尺寸1x100表示检测框的类别 id。推理时可以利用num_dets对boxes、scores、labels进行截断从 100 个检测结果中抽取前num_dets个目标作为最终检测结果。上述输入输出名定义在 export_onnx.py 的导出逻辑 中input_names[images]、output_names[num_dets, boxes, scores, labels]。若指定了tensorrt8/tensorrt7后端脚本还会修复 ONNX 输出张量的静态 shapebatch_size x 1、batch_size x keep_topk x 4、batch_size x keep_topk等便于查看。3.4 源码视角端到端导出如何发生端到端导出的核心在 deploy/easydeploy/model/model.py 的DeployModelforward()中先让 backbone neck 处理输入得到多尺度特征neck_outputs self.baseModel(inputs)随后调用pred_by_feat()完成 decode NMSpred_by_feat()会按检测头类型选择对应的 bbox decoderYOLOv5/YOLOv7 用yolov5_bbox_decoderRTMDet 用rtmdet_bbox_decoderYOLOX 用yolox_bbox_decoder其余走self.bbox_decoder见 model.py并按后端选择 NMS 实现onnxruntime/openvino→ 标准的 ONNXNonMaxSuppression算子onnx_nms见 deploy/easydeploy/nms/ort_nms.pytensorrt8→ TensorRT 的EfficientNMS_TRT插件efficient_nmstensorrt7→ TensorRT 的BatchedNMSDynamic_TRT插件batched_nms。__switch_deploy()还会对模型做部署友好改造把RepVGGBlock切换为部署形态switch_to_deploy()把Focus结构替换为等价且对后端友好的实现。对 ONNX Runtime / OpenVINO / TensorRT 使用DeployFocus纯 reshape permute 实现见 deploy/easydeploy/backbone/focus.py对 ncnn 使用NcnnFocus其余后端使用GConvFocus四个分组卷积替代切片操作。四、仅导出 Backbone Neck--model-only当需要部署到不支持端到端后处理的平台如各类嵌入式设备时可以使用--model-only参数且不要传递--backend参数即可导出仅包含 Backbone Neck 的模型。4.1 使用示例python ./projects/easydeploy/tools/export.py \ configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py \ yolov5s.pth \ --work-dir work_dir \ --img-size 640 640 \ --batch 1 \ --device cpu \ --simplify \ --opset 11 \ --model-only4.2 优缺点分析这种导出方式获取的 ONNX 模型具有如下优点算子简单一般而言只包含 Conv、激活函数等简单算子几乎不存在无法正确导出的情况对嵌入式部署更加友好便于公平对比不同算法的后处理各不相同只对比 Backbone Neck 的速度更加公平。同时也有如下缺点后处理需自行实现需要额外完成 decode NMS 的逻辑性能不如 TensorRT 端到端TensorRT 可以利用多核优势并行进行后处理--model-only方式导出的模型整体性能会差很多。从源码看--model-only导出时postprocess_cfgNoneDeployModel的with_postprocessFalseforward()只返回多尺度特征图见 model.py同时检测头的reg_max会被置 0、YOLOv5/YOLOv7 的 head 会替换forward_single以去除隐式层等训练期结构见 model.py。五、使用 model-only 导出的 ONNX 进行推理5.1 环境依赖推理脚本 需要基础依赖环境依赖清单见 deploy/easydeploy/examples/requirements.txtpip install onnxruntime pip install opencv-python4.7.0.72 # 建议使用最新的 opencv5.2 命令行参数参数默认值说明img必填待检测的图片路径或图片文件夹路径onnx必填导出的 model-only ONNX 模型--type必填模型名称支持yolov5、yolox、yolov6、ppyoloe、ppyoloep、yolov7、rtmdet、yolov8--img-size[640, 640]转换模型时输入的尺寸高 宽--out-dir./output保存检测结果的路径--show关闭是否可视化检测结果--score-thr0.3模型检测后处理的置信度分数阈值--iou-thr0.7模型检测后处理的 IoU 阈值--type对应的模型枚举定义在 deploy/easydeploy/examples/config.py 的ModelType中。5.3 运行示例cd ./projects/easydeploy/examples python main_onnxruntime.py \ image_path_to_detect \ yolov5_s_model-only.onnx \ --out-dir work_dir \ --img-size 640 640 \ --show \ --score-thr 0.3 \ --iou-thr 0.75.4 自定义数据集时的必要修改注意当使用自定义数据集训练得到的模型时请修改 deploy/easydeploy/examples/config.py 中的CLASS_NAMES和CLASS_COLORS如果是 YOLOv5 或 YOLOv7 这类基于 anchor 的模型请同时修改YOLOv5_ANCHORS和YOLOv7_ANCHORS仓库默认值分别对应 COCO 的 80 类类别名、80 组颜色以及 YOLOv5/YOLOv7 的三尺度 anchor见 config.py。5.5 推理脚本的完整工作流main_onnxruntime.py 的推理流程可以拆解为四步每一步在 examples 目录中都有独立模块预处理deploy/easydeploy/examples/preprocess.py按模型类型选择归一化参数YOLOv5/v6/v7/v8 使用mean0, std255的 RGB 归一化YOLOX 使用std1且 BGRRTMDet 使用 ImageNet 风格 mean/std随后 resize、HWC→CHW 转置并归一化ONNX Runtime 推理session.run(None, {images: img})得到多尺度特征输出纯 NumPy 解码deploy/easydeploy/examples/numpy_coder.pyDecoder类按模型类型分发到__yolov5_decode、__yolox_decode、__ppyoloe_decode、__yolov6_decode、__yolov7_decode、__rtmdet_decode、__yolov8_decode等实现完成 anchor 还原、sigmoid、坐标换算如 YOLOv5 的(x*2-0.5wIdx)*strideNMSdeploy/easydeploy/examples/cv2_nms.py调用 OpenCV 的cv2.dnn.NMSBoxesBatchedOpenCV 4.7或NMSBoxes完成非极大值抑制并把x0y0wh格式转换为x0y0x1y1。其中numpy_coder.py是当前所有算法仅使用 NumPy 实现的 decoder如果对性能有较高要求可以参照相关代码改写为 C/C 实现。六、构建 TensorRT 引擎与部署推理6.1 将 ONNX 构建为 TensorRT 引擎easydeploy 提供了 tools/build_engine.py 用于把导出的 ONNX 构建为 TensorRT.engine文件python tools/build_engine.py path/to/model.onnx \ --img-size 640 640 \ --device cuda:0 \ --scales [[1,3,640,640],[1,3,640,640],[1,3,640,640]] \ --fp16参数说明对应 build_engine.pycheckpoint必填待转换的.onnx文件脚本会断言后缀为.onnx--img-size默认[640, 640]构建引擎的输入尺寸--device默认cuda:0TensorRT 构建设备--scales动态输入 shape 的优化 profilemin/opt/max 三组默认三组均为[1,3,640,640]--fp16以 FP16 精度构建脚本会自动检测builder.platform_has_fast_fp16。构建的核心逻辑在EngineBuilder.__build_engine见 build_engine.py使用 ONNX parser 读取网络、设置max_workspace_size、创建优化 profile、可选开启 FP16最终序列化写入与 ONNX 同名的.engine文件。6.2 后端包装器ORTWrapper 与 TRTWrappereasydeploy/model/backendwrapper.py 提供了两个可直接面向推理的包装器ORTWrapper封装 ONNX Runtime 的InferenceSession支持 CPU / CUDA ExecutionProvider 自动选择输出转为 PyTorch TensorTRTWrapper封装 TensorRT 反序列化引擎与执行上下文支持动态 shape 的 binding shape 设置并通过 CUDA stream 异步执行后同步。这两个包装器被 tools/image-demo.py 使用当传入的 checkpoint 是.onnx时走ORTWrapper是.engine/.plan时走TRTWrapper推理后按num_dets截断结果并利用pad_param、scale_factor将坐标还原到原图尺寸。七、YOLO-World 开放词汇模型的部署扩展对于 YOLO-World 的开放词汇能力需要把文本提示词一起固化为模型的一部分仓库根目录的 deploy/export_onnx.py 专门处理这一场景。7.1 自定义文本 JSON--custom-text参数接收一个Text JSON文件其格式为二维字符串数组每个元素是该类别对应的一个或多个文本描述[ [A_1,A_2], [B], [C_1, C_2, C_3], ... ]仓库已提供 COCO、LVIS、Objects365 的现成文本文件例如 data/texts/coco_class_texts.json、data/texts/lvis_v1_class_texts.json、data/texts/obj365v1_class_texts.json。若不指定--custom-text脚本默认使用CocoDataset.METAINFO[classes]作为类别见 deploy/export_onnx.py。7.2 导出命令PYTHONPATH./ python deploy/export_onnx.py path/to/config path/to/weights --custom-text path/to/customtexts --opset 117.3 无后处理导出与 INT8 量化若不希望把 NMS 后处理包含进 ONNX可加--without-nms若要基于 ONNX 做 INT8 量化建议同时去掉 NMS 和 bbox decoder加--without-bbox-decoder此模式下output_names变为[scores, boxes]见 deploy/export_onnx.py。导出 ONNX 后可直接用官方演示脚本推理脚本为空文件onnx_demo.py对应的能力见 docs/deploy.md 中的命令python deploy/onnx_demo.py path/to/model.onnx path/to/images path/to/texts7.4 常见问题einsum 算子与 opset 11导出时可能遇到如下错误RuntimeError: Exporting the operator einsum to ONNX opset version 11 is not supported. Support for this operator was added in version 12, try exporting with this version.原因YOLO-World 在文本-图像对比对齐中使用torch.einsum做矩阵乘法例如 yolo_world/models/dense_heads/yolo_world_head.py 中ContrastiveHead的torch.einsum(bchw,bkc-bkhw, x, w)而 ONNX opset 11 不支持该算子。解决方案两种任选其一若设备支持将--opset从11提升到12在MaxSigmoidCSPLayerWithTwoConv与YOLOWorldHeadModule中设置use_einsumFalse改用permute/reshape/matmul等价实现ContrastiveHead与BNContrastiveHead均已内置该分支见 yolo_world_head.py可参考仓库提供的无 einsum 示例配置 configs/pretrain/yolo_world_v2_m_vlpan_bn_noeinsum_2e-3_100e_4x8gpus_obj365v1_goldg_train_lvis_minival.py。八、部署方案选型建议场景推荐方案说明快速验证 / CPU 推理--backend onnxruntime端到端导出输出自带 NMS 的 4 个张量配合num_dets截断即可用GPU 高性能推理ONNX →build_engine.py构建 TensorRT 引擎TensorRT 插件并行执行后处理延迟更低嵌入式 / 异构平台--model-only导出算子简单、可移植性好但需自行实现 decode NMS开放词汇定制场景官方 deploy/export_onnx.py --custom-text将自定义文本重参数化进模型后导出INT8 量化--without-bbox-decoder导出去掉 NMS 与 bbox decoder 后再做量化九、延伸阅读deploy/easydeploy/README_zh-CN.mdeasydeploy 部署子工程总览deploy/easydeploy/docs/model_convert.mdONNX 转换教程本文核心依据docs/deploy.mdYOLO-World 官方的 ONNX / TensorRT / TFLite 部署说明docs/tflite_deploy.mdTFLite INT8 量化部署流程deploy/easydeploy/examples/main_onnxruntime.py轻量 ONNX Runtime 推理示例deploy/easydeploy/tools/build_engine.pyTensorRT 引擎构建脚本。赞分享人工智能计算机视觉深度学习【免费下载链接】YOLO-World[CVPR 2024] Real-Time Open-Vocabulary Object Detection项目地址https://gitcode.com/gh_mirrors/yo/YOLO-World点击查看免费下载相关推荐HVE Core安全架构师指南Security Planner到RAI Planner的完整路径HVE Core安全架构师指南Security Planner到RAI Planner的完整路径 HVE Core 是 GitHub Copilot 生态中一人工智能计算机视觉深度学习Polar Python SDK 从 1.0.0 迁移到 1.x 完整指南新版客户端、分页、模型与 Webhook 改造实践Polar Python SDK 从 1.0.0 迁移到 1.x 完整指南新版客户端、分页、模型与 Webhook 改造实践 本文面向依赖 polar sd人工智能计算机视觉深度学习YOLOv8 ONNX 模型 OpenCV DNN 推理实战指南从模型导出到端到端部署基于 Ultralytics 仓库实例YOLOv8 ONNX 模型 OpenCV DNN 推理实战指南从模型导出到端到端部署基于 Ultralytics 仓库实例 YOLOv8 是 Ultra人工智能深度学习计算机视觉上一篇终极指南如何用 Rust 扩展 Godot 4 游戏引擎 下一篇CodeQL C/C 静态缓冲区溢出检测从 cpp/static-buffer-overflow 的精度升级看安全查询工程化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表