用多少眼泪才能让你相信 发表于 2024-6-20 01:19:09

轻量化的yolov8部署到安卓Android手机端

一、pytorch环境设置和yolov8源码安装

首先在电脑上必要设置好pytorch环境,和yolov8源码的下载
然后针对yolov8做自己的轻量化改进
二、下载Android Studio和ncnn-android-yolov8

1. Android Studio官网链接:

下载 Android Studio 和应用工具 - Android 开辟者  |  Android Developers
自行设置AS环境和JDK
我参考了下面这两个:
Android Studio 安装设置教程 - Windows(详细版)-CSDN博客Android Studio 开辟环境快速搭建(超详细)_设置android 开辟环境-CSDN博客
 Android Studio 安装设置教程 - Windows(详细版)-CSDN博客

(1)JDK下载:

官网站:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
同意协议后,下载相应版本的JDKhttps://img-blog.csdnimg.cn/direct/c1d8c9ac3fb5495496477458a0180e3a.png
   
(2)设置JDK及JAVA的环境

打开系统环境
打开计算机的属性/高级设置/环境变量/,   
https://img-blog.csdnimg.cn/direct/da9d360c04054e7eafa8860f81caf227.png

设置JAVA_HOME:
变量名:JAVA_HOME
变量值:JDK安装目录(复制jdk的路径,也就是我们前面安装JDK时设置的路径)
详细见谁人链接
https://img-blog.csdnimg.cn/direct/c39cc8d4e3314ee199b5ffb8bc0b62da.png
https://img-blog.csdnimg.cn/direct/a41727b7fba34315934c47dcdfdbe4dc.png
(3)安装cmake

留意安装的是cmake3.10版本。
https://img-blog.csdnimg.cn/direct/3c802ff8e17f44bc82f0e411fb1ad01e.png
   手机安卓版本选择相应的安卓版本,我的是荣耀70,直接下载sdk,对应的是安卓14。
https://img-blog.csdnimg.cn/direct/596ecc3dcde04866a5215988ee1e0d09.png
(4)出现的题目:

老项目导入可能碰到的题目 Unsupported Java. 
Your build is currently configured to use Java 17.0.7 and Gradle 5.4.1.
原本这个项目执行不是Java17,本地使用了更高的Java版本,因此同步必要更新gradle。
当然,可以更新gradle,但,这意味着反面有许多必要跟着改的题目。但是只是想运行下项目看下效果,效果还要改一通内容,终极很可能还不知道可否跑起来。
于是,根据条件,可以进行一下操作。
办理方案
可以设置较低的Java版本,以此来迎合Gradle 5.4.1。
https://img-blog.csdnimg.cn/direct/78e8e97a5be7423aa48ca4c31b3d5c89.png
——>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK——>选择个1.8的版本下载并运行吧。
https://img-blog.csdnimg.cn/direct/aa80cae4c3f64a688cb30eabe4160fbc.png
或者直接在第四部分反面修改build.gradle
安装之后在android studio\bin\studio64.exe打开
2. 下载ncnn-android-yolov8项目:

https://github.com/FeiGeChuanShu/ncnn-android-yolov8 
3. 下载opencv-mobile和ncnn-android-vulkan 



[*]opencv-mobile:https://github.com/nihui/opencv-mobile
[*]ncnn-android-vulkan:Releases · Tencent/ncnn · GitHub
将上面下载好的两个压缩包解压后放入该位置:ncnn-android-yolov8\app\src\main\jni\ 下
https://img-blog.csdnimg.cn/direct/794ad223ceb44e57ba30c03dd48c30a5.png
4.设置CMakeLists.txt文件
位置:ncnn-android-yolov8\app\src\main\jni\ ,
利用Android Studio打开CMakeLists.txt.,然后把下面的路径更改为自己下载的:
https://img-blog.csdnimg.cn/direct/a6c28c54193449f289dc8a74c790e8e8.png




三、将自定义的数据集和改进后的模子windows练习好的pt文件转为onnx文件

详细在Ultralytics/demo.py 代码内里也有体现
# 将模型导出为 ONNX 格式

from ultralytics import YOLO

model = YOLO("best.pt")

success = model.export(format="onnx", simplify=True, opset=12)    留意:
在安卓端使用demo项目在转换前必要对项目源码作出一些修改,修改详细见下面步骤。
待修改的内容在ncnn-android-yolov8-main/doc/中有显示,如使用检测任务则修改c2f.jpg和Detect.jpg两张图片上的内容。
https://img-blog.csdnimg.cn/direct/af7ffe4a39454f0282cfd0c4d811da2a.png
也即在windows把ultralytics项目中的下列函数修改为:
文件路径:ultralytics/ultralytics/nn/modules/block.py
class C2f(nn.Module):
    # ...
    def forward(self, x):
      # 全部替换为
      x = self.cv1(x)
      x = ]
      x.extend(m(x[-1]) for m in self.m)
      x.pop(1)
      return self.cv2(torch.cat(x, 1)) 文件路径:ultralytics/ultralytics/nn/modules/head.py
class Detect(nn.Module):
    # ...
    def forward(self, x):
      """Concatenates and returns predicted bounding boxes and class probabilities."""
      shape = x.shape# BCHW
      for i in range(self.nl):
            x = torch.cat((self.cv2(x), self.cv3(x)), 1)
      if self.training:
            return 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 = shape
      # 中间部分注释掉,return语句替换为
      return torch.cat(, self.no, -1) for xi in x], 2).permute(0, 2, 1) !记得保留原本的代码,这两处修改仅在格式转换时进行,假如想要重新练习,必要使用原本的代码。修改完成再执行模子格式转换的代码。

得到的文件范例为onnx格式,还需进一步转换为ncnn格式。使用一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine 即可
转换后会得到两个文件,分别以bin和param做后缀。使用yolov8模子已不再必要对param文件修改。两个文件即终极集成到android端的模子文件,
放到\ncnn-android-yolov8-main\ncnn-android-yolov8\app\src\main\assets
https://img-blog.csdnimg.cn/direct/6641e0d0debd48d6851a5927820d3e43.png


四 准备部署Android Studio项目

demo项目解读:
yolo.cpp和yolo.h:负责加载模子,执行猜测任务,返回数据效果。
ndkcamera.cpp和ndkcamera.h:负责摄像头相干以及实时绘制猜测矩形框。
yolov8ncnn.cpp:JNI方法直接对应的C++文件,负责整合上述两部分。
现在修改的部分均在yolo.cpp和yolov8ncnn.cpp两个文件中,可以以实时摄像的方式使用模子。
 
1. 修改yolo.cpp文件

在ncnn-android-yolov8\app\src\main\jni\ 下,修改为你自己数据集的类别数目
https://img-blog.csdnimg.cn/direct/53ac5fa4797b400cae7fc5a4a913974e.png
修改调用的模子名格式 :
https://img-blog.csdnimg.cn/direct/95cd5f9c39864d959650ae1aca1ef829.png
修改节点名称:
先检察自己onnx的节点名称,网站检察: https://netron.app/ 
https://img-blog.csdnimg.cn/direct/015b30f732654c819bcf58fcb69a49e3.pnghttps://img-blog.csdnimg.cn/direct/34df7b2398164c9bb500a6e18323c498.png
修改文件,对应上图中的输入和输出的名称
https://img-blog.csdnimg.cn/direct/35b221b961d54c72ae184d02d902931f.png
修改为自己的类别名称:
https://img-blog.csdnimg.cn/direct/fcb70e188c664b85b186c48350272192.png

2 修改strings.xml文件

增加item,添加移动端模子选择文件:
<item>bestXXX</item>
bestXXX是你练习出来的模子的名称
https://img-blog.csdnimg.cn/direct/68bba2257ba84576a7cd7eb151b0f102.png

3 修改yolov8ncnn.cpp文件

对应修改如下:
https://img-blog.csdnimg.cn/direct/bb0eea97c842421b934e4bc5ee912556.png
上图红框中的名称要和你导出来的bin和param中的文件名称对应 ,有多个模子,可以多放几个

4.修改build.gradle

在build.gradle 修改依赖的gradle插件版本为7.2.0
https://img-blog.csdnimg.cn/direct/7bbe6fc8094b4cf086f43009cdff2b01.png
在ncnn-android-yolov8-main\ncnn-android-yolov8\gradle\wrapper\gradle-wrapper.properties中:
修改使用的gradle版本为7.4-all版本。
https://img-blog.csdnimg.cn/direct/8d044ec9c70c49bc8aa2e1da64b4844d.png
重新sync项目

5.部署效果

找到Google USB Driver并下载,流程为点击File -> Settings ->Languages & Frameworks -> Android SDK -> SDK Tools -> Google USB Driver。
https://img-blog.csdnimg.cn/direct/1b3d45fddccb4314a0086bd1866e53bc.png
手机打开->开辟者模式,开启USB调试权限,手机和电脑用USB连接,答应调试
通过USB将手机和电脑连接,然后选择传文件模式,不要选择仅充电。
这个时间Android Studio的设备选择器中一般就有了已经连接的手机。
留意荣耀和华为手机在usb设置选“以太网”,这个搞了我还几天都搞不出来
https://img-blog.csdnimg.cn/direct/692f90324f9c499c9be4839b53b76c70.jpeg
运行Android Studio项目到手机上
另外app默认先打开的是前置摄像头,通太过析代码,可以知道,将MainActivity.java的40的facing的初始值从0改成1可以让app默认先打开后置摄像头。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 轻量化的yolov8部署到安卓Android手机端