海鸥派开发板(OpenEuler系统)实现YOLOv8模型ONNX推理全流程解析

张开发
2026/4/10 18:22:07 15 分钟阅读

分享文章

海鸥派开发板(OpenEuler系统)实现YOLOv8模型ONNX推理全流程解析
1. 海鸥派开发板与OpenEuler系统简介海鸥派开发板是一款基于海思SS928处理器的边缘计算设备主打高性能和低功耗特性。这块板子最吸引我的地方在于它原生支持OpenEuler系统这可是国内自主研发的企业级Linux发行版。OpenEuler在ARM架构上的优化做得相当不错特别适合跑AI推理这种计算密集型任务。说到边缘计算场景下的目标检测YOLOv8绝对是当前最火的选择之一。它比前几代更快更准而且模型体积控制得也很好。不过在实际部署时我们通常会先把PyTorch模型转成ONNX格式这样不仅能减小模型体积还能提高跨平台兼容性。我在多个项目里实测发现ONNX格式的模型在边缘设备上的推理速度能提升15%-20%。2. 开发板环境准备2.1 Python环境搭建由于开发板不能联网这个环节我踩过不少坑。首先要注意Python版本的选择建议用3.8-3.10之间的版本太新的版本可能会遇到库兼容性问题。我习惯用Python 3.8.10这个版本在OpenEuler上最稳定。下载源码包后传输到开发板记得用scp命令。这里有个小技巧先用df -h看看存储空间别像我第一次那样把根目录塞满了。解压时建议指定目录比如mkdir -p /opt/python tar -xzf Python-3.8.10.tgz -C /opt/python2.2 环境变量配置配置环境变量时最容易出错的是路径设置。我建议单独创建一个python.sh文件内容可以这样写export PATH/opt/python/Python-3.8.10/bin:$PATH export LD_LIBRARY_PATH/opt/python/Python-3.8.10/lib:$LD_LIBRARY_PATH export PYTHONPATH/opt/python/Python-3.8.10/lib/python3.8/site-packages:$PYTHONPATH记得给脚本加执行权限然后source一下。验证时别光看版本号最好再跑个简单的numpy测试确保基础功能正常。2.3 依赖库安装onnxruntime是核心但直接pip install肯定不行。我总结了个稳妥的方案先在x86机器上下载whl包注意要选manylinux2014_aarch64版本。比如onnxruntime的下载命令pip download onnxruntime1.16.0 --platform manylinux2014_aarch64 --only-binary:all:传输到开发板后安装时加上--no-index参数避免联网检查python3 -m pip install --no-index --find-links. onnxruntime-1.16.0-cp38-cp38-manylinux2014_aarch64.whl3. YOLOv8模型转换3.1 模型导出准备在转换模型前务必检查训练环境。我遇到过因为torch版本不一致导致导出失败的情况。建议用虚拟环境python3 -m venv yolo_env source yolo_env/bin/activate pip install ultralytics torch1.12.03.2 ONNX导出参数详解导出命令看着简单但参数设置很有讲究yolo export modelbest.pt formatonnx opset12 dynamicFalse simplifyTrue imgsz640重点说下opset版本opset12兼容性最好但某些自定义算子可能需要opset13。dynamicFalse固定输入尺寸能提升推理速度但会损失一些灵活性。simplifyTrue会自动优化模型结构能减小约30%的模型体积。3.3 模型验证技巧导出成功后我习惯用Netron可视化检查模型结构。重点关注输入输出节点是否符合预期是否有不支持的算子各层维度是否正确还可以用onnxruntime跑个简单推理测试import onnxruntime as ort sess ort.InferenceSession(best.onnx) print(sess.get_inputs()[0].shape)4. ONNX模型推理实现4.1 推理代码架构完整的推理流程应该包含这几个模块图像预处理尺寸调整/归一化/通道转换模型推理后处理NMS/置信度过滤结果可视化我优化过的预处理函数长这样def preprocess(image_path, input_size): img Image.open(image_path).convert(RGB) orig_size img.size img_resized img.resize(input_size) img_data np.array(img_resized).astype(np.float32) / 255.0 img_data np.transpose(img_data, (2, 0, 1)) # HWC - CHW img_data np.expand_dims(img_data, axis0) # CHW - NCHW return img, orig_size, img_data4.2 性能优化技巧在开发板上跑推理这几个优化点很关键使用providers[CPUExecutionProvider]明确指定CPU批量处理图片时复用session对象将NMS实现改为numpy版本控制日志级别减少输出ort.set_default_logger_severity(3)4.3 结果后处理YOLOv8的输出格式和之前版本不同需要特别注意。我的处理逻辑是predictions outputs[0][0].transpose() # shape: (8400, 11) for det in predictions: class_scores det[4:] cls_id np.argmax(class_scores) cls_conf class_scores[cls_id] if cls_conf CONF_THRES: continue # 解码bbox坐标...5. 实际应用中的问题排查5.1 常见错误解决ImportError: libxxx.so not found这通常是动态库路径问题检查LD_LIBRARY_PATH是否包含Python的lib目录。onnxruntime.capi.onnxruntime_pybind11_state.InvalidArgument大概率是输入数据格式不对检查是否做了归一化、通道转换。5.2 性能瓶颈分析用time模块分段计时通常瓶颈在图像预处理特别是resize操作NMS计算结果绘制可以考虑用OpenCV替代Pillow做图像处理速度能快2-3倍。5.3 内存管理开发板内存有限要注意及时del不再使用的变量控制并发推理数量使用gc.collect()手动触发垃圾回收6. 进阶优化方向6.1 模型量化ONNX支持FP16和INT8量化能显著减小模型体积。我测试过FP16量化后模型大小减少50%推理速度提升30%精度损失1%量化命令示例python -m onnxruntime.tools.convert_onnx_models_to_ort --quantize full best.onnx6.2 多线程推理利用Python的ThreadPoolExecutor实现流水线with ThreadPoolExecutor(max_workers2) as executor: preprocess_future executor.submit(preprocess, img_path) infer_future executor.submit(run_inference, session, preprocess_future.result())6.3 模型裁剪用onnx-simplifier进一步优化模型python -m onnxsim best.onnx best_sim.onnx这个工具会自动合并冗余节点我有个模型从85MB减小到了62MB推理速度还快了15%。7. 完整项目实践建议在实际部署时我建议采用这样的目录结构yolo_deploy/ ├── models/ │ ├── best.onnx │ └── labels.txt ├── utils/ │ ├── preprocess.py │ └── visualize.py ├── configs/ │ └── params.yaml └── main.py参数配置用yaml文件管理方便调整model: path: ./models/best.onnx input_size: [640, 640] conf_thres: 0.25 iou_thres: 0.45最后提醒下开发板部署和PC开发最大的不同是要考虑稳定性。建议添加看门狗机制当推理耗时超过阈值时自动重启进程。

更多文章