YOLOV1阅读笔记
简述
- 将目标检测作为回归问题
- 用整张图片作为输入,得到bounding boxes和相关的类别概率
优势
- 快。base YOLO model实时处理图片45帧/秒;Fast YOLO达到了155帧/秒,并且mAP是其它实时监测器的2倍。
- 背景类别分类正确率更高
- 泛化性更强
主要思想
本文将目标识别的组件统一到单个卷积网络中,使用整张图片的特征来预测每个bounding box,并且一张图片上所有bounding boxes的预测是同时进行的。YOLO在保持较高平均精度的同时实现了端到端的训练和实时的速度
-
将输入的图片划分成的网格。如果一个object的中心落在某个网格中,那么这个网格负责这个object的检测
-
每一个网格预测B个bounding boxes和这些boxes的confidence score。这些confidence score表明了
- 这个box包含一个object的可信度大小
- 这个box预测结果的准确度大小
将confidence定义为:
- 如果网格中不存在object,,即confidence score等于0
- 否则,,此时confidence score等于预测box与ground box之间的IoU
-
每个bounding box包含5个预测值:x,y,w,h和confidence:
- 其中(x,y)表示相对于网格边界的box的中心
- width(w)和height(h)相对于整张图片预测
- confidence同上所述
-
每个网格还预测C个条件类别概率,表示在网格包含Object时类别为的概率
所以这些预测的输出是一个的tensor.
设计细节
网络结构借鉴于GoogLeNet。有24个卷积层+2个全连接层。用的reduction layer后边紧跟的卷积层替代了GoogLenet中使用的inception modules,用来减少嵌满层得到的特征空间。
-
最后一个层预测类别概率和bounding box坐标。使用图像的宽和高归一化bounding box的宽和高,使用特定网格位置的offset归一化bounding box 的x,y坐标。
-
最后一层使用线性**函数,其他层的**函数使用leaky ReLu
-
为了优化方便,本文使用了sum-squared error来设计损失函数,这样导致的问题是:
- 会使得定位误差和分类误差同等重要,这样是不理想的
- 因为很多网格中不包含任何object,这些网格中box的confidence便会等于0,这会使得模型不稳定
为了解决这些问题,采取的方法是:
- 增加bounding box坐标预测的loss,减少不包含object的box的confidence预测的loss,使用了两个参数和来实现,并设置,.
-
由于比起大box的小偏移,小box的小偏移更应该引起重视,但是在sum-squared error下这两种情况是没有区别的。所以本文采取直接预测bounding box宽和高的平方根。
-
YOLO在每个网格中预测多个bounding box,在训练阶段只想要一个bounding box预测器负责一个类别,因此让一个预测器屈服一个类别(预测结果与ground truth之间的IOU最高的类别)。(Ps:个人不理解)
局限性
- 由于一个网格只能预测两个box并且只能有一个class,这种限制了可以预测的相邻物体的数量。在成群出现的小物体预测上表现不够好,比如鸟群。
- 对于新的、不常见的纵横比的泛化性不好
- 本文的损失函数对于小的bounding box和大的bounding box的损失是一样的,但是应该来说,小错误在大的box上一般来说是良性的,但是在小box上会对IOU有一个很大的影响。这导致了定位的准确性偏低。