重点参考《图解YOLO》、《论文阅读笔记:You Only Look Once: Unified, Real-Time Object Detection》
YOLO【1】是RBG挂名的目标检测算法。YOLO不再套用R-CNN的思路,而是将目标检测转换为回归问题,极大提升了检测速率:标准版达到45fps,简化版达到155fps
算法思路
从 r-cnn 到 faster-rcnn,算法一直采用的是 proposal+classify(前者提供位置信息,后者提供类别信息)的思路。精度很高,但检测速率不是很理想
YOLO以整张图为输入,直接在输出层回归 bounding box 的位置及其所属的类别。精度有所影响(图1),但大大提升了检测速率,满足实时的要求
图1. 检测精度mAP及检测帧率的对比
流程
- 将输入图像分成 SxS 个网格,如果某个 object 中心落在这个网格中那么这个网格就负责预测这个 object(也就是说一个网格最多仅负责一个object)
图2. YOLO检测流程
-
每个网格预测 B 个 bounding box。每个 box 回归自身位置,并且预测一个置信度
(xcenter,ycenter,w,h,confidence)
其中 confidence 综合了 box 含有 object 的置信度和 box 位置准确度这两个信息:confidence=Pr(object)∗IOUtruthpred
当 object 落在网格里,Pr(object)=1 ,否则为0;
第二项表示预测的 box 与真实 box 之间的 IoU 假设一共有 C 个类别需要预测,那么按照上面的定义,一个网格的数据维度为:
5∗B+C ,一张图片整个的输出 tensor 为S∗S∗(5∗B+C) -
在测试的时候,每个网格预测的类别概率和 box 预测的 confidence 相乘,就得到每个 box 的总置信度
Pr(classi|object)∗Pr(object)∗IOUtruthpred=Pr(classi)∗IOUtruthpred
得到总置信度后,通过阈值过滤,对剩下的 box 做 NMS 处理,就得到最终的结果
细节
-
每个 box 的坐标,x和y用对应网格的 offset 归一化到[0,1],w和h用图像的width和height归一化到[0,1]
文章使用的网络,输入为 448*448,取 S=7, B=2, C=20。这样输出为 7*7*30
-
损失函数
1)坐标损失
a. B*4=8维的坐标损失权重λcoord=5
b. 考虑到相同偏差下,小尺寸的 box 比大尺寸的更不能忍受,对width和height做取平方根的处理:
图3. 平方根处理后小尺寸的偏移(横轴)对应的惩罚更大(纵轴)2)object损失
a. 没有object的情况,λnoobj=0.5
b. 有object的情况,包括类别的损失权重取1
c. 一个网格预测 B 个 box,从这 B 个 IoU 中挑最大的作为该网格预测的 object 类别
图4. 总的损失函数(摘自这里)
算法缺陷
对相互 靠的很近的物体 以及 很小的群体 检测效果不好。这是因为一个网格仅预测B=2个框,并且仅属于一类
当同一类物体出现了不常见的长宽比时,泛化能力不够
定位误差是影响检测效果的主要原因
代码实现
作者在 github 上提供了源代码
同时也在这里给出了详细的安装及解释
【1】Redmon J, Divvala S, Girshick R, et al. You Only Look Once: Unified, Real-Time Object Detection[J]. 2015:779-788.