YOLOV5前后处理(推理)
1、输入与输出
输入:[1,3,640,640]
输出:[1,25200,85]
3中尺度的特征图,每个cell3个anchor:25200 = (80 * 80+40 * 40+20 * 20)*3
85 = (cx,cy,w,h,obj_conf)+cls_conf;
obj_conf:目标置信度(是目标的概率);
cls_conf:类别置信度(是哪一类目标的概率);
letterbox:
- 使指定的输入图片大小(640 * 640)/原图的大小(xxx * xxx),获取两个resize比例。
- 取最小的比例,使得原图大小乘以这个最小比例(此时的长边正好达到640)。
- 获取此时的短边距离640还差多少,接着将差值除以步长(stride)进行取余,然后除以2。
- 按照此时的size大小将原图进行resize。
tips:经过letterbox处理后的图片很多情况下仅有一条边能够达到640,另一条边为32的倍数(pytorch要求输入是32的倍数,下采样32倍)。
2、后处理
由于输出的数据过多(25000个框,每个框85个数据),所以要一步步的进行筛选。
1)设置conf_thres,目标置信度小于阈值的框直接过滤掉;
obj_conf > conf_thres
2)选出当前框的最大类别置信度,然后与此框的目标置信度相乘,过滤乘积小于阈值(conf_thres)的框。
(obj_conf * cls_conf) > conf_thres
cls_conf=max(cls1_conf,cls2_conf, ...... ,cls80_conf)
3)nms过滤
由于nms使用的框的坐标是(x1,y1,x2,y2),所以要将yolov5的(cx,cy,w,h)的框坐标进行转化,然后使用nms进行过滤。
经过1)、2)处理后的结果
经过3) nms处理后的结果,每个目标均剩一个框
NMS:
1)、找出每个框的最大类别置信度,然后按照高低进行排序。
2)、将最高得分置信度当做保留框,与其他所有框做IOU,若IOU大于某一阈值,则淘汰这些框。
3)、找出第二高得分置信度当做保留框,与其他框做IOU,依次循环执行。
3、box校正(还原)
由于输入图像一般是经过(letterbox:按照w/h resize至640,其余部分使用背景填充)resize至640*640的,所以在640 * 640的图像上找打目标框后,需要将其还原至原图大小上。
参考链接:
1、link