YOLOv1基本原理:
YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么中心位置所在的这个格子就负责检测出这个物体。
1. 将输入图像分成SxS grid,原作者论文中取S=7,即分成7*7 grid。
2. 对于每个网格,产生两种候选框,每个网格预测 B=2个bouding box(边界框),对候选框进行微调,每个边界框包含5个预测量:x、y、w、h、c(置信度)以及20个类别概率(当前数据集有20个类别),总共输出7×7×(2*5+20)=1470个tensor(张量)。
3. 每个grid cell都会进行物体的框定和分类,一图像预测7x7x2=98个预测框,然后根据阈值去除可能性比较低的目标窗口,再由NMS去除冗余窗口即可,得到最后的final detections。
网络结构
输入图像为448x448,输出特征图大小为7x7x30,
-
输入尺寸固定:由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。其它分辨率需要缩放成该分辨率.
-
占比较小的目标检测效果不好.虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。
输出7x7的理解
特征图7x7映射至原图,即图像被分成7×7个网格(grid cell)
如果物体的中心落在某个网格中,则这个网格就负责预测这个物体。
输出维度30的理解
(1)每个网格使用B(B=2)个bounding box(边界框)进行回归预测,共产生2*5个值;
回归坐标(x,y,w,h)和置信度confidence,置信度:包含物体的可能性大小;
(2)每个网格还要预测C个类别概率,以判断当前grid cell属于哪个类别C;因此1个网格的输出维度是(5×B+C),S×S个网格就输出就是S × S×(5×B+C)。
当前数据集类别C=20, 所以30 = 5*2+20;
博客参考链接:
单阶段目标检测算法之YOLOv1详解-pudn.com (较为详细)