YOLO
YOLO,真正的single stage鼻祖。abs里面提的比较振奋了,YOLO讲目标检测作为一个回归问题。输入一张图片,一个网络做了边框的检测和里面物体的分类。后续可以直接对检测性能进行端到端的优化。得益于这种singlestage的网络框架,YOLO和之前的检测框架比,快的离谱(相对的)。然后从自然图像迁移到其他的领域的时候往往效果是优于同时间段的其他算法的,abs里写的是YOLO学到了通用的reperesents of objects
当然缺点就是YOLO还是存在一些定位错误的问题,但是在背景上检测假阳率还是挺小的。
how it works and details
文中的YOLO用了reshreshing simple来形容,一个卷积网络同时预测多个bbox和这些框中的物体类概率。
得益于此,YOLO在训练和测试期间能够看到整个完整的图像,隐式的编码了其关于类和其外观的上下文信息,这也是YOLO对比与faster RCNN的优势之一。
- 将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。
- 每个网络需要预测B个BBox的位置信息和confidence(置信度)信息,一个BBox对应着四个位置信息和一个confidence信息。confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,文中的
Pr(Object)*IOU
就是这个定义,没有物体在这个cell中就直接是0,如果有落在这个格子里的就是1. - 每个BBOX有5个预测值,
x,y,w,h,confidence
,(x,y)
是个相对坐标(很关键),每个网格还要预测一个类别信息,记为C类。 - 在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score
- 得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
用人话来讲就是(以PASCAL VOC为例,划分成7*7个网格,每个预测2个BBOX):
- 给个一个输入图像,首先将图像划分成7*7的网格
- 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
- 根据上一步可以预测出772个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可
损失函数的设计就比较粗暴了,直接就是一个sum-squared error loss,后续是不是有更好的损失函数?
不合理的地方:
- 不同维度的分类错误显然不能等价
- obj稀疏的网格,confidence被push到0的话,网络会不会发散?
为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width
一个网格预测多个box,希望的是每个box predictor专门负责预测某个object。具体做法就是看当前预测的box与ground truth box中哪个IoU大,就负责哪个。这种做法称作box predictor的specialization
Weakness
由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。