海思部署:RuyiStudio流程解析(2)-网络初始化SvpSampleOneSegDetCnnInit

该文描述了一个用于初始化神经网络推理的函数,包括加载WK模型,使用HI_MPI_SVP_NNIE_LoadModel解析模型,获取模型参数,分配内存,加载图像列表以及设置控制参数的过程。这个过程是设备端图像检测的关键步骤。

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

网络初始化函数:s32Ret = SvpSampleOneSegDetCnnInit(&stDetCfg, &stDetParam)

(1)变量声明初始化

结构体如下所示:

 (2)加载wk 模型

   <1>   通过SvpSampleReadWK()函数导入模型,并存放在pstModelBuf中。(SvpSampleNetCom.cpp文件中)

 SvpSampleReadWK介绍

 A: 参数核验与声明

   B: 读取模型文件 

 

     C: 将文件存储于pstModelBuf中

    <2> 通过HI_MPI_SVP_NNIE_LoadModel函数处理(mpi_nnie.h文件中)

    函数作用:对上面的获取到的pstModelBuf模型数据进行解析,从mmz内存中解析模型。

    获取模型的参数个数:

 

    C++与Python不同之处就是可以用各种结构体,pstComParam是一个结构体,而其中的stModel也是一个结构体,再其中的astSeg也是一个结构体。再内存释放的时刻会用到。

    <3> 内存获取

 

  <4> 检测并获取需要测试的图像列表

 SvpSampleLoadImageList介绍:

 A: 初始化操作

     B: 依次获取图像列表路径(这里的数据指的是txt文件,如image_test_list.txt,可能有多个这样的txt文件,一个就代表一个batch)

 <5> 开辟Blob数据空间

   SvpSampleAllocBlobMemDet介绍

static HI_S32 SvpSampleAllocBlobMemDet(
    const HI_U32 *pu32SrcAlign,
    const HI_U32 *pu32DstAlign,
    const SVP_NNIE_CFG_S *pstClfCfg,
    SVP_NNIE_ONE_SEG_DET_S *pstComfParam)
{
    HI_S32 s32Ret = HI_SUCCESS;

    SVP_NNIE_MODEL_S* pstModel = &pstComfParam->stModel;
    SVP_NNIE_SEG_S* astSeg = pstModel->astSeg;

    HI_U16 u16SrcNum = astSeg[0].u16SrcNum;
    HI_U16 u16DstNum = astSeg[0].u16DstNum;
    HI_U32 u32Num = SVP_SAMPLE_MIN(pstComfParam->u32TotalImgNum, pstClfCfg->u32MaxInputNum);

    // malloc src, dst blob buf
    for (HI_U32 u32SegCnt = 0; u32SegCnt < pstModel->u32NetSegNum; ++u32SegCnt)
    {
        SVP_NNIE_NODE_S* pstSrcNode = (SVP_NNIE_NODE_S*)(astSeg[u32SegCnt].astSrcNode);
        SVP_NNIE_NODE_S* pstDstNode = (SVP_NNIE_NODE_S*)(astSeg[u32SegCnt].astDstNode);

        // malloc src blob buf;
        for (HI_U16 i = 0; i < astSeg[u32SegCnt].u16SrcNum; ++i)
        {
            SVP_BLOB_TYPE_E enType = pstSrcNode->enType;
            HI_U32 u32SrcC = pstSrcNode->unShape.stWhc.u32Chn;
            HI_U32 u32SrcW = pstSrcNode->unShape.stWhc.u32Width;
            HI_U32 u32SrcH = pstSrcNode->unShape.stWhc.u32Height;
            s32Ret = SvpSampleMallocBlob(&pstComfParam->astSrc[i],
                enType, u32Num, u32SrcC, u32SrcW, u32SrcH, pu32SrcAlign ? pu32SrcAlign[i] : STRIDE_ALIGN);
            CHECK_EXP_GOTO(HI_SUCCESS != s32Ret, FAIL, "Error(%#x): Malloc src blob failed!", s32Ret);
            ++pstSrcNode;
        }

        // malloc dst blob buf;
        for (HI_U16 i = 0; i < astSeg[u32SegCnt].u16DstNum; ++i)
        {
            SVP_BLOB_TYPE_E enType = pstDstNode->enType;
            HI_U32 u32DstC = pstDstNode->unShape.stWhc.u32Chn;
            HI_U32 u32DstW = pstDstNode->unShape.stWhc.u32Width;
            HI_U32 u32DstH = pstDstNode->unShape.stWhc.u32Height;

            s32Ret = SvpSampleMallocBlob(&pstComfParam->astDst[i],
                enType, u32Num, u32DstC, u32DstW, u32DstH, pu32DstAlign ? pu32DstAlign[i] : STRIDE_ALIGN);
            CHECK_EXP_GOTO(HI_SUCCESS != s32Ret, FAIL, "Error(%#x): Malloc dst blob failed!", s32Ret);
            ++pstDstNode;
        }
    }

    return s32Ret;
FAIL:
    for (HI_U16 i = 0; i < u16SrcNum; ++i) {
        SvpSampleFreeBlob(&pstComfParam->astSrc[i]);
    }
    for (HI_U16 i = 0; i < u16DstNum; ++i) {
        SvpSampleFreeBlob(&pstComfParam->astDst[i]);
    }

    // some fail goto not mark s32Ret as HI_FAILURE, set it to HI_FAILURE
    // keep s32Ret value if it is not HI_SUCCESS
    if (HI_SUCCESS == s32Ret) {
        s32Ret = HI_FAILURE;
    }

    return s32Ret;
}

<6> 其余参数设置

   SvpSampleSetCtrlParamOneSeg介绍

 主要对pstComParam的stCtrl进行设置,stCtrl的结构体如下所示:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值