NCNN的介绍和使用

本章主要简述NCNN和NCNN的应用。

关于NCNN

NCNN是一个为手机端极致优化的高性能神经网络前向计算框架。NCNN从设计之初深刻考虑手机端的部署和使用。无第三方依赖, 跨平台,手机端cpu的速度快于目前所有已知的开源框架。基于NCNN,开发者能够将深度学习算法轻松移植到手机端高效执行, 开发出人工智能APP,将AI带到你的指尖。NCNN目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。

NCNN的代码在 [1] 下载。

NCNN的模型文件 [2] 下载:

NCNN更详细的介绍,参考: 社区网站

NCNN的使用

1.下载和编译NCNN

NCNN这类开源引擎都可以从github上下载下来,下载下来的整个文件夹就像一个完整的软件或者生态系统一样。下载方式可以直接去官方的github上下载,也可以本地直接git clone。

因为准备使用NCNN在基于RISCV的系统上运行(根据各人需求),因此需要下载RISCV对应的交叉编译工具链,编译NCNN。

NCNN已支持直接用simpleocv替代opencv编译,为了支持测试验证,需要打开NCNN对应的编译选项: NCNN_BUILD_EXAMPLES和NCNN_SIMPLEOCV,编译完成的测试用例如下:

xiaofei@xiaofei-ubuntu-01:/.../build/examples$ ls
CMakeFiles           mobilenetv2ssdlite  retinaface        shufflenetv2      squeezenetssd  yolov5
cmake_install.cmake  nanodet             rfcn              simplepose        yolact         yolov5_pnnx
fasterrcnn           nanodetplus_pnnx    scrfd             squeezenet        yolov2         yolox
mobilenetssd         peleenetssd_seg     scrfd_crowdhuman  squeezenet_c_api  yolov3

2.运行验证

不同测试用例需要不同的模型文件,可以从 [2] 下载。将编译生成的动态库、需要的测试用例以及配套的模型打包到板卡中测试运行。

1、 运行benchncnn,测试模型的速度,所有自带的模型文件都在NCNN根目录下的benchmark的文件夹中(若不存在则需要手动下载),把里面所有的param文件都拷贝到现在的benchmark文件夹,然后执行如下命令:

bash-5.1# ./benchncnn 4 1 0 -1 0

第一个数字表示测试次数,第二个表示开的线程数,第四个数字-1表示只测cpu,跑出的结果如下所示:

syscall error -1
loop_count = 4
num_threads = 1
powersave = 0
gpu_device = -1
cooling_down = 0
         squeezenet  min =  419.58  max =  420.40  avg =  420.15
          mobilenet  min =  756.79  max =  761.34  avg =  758.63
       mobilenet_v2  min =  473.69  max =  477.22  avg =  474.85
       mobilenet_v3  min =  371.29  max =  372.64  avg =  372.15
         shufflenet  min =  478.59  max =  479.41  avg =  479.07
      shufflenet_v2  min =  307.19  max =  307.85  avg =  307.52
            mnasnet  min =  448.36  max =  450.86  avg =  449.72
    proxylessnasnet  min =  488.78  max =  489.21  avg =  488.96
    efficientnet_b0  min =  640.35  max =  642.49  avg =  641.51
  efficientnetv2_b0  min =  914.21  max =  915.90  avg =  914.77
       regnety_400m  min =  613.04  max =  629.86  avg =  620.66
          blazeface  min =  131.30  max =  131.84  avg =  131.47
          googlenet  min = 1418.17  max = 1427.26  avg = 1423.90
           resnet18  min = 1076.17  max = 1079.29  avg = 1077.89
            alexnet  min =  942.08  max =  947.97  avg =  945.30

2、运行姿态检测

bash-5.1# cd /usr/share/ncnn/simplepose
bash-5.1# ./simplepose ../testpic/dog.jpg
517.50 1168.50 = 0.52102
517.50 1131.98 = 0.31274
472.50 1131.98 = 0.66552
742.50 1168.50 = 0.26839
405.00 1168.50 = 0.73327
652.50 1314.56 = 0.13324
382.50 1351.08 = 0.30757
742.50 1131.98 = 0.19467
292.50 1533.66 = 0.17223
765.00 1131.98 = 0.20411
337.50 1533.66 = 0.11574
405.00 1679.72 = 0.14537
450.00 1679.72 = 0.15800
675.00 1497.14 = 0.20992
675.00 1460.62 = 0.16571
652.50 1825.78 = 0.49265
630.00 1825.78 = 0.35499
imshow save image to image.png
../../../_images/ncnn_simplepose_input.png
../../../_images/ncnn_simplepose_output.png

生成姿态检测结果ncnn_simplepose_output.png

注:Nuclei DDR200T开发板因内存限制,暂不支持运行此实例。

3、 运行图像分割

bash-5.1# cd /usr/share/ncnn/mobilenetssd
bash-5.1# ./mobilenetssd ../testpic/mobilenetssd_input.jpg
7 = 1.00000 at 57.72 215.35 1062.55 x 605.17
imshow save image to image.png
waitKey stub
../../../_images/ncnn_mobilenetssd_input.png
../../../_images/ncnn_mobilenetssd_output.png

生成分割图片ncnn_mobilenetssd_output.png

4、 运行图像识别

输入图片ncnn_squeezenet_input.jpg

../../../_images/ncnn_squeezenet_input.jpg
bash-5.1# cd /usr/share/ncnn/squeezenet
bash-5.1# ./squeezenet ../testpic/squeezenet_input.jpg
817 = 0.866784
n04285008 sports car, sport car
511 = 0.107477
n03100240 convertible
751 = 0.011277
n04037443 racer, race car, racing car