17

AI老铁 · 2020年07月23日

海思AI芯片(Hi3519A/3559A)方案学习(十七)开发板上运行yolo3模型的代码分析

本系列为华为海思海思AI芯片(Hi3519A/3559A)方案学习系列之十七,系列文章请关注海思AI芯片方案学习
作者:ltshan139

前言

前面的博客系列 已经介绍了如何将caffemodel转换成wk文件,如何将jpg文件转成bgr格式数据以及如何在PC上仿真模型推理等,基于这些基础,本文来结合代码分析如何在板子上推理yolov3模型。

代码

SDK提供的nnie AI推理相关的样例代码路径在这里:
1.png

sample_nnie_main.c很简单,主要是提供入口函数main, 其所带的参数0/1/2。。。 。。。决定了哪个算法模型(比如YOLOV1/YOLOV2/YOLOV3/SSD中的一个)被推理。 本文选的是yolov3。所以对应地,函数void SAMPLE_SVP_NNIE_Yolov3(void)被调用。

在SAMPLE_SVP_NNIE_Yolov3函数里面,其过程分为如下步骤:

1)初始化,包括svp/nnie系统初始化,wk模型文件加载以及参数初始化
1.png
2.png
3.png
 

参数初始化函数里面包括模型参数初始化和软件参数初始化。其中软件参数初始化部分是 随着模型配置改变而改变的。 比如说同一个算法模型框架,但是网络size不一样,分类数目不一样等,就要在这里修改。 代码如下所示

static HI_S32 SAMPLE_SVP_NNIE_Yolov3_SoftwareInit(SAMPLE_SVP_NNIE_CFG_S* pstCfg,
    SAMPLE_SVP_NNIE_PARAM_S *pstNnieParam, SAMPLE_SVP_NNIE_YOLOV3_SOFTWARE_PARAM_S* pstSoftWareParam)
{
 。。。 。。。
    pstSoftWareParam->u32OriImHeight = pstNnieParam->astSegData[0].astSrc[0].unShape.stWhc.u32Height;
    pstSoftWareParam->u32OriImWidth = pstNnieParam->astSegData[0].astSrc[0].unShape.stWhc.u32Width;
    pstSoftWareParam->u32BboxNumEachGrid = 3;
    pstSoftWareParam->u32ClassNum = 80;
    pstSoftWareParam->au32GridNumHeight[0] = 13;
    pstSoftWareParam->au32GridNumHeight[1] = 26;
    pstSoftWareParam->au32GridNumHeight[2] = 52;
    pstSoftWareParam->au32GridNumWidth[0] = 13;
    pstSoftWareParam->au32GridNumWidth[1] = 26;
    pstSoftWareParam->au32GridNumWidth[2] = 52;
    pstSoftWareParam->u32NmsThresh = (HI_U32)(0.3f*SAMPLE_SVP_NNIE_QUANT_BASE);
    pstSoftWareParam->u32ConfThresh = (HI_U32)(0.5f*SAMPLE_SVP_NNIE_QUANT_BASE);
    pstSoftWareParam->u32MaxRoiNum = 10;
    pstSoftWareParam->af32Bias[0][0] = 116;
    pstSoftWareParam->af32Bias[0][1] = 90;
    pstSoftWareParam->af32Bias[0][2] = 156;
    pstSoftWareParam->af32Bias[0][3] = 198;
    pstSoftWareParam->af32Bias[0][4] = 373;
    pstSoftWareParam->af32Bias[0][5] = 326;
    pstSoftWareParam->af32Bias[1][0] = 30;
    pstSoftWareParam->af32Bias[1][1] = 61;
    pstSoftWareParam->af32Bias[1][2] = 62;
    pstSoftWareParam->af32Bias[1][3] = 45;
    pstSoftWareParam->af32Bias[1][4] = 59;
    pstSoftWareParam->af32Bias[1][5] = 119;
    pstSoftWareParam->af32Bias[2][0] = 10;
    pstSoftWareParam->af32Bias[2][1] = 13;
    pstSoftWareParam->af32Bias[2][2] = 16;
    pstSoftWareParam->af32Bias[2][3] = 30;
    pstSoftWareParam->af32Bias[2][4] = 33;
    pstSoftWareParam->af32Bias[2][5] = 23;
。。。 。。。
}

2)加载图片
3.png
 

3)nnie推理

4.png

4)软件处理三个yolo层的数据,并通过NMS来得到最终 bbox
5.png

同样的,在sample_svp_nnie_software.h中,有几个参数也是和网络模型结构相关的,需要根据实际情况手动修改。 
6.png
 5)最后就是结果打印

8.png

 运行

 交叉编译以及如何在板子上运行, 请参考海思AI芯片(Hi3519A/3559A)方案学习(四)如何在3519A板子上运行sample code。 

版权声明:本文为CSDN博主「ltshan139」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/avideointerfaces/article/details/93891881



海思AI芯片系列文章



更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习

推荐阅读
关注数
871
内容数
40
海思AI芯片(Hi3519A/3559A)方案学习系列笔记,欢迎关注。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息