基于NCNN框架在Android平臺實現YOLOv8目標檢測模型的高效部署與實踐

隨著移動設備計算能力的提升,越來越多的深度學習模型被部署到移動端,以實現實時、低延遲的應用場景。YOLO系列的在目標檢測任務中表現出色,具有精度高、速度快的優勢。本文將詳細介紹如何基于NCNN框架 ,在Android平臺 上高效部署YOLOv8目標檢測模型,并結合OpenCVVulkan加速實現高性能推理。

效果展示:

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.jpgDetect.jpg兩張圖片上的內容。即把ultralytics項目中的下列函數修改:

  1. 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
    

    在這里插入圖片描述

  2. 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

  1. 安裝Visual Studio

  2. 下載并解壓ncnn-YYYYMMDD-windows-vsXXXX.zip(vs后的數字應當要與本地Visual Studio版本保持一致。):https://github.com/Tencent/ncnn/releases
    在這里插入圖片描述

  3. 打開文件夾 \ncnn-20250503-windows-vs2022\x64\bin,可以看到應用程序onnx2ncnn.exe
    在這里插入圖片描述

  4. 進入該文件夾(cmd):
    在這里插入圖片描述

  5. 輸入(將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
在這里插入圖片描述

  1. 修改\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"};
    

    在這里插入圖片描述

  2. 修改 ex.input(“images”, in_pad); 和 ex.extract(“output”, out); 為模型輸入輸出名

    在這里插入圖片描述

  3. 修改const int num_class為模型分類數量

    在這里插入圖片描述

  4. 修改文件夾內模型匹配格式:

    在這里插入圖片描述

  5. 修改\ncnn-android-yolov8\app\src\main\jni\yolov8ncnn.cpp:修改const char* modeltypes[] 為模型名。

    在這里插入圖片描述

  6. 修改 const int target_sizes[]、const float mean_vals[][3]、const float norm_vals[][3] 代碼行數匹配文件夾內模型數量

    在這里插入圖片描述

  7. 修改\ncnn-android-yolov8\app\src\main\res\values\strings.xml

    在這里插入圖片描述
    注:此修改僅調整下拉菜單中的選項顯示名稱,實際選項匹配由索引值完成,與名稱無關。

2.5 編譯運行

在這里插入圖片描述

3. 畫面清晰度

修改\ncnn-android-yolov8\app\src\main\jni\ndkcamera.cppAImageReader_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的潛力,實現更高幀率的目標檢測體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88102.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為動態路由配置

問題描述&#xff1a;針對四個路由器在不同的網段場景中&#xff0c;對四個路由器進行動態路由配置。下面以如下場景為例&#xff0c;介紹詳細配置過程。配置過程&#xff1a; 1、每個路由器的接口配置IP地址 路由器AR1中每個接口配置IP地址。 sys # 進入系統視圖 interface g…

分布式事務解決方案(三)

在Java分布式系統領域&#xff0c;傳統強一致性方案&#xff08;如2PC、3PC&#xff09;在高并發、復雜業務場景下暴露出性能瓶頸和阻塞問題。而Saga模式與事件溯源&#xff08;Event Sourcing&#xff09;作為更具彈性和擴展性的解決方案&#xff0c;逐漸成為分布式事務處理和…

【時時三省】(C語言基礎)通過指針引用數組

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省數組元素的指針一個變量有地址&#xff0c;一個數組包含若干元素&#xff0c;每個數組元素都在內存中占用存儲單元&#xff0c;它們都有相應的地址。指針變量既然可以指向變量&#xff0c;當然…

【WEB】Polar靶場 21-25題 詳細筆記

二十一.php very nicephp又是你 ,但是經過這么多次折磨后我感覺我已經有一點抗性了老規矩&#xff0c;先看知識點PHP 序列化是將 PHP 變量&#xff08;如對象、數組&#xff09;轉換為字符串的過程&#xff0c;便于存儲或傳輸。反序列化則是將字符串還原為原始變量。這在緩存、…

【Guava】1.0.設計虛擬機的方向

【Guava】1.0.設計虛擬機的方向虛擬機是什么&#xff1f;棧式虛擬機棧式虛擬機的優缺點題外話虛擬機是什么&#xff1f; 虛擬機&#xff08;VirtualMachine, VM&#xff09;是一種計算機程序或系統&#xff0c;它通過軟件模擬物理計算機的硬件運行環境&#xff0c;使得多個操作…

[附源碼+數據庫+畢業論文]基于Spring+MyBatis+MySQL+Maven+jsp實現的高校實驗室資源綜合管理系統,推薦!

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本高校實驗室資源綜合管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大…

Spring Boot:影響事務回滾的幾種情況

一、Controller 捕獲異常導致事務失效 需求 我們有一個用戶注冊服務&#xff0c;注冊時需要&#xff1a; 創建用戶賬戶分配初始積分發送注冊通知 這三個操作需要在同一個事務中執行&#xff0c;任何一步失敗都要回滾。 錯誤示例&#xff1a;Controller 捕獲異常導致事務失效 Re…

如何避免分布式爬蟲被目標網站封禁?

在分布式爬蟲的大規模數據采集場景中&#xff0c;避免被目標網站封禁的核心邏輯是&#xff1a;通過技術手段模擬真實用戶行為&#xff0c;降低爬蟲行為的可識別性&#xff0c;同時建立動態適配機制應對網站反爬策略的升級。以下從請求偽裝、行為控制、資源管理、反爬對抗四個維…

Maven 打包排除特定依賴的完整指南(詳細方法 + 示例)

前言 在使用 Maven 構建 Java 項目時&#xff0c;我們常常需要對項目的打包過程進行精細化控制&#xff0c;尤其是希望排除某些特定的依賴庫。這可能是為了減小最終構建產物的體積、避免版本沖突&#xff0c;或者僅僅是為了滿足不同環境下的部署需求。 本文將詳細介紹如何在 Ma…

Terraform `for_each` 精講:優雅地自動化多域名證書驗證

大家好&#xff0c;在云原生和自動化運維的世界里&#xff0c;Terraform無疑是基礎設施即代碼&#xff08;IaC&#xff09;領域的王者。它強大的聲明式語法讓我們能夠輕松地描述和管理云資源。然而&#xff0c;即使是經驗豐富的工程師&#xff0c;在面對某些動態場景時也可能會…

C++標準庫中各種互斥鎖的用法 mutex

示例 僅供參考學習 #include <mutex> #include <shared_mutex> #include <thread> #include <chrono> #include <iostream> #include <vector>// // 1. std::mutex - 基本互斥鎖 // void basic_mutex_example() {std::mutex mtx;int cou…

Android Handler機制與底層原理詳解

Android 的 Handler 機制是跨線程通信和異步消息處理的核心框架&#xff0c;它構成了 Android 應用響應性和事件驅動模型的基礎&#xff08;如 UI 更新、后臺任務協調&#xff09;。其核心思想是 “消息隊列 循環處理”。 核心組件及其關系Handler (處理器): 角色: 消息的發送…

jQuery JSONP:實現跨域數據交互的利器

jQuery JSONP&#xff1a;實現跨域數據交互的利器 引言 隨著互聯網的發展&#xff0c;跨域數據交互的需求日益增加。在Web開發中&#xff0c;由于同源策略的限制&#xff0c;直接通過XMLHttpRequest請求跨域數據會遇到諸多問題。而JSONP&#xff08;JSON with Padding&#xff…

Redis集群和 zookeeper 實現分布式鎖的優勢和劣勢

在分布式系統中&#xff0c;實現分布式鎖是確保多個節點間互斥訪問共享資源的一種常見需求。Redis 集群 和 zookeeper 都可以用來實現這一功能&#xff0c;但它們有著各自不同的優勢和劣勢。 CAP 理論&#xff1a; 在設計一個分布式系統時&#xff0c;一致性&#xff08;Consis…

如何備份vivo手機中的聯系人?

隨著vivo移動設備在全球設立7個研發中心&#xff0c;vivo正在進入更多的國家。如今&#xff0c;越來越多的人開始使用vivo手機。以vivo X100為例&#xff0c;它配備了主攝像頭和多個輔助攝像頭&#xff0c;提供多樣化的拍攝選項&#xff0c;并搭載了最新的FunTouch OS&#xff…

python腳本編程:使用BeautifulSoup爬蟲庫獲取熱門單機游戲排行榜

BeautifulSoup是一個便捷的解析html頁面元素的python庫&#xff0c;此處用來寫一個簡單的爬蟲批量抓取國內游戲資訊網站的近期熱門單機游戲排行榜。 網頁來源如下所示代碼 from bs4 import BeautifulSoup import requests# get web page web_url "https://www.3dmgame.co…

C#配置全面詳解:從傳統方式到現代配置系統

C#配置全面詳解&#xff1a;從傳統方式到現代配置系統 在軟件開發中&#xff0c;配置是指應用程序運行時可調整的參數集合&#xff0c;如數據庫連接字符串、API 地址、日志級別等。將這些參數從代碼中分離出來&#xff0c;便于在不修改代碼的情況下調整應用行為。C# 提供了多種…

數據中臺架構解析:湖倉一體的實戰設計

目錄 一、數據中臺與湖倉一體架構是什么 1. 數據中臺 2. 湖倉一體架構 3. 湖倉一體在數據中臺里的價值 二、湖倉一體架構的核心部件 1. 數據湖 2. 數據倉庫 3. 數據集成工具 4. 數據分析與處理引擎 三、湖倉一體架構實戰設計 1. 需求分析與規劃 2. 數據湖建設 3. …

SQL Server表分區技術詳解

表分區概述 表分區是將大型數據庫表物理分割為多個較小單元的技術,邏輯上仍表現為單一實體。該技術通過水平分割數據顯著提升查詢性能,尤其針對TB級數據表可降低90%的響應時間。典型應用場景包含訂單歷史表、日志記錄表等具有明顯時間特征的業務數據,以及需要定期歸檔的審計…

WHIP(WebRTC HTTP Ingestion Protocol)詳解

WHIP&#xff08;WebRTC HTTP Ingestion Protocol&#xff09;詳解 WHIP&#xff08;WebRTC HTTP Ingestion Protocol&#xff09;是一種基于 HTTP 的協議&#xff0c;用于將 WebRTC 媒體流推送到媒體服務器&#xff08;如 SRS、Janus、LiveKit&#xff09;。它是為簡化 WebRT…