YOLO v1结构
它的核心思想就是利用整张图作为网络的输入,将目标检测作为回归问题解决,直接在输出层回归预选框的位置及所属的类别。输入图像大小为,将其分割成了个网络,每个网格要预测两个(候选框)的坐标 和 内是否包含物体的置信度 (每个有一个),以及物体属于类别中每一类的概率(的训练数据集为 ,它是一个分类的数据集)。所以一个网格对应一个 维的向量。
如下图所示, 网格内的每一个grid(红色框),对应两个大小形状不同的 (黄色框)。每个box的位置坐标为 , 和 表示 中心点与该格子边界的相对值, 和表示预测的宽度和高度相对于整幅图像的宽度和高度的对比。 会限制在 之间。与训练数据集上标定的物体真实坐标 进行对比训练,每个 负责检查中心落在该格子的物体。
这个置信度只是为表达内有无物体的概率(类似于中层的预测是前景还是背景的概率),并不预测box内物体属于哪一类。
- 置信度
其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的IOU。值越大则box越接近真实位置。
confidence是针对bounding box的,每个网格有两个bounding box,所以每个网格会有两个confidence与之对应。
YOLO v1预测工作流程
- 1、每一个格子得到两个bounding boxes
- 2、每个网格预测的class信息和bounding boxes预测的confidence信息相乘,得到每个bounding box预测具体物体的概率和位置重叠的概率PrIOU
- 3、对于每一个类别,对PrIOU进行排序,去除小于阈值的PrIOU,然后做非极大值抑制。
YOLO v1代价函数
YOLO v1的loss function如下所示,包含三部分:位置误差、confidence误差、分类误差。
YOLO v1的图解如下所示:
- loss代价函数中 为什么要开根号 ?
如下图所示:绿色为bounding box,红色为真实标注。如果w和h没有平方根,那么bounding box跟两个真实标注的位置loss是相同的,但是从面积看来B框是A框的25倍,C框是B框的81/25倍,B框跟A框的大小偏差更大,不应该得到相同的loss。
如果w和h加上平方根,那么B对于A的位置loss约为3.06,B对C的位置约为1.17,B对A的位置loss的值更大,更符合我们的实际判断。
- YOLO v1代价函数的weight(权重)说明
不同的任务重要程度不同,所以也应给予不同的loss weight:
1).每个网格两个预测框坐标比较重要,给这些损失前面赋予更大的loss weight,在pascal VOC取值为5。
2).对没有object的box的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5.
3).有object的box的confidence loss和类别的loss的loss weight正常取1。
YOLO v1的缺点
1、每个网格只对应两个bounding box,当物体的长款比不常见(也就是训练数据集覆盖不到时),效果较差。
2、原始图片只划分7×7的网格,当两个物体靠的很近时,效果比较差。
3、最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
4、每个图片中比较小的物体,效果比较差。
参考:
论文下载
darknet版的代码下载
tensorflow版本的代码下载