瑞芯微Rockchip开发者社区
直播中

xiangwangzihui

11年用户 511经验值
擅长:模拟技术
私信 关注
[问答]

如何实现基于ncnn的RK3399上的mtcnn人脸检测?

如何在RK3399上烧录安卓系统?
如何实现基于ncnn的RK3399上的mtcnn人脸检测?

回帖(1)

景芳

2022-3-4 10:20:04
1.在RK3399上烧录安卓系统(Android 7.1.2)


博主使用SD卡脱机烧写:
访问此处的下载地址下载SD卡脱机烧写所需的文件及工具:

详细操作步骤如下:



  • 准备一张8G或以上容量的SDHC卡;
  • 下载并解压固件文件rk3399-eflasher-OSNAME-YYYYMMDD.img.zip和工具win32diskimager;(osname是你要烧录的系统镜像名称)
  • 在Windows下以管理员身份运行win32diskimager,在界面上选择你的SD卡盘符,选择- 解压后的EFlasher固件,点击写按钮烧写到SD卡; 或者在Linux下使用dd命令将rk3399-eflasher-OSNAME -YYYYMMDD.img写入SD卡;
  • 将SD卡从电脑端弹出,插入NanoPC-T4的的microSD卡槽;
  • 长按NanoPC-T4上的Power键直到板上的PWR灯亮,系统会从SD卡启动,并自动启动EFlasher烧写工具,你有多种途径可以操作EFlasher:


方法1:连接LCD或HDMI显示屏,在图形界面上操作EFlasher,如果屏幕不支持触摸,则需要使用USB鼠标来操作; (博主采用这个方法)

方法2:将开发板通过网线接入局域网,通过ssh登录开发板,然后输入命令eflasher,根据命令行的提示进行操作;(注:ssh登录的用户是root,密码为fa,开发板IP可查看路由器后台获得)

方法3:通过调试串口登录到串口终端,在终端上输入命令eflasher来操作;

方法4:连接一个lcd2u***配件到NanoPC-T4上,按配件上面的K1键可以选择要烧写的系统,然后按K2键确定烧写,烧写进度会在lcd2u***上显示;

烧写完成后,轻按电源键关机,从NanoPC-T4端弹出SD卡;(不拔出会进不了烧好的系统

长按电源开机,会从eMMC的启动你刚刚烧写的系统;


2. 搭建开发环境


2.1英伟达官网下载驱动程序




2.1.1禁用nouveau第三方驱动


打开编辑配置文件: sudo gedit /etc/modprobe.d/blacklist.conf

在最后一行添加:blacklist nouveau

改好后执行命令:sudo update-initramfs -u

重启使之生效:reboot

2.1.2安装驱动


重启后按Ctrl+Alt+F1 进入命令行界面

执行命令:lsmod | grep nouveau

禁用X服务:sudo /etc/init.d/lightdm stop (或者:sudo service lightdm stop)

给驱动run文件赋予可执行权限:sudo chmod a+x NVIDIA-Linux-x86_64-390.25.run     (下载的驱动文件名)

安装:sudo ./NVIDIA-Linux-x86_64-390.25.run -no-opengl-files

开启X服务:sudo /etc/init.d/lightdm start (或者:sudo service lightdm start)

–no-opengl-files 只安装驱动文件,不安装OpenGL文件。这个参数最重要
–no-x-check 安装驱动时不检查X服务
–no-nouveau-check 安装驱动时不检查nouveau
后面两个参数可不加。

重启,没有问题,输入命令:nvidia-smi

如果出现了驱动版本就表示安装成功了。

2.2cuda安装

这篇文章写的非常详细,但是因为个人环境不同,还是出现了很多大小不同的错误,如果遇到了错误可以继续遇到此文



  • 如果按照这篇文章遇到了安装cuda的问题可以参考我的做法:
    - 这篇文章到了第五步请注意:我之前上一步已经装了驱动,所以第五步这里选择 n
    - 此处是因为直接安装cuda的时候总是失败,所以选择分开安装驱动cuda**(cuda本身是含有驱动的)**




2.3cudnn安装


2.4安装 opencv3.1


2.5编译caffe##安装 pycaffe notebook 接口环境


如果出错 确保安装好需要的工具cmake、编译caffe的工具(参考caffe github的安装教程)



  • 以及对应报错所缺少的文件,一般是环境变量,文件没有复制好等问题,自行谷歌一般能解决这些疑难杂症,博主在参考上面的文章也遇到了很多错误,但是没有及时记下来…
  • 比如python,上一步的链接库复制等
  • 安装pycaffe导入的时候需要注意编码问题
  • 安装或新建文件时需要使用sudo命令等(很多是没有权限)


3.NCNN编译及模型转换

使用Ubuntu编译ncnn库

3.1首先要下载和解压NDK。
unzip android-ndk-r17b-linux-x86_64.zip

3.2设置NDK环境变量,目录是NDK的解压目录。


export

设置好之后,可以使用以下的命令查看配置情况。

root@test:/home/test/paddlepaddle# echo $NDK_ROOT
/home/test/paddlepaddle/android-ndk-r17b

3.3 安装cmake,需要安装较高版本的,笔者的cmake版本是3.11.2。


下载cmake源码

解压cmake源码

tar -zxvf cmake-3.11.2.tar.gz

进入到cmake源码根目录,并执行bootstrap。

cd cmake-3.11.2
./bootstrap

最后执行以下两条命令开始安装cmake。

make
make install

安装完成之后,可以使用cmake --version是否安装成功。

root@test:/home/test/paddlepaddle# cmake --version
cmake version 3.11.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

3.4克隆ncnn源码。
3.5编译源码。


进入到ncnn源码根目录下

   cd ncnn

创建一个新的文件夹

    mkdir -p build-android-armv7

进入到该文件夹中

    cd build-android-armv7

执行编译命令

cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake
     -DANDROID_ARM_NEON=ON
    -DANDROID_PLATFORM=android-14 ..

这里使用4个行程并行编译

make -j4
make install

3.6编译完成,会在build-android-armv7目录下生成一个install目录,我们编译得到的文件都在该文件夹下:


include 调用ncnn所需的头文件,该文件夹会存放在Android项目的src/main/cpp目录下;
lib 编译得到的ncnn库libncnn.a,之后会存放在Android项目的src/main/jniLibs/armeabi-v7a/libncnn.a

转换预测模型

3.6.1. 克隆Caffe源码。

3.6.2. 编译Caffe源码。


之前安装caffe时已经编译好

3.6.3. 升级Caffe模型。


把需要转换的模型复制到caffe/tools,并切入到该目录

cd tools

升级Caffe模型
./upgrade_net_proto_text mobilenet_v2_deploy.prototxt mobilenet_v2_deploy_new.prototxt

./upgrade_net_proto_binary mobilenet_v2.caffemodel mobilenet_v2_new.caffemodel

3.6.4.检查模型配置文件,因为只能一张一张图片预测,所以输入要设置为dim: 1。


name: "MOBILENET_V2"
layer {
  name: "input"
  type: "Input"
  top: "data"
  input_param {
    shape {
      dim: 1
      dim: 3
      dim: 224
      dim: 224
    }
  }
}

3.6.5. 切换到ncnn的根目录,就是我们上一部分克隆的ncnn源码。


cd ncnn/

3.6.6. 在根目录下编译ncnn源码。


    mkdir -p build
    cd build
    cmake ..
    make -j4
    make install

3.7. 把新的Caffe模型转换成NCNN模型。


经过上一步,会生产一个tools,我们进入到以下目录

cd tools/caffe/

把已经升级的网络定义文件和权重文件复制到当目录,并执行以下命令

./caffe2ncnn mobilenet_v2_deploy_new.prototxt mobilenet_v2_new.caffemodel mobilenet_v2.param mobilenet_v2.bin

3.8. 对象模型参数进行加密,这样就算别人反编译我们的apk也用不了我们的模型文件。把上一步获得的mobilenet_v2.param、mobilenet_v2.bin复制到该目录的上一个目录,也就是tools目录。


切换到上一个目录

cd ../

执行命令之后会生成mobilenet_v2.param、mobilenet_v2.id.h、mobilenet_v2.mem.h

./ncnn2mem mobilenet_v2.param mobilenet_v2.bin mobilenet_v2.id.h mobilenet_v2.mem.h

经过上面的步骤,得到的文件中,以下文件时需要的:

mobilenet_v2.param.bin 网络的模型参数;
mobilenet_v2.bin 网络的权重;
mobilenet_v2.id.h 在预测图片的时候使用到。

4.开发Android项目


我们在Android Studio上创建一个NCNN1的项目,别忘了选择C++支持
(Android Studio3.0之后的新建项目时下滑可以找到c++支持的模板)

其他的可以直接默认就可以了,在这里要注意选择C++11支持。(选其他的会出错)



编译不通过的解决办法




  • ndk版本<=16.(下载ndk16版本,修改ndk路径)
    NDK旧版本下载地址:
  • 按照Android Studio移除报错地方,一直点点do refactor,警告也可以通过修改成最新的语法解决
    比如build.gradle(该项目的build.gradle)里的 ‘compile’—>‘implementation’
  • build.gradle(全局)里添加 google()
  • 确保需要的sdk版本已经下载


虽然成功安装运行,但是没有检测到人脸,初步猜测是动态申请读取外部存储问题


举报

更多回帖

发帖
×
20
完善资料,
赚取积分