本文主要讲述如何运行在nnie设备SOC上面来运行YOLOv3模型,在开始知道,我们默认读者已经把YOLOv3模型转换完成并取得还是wk指令模型,如果不明白如何获取wk指令模型,可以参考我的上一篇博文。
Pytorch版本YOLOv3模型转Darknet weights模型然后转caffemodel再转wk模型在nnie上面推理
nnie的代码位于官方的SDK文件Hi3519A V100R001C02SPC010.rar下面,需要我们按照要求解压并安装SDK
Hi3519A V100R001C02SPC010.rar\Hi3519A V100R001C02SPC010\01.software\board\Hi3519AV100_SDK_V2.0.1.0.tgz文件。
安装的过程请看ReleaseDoc.rar\ReleaseDoc\zh\01.software\board\Hi3519AV100 SDK 安装及升级使用说明.pdf
安装完成以后,我们就看到有一个叫mpp的文件夹,推理的代码就在下面了,我们需要在:
/mpp/sample/svp/nnie
下面去编译整个项目。其中这个demo默认是没有集成YOLO需要自己去新增,这里我已经改好相关的代码,并上传到gitee中:
https://gitee.com/liangjiaxi2019/yolov3_nnie_infer
nnie的代码需要根据模型进行适配,这里有部分文件需要修改的,具体需要修改的内容如下。
mpp/sample/svp/nnie/sample/sample_nnie.c里面:
第3803行需要修改类别的数目,这里是11。另外下面是进入YOLO层时候featuremap的大小值,这里分别是19,38,76从小到大写即可。分别写2次,代表是长和宽的值,这里是长宽相等的。
pstSoftWareParam->u32BboxNumEachGrid = 3;
pstSoftWareParam->u32ClassNum = 11;
pstSoftWareParam->au32GridNumHeight[0] = 19;
pstSoftWareParam->au32GridNumHeight[1] = 38;
pstSoftWareParam->au32GridNumHeight[2] = 76;
pstSoftWareParam->au32GridNumWidth[0] = 19;
pstSoftWareParam->au32GridNumWidth[1] = 38;
pstSoftWareParam->au32GridNumWidth[2] = 76;
第3814行,需要修改模型的anchor的数值。这里需要从大到小来填写,因为小的featuremap对应的是大的anchor,大的featuremap对应的是小的anchor。
pstSoftWareParam->af32Bias[0][0] = 147;
pstSoftWareParam->af32Bias[0][1] = 308;
pstSoftWareParam->af32Bias[0][2] = 308;
pstSoftWareParam->af32Bias[0][3] = 254;
pstSoftWareParam->af32Bias[0][4] = 430;
pstSoftWareParam->af32Bias[0][5] = 440;
pstSoftWareParam->af32Bias[1][0] = 110;
pstSoftWareParam->af32Bias[1][1] = 74;
pstSoftWareParam->af32Bias[1][2] = 75;
pstSoftWareParam->af32Bias[1][3] = 170;
pstSoftWareParam->af32Bias[1][4] = 195;
pstSoftWareParam->af32Bias[1][5] = 137;
pstSoftWareParam->af32Bias[2][0] = 21;
pstSoftWareParam->af32Bias[2][1] = 22;
pstSoftWareParam->af32Bias[2][2] = 58;
pstSoftWareParam->af32Bias[2][3] = 37;
pstSoftWareParam->af32Bias[2][4] = 37;
pstSoftWareParam->af32Bias[2][5] = 82;
3811行 nms阈值以及置信度的阈值
pstSoftWareParam->u32NmsThresh = (HI_U32)(0.3f*SAMPLE_SVP_NNIE_QUANT_BASE);
pstSoftWareParam->u32ConfThresh = (HI_U32)(0.1f*SAMPLE_SVP_NNIE_QUANT_BASE);
3934行 需要打印的置信度阈值
/*Set configuration parameter*/
f32PrintResultThresh = 0.5f;
3924行,修改推理的模型名称
这里指定模型的名称,以及需要推理图像的名称,图片的名称格式是gbr。
HI_CHAR *pcSrcFile = "./data/nnie_image/rgb_planar/testimage3.bgr";
HI_CHAR *pcModelName = "./data/nnie_model/detection/yolov36c_inst.wk";
修改mpp/sample/svp/nnie/sample_nnie_software/sample_svp_nnie_software.h的相关代码。
第47行 这个数值为 num_classes+5,我这里的类别数是11,所以为16
#define SAMPLE_SVP_NNIE_YOLOV3_EACH_BBOX_INFER_RESULT_NUM 16
在进行交叉编译之前,我们先要确保安装好交叉编译器arm-himix200-linux-gcc。使用下面命令查看交叉编译器是否安装成功,如果返回编译器信息,说明交叉编译器已经安装成功了。
arm-himix200-linux-gcc -v
然后我们再nnie的目录下执行
make clean
make all
成功编译以后,目录就会生成sample_nnie_main可执行文件,可以直接挂载到SOC设备上面执行。
通过nfs挂载并在SOC上面执行命令,ip可以根据实际的环境进行修改。直接执行sample_nnie_main文件就可以了。下面是在SOC上面的挂载命令。
mount -t nfs 192.168.4.120:/root/nfs /home/nfs -o nolock
cd /home/nfs/yolov3_nnie_infer/mpp/sample/svp/nnie
./sample_nnie_main b
好了以上是本期分享的全部内容了,如果你觉得对你还有帮助,建议点赞分享并收藏哦。如果大家想对我表示肯定,扫描下面的二维码即可哦,原创不易,一分钱也是爱哦。