人工智能计算机视觉深度学习【免费下载链接】YOLOXYOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/项目地址https://gitcode.com/gh_mirrors/yo/YOLOX点击查看免费下载本指南基于 YOLOX 仓库中的 OpenVINO C 部署文档系统讲解如何将 YOLOX 模型转换为 OpenVINO 中间表示IR并借助仓库自带的 C 推理示例在 Intel 平台CPU/GPU/VPU 等上完成目标检测。读完本文你将掌握从下载官方 OpenVINO 模型、配置 OpenVINO 环境、以 opset 10 导出 ONNX 并转为 IR 的完整链路同时能读懂 yolox_openvino.cpp 中预处理、解码、NMS 与坐标还原的每一行实现具备将 demo 迁移到自定义数据集或嵌入自身 C 项目的能力。一、仓库中的 OpenVINO C Demo 一览YOLOX 的 OpenVINO 部署示例位于demo/OpenVINO目录其中cpp/yolox_openvino.cpp完整的 C 推理程序基于 OpenVINO 2021 版 Inference Engine API 编写输入模型IR 或 ONNX、图片与设备名输出带检测框的_demo.jpgcpp/CMakeLists.txtCMake 构建脚本依赖 OpenCV、InferenceEngine 与 ngraph 三个库README.md本指南对应的官方部署文档涵盖模型下载、环境配置、模型转换、构建与运行四步python/openvino_inference.py功能等价的 Python 版推理脚本可作为 C 结果的对照验证。整个部署链路为PyTorch 权重 → ONNXopset 10→ OpenVINO IR.xml .bin→ C 推理。其中 ONNX 导出依赖 ONNXRuntime 部署文档 与 tools/export_onnx.py 脚本本文会在转换章节一并讲透。二、下载官方 OpenVINO 模型与规格对照官方已为 YOLOX 全系列模型提供转换好的 OpenVINO 模型压缩包格式为yolox_model_openvino.tar.gz随 YOLOX v0.1.1rc0 版本发布。压缩包内即 demo 所需的 IR 文件.xml拓扑描述与.bin权重解压后可直接传给 C demo 的XML_MODEL_PATH参数。各模型规格如下表模型名链接到仓库中对应的实验配置mAP 为 COCO 验证集指标模型参数量GFLOPs测试尺寸mAP权重包YOLOX-Nano0.91M1.08416x41625.8yolox_nano_openvino.tar.gzYOLOX-Tiny5.06M6.45416x41632.8yolox_tiny_openvino.tar.gzYOLOX-S9.0M26.8640x64040.5yolox_s_openvino.tar.gzYOLOX-M25.3M73.8640x64047.2yolox_m_openvino.tar.gzYOLOX-L54.2M155.6640x64050.1yolox_l_openvino.tar.gzYOLOX-Darknet5363.72M185.3640x64048.0yolox_dark_openvino.tar.gzYOLOX-X99.1M281.9640x64051.5yolox_x_openvino.tar.gz选择要点追求极速与低算力平台如嵌入式/边缘设备选择YOLOX-Nano / YOLOX-Tiny其测试尺寸为 416x416与 demo 源码中默认的INPUT_W INPUT_H 416见 yolox_openvino.cpp完全一致追求精度则选YOLOX-L / YOLOX-X640x640mAP 50YOLOX-Darknet53对应实验配置 exps/default/yolov3.py即 Darknet53 骨干版 YOLOX。若模型测试尺寸不是 416x416则必须在转换阶段指定对应的--input_shape并同步修改 C 源码中的输入宽高常量详见下文第四节。三、安装 OpenVINO Toolkit 并配置环境官方文档要求安装 OpenVINO 2021 版本工具包安装方式请以 OpenVINO 官方安装指南为准仓库文档原文指向其官网 get_started 页面。安装完成后关键路径为/opt/intel/openvino_2021其下包含setupvars.sh环境脚本与 Model Optimizer 转换工具。3.1 临时配置环境每次开新终端都要执行source /opt/intel/openvino_2021/bin/setupvars.sh该命令会把 OpenVINO 的动态库、Model Optimizer 等工具路径注入当前 shell。由于只对当前会话生效每次新建终端窗口后都必须重新执行。3.2 永久配置环境推荐Step1.编辑 shell 配置文件vim ~/.bashrcStep2.在文件末尾追加一行source /opt/intel/openvino_2021/bin/setupvars.shStep3.保存退出后使其立即生效source ~/.bashrc配置完成后setupvars.sh会在每个交互式终端启动时自动执行后续构建与运行 demo 前无需再手动 source。四、模型转换PyTorch → ONNX → OpenVINO IROpenVINO 不直接消费 PyTorch 权重需要先导出 ONNX再用 Model Optimizermo.py转为 OpenVINO IR。4.1 第一步导出 ONNXopset 必须为 10关键前提官方文档明确强调若后续要转换为 OpenVINO导出 ONNX 时必须指定--opset 10否则下一步 Model Optimizer 转换会失败。而 tools/export_onnx.py 中 opset 的默认值是 11因此必须显式传参。以 YOLOX-Tiny 为例cd YOLOX_HOME python3 tools/export_onnx.py --output-name yolox_tiny.onnx -n yolox-tiny -c yolox_tiny.pth -o 10脚本核心参数源自 tools/export_onnx.py 的参数定义--output-name导出 ONNX 文件名默认yolox.onnx-n, --name指定预置模型名可取yolox-nano / yolox-tiny / yolox-s / yolox-m / yolox-l / yolox-x / yolov3-f, --exp_file指定自定义实验配置文件.py路径与-n二选一-c, --ckpt训练得到的权重文件路径-o, --opsetONNX opset 版本默认 11转 OpenVINO 时必须设为 10--no-onnxsim禁用 onnx-simplifier 简化默认会启用简化并校验--dynamic是否导出动态 batch 输入--input/--output输入/输出节点名默认分别为images/output--decode_in_inference是否在导出模型内部完成解码。以-f指定实验文件的方式等价写法python3 tools/export_onnx.py --output-name yolox_tiny.onnx -f exps/default/yolox_tiny.py -c yolox_tiny.pth -o 10自定义模型则用python3 tools/export_onnx.py --output-name your_yolox.onnx -f exps/your_dir/your_yolox.py -c your_yolox.pth -o 10关于输入尺寸脚本使用torch.randn(batch_size, 3, exp.test_size[0], exp.test_size[1])构造 dummy input见 tools/export_onnx.py即 ONNX 的输入形状由实验配置的test_size决定。例如 exps/default/yolox_tiny.py 中test_size (416, 416)而 exps/default/yolox_s.py 未显式覆盖test_size继承默认的 640x640。若想自定义导出尺寸需在实验配置中调整test_size或按官方 ONNX 文档方式修改 dummy input 构造并确保与 C demo 的INPUT_W/INPUT_H一致。4.2 第二步安装 Model Optimizer 的 ONNX 转换依赖进入 Model Optimizer 目录并安装 ONNX 转换所需的 Python 依赖cd INSTALL_DIR/openvino_2021/deployment_tools/model_optimizer sudo ./install_prerequisites/install_prerequisites_onnx.sh4.3 第三步ONNX → OpenVINO IR仍在 Model Optimizer 目录下执行python3 mo.py --input_model ONNX_MODEL --input_shape INPUT_SHAPE [--data_type FP16]参数说明--input_model上一步导出的 ONNX 文件--input_shape必须与 ONNX 导出时的输入形状一致格式如[1,3,416,416]--data_type FP16可选将权重压缩为 FP16可减小模型体积并提升部分设备上的推理速度。官方示例YOLOX-Tiny416 输入python3 mo.py --input_model yolox_tiny.onnx --input_shape [1,3,416,416] --data_type FP16一致性检查转换时指定的--input_shape必须与 C 源码中定义的输入宽高常量保持一致即 yolox_openvino.cpp 中的INPUT_W 416与INPUT_H 416否则推理时输入 Blob 尺寸不匹配会直接报错。转换成功后工作目录会生成同名的.xml与.bin文件二者共同构成 OpenVINO IR后续传给 demo 的是.xml路径。五、C 推理源码深度解析理解了模型来源后我们来逐段拆解 yolox_openvino.cpp 的完整推理流程。该程序严格遵循 OpenVINO 2021 推理样板的标准八步同时内嵌了 YOLOX 特有的解码与后处理逻辑可直接作为移植到其他推理框架的参考。5.1 命令行参数与关键常量main函数首先校验参数个数yolox_openvino.cppif (argc ! 4) { tcout Usage : argv[0] path_to_model path_to_image device_name std::endl; return EXIT_FAILURE; }即运行格式为./yolox_openvino XML_MODEL_PATH IMAGE_PATH DEVICE。文件顶部定义了几个影响检测行为的关键常量yolox_openvino.cpp常量默认值含义NMS_THRESH0.45NMS 的 IoU 阈值BBOX_CONF_THRESH0.3候选框置信度阈值INPUT_W/INPUT_H416 / 416网络输入尺寸NUM_CLASSES80COCO 类别数自定义数据集需修改5.2 推理主流程OpenVINO 标准八步主流程代码yolox_openvino.cpp依次为初始化 Inference Engine CoreCore ie;2021 版新 API替代旧版InferencePlugin读取模型ie.ReadNetwork(input_model)可同时读取 IR.xml或 ONNX.onnx随后校验拓扑必须为单输入单输出否则抛出异常配置输入输出获取输入输出节点名并将输出精度强制设为FP32output_info-setPrecision(Precision::FP32)保证解码时按 float 解释数据加载模型到设备ie.LoadNetwork(network, device_name)device_name即运行参数DEVICE常见取值CPU、GPU、MYRIADIntel Movidius VPU、HDDL、HETERO等与 python/openvino_inference.py 中-d参数支持的设备列表一致创建推理请求infer_request executable_network.CreateInferRequest()准备输入读图、letterbox 缩放、写入输入 Blob见 5.3执行推理infer_request.Infer()同步推理处理输出读取输出 Blob经解码 NMS 坐标还原后绘制保存见 5.45.6。5.3 预处理letterbox 等比缩放 灰度填充static_resizeyolox_openvino.cpp实现标准 YOLOX letterboxfloat r std::min(INPUT_W / (img.cols*1.0), INPUT_H / (img.rows*1.0)); int unpad_w r * img.cols; int unpad_h r * img.rows; cv::resize(img, re, re.size()); cv::Mat out(INPUT_H, INPUT_W, CV_8UC3, cv::Scalar(114, 114, 114)); // 114 灰度填充 re.copyTo(out(cv::Rect(0, 0, re.cols, re.rows)));即按比例缩放图片至 416x416 内多余区域用 RGB(114,114,114) 填充与训练时数据增强的填充值一致避免直接拉伸导致的形变。blobFromImageyolox_openvino.cpp将cv::Mat的 HWC 数据按 NCHW 顺序写入内存 Blob注意这里只做类型转换uint8 → float不做 /255 归一化——因为导出 ONNX 时模型内部已包含归一化层。5.4 解码无锚框输出解析YOLOX 是无锚框anchor-free检测器输出为各 stride 特征图网格上的原始预测需配合网格坐标解码为边界框。源码实现分两步generate_grids_and_strideyolox_openvino.cpp按strides {8, 16, 32}对应 PAFPN 三个检测层枚举每个网格坐标(grid0, grid1)与对应 stridegenerate_yolox_proposalsyolox_openvino.cpp逐网格解码代码注释明确标注了与 yolox/models/yolo_head.py 中 decode 逻辑的一致性// outputs[..., :2] (outputs[..., :2] grids) * strides // outputs[..., 2:4] torch.exp(outputs[..., 2:4]) * strides float x_center (feat_ptr[basic_pos 0] grid0) * stride; float y_center (feat_ptr[basic_pos 1] grid1) * stride; float w exp(feat_ptr[basic_pos 2]) * stride; float h exp(feat_ptr[basic_pos 3]) * stride;随后计算目标置信度与类别分数的乘积box_prob box_objectness * box_cls_score仅保留大于BBOX_CONF_THRESH0.3的候选框。5.5 NMS按置信度降序排序 IoU 抑制qsort_descent_inplaceyolox_openvino.cpp快速排序将候选框按置信度降序排列递归分支用 OpenMP#pragma omp parallel sections并行化nms_sorted_bboxesyolox_openvino.cpp按序贪婪选择若与已保留框的 IoU 大于NMS_THRESH0.45则剔除实现标准单类别 NMS遍历所有类别等价于将 80 类视为一个大类做一次 NMS。5.6 坐标还原、裁剪与可视化decode_outputsyolox_openvino.cpp在 NMS 之后把框坐标从 416x416 空间还原到原始图像空间float x0 (objects[i].rect.x) / scale; // scale 为预处理时的缩放比 ... x0 std::max(std::min(x0, (float)(img_w - 1)), 0.f); // 裁剪到图像边界draw_objectsyolox_openvino.cpp完成对每个检测框按类别取固定调色板颜色绘制矩形与标签文本class_names数组为完整 COCO 80 类列表在 stderr 打印结构化结果label prob at x y w h将结果图保存为当前目录下的_demo.jpg。六、CMake 构建详解CMakeLists.txt 内容非常精简依赖三个通过find_package查找的库cmake_minimum_required(VERSION 3.4.1) set(CMAKE_CXX_STANDARD 14) project(yolox_openvino_demo) find_package(OpenCV REQUIRED) find_package(InferenceEngine REQUIRED) find_package(ngraph REQUIRED) ... add_executable(yolox_openvino yolox_openvino.cpp) target_link_libraries(yolox_openvino ${InferenceEngine_LIBRARIES} ${NGRAPH_LIBRARIES} ${OpenCV_LIBS})要点要求 C14 标准与 CMake 3.4.1InferenceEngine与ngraph两个包的查找路径正是由第三节setupvars.sh注入的必须先 source 环境脚本再执行 cmake否则会因找不到包而配置失败需要系统已安装 OpenCVcv::imread / cv::resize / cv::rectangle等均来自 OpenCV。Linux 下完整构建步骤source /opt/intel/openvino_2021/bin/setupvars.sh mkdir build cd build cmake .. make构建成功后build目录下生成可执行文件yolox_openvino。七、运行 Demo 并验证结果./yolox_openvino XML_MODEL_PATH IMAGE_PATH DEVICE例如使用转换好的 YOLOX-Tiny IR 与 CPU 设备./yolox_openvino yolox_tiny.xml dog.jpg CPU运行说明与验证手段程序要求恰好 4 个参数可执行文件名 模型 图片 设备参数个数不对会打印 Usage 后退出推理过程中会在 stderr 逐行打印检测结果格式为label prob at x y w h如16 0.93152 at 104.00 170.00 261.00 x 379.00检测结果图保存在当前工作目录的_demo.jpg可直接查看若需 GUI 显示可取消draw_objects末尾cv::imshow / cv::waitKey的注释设备名可尝试CPU、GPU需安装 GPU 插件或MYRIAD需接入 Intel NCS2 等 VPU 设备。若同时安装了 Python 环境可用 python/openvino_inference.py 做交叉验证python3 openvino_inference.py -m yolox_tiny.xml -i dog.jpg -o demo_output -s 0.3 -d CPUPython 版内部复用 yolox/utils/demo_utils.py 中的demo_postprocess / multiclass_nms / vis等工具函数与 C 版在解码与 NMS 策略上保持等价。八、常见问题与注意事项opset 必须是 10导出 ONNX 时若使用默认 opset 11或更高Model Optimizer 转换会失败务必加-o 10输入形状三方一致mo.py的--input_shape、ONNX 导出时的test_size、C 源码的INPUT_W/INPUT_H必须统一。换用 640x640 模型如 YOLOX-S时请同步修改 yolox_openvino.cpp 中的常量并重新编译单输入单输出限制demo 只支持单输入单输出拓扑若自定义模型导出后输入输出节点异常例如开启了多输出解码需调整导出配置自定义数据集修改NUM_CLASSES为实际类别数并同步替换class_names数组与color_list长度yolox_openvino.cppFP16 模型使用--data_type FP16转换可缩小体积代码中已强制输出精度为 FP32 供解码使用不受影响每次构建前 source 环境新终端必须先执行source /opt/intel/openvino_2021/bin/setupvars.sh或配置进~/.bashrc否则 CMake 无法找到 InferenceEngine/ngraph。至此从官方权重、ONNX 导出、IR 转换到 C 推理的完整 YOLOX OpenVINO 部署链路已全部打通你可以基于 yolox_openvino.cpp 快速集成到自己的边缘端或服务端 C 推理工程中。赞分享人工智能计算机视觉深度学习【免费下载链接】YOLOXYOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/项目地址https://gitcode.com/gh_mirrors/yo/YOLOX点击查看免费下载相关推荐YOLOX 基于 OpenVINO 的部署实战模型转换、Python 与 C 推理全流程指南YOLOX 基于 OpenVINO 的部署实战模型转换、Python 与 C 推理全流程指南 YOLOX 是一款高性能的 anchor free 检测框架人工智能计算机视觉深度学习YOLOX ncnn部署实战C推理与模型转换全链路解析YOLOX ncnn部署实战C推理与模型转换全链路解析 YOLOX 是旷视开源的高性能无锚点anchor free目标检测模型性能超过 YOLOv3人工智能计算机视觉深度学习CAMEL 开源贡献指南环境搭建、测试与文档流水线、代码审查与编码规范全解CAMEL 开源贡献指南环境搭建、测试与文档流水线、代码审查与编码规范全解 本篇技术文章基于 CAMEL 仓库根目录的 CONTRIBUTING.md htt人工智能计算机视觉深度学习上一篇Metalsmith未来能源可再生技术的静态网站资源库下一篇让流程图不再有障碍js-sequence-diagrams无障碍优化指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考