1. 环境依赖与搭建
Python (Ultralytics 库)
-
依赖管理 :通过
pip install ultralytics一键安装,自动处理所有依赖 -
底层库:无需手动配置 ONNX Runtime、CUDA 等,库会自动管理
-
安装命令 :
bashpip 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 行代码实现完整推理
pythonfrom ultralytics import YOLO model = YOLO('model.onnx') results = model(frame) # 自动处理预处理、推理、后处理 annotated_frame = results[0].plot() # 自动绘制检测结果C++ (ONNX Runtime)
-
核心代码 :需手动实现完整流程
- 预处理:调整图像大小、BGR→RGB 转换、归一化、转换为 CHW 格式
- 推理:创建输入张量、调用 ONNX Runtime API 执行推理
- 后处理:解析模型输出、应用 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+ 库