C++ ONNX Runtime 与 Python Ultralytics 库实现 YOLOv8 模型检测的区别

1. 环境依赖与搭建

Python (Ultralytics 库)

  • 依赖管理 :通过 pip install ultralytics 一键安装,自动处理所有依赖

  • 底层库:无需手动配置 ONNX Runtime、CUDA 等,库会自动管理

  • 安装命令

    bash 复制代码
    pip install ultralytics opencv-python

C++ (ONNX Runtime)

  • 依赖管理:需手动安装和配置 ONNX Runtime、OpenCV 等库

  • 编译配置 :编译时需链接相关库(如 -lonnxruntime -lopencv_core 等)

  • 安装步骤

    bash 复制代码
    # 安装 ONNX Runtime(Ubuntu 示例)
    sudo apt-get install libonnxruntime-dev
    
    # 安装 OpenCV
    sudo apt-get install libopencv-dev
    
    # 编译命令
    g++ -std=c++17 test_onnx_cpp.cpp -o test_onnx_cpp $(pkg-config --cflags --libs opencv4) -lonnxruntime

2. 代码复杂度与开发效率

Python (Ultralytics 库)

  • 核心代码 :极简,仅需 1-2 行代码实现完整推理

    python 复制代码
    from ultralytics import YOLO
    
    model = YOLO('model.onnx')
    results = model(frame)  # 自动处理预处理、推理、后处理
    annotated_frame = results[0].plot()  # 自动绘制检测结果

    C++ (ONNX Runtime)

  • 核心代码 :需手动实现完整流程

    1. 预处理:调整图像大小、BGR→RGB 转换、归一化、转换为 CHW 格式
    2. 推理:创建输入张量、调用 ONNX Runtime API 执行推理
    3. 后处理:解析模型输出、应用 NMS 算法、坐标缩放

3. 模型输出解析

Python (Ultralytics 库)

  • 输出格式 :结构化结果,自动解析为 results[0].boxes,包含:
    • 坐标:xyxy 格式(x1, y1, x2, y2)
    • 置信度:conf 字段
    • 类别 ID:cls 字段
  • 后处理:自动应用 NMS 算法,无需手动实现

C++ (ONNX Runtime)

  • 输出格式 :原始张量(如 [1, 6, 1680]),需按通道优先存储格式手动解析:
    • 通道 0:所有检测的 x1 坐标
    • 通道 1:所有检测的 y1 坐标
    • 通道 2:所有检测的 x2 坐标
    • 通道 3:所有检测的 y2 坐标
    • 通道 4:所有检测的类别 0(类型1)置信度
    • 通道 5:所有检测的类别 1(类型2)置信度
  • 后处理:需手动实现 NMS 算法,计算 IoU 并抑制重叠框

4. 代码示例对比

Python (Ultralytics 库) - 核心代码

python 复制代码
# 加载模型
model = YOLO('320x240_in_model.onnx')

# 处理视频帧
cap = cv2.VideoCapture('test.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    # 核心推理代码(自动处理所有步骤)
    results = model(frame, imgsz=(256, 320))
    
    # 自动绘制检测结果
    annotated_frame = results[0].plot()
    
    # 保存输出
    out.write(annotated_frame)

C++ (ONNX Runtime) - 核心代码

cpp 复制代码
// 预处理图像
Mat resized;
resize(frame, resized, Size(320, 256));
Mat rgb;
cvtColor(resized, rgb, COLOR_BGR2RGB);
Mat normalized;
rgb.convertTo(normalized, CV_32F, 1.0 / 255.0);

// 转换为 CHW 格式
vector<Mat> channels(3);
split(normalized, channels);
vector<float> input_data(input_size);
int idx = 0;
for (int c = 0; c < 3; c++) {
    for (int h = 0; h < 256; h++) {
        for (int w = 0; w < 320; w++) {
            input_data[idx++] = channels[c].at<float>(h, w);
        }
    }
}

// 执行推理
vector<Value> outputs = session.Run(
    RunOptions{nullptr},
    input_names,
    &input_tensor,
    1,
    output_names,
    1
);

// 解析输出
float* output_data = outputs[0].GetTensorMutableData<float>();
for (int i = 0; i < num_detections; i++) {
    // 手动解析坐标和置信度
    float x1 = output_data[i + 0 * num_detections];
    float y1 = output_data[i + 1 * num_detections];
    float x2 = output_data[i + 2 * num_detections];
    float y2 = output_data[i + 3 * num_detections];
    float class0_conf = output_data[i + 4 * num_detections];
    float class1_conf = output_data[i + 5 * num_detections];
    
    // 应用 NMS 算法(需手动实现)
    // ...
}

适用版本:YOLOv8 模型,ONNX Runtime 1.15+,Ultralytics 8.0+ 库

相关推荐
witAI18 小时前
手机生成剧本杀软件2025推荐,创新剧情设计工具助力创作
人工智能·python
不爱吃炸鸡柳18 小时前
[特殊字符]C/C++内存管理深度解剖:从内存布局到new/delete底层,吃透面试必考核心
c语言·c++·面试
森G18 小时前
35、事件传递模式---------事件系统
c++·qt
故事和你9118 小时前
蓝桥杯-2025年C++B组国赛
开发语言·软件测试·数据结构·c++·算法·职场和发展·蓝桥杯
派大星~课堂18 小时前
【力扣-138. 随机链表的复制 ✨】Python笔记
python·leetcode·链表
王忘杰18 小时前
0基础CUDA炼丹、增加断点保存,从零开始训练自己的AI大模型 87owo/EasyGPT Python CUDA
开发语言·人工智能·python
数据知道19 小时前
claw-code 源码详细分析:`reference_data` JSON 快照——大型移植里「对照底稿」该怎么治理与演进?
linux·python·ubuntu·json·claude code
cpp_250119 小时前
P10108 [GESP202312 六级] 闯关游戏
数据结构·c++·算法·动态规划·题解·洛谷·gesp六级
好家伙VCC19 小时前
**发散创新:基于以太坊侧链的高性能去中心化应用部署实战**在区块链生态中,*
java·python·去中心化·区块链
kvo7f2JTy19 小时前
吃透Linux/C++系统编程:文件与I/O操作从入门到避坑
java·linux·c++