1.1 项目准备
1.1.1. 安装Android studio
这个百度上有很多对应的经验体随便找一个教程然后切换一下国内源即可安装成功这里不做赘述
这里需要说明一点我们应该安装NDK、Cmake
-
- 这里根据自己的手机版本来选择对应的开发环境
-
- 最后点击应用安装
-
-
-
1.1.2. 下载解压源码
下载解压NCNN和ncnn-android-yolov5工程
GitHub nihui/ncnn-android-yolov5: The YOLOv5 object detection android example
- 把ncnn-20221128-android-vulkan里面的文件复制一份到ncnn-android-yolov5-master的\app\src\main\jni目录下
1.2. 安卓源码重新编译
1.2.1. 构建工程
用Android studio 打开这个ncnn-android-yolov5-master项目的build.gradle文件
-
- 之后Android studio会帮我们构建整个工程耐心等待他走完
-
1.2.2. 修改源码
1.2.2.1. 修改CMakeLists.txt中的路径
- 打开ncnn-android-yolov5-master\app\src\main\jni\CMakeLists.txt
-
- 将第五行的路径改为自己的路径
- 也就是将
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/ncnn-20201218-android-vulkan/${ANDROID_ABI}/lib/cmake/ncnn)
- 改为
set(ncnn_DIR ${CMAKE_SOURCE_DIR}/${ANDROID_ABI}/lib/cmake/ncnn)
- 也就是把作者的根目录给删除掉
- 修改之后
-
- 简单说明一下ANDROID_ABI对应的是不同架构下的文件夹名称
1.2.2.2. 重新重新ysnc project
1.2.3 修改项目源码
1.2.3.1. 替换原来的param文件
- 将刚才生成的yolov5s.bin、yolov5s.param文件放到ncnn-android-yolov5-master\app\src\main\assets文件夹下并替换原来的文件
-
1.2.3.2. 修改param文件中的参数
- 打开yolov5s.param搜索Reshape层将后面对应的 0=6400、0=1600、0=400 均修改为 0=-1 这是为了解决实际中出现的多检测框的问题
- 修改前
-
-
- 修改后
-
-
1.2.3.3. 修改yolov5ncnn_jni.cpp文件
1.2.3.3.1. 将ncnn-android-yolov5-master\app\src\main\jni文件夹下的yolov5ncnn_jni.cpp的分类类别名改成自己模型的实际类别名
- 修改前
-
- 修改后
-
2.5.2.3.2. 修改stride 16和32部分
解决办法
/ndk-bundle/toolchains
ndk.dir=C\:\\Users\\Lenovo\\AppData\\Local\\Android\\Sdk\\platform-tools\\ndk-bundle
- 修改源码文件yolov5ncnn_jni.cpp中Permute 节点的 output
- 将param文件中permute部分与stride部分中blob_name后面的数字对应起来
- param文件中搜索permute会出来3个结果我们选择
- 我们使用Notre打开这个yolov5s.param文件找到permute节点这个permute节点一共有3个分别是128,256,512尺寸的我们需要的是256和512的输出维度
-
-
- 修改前
-
- 修改后
-
-
2. 报错
2.1. Android Studio报错
-
CMake ‘3.10.2’ was not found in PATH or by cmake.dir property.
点击下方的install即可 -
By not providing “Findncnn.cmake” in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by “ncnn”, but CMake did not find one.
看一下自己ncnn-20221128-android-vulkan的代码是否放对了位置需要放到ncnn-android-yolov5-master的\app\src\main\jni目录下 -
No toolchains found in the NDK toolchains folder for ABI with prefix:** arm-linux-androideabi**
在ABI的NDK工具链文件夹中没有找到带有前缀:arm-linux-androideabi的工具链
原因分析最新版ndkversion=25.1.8937393的toolchains文件夹中无arm-linux-androideabi文件 - 下载老版本NDK21
- 打开本地Android SDK所在路径解压到指定目录就行如果没有这个目录就新建一个
- developer.android.com/ndk/downloads/?hl=zh cn
-
- 修改项目根目录的local.properties文件
- 可以看到这个文件中原来没有NDK的路径我们为其手动指定一个
-
- 这个路径是安卓SDK下面的路径具体根据自己的实际情况进行选择
-
- 同时安装低版本的ndk如version=21.3.6528147将低版本ndk中toolchains 文件夹下的arm-linux-androideabi等文件复制到25.1.8937393版本ndk的toolchains 文件夹中
-
-
- 之后再构建项目就不报错了
-
-
Update NDK version to 25.1.8937393 and sync project
这个很好理解嘛也就是自己的NDK的版本太低了下载最新版的NDK即可 -
Location specified by ndk.dir (C:\Users\Lenovo\AppData\Local\Android\Sdk\platform-tools\ndk-bundle) did not contain a valid NDK and and couldn’t be used
没有包含有效的NDK
实际原因是NDK的路径不对
确保NDK的两个路径是正确的 -
-
-
这样之后再进行sync projec就可以正常了
-