欢迎光临散文网 会员登陆 & 注册

海思hi3516dv300芯片AI图像模块学习(十三) YOLOV3 的不支持层处理

2022-08-11 15:56 作者:饼干快快快跑  | 我要投稿


7.不支持层计算

7.1 输入:

硬件参数(网络层、结果内存地址)

s_stYolov3NnieParam

软件参数(检测种类、roi配置等)

s_stYolov3SoftwareParam

7.2 函数本体

读出每层的Stride和BlobAddr-VirAddr

SVP_NNIE_Yolov3_GetResult函数

输入:

au64InputBlobAddr 、Stride,硬件系统储存地址和字节数

YOLOv3软件参数结构体 

输入图分辨率

    HI_U32 u32OriImHeight;

    HI_U32 u32OriImWidth;

每个格子框数量 HI_U32 u32BboxNumEachGrid;

检测种类数量  HI_U32 u32ClassNum;

网格大小

    HI_U32 au32GridNumHeight[3];

    HI_U32 au32GridNumWidth[3];

非极大值抑制阈值 值越小预测框与标注框重叠度越高

    HI_U32 u32NmsThresh;

conf_thresh 网格包含物体的概率或分数阈值,值越高滤除的不含物体的网格越多

    HI_U32 u32ConfThresh;

每张图中框的最大数量

    HI_U32 u32MaxRoiNum;

聚类先验anchor框的数值

    HI_FLOAT af32Bias[3][6];

结果等信息存储位置

    SVP_MEM_INFO_S stGetResultTmpBuf;

    SVP_DST_BLOB_S stClassRoiNum;

    SVP_DST_BLOB_S stDstRoi;

    SVP_DST_BLOB_S stDstScore;

SAMPLE_SVP_NNIE_YOLOV3_REPORT_BLOB_NUM=3


1.输出结果的最大维度大小统计

//输出结果中有用3种大小的grid分别检测的结果

//au32GridNumWidth:每个grid的大小,三种:[1]图片大小/32 [2]图片大小/16 [3]图片大小/8 ,不同大小的grid适应不同大小的物体检测

//Bounding Box=BBOX,每个bbox里有的向量维度。这个数值为 num_classes(王工的检测网里就一个类别所以这里是1)+5(x、y、w、h、c)。

//u32EachGridBbox每个grid里bbox数量

最后结果:

u32MaxBlobSize = u32BlobSize,获得最大的结果向量维度(应该8*8grid那组数据)

2.bbox总数——有多少个u32MaxBlobSize维度的向量的内存空间应该划出

3.硬件输出InputBlob重新排列,放到permute里面

//逐个grid,逐个bbox,逐个bbox中元素,把输出数据InputBlob全部放到Permute向量里了,Permute向量的长度=k*k(grid数目)*EachGridBbox*EACH_BBOX_RESULT_NUM

4.解码bbox结果和计算分数

  1. 计算当前bbox在Permute向量的位置

    起始点 Offset = j * u32EachGridBbox*BBOX_INFER_RESULT_NUM之前的grid+k*BBOX_INFER_RESULT_NUM当前grid第k个之前的向量长度    

2. 计算bbox——中心点x、y的相对坐标、w、h的相对长宽

3.求bbox最可能的类别以及相应的概率,简化bbox内部元素,置信度大于阈值的bbox放到新的结构体pstBbox里面收集起来

4.bbox集合pstBbox中数据按置信度快速排序

1.ps32Array=pstBbox,2.范围low=0,3.high=BboxNum(pstBbox中bbox数量)

4.size =SAMPLE_SVP_NNIE_YOLOV3_BBOX_S(内部结构与pstBbox相同)/u32

5.需要排序的对象pstBbox的第4项ClassScore, 6.内存位置

搞不懂这种结构体一会是层叠式一层层的,一会又是一整条向量。。

和之前一样找到每个bbox概率的位置

u32ArraySize * s32Low + u32ScoreIdx


双指针快速排序算法,将首段i位置的置信度与尾端j位置的置信度对比,如果首端i位置的较小,则把j位置的数据交换到j位置出,如此循环置信度小的bbox数据不断后移,大的不断前移,最终实现pstBbox中数据按置信度从大到小排序。

交换i位置bbox和j位置bbox的数据

5.计算IOU,进行非极大值抑制

输入:排好序的bbox集合、bbox数量、iou阈值、bbox的总数

计算第i个与之后所有bbox的iou,大于iou阈值的bbox的mask赋值1

从头逐个往后遍历,重复的bbox跳过(mask=1)

由于pstbbox概率从大到排列,跳过重复的bbox,只需要计算需要显示的bbox,后面的不用算NMS了

最后获得做好mark标记的pstbbox

6.获得最终输出的bbox结果


//遍历物体类别,分物体类别取值u32ClassNum

//遍历bbox

//该类别且无重复mark=0

//地址和置信度存到硬件输出roi信息的内存地址里ps32DstRoi和ps32DstScore

//类别存到软件配置的内存地址里stClassRoiNum

//存左上右下坐标和置信度

8.输出yolo检测结果

输入:NMS后BBOX的置信度、坐标、类别,结果阈值

字符打印

9.VO画面输出ROI结果,这部分需要参考rfcn修改,前面需要初始化vio等操作。

未完待续

海思hi3516dv300芯片AI图像模块学习(十三) YOLOV3 的不支持层处理的评论 (共 条)

分享到微博请遵守国家法律