YOLO端上部署:MNN C++部署YOLOv8 YOLO11 YOLO26(含源码,支持CPU和GPU)
YOLO端上部署MNN C部署YOLOv8 YOLO11 YOLO26(含源码支持CPU和GPU)目录YOLO端上部署MNN C部署YOLOv8 YOLO11 YOLO26(含源码支持CPU和GPU)1. 前言2. 部署框架MNN3. 导出MNN模型4. MNN C推理实现1项目结构2配置开发环境(OpenCVOpenCLbase-utilsMNN)3CMake配置4main源码5源码编译和运行5. Python和MNN效果对比6. Android端部署模型7. 项目源码下载1. 前言在边缘计算场景中模型部署的灵活性和性能是开发者最关注的两个核心问题。Ultralytics 系列模型凭借其出色的精度与速度平衡已成为目标检测领域的事实标准。而 MNNMobile Neural Network作为阿里巴巴开源的轻量级推理引擎凭借其极小的体积和跨平台能力成为了移动端和嵌入式设备部署 YOLO 系列模型的理想选择。本文将深入探讨如何使用 MNN 的 C API 部署 YOLOv8、YOLO11 以及最新的 YOLO26 模型并覆盖 CPU 与 GPUOpenCL两种推理后端。下表给出YOLOv8n-seg YOLO11n-seg和YOLO26n-seg实例分割模型MNN C部署性能测试(含图像预处理模型推理后处理等耗时)如果你想进一步提升性能可以将模型输入分辨率640×640改为416×416。模型input-sizeparams(M)CPU(4线程)GPU(OpenCL)YOLOv8n-seg640×6403.15M155.43ms42.49msYOLO11n-seg640×6402.62M146.44ms38.06msYOLO26n-seg640×6402.41M148.56ms23.44ms【尊重原创转载请注明出处】https://blog.csdn.net/guyuealian/article/details/1656091452. 部署框架MNNGitHubhttps://github.com/alibaba/MNNMNN 是阿里巴巴集团开源的轻量级深度学习推理框架旨在为移动端、嵌入式设备提供高效的模型部署能力。它已在**宝、**猫、钉钉等 30 多个阿里系应用中大规模使用每天运行数百万次推理。MNN 支持 TensorFlow、Caffe、ONNX 等主流模型格式转换兼容 CNN、RNN、GAN、Transformer 等常见网络结构并针对 CPU、GPU、NPU 等硬件后端进行了深度优化。 在 CPU 端MNN 不依赖第三方计算库通过手写汇编、Winograd 卷积、多线程调度和内存复用等方式充分发挥 ARM CPU 算力在 GPU 端它支持 OpenCL、Vulkan、Metal、CUDA 等多种加速后端其中 Android 平台可使用 OpenCL/VulkaniOS/macOS 平台可使用 MetalPC/服务器端还可使用 CUDA。 对于需要更高性能的场景开启 GPU 加速后推理速度通常可提升数倍部分机型甚至可获得更明显的加速效果。此外MNN 还支持 INT4/INT8/FP16 等低精度量化、算子融合、图优化和异构计算能够在保持模型精度的同时显著降低推理延迟和内存占用。 结合其轻量的库体积、完善的 Python/C API 以及跨平台部署能力MNN 非常适合作为本项目 Android 端推理后端。3. 导出MNN模型在开始 C 部署之前首先需要将训练好的 PyTorch 模型导出为 MNN 格式。Ultralytics 提供了便捷的导出接口支持 FP32、FP16 和 INT8 三种精度。以 YOLO26 为例导出命令如下需要安装依赖库 pip install onnx onnxsim onnxruntime mnnfrom ultralytics import YOLO # 加载模型 model YOLO(yolo26n.pt) # 导出为 MNN 格式默认 FP32 model.export(formatmnn) # 或者导出 FP16 量化版本 model.export(formatmnn, halfTrue) # 或者导出 INT8 量化版本 model.export(formatmnn, int8True)对于 YOLOv8 和 YOLO11导出方式完全一致只需替换对应的.pt模型文件即可导出的*.mnn文件包含了模型结构和权重。4. MNN C推理实现本项目采用CLion作为集成开发环境IDE。在依赖库方面OpenCV为必须安装的核心依赖用于图像处理基础功能base-utils与MNN推理框架已集成于项目内部开发者无需额外配置OpenCL作为可选组件主要用于在支持该标准的设备上对模型推理进行硬件加速用户可根据实际硬件情况选择性启用。1项目结构2配置开发环境(OpenCVOpenCLbase-utilsMNN)项目模型推理采用MNN部署框架支持多线程CPU和GPU加速推理图像处理采用OpenCV库模型加速采用OpenCL/Vulkan在普通电脑设备即可达到实时处理。项目仅在Ubuntu20.04进行测试Windows系统下请自行配置和编译如果你想在这个 C Demo部署你自己训练的模型你可以将训练好的Pytorch模型转换成MNN模型然后把原始的模型替换成你自己的MNN模型即可。安装OpenCV图像处理图像处理如读取图片图像裁剪等都需要使用OpenCV库进行处理安装教程Ubuntu20.04安装opencv和opencv_contribOpenCV库使用opencv-4.3.0版本opencv_contrib库暂时未使用可不安装安装OpenCL模型加速安装教程Ubuntu20.04安装OpenCLOpenCL和Vulkan用于模型GPU推理加速若不使用GPU纯C推理模型速度会比较慢。OpenCL支持性更好推进使用OpenCL。安装Vulkan模型加速安装教程Ubuntu20.04安装VulkanOpenCL和Vulkan用于模型GPU推理加速若不使用GPU纯C推理模型速度会比较慢。MNN对OpenCL支持性更好推荐优先使用OpenCL。base-utilsC库GitHubhttps://github.com/PanJinquan/base-utils 无需安装项目已经配置了base_utils是个人开发常用的C库集成了C/C OpenCV等常用的算法MNN模型推理GitHubhttps://github.com/alibaba/MNN 无需安装项目已经配置了MNN (Mobile Neural Network)是由阿里巴巴集团开源的一个轻量级、高性能的深度学习推理引擎。它专为移动端、嵌入式设备以及边缘计算场景设计支持OpenCL/Vulkan同时也支持服务器端的高并发推理。自2019年开源以来MNN 已经成为业界主流的端侧推理框架之一广泛应用于**宝、**猫、**酷、**钉等阿里系App中覆盖了搜索推荐、图像识别、OCR、AR特效、语音处理等数百个业务场景。3CMake配置具体查看项目配套的CMakeLists.txt文件主要配置了OpenCVbase-utilsMNN这四个库Windows系统下请自行配置和编译。4main源码主程序src/main.cpp主程序提供了Demo其中test_image_file()用于测试图片test_video_file()用于测试视频文件test_usb_camera()用于测试USB摄像头test_performance用于测试性能。源码已经支持YOLOv8、YOLO11以及最新的 YOLO26模型且同时支持目标检测和实例分割模型。你可以根据自己需要更改模型文件(model_file)和修改模型参数配置(YOLOParam)// // Created by Pan on 2024/6/24. // #include opencv2/opencv.hpp #include opencv2/core.hpp #include vector #include string #include yolo.h #include Types.h #include file_utils.h #include image_utils.h using namespace dl; using namespace vision; using namespace std; DeviceType device CPU; // 使用CPU运行 // DeviceType device OPENCL; // 使用OPENCL运行 // DeviceType device VULKAN; // 使用VULKAN运行 const int max_nums -1; // 最大检测数量-1表示不限制 const int numThread 4; // 线程数 const float scoreThresh 0.25f; // 检测阈值 const float iouThresh 0.45f; // IOU阈值 // TODO YOLO26 模型 string model_file ../data/model/yolo26n-seg.mnn; YOLOParam param YOLO26_SEG640_COCO; // TODO YOLO11 模型 // string model_file ../data/model/yolo11n-seg.mnn; // YOLOParam param YOLO11_SEG640_COCO; // TODO YOLOv8 模型 // string model_file ../data/model/yolov8n-seg.mnn; // YOLOParam param YOLOv8_SEG640_COCO; YOLO *detector new YOLO(model_file, param, numThread, device, max_nums); /*** * 测试图片文件 * return */ int test_image_file() { // 测试图片 string image_dir ../data/test_image/coco; vectorstring image_list get_files_list(image_dir); for (string image_path: image_list) { cv::Mat frame cv::imread(image_path); if (frame.empty()) continue; FrameInfo resultInfo; // 开始检测 detector-detect(frame, resultInfo, scoreThresh, iouThresh); // 可视化代码 detector-drawResult(frame, resultInfo, true, 0, true); } printf(FINISHED.\n); return 0; } /*** * 测试视频文件 * return */ int test_video_file() { string video_file ../data/video/video1.mp4; //视频文件 cv::VideoCapture cap; bool ret get_video_capture(video_file, cap); cv::Mat frame; while (ret) { cap frame; if (frame.empty()) break; FrameInfo resultInfo; // 开始检测 detector-detect(frame, resultInfo, scoreThresh, iouThresh); // 可视化代码 detector-drawResult(frame, resultInfo, true, 10, true); } cap.release(); printf(FINISHED.\n); return 0; } /*** * 测试USB摄像头 * return */ int test_usb_camera() { int camera 0; //摄像头USB ID号(请修改成自己摄像头USB ID号) cv::VideoCapture cap; bool ret get_video_capture(camera, cap); cv::Mat frame; while (ret) { cap frame; if (frame.empty()) break; FrameInfo resultInfo; // 开始检测 detector-detect(frame, resultInfo, scoreThresh, iouThresh); // 可视化代码 detector-drawResult(frame, resultInfo, true, 10, true); } cap.release(); printf(FINISHED.\n); return 0; } /*** * 测试性能 * return */ int test_performance() { // 测试图片 string image_dir ../data/test_image/coco; string image_path ../data/test_image/coco/bus.jpg; vectorstring image_list get_files_list(image_dir); cv::Mat frame cv::imread(image_path); FrameInfo resultInfo; detector-performance(frame, resultInfo, scoreThresh, iouThresh, 50); detector-drawResult(frame, resultInfo, true, 0, true); printf(FINISHED.\n); return 0; } int main() { test_image_file(); test_video_file(); //test_usb_camera(); //test_performance(); return 0; }5源码编译和运行编译脚本或者直接bash build.sh#!/usr/bin/env bash mkdir -p build cd build cmake .. -DMNN_VULKANON make -j4 sleep 1 #./video_for_pose ./Detector如果你要测试CPU运行的性能请修改src/main.cppDeviceType device CPU;如果你要测试GPU运行的性能请修改src/main.cpp 需配置好OpenCLDeviceType device OPENCL;6源码编译和运行下表给出YOLOv8n-seg YOLO11n-seg和YOLO26n-seg实例分割模型MNN C部署性能测试(含图像预处理模型推理后处理等耗时)如果你想进一步提升性能可以将模型输入分辨率640×640改为416×416。模型input-sizeparams(M)CPU(4线程)GPU(OpenCL)YOLOv8n-seg640×6403.15M155.43ms42.49msYOLO11n-seg640×6402.62M146.44ms38.06msYOLO26n-seg640×6402.41M148.56ms23.44ms5. Python和MNN效果对比Python版本的实例分割测试代码from ultralytics import YOLO def test_yolo(): model_file yolo26n-seg.pt model YOLO(model_file) # 推理参数说明https://docs.ultralytics.com/zh/modes/predict results model.predict(bus.jpg, imgsz640, rectFalse, saveTrue) if __name__ __main__: test_yolo()注意Python推理时需要设置rectFalse如果为True则在可能时使用最小矩形填充相同形状的批次和受支持的后端。如果为False则始终填充到完整的imgsz这时与C版本推理输入保持一致。如果你想进一步提升性能可以将模型输入分辨率640×640改为416×416。推理参数说明https://docs.ultralytics.com/zh/modes/predictC MNN版本与Python版本的实例分割检测效果(yolo26n-seg)基本一致以下Python版本和C MNN版本效果对比Python版本C MNN版本6. Android端部署模型如果你需要在Android端部署YOLO系列模型请参考https://blog.csdn.net/guyuealian/article/details/1656277397. 项目源码下载如需下载项目源码请关注【AI吃大瓜】回复【yolo】即可下载项目资源内容包含项目MNN C/C源码支持YOLOv8n / YOLO11n / YOLO26n目标检测模型和实例分割模型推理。你可以根据自己需要更改模型文件(model_file)和修改模型参数配置(YOLOParam)项目MNN C/C源码支持CPU和GPU运行GPU模型加速需要配置好OpenCL可以达到实时检测效果。如果你想进一步提升性能可以将模型输入分辨率640×640改为416×416。项目C/C源码Demo支持图片视频摄像头测试