基于ncnn的人脸识别系统
目标:在RK3399板子上实现2维人脸识别
平台:NanoPC-T4板子,系统基于Ubuntu Desktop 18.04的FriendlyDesktop
准备工作:按照wiki上的教程装opencv3.4
1 安装ncnn
ncnn是腾讯出品的一个为手机端极致优化的高性能神经网络前向计算框架。ncnn git地址
1.1 编译
按照git上的教程【Build for ARM Cortex-A family with cross-compiling】,不过我好像不应该是cross-compiling,因为我直接在板子make的。
按照**AArch64 GNU/Linux target (aarch64-linux-gnu)**的步骤编译
提醒:把CMakeLists.txt里最后add_subdirector(example)取消注释,这步可以跳过,不过等你安装后发现example里的内容没有编译,想测试一下就要重新编译了。
$ cd
$ mkdir -p build-aarch64-linux-gnu
$ cd build-aarch64-linux-gnu
$ cmake -DCMAKE_TOOLCHAIN_FILE=…/toolchains/aarch64-linux-gnu.toolchain.cmake …
$ make -j4
$ make install
在最后一步make install后会有一个install文件夹,下面有include和lib两个文件夹,这是我们以后在使用ncnn时要用到的,记住这两个文件夹的地址。
1.2 测试
官方给的example例子是squeezenet,把example文件下的squeezenet_v1.1.bin和squeezenet_v1.1.param和sysnet_words.txt拷贝到build/example里,然后找张图片【我用的飞机图片】也放到build/example里,运行squeezent timg.jpg,就会有3个输出,输出图片的top3分类。
以上完成就算ncnn编译成功了,不过强烈建议多看看example里的例子,毕竟官方源码写的很棒。
2 实现vggface提取特征
参考官方指北教程how to use ncnn with alexnet
实现vggface的特征提取
2.1 模型转换
这步分两步进行
- 将caffe模型转到最新的模型
这一步应该是caffe的问题,我见过不同版本的prototxt,例如layer和layers的区别
用编译好的caffe tools里的upgrade_net_proto_text
和upgrade_net_proto_binary
两个程序完成
upgrade_net_proto_text [old prototxt] [new prototxt]
upgrade_net_proto_binary [old caffemodel] [new caffemodel]
- 将新的caffe模型转到ncnn模型
在上一步编译的build/tools/caffe里有caffe2ncnn
将上一步的new prototxt和new caffemodel转为ncnn的param和bin
caffe2ncnn new.prototxt new.caffemodel vgg.param vgg.bin
这样就得到了vgg的ncnn模型。
2.2 特征提取
最简单的方法,在example里的squeezenet的基础上修改
- squeezenet模型替换
- 取消substract_mean_normalize
- 输入输出名字替换
这样就能得到vggface最后的4096维特征