赞
踩
NCNN是一个腾讯开源的优化到极致的高性能神经网络前向计算框架,可以把电脑端生成在深度学习模型移植到手机端,支持的模型非常多
NCNN官方的定义:NCNN是腾讯公司开源的一个专为手机端极致优化的高性能神经网络前向计算框架。NCNN从设计之初,就深刻考虑手机端的部署和使用,无需第三方依赖,跨平台,手机端CPU的速度快于目前所有已知的开源框架。基于NCNN,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能APP,将AI带到你的指尖。
目前NCNN已经支持大部分的CNN网络,包括本文中用到的YOLOv5,
可以从这个网页上进行查看支持的具体平台
Releases · Tencent/ncnn · GitHub
我们接下来主要以带加速的ncnn-android-vulkan.zip展开
GitHub nihui/ncnn-android-yolov5: The YOLOv5 object detection android example
这个百度上有很多对应的经验体,随便找一个教程,然后切换一下国内源,即可安装成功,这里不做赘述
这里需要说明一点,我们应该安装NDK、Cmake
下载解压NCNN和ncnn-android-yolov5工程
用Android studio 打开这个ncnn-android-yolov5-master项目的build.gradle文件
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)
点击这个开始按钮即可
我们选择一张有物体的图片,点击识别
可以看到,已经可以用目标检测框把这个鼠标给框出来了
如果我们想查看手机识别的精确结果,可以点击这个run状态栏(需要注意,这个操作必须是手机通过数据线连接电脑才行)
这个时候再在手机端进行选图识别,电脑端就会打印出识别所用的精确时间
这里CPU识别一张图片用112毫秒,GPU识别一张图片需要201毫秒,这是什么鬼?可能是GPU模型比较大吧,导入的速度会慢一点,处理单张图片看不出来区别,处理视频的时候应该还是GPU更好。
我们采用.pt ->onnx->ncnn的路线来转换自己训练的模型
export.py --weights weights/yolov5s.pt --include torchscript onnx
python export.py --train --weights weights/yolov5s.pt --include torchscript onnx
sudo apt install build-essential libopencv-dev cmake git
su
git clone -b v3.20.1-rc1 https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
make install
sudo ldconfig
protoc --version
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
mkdir build
cd build
cmake ..
make -j8
make install
./onnx2ncnn best-sim.onnx yolov5s.param yolov5s.bin
这种方式简直是我们做深度学习模型移植到安卓手机端的神器,整个过程里没有复杂的部署,也没有什么坑,有的只是人性化的操作界面,简单几个按钮就可以把整个流程给走完,节省好几个小时的时间,以及中间的无数大小坑,溢美之词不能再多了。
是在本地运行的,所以自己的模型是不会被泄露
连上手机,点击run按钮,编译安装调试
可以看到了手机端安装了对应的APP
点开
export.py --weights yolov5s.pt --include torchscript --train
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的工具链
原因分析:最新版ndk(version=25.1.8937393)的toolchains文件夹中无arm-linux-androideabi文件
解决办法
/ndk-bundle/toolchains
ndk.dir=C\:\\Users\\Lenovo\\AppData\\Local\\Android\\Sdk\\platform-tools\\ndk-bundle
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就可以正常了
OSError: [WinError 1455] 页面文件太小,无法完成操作。 #OSError
电脑上开的东西太多了,关掉一些就好了
或者设置虚拟内存
export.py --weights weights/yolov5s.pt --include torchscript onnx
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
make install
sudo ldconfig
或者自己先手动把这个仓库下载下来,然后再进行安装
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make
make install
sudo ldconfig
sudo apt-get install autoconf automake libtool
git clone -b v3.20.1-rc1 https://github.com/protocolbuffers/protobuf.git
sudo ln -s /usr/bin/g++-5 /usr/bin/g++ -f
手机APP可以安装成功,也可以打开,但是点击识别的时候闪退
可以使用IDE调试,看一下到底报的是什么错误
A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 28976 (cent.yolov5ncnn), pid 28976 (cent.yolov5ncnn)
这个问题,大概率还是修改Permute参数的时候不对,要相信自己,再照着前面的教程看一下,一定可以修改成功的。
此外,不要用虚拟机运行,直接用手机运行
使用自己的模型会报错,yolov5-5.0 · Issue #32 · nihui/ncnn-android-yolov5 · GitHub
不同版本的YOLOv5 修改的方式是不一样
请问如何使用自己训练和转换后的param和bin文件呢? · Issue #39 · nihui/ncnn-android-yolov5 · GitHub
YOLOv5 5.0 的修改方法参考这篇帖子
YOLOv5 6.0 的修改方法参考这篇帖子
手机APP无法通过APP文件安装
那还是通过Android Studio进行安装吧
不闪退,但是也无法识别
效果
调试yolov5ncnn_jni.cpp文件中的prob_threshold阈值,
将其改成0.01看能否出来框
如果可以出来框,那么表明就是阈值的问题,如果不能出来框的话,那就是其他地方的问题
换一张图试一下
有时候识别不出来,可能是因为图像中的物体不符合定义中的类别,再换一张图片,有可能就可以识别出来了
比如自己识别不出来这个口罩里,但是却可以识别出来这个男的
https://www.lanzoui.com/iWoBt0hzt9hi 访问码:24647
下载下来之后,需要更改一下自己的Android SDK路径
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。