隨著移動設備計算能力的提升,越來越多的深度學習模型被部署到移動端,以實現實時、低延遲的應用場景。YOLO
系列的在目標檢測任務中表現出色,具有精度高、速度快的優勢。本文將詳細介紹如何基于NCNN
框架 ,在Android
平臺 上高效部署YOLOv8
目標檢測模型,并結合OpenCV
和Vulkan
加速實現高性能推理。
效果展示:
1. 準備工作
步驟一:
下載YOLOv8
源碼進行訓練模型,環境配置以及訓練方法在此不做贅述,可以參考主頁-Ultralytics YOLOv8文檔進行。
項目下載地址:YOLOv8-github
官方快速入門:YOLOv8-文檔
步驟二:
安裝 Android Studio (https://developer.android.google.cn/),非本文重點,不做贅述。
步驟三
:準備項目:①下載 ncnn-android-yolov8,官方地址:https://github.com/FeiGeChuanShu/ncnn-android-yolov8
② 下載 opencv-mobile: https://github.com/nihui/opencv-mobile/releases 和 ncnn-android-vulkan: https://github.com/Tencent/ncnn/releases
將上面下載好的兩個壓縮包解壓后放入該位置:ncnn-android-yolov8\app\src\main\jni\
下
2. 模型轉化
2.1 修改源碼
經過訓練模型之后,默認得到的文件格式為.pt后綴文件,通過模型導出Ultralytics YOLO文檔可以得知訓練后可以導出多種不同模型文件。但是,值得注意的是
:在轉換前需要對項目源碼作出一些修改,待修改的內容在ncnn-android-yolov8-main/doc/ 中有顯示,如使用檢測任務則修改 c2f.jpg和Detect.jpg兩張圖片上的內容。即把ultralytics項目中的下列函數修改:
-
ultralytics/ultralytics/nn/modules/head.py
:注釋Detect類下forward方法內所有內容并添加代碼shape = x[0].shape # BCHW for i in range(self.nl):x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1) if self.training: # Training pathreturn x elif self.dynamic or self.shape != shape:self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))self.shape = shapepred = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1) return pred
-
ultralytics/ultralytics/nn/modules/block.py
:注釋C2f類下forward方法內所有內容并添加代碼x = self.cv1(x) x = [x, x[:, self.c:, ...]] x.extend(m(x[-1]) for m in self.m) x.pop(1) return self.cv2(torch.cat(x, 1))
注:恢復原代碼即可重新訓練!!
2.2 pt轉onnx
新建文件pt_to_onnx.py
,填入自己的模型路徑運行:
# 將模型導出為ONNX 格式
from ultralytics import YOLOmodel = YOLO(r"模型路徑")
success = model.export(format="onnx", imgsz=320, half=True, opset=12)
點擊網址 https://netron.app,導入onnx
模型:可以看到輸入名稱和輸出名稱:
輸入名稱images
,輸出名稱output0
2.3 onnx轉ncnn
-
安裝Visual Studio
-
下載并解壓ncnn-YYYYMMDD-windows-vsXXXX.zip(vs后的數字應當要與本地Visual Studio版本保持一致。):https://github.com/Tencent/ncnn/releases
-
打開文件夾 \ncnn-20250503-windows-vs2022\x64\bin,可以看到應用程序onnx2ncnn.exe:
-
進入該文件夾(cmd):
-
輸入(將yolov8n換成自己的模型路徑名)并運行
onnx2ncnn E:\OCR_Project\yolov8n.onnx yolov8n.param yolov8n.bin
可以看到 \ncnn-20250503-windows-vs2022\x64\bin 文件夾下多出來兩個文件,
2.4 修改項目代碼
將轉換后的模型文件粘貼至\ncnn-android-yolov8-main\ncnn-android-yolov8\app\src\main\assets
用Android studio打開\ncnn-android-yolov8-main\ncnn-android-yolov8
-
修改
\ncnn-android-yolov8\app\src\main\jni\yolo.cpp
:函數修改static const char* class_names[] 為模型的預測類別int Yolo::draw(cv::Mat& rgb, const std::vector<Object>& objects) {static const char* class_names[] = {"person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light","fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow","elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee","skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard","tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple","sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch","potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone","microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear","hair drier", "toothbrush"};
-
修改 ex.input(“images”, in_pad); 和 ex.extract(“output”, out); 為模型輸入輸出名
-
修改const int num_class為模型分類數量
-
修改文件夾內模型匹配格式:
-
修改
\ncnn-android-yolov8\app\src\main\jni\yolov8ncnn.cpp
:修改const char* modeltypes[] 為模型名。 -
修改 const int target_sizes[]、const float mean_vals[][3]、const float norm_vals[][3] 代碼行數匹配文件夾內模型數量
-
修改
\ncnn-android-yolov8\app\src\main\res\values\strings.xml
注:此修改僅調整下拉菜單中的選項顯示名稱,實際選項匹配由索引值完成,與名稱無關。
2.5 編譯運行
3. 畫面清晰度
修改\ncnn-android-yolov8\app\src\main\jni\ndkcamera.cpp
:AImageReader_new方法
4. 默認攝像頭
修改\ncnn-android-yolov8\app\src\main\java\com\tencent\yolov8ncnn\MainActivity.java
: private int facing(0:前置,1:后置)
修改 cnn-android-yolov8/app/src/main/res/layout/main.xml
文件即可調整APP
界面布局,通過拖拽操作即可完成。
5. 總結展望
本文詳細介紹了如何基于NCNN框架 在Android平臺 上部署YOLOv8目標檢測模型 的完整流程。從環境配置、模型轉換、項目搭建到最終的調試運行,每一步都提供了清晰的操作指引和代碼示例,幫助開發者快速實現YOLOv8在移動端的落地應用。
亮點總結:
- 使用NCNN框架實現高效的模型推理,兼容性強且性能優越;
- 通過OpenCV-Mobile提升圖像預處理效率;
- 支持自定義訓練模型的無縫替換,靈活應用于不同場景;
- 實現了YOLOv8在移動端的實時視頻檢測功能,滿足工業級需求。
展望:
未來可進一步優化模型量化策略(如FP16/INT8),提升推理速度;同時結合Vulkan異構計算能力,進一步挖掘移動端GPU的潛力,實現更高幀率的目標檢測體驗。