)
YOLO端上部署MNN C部署YOLOv8 YOLO11 YOLO26(含源碼支持CPU和GPU)目錄YOLO端上部署MNN C部署YOLOv8 YOLO11 YOLO26(含源碼支持CPU和GPU)1. 前言2. 部署框架MNN3. 導(dǎo)出MNN模型4. MNN C推理實(shí)現(xiàn)1項(xiàng)目結(jié)構(gòu)2配置開發(fā)環(huán)境(OpenCVOpenCLbase-utilsMNN)3CMake配置4main源碼5源碼編譯和運(yùn)行5. Python和MNN效果對(duì)比6. Android端部署模型7. 項(xiàng)目源碼下載1. 前言在邊緣計(jì)算場(chǎng)景中模型部署的靈活性和性能是開發(fā)者最關(guān)注的兩個(gè)核心問題。Ultralytics 系列模型憑借其出色的精度與速度平衡已成為目標(biāo)檢測(cè)領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。而 MNNMobile Neural Network作為阿里巴巴開源的輕量級(jí)推理引擎憑借其極小的體積和跨平臺(tái)能力成為了移動(dòng)端和嵌入式設(shè)備部署 YOLO 系列模型的理想選擇。本文將深入探討如何使用 MNN 的 C API 部署 YOLOv8、YOLO11 以及最新的 YOLO26 模型并覆蓋 CPU 與 GPUOpenCL兩種推理后端。下表給出YOLOv8n-seg YOLO11n-seg和YOLO26n-seg實(shí)例分割模型MNN C部署性能測(cè)試(含圖像預(yù)處理模型推理后處理等耗時(shí))如果你想進(jìn)一步提升性能可以將模型輸入分辨率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【尊重原創(chuàng)轉(zhuǎn)載請(qǐng)注明出處】https://blog.csdn.net/guyuealian/article/details/1656091452. 部署框架MNNGitHubhttps://github.com/alibaba/MNNMNN 是阿里巴巴集團(tuán)開源的輕量級(jí)深度學(xué)習(xí)推理框架旨在為移動(dòng)端、嵌入式設(shè)備提供高效的模型部署能力。它已在**寶、**貓、釘釘?shù)?30 多個(gè)阿里系應(yīng)用中大規(guī)模使用每天運(yùn)行數(shù)百萬次推理。MNN 支持 TensorFlow、Caffe、ONNX 等主流模型格式轉(zhuǎn)換兼容 CNN、RNN、GAN、Transformer 等常見網(wǎng)絡(luò)結(jié)構(gòu)并針對(duì) CPU、GPU、NPU 等硬件后端進(jìn)行了深度優(yōu)化。 在 CPU 端MNN 不依賴第三方計(jì)算庫通過手寫匯編、Winograd 卷積、多線程調(diào)度和內(nèi)存復(fù)用等方式充分發(fā)揮 ARM CPU 算力在 GPU 端它支持 OpenCL、Vulkan、Metal、CUDA 等多種加速后端其中 Android 平臺(tái)可使用 OpenCL/VulkaniOS/macOS 平臺(tái)可使用 MetalPC/服務(wù)器端還可使用 CUDA。 對(duì)于需要更高性能的場(chǎng)景開啟 GPU 加速后推理速度通??商嵘龜?shù)倍部分機(jī)型甚至可獲得更明顯的加速效果。此外MNN 還支持 INT4/INT8/FP16 等低精度量化、算子融合、圖優(yōu)化和異構(gòu)計(jì)算能夠在保持模型精度的同時(shí)顯著降低推理延遲和內(nèi)存占用。 結(jié)合其輕量的庫體積、完善的 Python/C API 以及跨平臺(tái)部署能力MNN 非常適合作為本項(xiàng)目 Android 端推理后端。3. 導(dǎo)出MNN模型在開始 C 部署之前首先需要將訓(xùn)練好的 PyTorch 模型導(dǎo)出為 MNN 格式。Ultralytics 提供了便捷的導(dǎo)出接口支持 FP32、FP16 和 INT8 三種精度。以 YOLO26 為例導(dǎo)出命令如下需要安裝依賴庫 pip install onnx onnxsim onnxruntime mnnfrom ultralytics import YOLO # 加載模型 model YOLO(yolo26n.pt) # 導(dǎo)出為 MNN 格式默認(rèn) FP32 model.export(formatmnn) # 或者導(dǎo)出 FP16 量化版本 model.export(formatmnn, halfTrue) # 或者導(dǎo)出 INT8 量化版本 model.export(formatmnn, int8True)對(duì)于 YOLOv8 和 YOLO11導(dǎo)出方式完全一致只需替換對(duì)應(yīng)的.pt模型文件即可導(dǎo)出的*.mnn文件包含了模型結(jié)構(gòu)和權(quán)重。4. MNN C推理實(shí)現(xiàn)本項(xiàng)目采用CLion作為集成開發(fā)環(huán)境IDE。在依賴庫方面OpenCV為必須安裝的核心依賴用于圖像處理基礎(chǔ)功能base-utils與MNN推理框架已集成于項(xiàng)目?jī)?nèi)部開發(fā)者無需額外配置OpenCL作為可選組件主要用于在支持該標(biāo)準(zhǔn)的設(shè)備上對(duì)模型推理進(jìn)行硬件加速用戶可根據(jù)實(shí)際硬件情況選擇性啟用。1項(xiàng)目結(jié)構(gòu)?2配置開發(fā)環(huán)境(OpenCVOpenCLbase-utilsMNN)項(xiàng)目模型推理采用MNN部署框架支持多線程CPU和GPU加速推理圖像處理采用OpenCV庫模型加速采用OpenCL/Vulkan在普通電腦設(shè)備即可達(dá)到實(shí)時(shí)處理。項(xiàng)目?jī)H在Ubuntu20.04進(jìn)行測(cè)試Windows系統(tǒng)下請(qǐng)自行配置和編譯如果你想在這個(gè) C Demo部署你自己訓(xùn)練的模型你可以將訓(xùn)練好的Pytorch模型轉(zhuǎn)換成MNN模型然后把原始的模型替換成你自己的MNN模型即可。安裝OpenCV圖像處理圖像處理如讀取圖片圖像裁剪等都需要使用OpenCV庫進(jìn)行處理安裝教程Ubuntu20.04安裝opencv和opencv_contribOpenCV庫使用opencv-4.3.0版本opencv_contrib庫暫時(shí)未使用可不安裝安裝OpenCL模型加速安裝教程Ubuntu20.04安裝OpenCLOpenCL和Vulkan用于模型GPU推理加速若不使用GPU純C推理模型速度會(huì)比較慢。OpenCL支持性更好推進(jìn)使用OpenCL。安裝Vulkan模型加速安裝教程Ubuntu20.04安裝VulkanOpenCL和Vulkan用于模型GPU推理加速若不使用GPU純C推理模型速度會(huì)比較慢。MNN對(duì)OpenCL支持性更好推薦優(yōu)先使用OpenCL。base-utilsC庫GitHubhttps://github.com/PanJinquan/base-utils 無需安裝項(xiàng)目已經(jīng)配置了base_utils是個(gè)人開發(fā)常用的C庫集成了C/C OpenCV等常用的算法MNN模型推理GitHubhttps://github.com/alibaba/MNN 無需安裝項(xiàng)目已經(jīng)配置了MNN (Mobile Neural Network)是由阿里巴巴集團(tuán)開源的一個(gè)輕量級(jí)、高性能的深度學(xué)習(xí)推理引擎。它專為移動(dòng)端、嵌入式設(shè)備以及邊緣計(jì)算場(chǎng)景設(shè)計(jì)支持OpenCL/Vulkan同時(shí)也支持服務(wù)器端的高并發(fā)推理。自2019年開源以來MNN 已經(jīng)成為業(yè)界主流的端側(cè)推理框架之一廣泛應(yīng)用于**寶、**貓、**酷、**釘?shù)劝⒗锵礎(chǔ)pp中覆蓋了搜索推薦、圖像識(shí)別、OCR、AR特效、語音處理等數(shù)百個(gè)業(yè)務(wù)場(chǎng)景。3CMake配置具體查看項(xiàng)目配套的CMakeLists.txt文件主要配置了OpenCVbase-utilsMNN這四個(gè)庫Windows系統(tǒng)下請(qǐng)自行配置和編譯。4main源碼主程序src/main.cpp主程序提供了Demo其中test_image_file()用于測(cè)試圖片test_video_file()用于測(cè)試視頻文件test_usb_camera()用于測(cè)試USB攝像頭test_performance用于測(cè)試性能。源碼已經(jīng)支持YOLOv8、YOLO11以及最新的 YOLO26模型且同時(shí)支持目標(biāo)檢測(cè)和實(shí)例分割模型。你可以根據(jù)自己需要更改模型文件(model_file)和修改模型參數(shù)配置(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運(yùn)行 // DeviceType device OPENCL; // 使用OPENCL運(yùn)行 // DeviceType device VULKAN; // 使用VULKAN運(yùn)行 const int max_nums -1; // 最大檢測(cè)數(shù)量-1表示不限制 const int numThread 4; // 線程數(shù) const float scoreThresh 0.25f; // 檢測(cè)閾值 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); /*** * 測(cè)試圖片文件 * return */ int test_image_file() { // 測(cè)試圖片 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; // 開始檢測(cè) detector-detect(frame, resultInfo, scoreThresh, iouThresh); // 可視化代碼 detector-drawResult(frame, resultInfo, true, 0, true); } printf(FINISHED.\n); return 0; } /*** * 測(cè)試視頻文件 * 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; // 開始檢測(cè) detector-detect(frame, resultInfo, scoreThresh, iouThresh); // 可視化代碼 detector-drawResult(frame, resultInfo, true, 10, true); } cap.release(); printf(FINISHED.\n); return 0; } /*** * 測(cè)試USB攝像頭 * return */ int test_usb_camera() { int camera 0; //攝像頭USB ID號(hào)(請(qǐng)修改成自己攝像頭USB ID號(hào)) cv::VideoCapture cap; bool ret get_video_capture(camera, cap); cv::Mat frame; while (ret) { cap frame; if (frame.empty()) break; FrameInfo resultInfo; // 開始檢測(cè) detector-detect(frame, resultInfo, scoreThresh, iouThresh); // 可視化代碼 detector-drawResult(frame, resultInfo, true, 10, true); } cap.release(); printf(FINISHED.\n); return 0; } /*** * 測(cè)試性能 * return */ int test_performance() { // 測(cè)試圖片 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源碼編譯和運(yùn)行編譯腳本或者直接bash build.sh#!/usr/bin/env bash mkdir -p build cd build cmake .. -DMNN_VULKANON make -j4 sleep 1 #./video_for_pose ./Detector如果你要測(cè)試CPU運(yùn)行的性能請(qǐng)修改src/main.cppDeviceType device CPU;如果你要測(cè)試GPU運(yùn)行的性能請(qǐng)修改src/main.cpp 需配置好OpenCLDeviceType device OPENCL;6源碼編譯和運(yùn)行下表給出YOLOv8n-seg YOLO11n-seg和YOLO26n-seg實(shí)例分割模型MNN C部署性能測(cè)試(含圖像預(yù)處理模型推理后處理等耗時(shí))如果你想進(jìn)一步提升性能可以將模型輸入分辨率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效果對(duì)比Python版本的實(shí)例分割測(cè)試代碼from ultralytics import YOLO def test_yolo(): model_file yolo26n-seg.pt model YOLO(model_file) # 推理參數(shù)說明https://docs.ultralytics.com/zh/modes/predict results model.predict(bus.jpg, imgsz640, rectFalse, saveTrue) if __name__ __main__: test_yolo()注意Python推理時(shí)需要設(shè)置rectFalse如果為True則在可能時(shí)使用最小矩形填充相同形狀的批次和受支持的后端。如果為False則始終填充到完整的imgsz這時(shí)與C版本推理輸入保持一致。如果你想進(jìn)一步提升性能可以將模型輸入分辨率640×640改為416×416。推理參數(shù)說明https://docs.ultralytics.com/zh/modes/predictC MNN版本與Python版本的實(shí)例分割檢測(cè)效果(yolo26n-seg)基本一致以下Python版本和C MNN版本效果對(duì)比Python版本C MNN版本6. Android端部署模型如果你需要在Android端部署YOLO系列模型請(qǐng)參考https://blog.csdn.net/guyuealian/article/details/1656277397. 項(xiàng)目源碼下載如需下載項(xiàng)目源碼請(qǐng)關(guān)注【AI吃大瓜】回復(fù)【yolo】即可下載項(xiàng)目資源內(nèi)容包含項(xiàng)目MNN C/C源碼支持YOLOv8n / YOLO11n / YOLO26n目標(biāo)檢測(cè)模型和實(shí)例分割模型推理。你可以根據(jù)自己需要更改模型文件(model_file)和修改模型參數(shù)配置(YOLOParam)項(xiàng)目MNN C/C源碼支持CPU和GPU運(yùn)行GPU模型加速需要配置好OpenCL可以達(dá)到實(shí)時(shí)檢測(cè)效果。如果你想進(jìn)一步提升性能可以將模型輸入分辨率640×640改為416×416。項(xiàng)目C/C源碼Demo支持圖片視頻攝像頭測(cè)試