网络初始化函数: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的结构体如下所示: