华为海思AI芯片HI3516DV300上SSD代码的移植和优化

针对海思AI芯片HI3516DV300上的SSD代码,通过优化DetectionOutForward、NMS及Softmax等环节,显著提升模型运行效率。尤其在decodebox与NMS阶段,采用创新编码策略与修正背景类NMS实现,大幅缩短CPU运行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前一段时间一直在做海思AI芯片 HI3516DV300上SSD代码的优化工作,这里总结一下优化的一些心得体会。之所以要对海思AI芯片 HI3516DV300上SSD代码做优化,是因为SSD有一部分是运行在CPU上,而HI3516DV300上的CPU性能比较差,网络只要稍微复杂一点,CPU部分运行就会很慢。下表给出了一些模型在芯片上运行的时间,可以看到CPU部分运行的时间占据了大部分。

在这里插入图片描述
注意:
这里的Forward对应SAMPLE_SVP_NNIE_Forward()函数,这个函数基本上是运行在NNIE上的,GetResult对应SAMPLE_SVP_NNIE_Ssd_GetResult函数,这个函数是运行在CPU上的,后面直接使用GetResult表示这个函数



DetectionOutForward的优化

首先分析性能瓶颈。通过对GetResult函数分析发现主要耗时在两个函数中:SVP_NNIE_Ssd_SoftmaxForward和SVP_NNIE_Ssd_DetectionOutForward,后面直接使用SoftmaxForward和DetectionOutForward表示。
在这里插入图片描述

进一步对DetectionOutForward函数进行分析,其中DetectionOutForward主要包含了两个步骤,这两个部分分别对应了两个for循环:

  1. decode box: 将网络输出的预测值转换为实际的坐标值,这一部分记为Loop1
  2. NMS: 对每一类目标的前topk个置信度最高的bbox做NMS,这一部分记为Loop2

发现主要耗时在Loop1中
在这里插入图片描述
Loop1对应了如下代码:
在这里插入图片描述

分析Loop1代码,Loop1主要功能是对所有anchor的预测值进行解码转换为anchor在图像中实际的坐标值。
在这里插入图片描述
对每一个anchor都需要调用两次exp()函数(上图中红框标出的部分),这个函数是一个非常耗时的函数,45120个anchor一共调用90240次exp(),通过测试发现90240次exp()调用需要耗时21ms,如果能够减少exp()的调用次数,将会大大减少时间。
由于实际做NMS的时候,我们只对前topk个置信度最高的bbox做NMS,也就是说只会用到前topk个bbox的真实坐标值,其他bbox的坐标值用不到,所以我们只需要计算出前topk个bbox的真实坐标值就可以了,这里topK设置为400,也就是说只需要执行800次exp操作就可以,而800次exp操作只需要0.2ms,可以大大减少时间。

但是最后做NMS的时候,使用的是图1中蓝框中的4个变量,而如果要计算出真实坐标值,就必须要知道网络输出的预测值和priorbox的坐标,也就是如果要计算出前topk个bbox的真实坐标值,就必须要知道每个bbox对应的8个变量,图1中红框和绿框中的8个值。

在这里插入图片描述图1

8个值:

ps32PriorBoxes[jSAMPLE_SVP_NNIE_COORDI_NUM]
ps32PriorBoxes[j
SAMPLE_SVP_NNIE_COORDI_NUM+1]
ps32PriorBoxes[jSAMPLE_SVP_NNIE_COORDI_NUM+2]
ps32PriorBoxes[j
SAMPLE_SVP_NNIE_COORDI_NUM+3]
ps32LocPreds[jSAMPLE_SVP_NNIE_COORDI_NUM]
ps32LocPreds[j
SAMPLE_SVP_NNIE_COORDI_NUM+1]
ps32LocPreds[jSAMPLE_SVP_NNIE_COORDI_NUM+2]
ps32LocPreds[j
SAMPLE_SVP_NNIE_COORDI_NUM+3]

下面的问题就是如何将每个bbox对应的这8个变量编码到4个变量中,通过对每个bbox对应的8个变量分析发现:

  1. 由于网络输入大小是512,也就是图像中的坐标在[0,512]之间,也就是ps32PriorBoxes的值也在[0,512]之间,也就表示ps32PriorBoxes的值可以通过3位数来表示
  2. ps32LocPreds的值有正有负,而且值的范围可以使用5位数表示

基于上面的发现,设计了以下编码方式:

ps32LocPreds * 10000+ps32PriorBoxes * 10+flag

其中flag为标记位,当ps32LocPreds值为负数时,flag为0,当ps32LocPreds值为正数时,flag为1
而且编码之后的值全部转换为正数,便于解码。
这个编码的含义就是:最后一位是标记位,倒数第2到第4位是priorbox的值,剩下的位数是位置预测值
示例:
-3852,125→38521250
5017,96→50170961
-13590,145→135901450
在这里插入图片描述
最后,在NMS的时候,进行解码就可以计算出真实坐标值了,比如对每个bbox编码之后的4个值的第一个值进行解码:
在这里插入图片描述

这样就可以得到需要的8个值,最后根据这8个值就可以计算出该bbox的真实坐标值了
在这里插入图片描述

使用优化后的代码进行速度测试
在这里插入图片描述
行人检测器Loop1经过优化后从原来的34ms提高到了7ms,速度得到了明显提高,由于Loop2增加了解码的时间,所以Loop2会略微变慢,但是总体时间还是大大降低了。
优化之后对精度是完全没有影响的。


NMS的优化

AI芯片中官方给的SSD代码在对每一类做NMS的时候,实现上有点bug,官方代码中,当类别为背景的时候,也做了NMS。
当类别为背景的时候,是不需要对所有的预测框做NMS的,这样可以节省很多时间。
在这里插入图片描述

修改后的代码:
在这里插入图片描述
优化后的时间:
在这里插入图片描述
我们可以看到优化后Loop2的时间大大降低,在CPU上运行的时间基本上降低为原来的一半了。


Softmax的优化

上面分析了GetResult函数主要耗时在两个函数中:SoftmaxForward和DetectionOutForward。上面对DetectionOutForward进行了优化,那么SoftmaxForward是否可以优化呢?

分析了SoftmaxForward函数,发现计算所有anchor的置信度的时候,45120个anchor也需要调用90240次exp(),需要耗时21ms。

我们知道softmax概率的计算公式如下:
在这里插入图片描述
在对softmax进行优化的时候,我做了一个实验,直接使用fi表示softmax置信度,然后在多个模型中做了测试:
数据集A:
在这里插入图片描述
数据集B:
在这里插入图片描述
我发现一个很奇怪的现象:直接使用fi代替softmax概率,大部分模型精度基本上没有损失。同时也观察了一系列模型的结果,发现softmax概率大的目标往往fi值也大。 目前还不知道具体原因。有知道其中原因的朋友欢迎留言讨论。

在这里插入图片描述

由于去掉了softmax的计算,所以时间会大大减少,上表中可以看到去掉了softmax计算后,从原来的77ms直接降低到了18ms,速度提高了4倍多。但是由于目前对这种现象的原因还不明确,所以暂时是没有使用的。


结束语

通过本次优化,深刻体会到了算法性能的重要性,PC上很快的一个操作,在其他平台很可能就是性能的瓶颈。同时也体会到了深入理解算法的重要性以及将速度做到极致的那种成就感。


非常感谢您的阅读,如果您觉得这篇文章对您有帮助,欢迎扫码进行赞赏。
这里写图片描述

处理器内核 ● ARM Cortex A9@800MHz - 32KB L1 I-Cache,32KB L1 D-Cache - 256KB L2 Cache 视频编码 ● H.264 Baseline Profile编码 ● H.264 Main Profile编码 ● H.264 High profile编码 ● MPEG4 SP编码 ● MJPEG/JPEG Baseline编码 视频编码处理性能 ● H.264编码可支持最大分辨率为 1600万像素 ● H.264多码流实时编码能力: - 1080P@30fps+D1@30fps+CIF@30fps +QVGA@30fps+1080P JPEG抓拍 2fps - 720P@60fps+D1@30fps+CIF@30fps+ QVGA@30fps+720P JPEG抓拍2fps ● 支持JPEG抓拍3M Pixels@15fps~16M Pixels@2fps ● 支持MP EG4 S P编码,支持最大 960H实时 ● CBR/VBR/ABR码率控制,16kbit/ s~40Mbit/s ● 编码帧率支持1/16~60fps ● 编码码流支持VUI信息 ● 支持对感兴趣区域高质量编码 (ROI) ● 提供彩转灰编码功能 智能视频分析 ● 集成智能分析加速引擎,支持智能 运动侦测、周界防范、人脸检测、 镜头保护等多种智能分析应用 视频与图形处理 ● 支持de-interlace、图像增强、边缘 增强、3D去噪等前处理功能 ● 视频、图形输出抗闪烁处理 ● 视频1/8~16x缩放功能 ● 图形 1/4~4x缩放功能 ● 8个区域的前端OSD叠加 ● 2层(视频层、图形层)视频后端 硬件图像叠加 ● 4个区域的视频遮盖 Hi3516 芯片主要特点 ISP ● 支持3A功能,3A的控制用户可调节 ● 支持WDR、强光抑制、背光补偿、 gamma、色彩增强 ● 支持坏点校正、去噪、数字防抖 ● 提供ISP相关API,可供客户调节ISP 效果 ● 提供 PC端sensor与ISP tuning tools 音频编解码 ● 通过软件实现多协议语音编解码 ● 协议支持G.711、ADPCM、G.726 ● 支持回波抵消功能 安全引擎 ● 硬件AES/DES/3DES加解密算法 ● 数字水印技术 视频接口 ● 输入 - 支持支持8/10/12/14/16 bit RGB Bayer输入,时钟频率最高150MHz - 支持BT.601,数据格式可支持:YUV 422 - 支持BT.656,数据格式可支持:YUV 422 - 支持BT.1120协议输入,支持内嵌同 步,外置同步两种模式,数据格式 为:YUV422,频率≥150MHz - 支持与A p t i n a、OV、SONY 、 Altasens等主流高清CMOS对接 - 支持与sharp、松下高清CCD对接 - 支持与960H CCD sensor对接 - 支持1 6 M @ 2 f p s ; 5 M @ 5 f p s; 3M@1 5 f p s ; 1 0 8 0 P@3 0 f p s ; 720P@60fps视频输入能力 - 支持双sensor输入 ● 输出 - 支持一路CVBS输出,同时提供1个 BT.656输出 - 提供1个BT.1120视频输出接口,用 于外扩HDMI或SDI接口,最高性能 1080P@30fps 音频接口 ● 2个标准I2S接口 ● 集成1个Audio codec,支持8/16bit语 音输入输出 ● 支持通过I2S接口外接Audio codec, 支持8/16bit语音输入输出 外围接口 ● 4个UART接口 ● IR接口、I2C接口、SPI主从接口、 GPIO接口、PWM接口 ● 1个PCIe 1.1接口,支持EP/RC; ● 2个SDIO2.0接口,最大支持32GB ● 2个USB 2.0 HOST接口,支持Hub功能 ● GMAC接口,支持RGMI IMI I模 式;支持10/100Mbit/s 全双工或半 双工模式,1000M 全双工模式,支 持QoS 外部存储器接口 ● DDR2/3 SDRAM接口 - 32/16bit DDR2/DDR3@500MHz - 最大容量支持1GB ● SPI Nor Flash接口 - 1、2、4bit SPI Nor Flash ● NAND Flash接口 - 8bit数据位宽 - 支持SLC、MLC;1bit、4bit、8、 24bit ECC - 支持8GB以上容量器件 ● 可选择从Nor Flash或NAND Flash启动 SDK ● 提供基于Linux 2.6.32 SDK包 ● 提供H.264的高性能PC解码库 芯片物理规格 ● 功耗 - 1000mW典型功耗 - 支持多级省电模式 工作电压 - 内核电压为1.0V - IO电压为3.3V/PCIe 2.5V,容限电压 为5V - DDR2/3 SDRAM接口电压为1.8/1.5V - 工作环境温度为-20℃~+85℃ 封装 - FC-CSP封装, 441 pin - 0.65mm管脚间距,15mm×15mm The right silicon for your next BIG idea Hi3516 功能框图 Hi3516 单sensor IPC解决方案 Hi3516 双sensor IPC解决方案 安防监控行业在经历从传统模拟 CCTV向DVR数字监控转型的同时,网 络化、高清化、智能化也逐渐融入到 发展趋势中,行业对高清IPCamera的 需求也日趋明确与强烈。Hi3516为针 对高清IPCamera产品应用开发的一款 专业高端SOC芯片,其1080P@30fps H264多码流编码性能、优异的ISP编 码视频质量、高性能的智能加速引擎 等特性,在满足客户差异化IPCamera 产品功能、性能、图像质量要求的同 时,可大大降低ebom成本 32/16bit DDR2/DDR3 @500MHz SD/MMC GMAC PHY 2 PORT USB NAND Flash SPI NOR Flash× 2 AXI bus Hi3516 PCIe 1.1 AES/DES/ 3DES/SHA RTC I2C UART ×4 GPIO s IR I2S× 2 PWM× 4 Video Subsystem H.264 HP/MPEG4/ MJPEG/JPEG ARM Subsystem A9@800MHz (32KB/32KB,256KB L2 Cache) Flash I/F I2C USB 2.0 Host× 2 GMAC SSP × 2 NANDC Image Subsystem IVS ENGINE VPP+TDE ISP
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值