张新栋 · 2020年09月03日

RK1808-AI开发手记(二)人脸姿态估计porting(python)

首发:知乎
作者:张新栋

之前跟大家简单介绍过基于RK1808设备去开发和调试的基本流程,大家如果感兴趣的话,可以参考RK1808-AI开发手记(一)开篇。本文我们选取一个简单的例子来跟大家一起走一下这个流程,我们这里选取end-to-end的人脸姿态估计器来作为porting的样例。本文主要有4个讨论点,分别为:1、人脸姿态估计简介 2、 上位机数值验证 3、网络模型量化 4、RK1808数值验证,大部分基于graph-level的开发流程与本文的开发流程相似。

一、人脸姿态估计简介

模型设计和算法训练部分都比较基础,输入为64x64的人脸patch,核心的特征提取部分采用的是类似resnet的网络结构,只堆叠了4-5层。网络的模型总大小为1.4MB,下图为该模型的网络结构可视化(PS:为了最高效的使用NPU,尽量还是别用DW-CONV了):

姿态估计网络可视化

二、上位机数值验证

我们基于上述网络,freeze导出了一版pb文件,下面我们在上位机上对网络进行数值验证。数值验证核心代码:

输出的数值对应人脸角度的pitch、yaw、roll三维欧拉角,测试图例如下:

对应的ground-truth为:0.162081,-0.784058,0.013938

上位机输出的算法预测数值为:0.146407,-0.7542514,0.00680137

三、网络模型量化

含NPU的设备内置int8运算的ip单元,一般都会提供post-train quantization toolbox给用户进行模型转换。同样的,瑞芯微也提供了对应的工具链,已于github上开源,rknn-toolkit。在进行算法网络量化的时候,一般只需要注意如下几点:

1、提供的calibration dataset尽量与训练数据同分布,或者干脆在训练数据中采样部分数据用于calibration。一般提供1k张左右的图例进行post-train quantization就可以得到不错的数值精度。关于量化的一些杂谈,之前的文章也有跟大家讨论过,可以参考谈谈MNN的模型量化(一)数学模型

2、在NPU的项目中(rk、allwin、k210等),尽量在网络设计的时候干掉DW-CONV,该op在NPU中并没有进行很好的适配,且该op在int8下的量化数值精度经常翻车(high-level偶尔翻车,low-level大概率翻车)。我一般都会采用resnet-like的module进行小型化,速度和性能一般都要优于基于mobilenet结构的。

我们将使用瑞芯微提供的rknn-toolkit进行模型量化,下面为量化的核心代码:

我们在dataset.txt文件中提供了参与量化的图片名,跟进上图的简单代码片就可以对fp32的pb模型进行int8的量化操作。我们可以用瑞芯微提供的rknn-toolkit对量化后的rknn模型进行可视化,量化完的模型大小约为原模型的1/4,392kb。

四、RK1808数值验证

我们采用瑞芯微提供的rknn-toolkit得到了量化后的网络模型,后面我们将采用瑞芯微提供的runtime-library进行模型数值精度验证。这一步的必须的,不管是基于graph-level还是op-level的runtime-sdk,都建议大家做数值验证这一步,否则随着项目的推进,不可能的因素将堆叠的越来越多。跟RK1808的设备链接和数据传输,我这边就不赘述啦(如果是计算棒的话,可以用ssh和scp)。瑞芯微提供了native和python的两套runtime调用,我这边为了方便,采用了python接口进行数值精度的验证(后续也会有native-cpp的demo哒)。下面请看数值验证的脚本代码(该脚本为在rk1808的环境中运行的),在rk1808的python环境下单帧推理时间约为4ms

下面为输出的结果对比,

上述结果分别为基于同样图例的计算结果,可以看出,虽然有数值精度误差,但是也在可接受的范围内。本例程笔者仅采用了10张图进行量化操作,若想提升精度,可将calibration数据的数量增加至1k或更多。

五、最后

本文选用一个简单的人脸姿态估计网络,跟大家讨论了如果基于RK1808的硬件平台进行porting的落地工作。本文在数值精度验证阶段是采用的python接口,后续也会出对应的native-cpp层的porting流程。大家如果有感兴趣的任务或者话题,可以下方留言。欢迎大家留言、关注专栏,谢谢大家!

  • 参考

1、 https://zhuanlan.zhihu.com/p/194199332

2、https://zhuanlan.zhihu.com/p/81243626

3、https://github.com/rockchip-linux/rknn-toolkit

推荐阅读

专注嵌入式端的AI算法实现,欢迎关注作者微信公众号和知乎嵌入式AI算法实现专栏

WX20200305-192544.png
更多嵌入式AI相关的技术文章请关注极术嵌入式AI专栏

推荐阅读
关注数
16561
内容数
1230
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息