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

前言

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

代码

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

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模型文件加载以及参数初始化

 

参数初始化函数里面包括模型参数初始化和软件参数初始化。其中软件参数初始化部分是 随着模型配置改变而改变的。比如说同一个算法模型框架,但是网络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)nnie推理

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

同样的,在sample_svp_nnie_software.h中,有几个参数也是和网络模型结构相关的,需要根据实际情况手动修改。 

 5)最后就是结果打印

 运行

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

 

 

你可能感兴趣的:(嵌入式AI)