基于NCNN框架的MTCNN&移植

基于NCNN框架的MTCNN

1 地址

https://www.cnblogs.com/cpuimage/p/8995600.html
git:https://github.com/cpuimage/MTCNN 其中包含了ncnn的地址

2 编译

1 注意ncnn目录,需要从腾讯的ncnn git下来
2 mtcnn有转换好的模型文件,也可以自己搭建matlab+caffe的训练环境自己训练模型。
mkdir build
cd build
cmake …/
make ncnn
make
make可能会报错,把browse.h中的#if linux || FreeBSD || __sun&&__SVR4 改成 #if 1

3 交叉编译

1 修改ncnn/CMakeList.txt文件
倒数第二行注释:
#add_subdirectory(tools)
2 修改ncnn/toolchains
注释最后三行:
#add_definitions(-D__ARM_NEON)
#add_definitions(-D__ANDROID__)
#SET ( ANDROID true)
3 编译
mkdir build_armhi
cd build_armhi
cmake -DCMAKE_TOOLCHAIN_FILE=…/ncnn/toolchains/hisiv500.toolchain.cmake …/
make ncnn
make
这样就生成了 mtcnn执行程序,但是我在我的海思板子上执行报错:
./mtcnn: can’t load library ‘libgomp.so.1’
ncnn需要OpenMP的支持,本来我们可以通过修改CMakeList.txt和ncnn/CMakeList.txt来去掉OpenMP的支持,但是实验证明,带有OpenMP的计算速度提升很多,比如在我的8700cpu下,检测一张有4张人脸的图形,不带OpenMP需要147ms,带上就是65ms。相同的图片,不带OpenMP在hi3531d上执行需要37s,带上需要20s
所以我们需要在arm板上安装OpenMP:
1 git clone https://github.com/lapesd/libgomp.git
2 cd libgomp/src/libgomp && mkdir build && cd build
3 …/configure --host=arm-hisiv500-linux CC=arm-hisiv500-linux-gcc CXX=arm-hisiv500-linux-g++ --disable-multilib CFLAGS=-std=gnu11
两种配置方法生成的动态库是相同的,但是加上–disable-multilib参数编译时间快很多
…/configure --host=arm-hisiv500-linux CC=arm-hisiv500-linux-gcc CXX=arm-hisiv500-linux-g++ CFLAGS=-std=gnu11
4 make -j6
5 cp -d .libs/libgomp.so* 指定目录
可是安装OpenMP还不够,时间还是太长了,我们需要想办法降低时间
这个时候我发现了NENO这个功能,通过修改…/ncnn/toolchains/hisiv500.toolchain.cmake文件,增加浮点运算和NEON,本来加上这个报错我给去掉了,现在修改成:
SET ( CMAKE_CXX_FLAGS “-std=c++11 -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon -mno-unaligned-access -fno-aggressive-loop-optimizations ${CMAKE_CXX_FLAGS}” )
带有OpenMP和NEON的执行结果:784ms,比之前的20s提升了非常多,但是还是不行,时间太长了

猜你喜欢

转载自blog.csdn.net/kakasxin/article/details/93071984