以YOLOv3为例:
1. main.cpp调用接口SvpSampleCnnDetYoloV3()函数接口。注意:其他不需要的可以都注释掉;
(1) SvpSampleCnnDetYoloV3()函数介绍
//在SvpSampleCnnDetectionOneSeg.cpp脚本中
void SvpSampleCnnDetYoloV3()
{
printf("%s start ...\n", __FUNCTION__);//开始标志,见下图,输出:SvpSampleCnnDetYoloV3 start ...
//调用SvpSampleCnnDetectionOneSeg函数
SvpSampleCnnDetectionOneSeg(
g_paszModelName_d[SVP_SAMPLE_WK_DETECT_NET_YOLOV3],
g_paszPicList_d[SVP_SAMPLE_WK_DETECT_NET_YOLOV3],
SVP_SAMPLE_WK_DETECT_NET_YOLOV3
);
printf("%s end ...\n\n", __FUNCTION__);//结束标志
fflush(stdout);
}
输出的开始标志:
输出的结束标志:
以上说明:整个过程都在SvpSampleCnnDetectionOneSeg()中进行。(有点小兴奋 ... fighting!)
(2) SvpSampleCnnDetectionOneSeg()函数介绍
<1> 先介绍的别的
该函数存在于同名的SvpSampleCnnDetectionOneSeg.cpp脚本文件中,因为函数中会用到一些全局参数,故先对脚本文件进行介绍。
首先在程序运行前,先将SvpSampleCnnDetectionOneSeg.cpp文件中对应的模型路径以及测试用的数据路径进行修改,如下图所示:
A: 修改测试数据:
修改测试列表中的测试数据,此处配置的是 { "../../data/detection/yolov3/image_test_list.txt" },
对应文件在 data/detection/yolov3 中
此处列出需要仿真的文件表,需要根据自己的仿真数据类型进行选择:如果为U8,则为bgr,如果为YVU420sp则为yvu格式。
B: 修改模型数据
模型调用可以选择Inst和func,现在是做指令仿真,选inst模型修改就可以:
上面这两个地方是必须要修改的,如上面提到的SvpSampleCnnDetectionOneSeg()函数也是应用了这里的数据的,如:
仿真工程要切换到inst方式,右键选择:
<2> SvpSampleCnnDetectionOneSeg函数正式介绍
下面为伪代码,只保留函数内的关键函数
//参数1:模型路径 参数2:图像路径 参数3:网络类型,通过网络类型从设置的上述参数中选取数据(下面会介绍);
HI_S32 SvpSampleCnnDetectionOneSeg(const HI_CHAR *pszModelName, const HI_CHAR *paszPicList[], HI_U8 netType, HI_S32 s32Cnt)
{
//加载模型,申请mmz空间
s32Ret = SvpSampleOneSegDetCnnInit(&stDetCfg, &stDetParam);
/*
stDetParam存储了模型信息
stDetParam.stModel.astSeg[0]u16SrcNum:输入节点个数
stDetParam.stModel.astSeg->astSrcNode[i].szName:输入节点 i 的名字
stDetParam.stModel.astSeg->u16DstNum:输出节点个数
stDetParam.stModel.astSeg->astDstNode[i].szName:输出节点 i 的名字
*/
//读入图像
s32Ret = SvpSampleReadAllSrcImg(stDetParam.fpSrc, stDetParam.astSrc, stDetParam.stModel.astSeg[0].u16SrcNum, imgNameRecoder);
//forward 计算
s32Ret = SvpSampleCnnDetectionForword(&stDetParam, &stDetCfg);
//获取结果
s32Ret = SvpSampleDetOneSegGetResult(&stDetParam, netType, &stSSDParam, strResultFolderDir, imgNameRecoder);
}
上述是大体的运行流程。
<A> 输入参数
重点介绍第三个参数:netType,会根据此参数获得对应网络在参数设置中的索引,调用参数来自于:SvpSampleWk.h的hiSVP_SAMPLE_WK_DETECT_NET_TYPE_E函数中:
下面会根据 netType,选取模型路径和测试图像路径
<B> 参数核验
在函数前期会进行输入的参数核验,以保证运行的有效性,
1> : 参数核验
2>: 变量声明初始化
3> 根据网络格式建立对应的文件夹
4> 结构体stDetCfg初始化,该结构体用于存放模型即检测结果信息
结构体如下所示:
<C> 网络初始化
通过以引用的方式传入stDetCfg, stDetParam,对网络进行初始化。
stDetCfg上面讲过了,而stDetParam上面在变量初始化时也提到,是由SvpSampleWk.h声明的结构体,在此进行声明初始化初始化
结构如下:
具体的函数介绍,将在博文网络初始化SvpSampleOneSegDetCnnInit介绍。
<D> 读入图像
具体函数介绍,将在博文图像读取SvpSampleReadAllSrcImg介绍。
<E> 前向传播,调用SvpSampleCnnDetectionForword()函数
具体函数介绍,将在博文前向传播SvpSampleCnnDetectionForword介绍。
<F> 获得粗略结果
具体函数介绍,将在博文结果解析SvpSampleDetOneSegGetResult介绍。
<G> 获得最终结果
F步获得的只是经过阈值粗略筛选的结果,还需要进行进一步的处理,才可以得到最终的结果,如NMS非极大值抑制等。
具体函数介绍,将在博文结果精筛SvpSampleWKYoloV3BoxPostProcess介绍。
<H> 打印结果
具体的函数介绍,将在博文打印结果SvpDetYoloResultPrint介绍。