You only look once: Unified, real-time object detection
去年的存货,丢博客上算做个备份吧
Abstract
老方法
- repurpose classifier 来做detection
- 即先做classifier做class probabilities(cp)预测,再换regressor做bounding boxes(bb)预测
YOLO
- object detection 新方法
- 将 object detection 看作regressor问题
- 即用regression来解决bb,cp,这两个问题
- 用一个neural net,一次evaluation,直接预测bb,cp
- 一个模型,能做到end-to-end optimization
YOLO的速度
- 45 frames/s, 155 frames/s
- 对比state-fo-the-art, 背景的false positive 预测比例低
- 优越的学习物体general representation 的能力
1.Introduction
快速准确的做object detection 算法的意义在……
- 无人驾驶:无需特殊的sensor
- 人体辅助设备:向用户反映实时数据
- 释放 general purpose, responsive robotic systems 的潜力
YOLO之前的object detection算法
- repurpose claasifier 来做detection
- 在不同的scales的测试图片上,及图片里不同的locations上使用classifier
- DPM(deformable parts models)使用sliding window做上述工作
更近的算法,R-CNN
- region proposal methods:
- 为图片生成潜在的bb
- 针对每个bb做classifier分类
- post-preprocessing
- refine bb, 删除重复的bb,rescore bb(基于图中其他的objects)
- 评价
- 复杂
- 低效
- 每个部位独立训练,难以统一优化、提高效率
到底什么是YOLO?
- YOLO眼里object detection是一个regression问题
- 一次性喂入图片,然后给出bb和cp的值的生成(regression)
- 换言之,只看一次就知道图中物体的类别和位置
YOLO很简单
- 一个CNN模型
- 同时输出bb,cp两个结果
- 从图片到以上两个结果,是end-to-end training,容易优化
- 算法流程(见图1)
YOLO对比传统的算法的优势
- 计算高效
- 45 frames/s, 155 frames/s
- 处理实时视频的滞后性只有25mm
- 处理精度是其他实时处理算法的2倍
- 全局性强
- reasons, sees更完整全面的图片样本
- encodes contextual information 来应对分类和定位问题
- 传统方法,如fast r-cnn容易将背景误认为是物品,因无法看到更大的context
- YOLO误将背景当作物体的比率是fast r-cnn的一半
- 对物品做到更generalized representation
- 更自然(对于那些没有过度变形处理)的图片上训练
- 在artwork上测试
- 效果远胜过传统方法DPM, R-CNN
- 在new domain 和出乎意料的样本上,也能表现平稳
不足之处
- 虽然速度快,但精度不是最高的
- 尤其在小图片的定位上,精度有待提高
- 在实验中会提到速度和精度的tradeoff
代码和训练好的模型已经开源
2.Unified Detection
什么是Unified Detection?
- 将原来分割的部件,合并为一个neural net
- 每一个bb,都是基于全图里的特征来预测的
- 同步为图片里所有类别物体做bb预测(很强的全局能力)
- 具备end-to-end训练优势,在维持整体高精度的情况瞎实现实时处理
How it work?
- 把图片分成S×S格
- 如果物体的中心落在某个格子内,该cell负责detect该物体
- 即该cell要预测该物体的bb和confidence score
- confidence score 包含两个概率:
- cell内有物体的概率
- 该物体是某一类别的概率
- c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U p r e d t r u t h confidence=Pr(Object)*IOU^{truth}_{pred} confidence=Pr(Object)∗IOUpredtruth
- 如果cell内无物体, P r ( O b j e c t ) = 0 , c o n f i d e n c e = 0 Pr(Object)=0,confidence=0 Pr(Object)=0,confidence=0
- 有物体, P r ( O b j e c t ) = 1 , c o n f i d e n c e = I O U p r e d t r u t h Pr(Object)=1,confidence=IOU^{truth}_{pred} Pr(Object)=1,confidence=IOUpredtruth
- prediction输出:x, y, w, h, confidence
- (x, y)是bb中心点(想对于bb的定位)
- (w. h)是bb的长与宽,是相对于整张图而言的
- confidence是基于IOU(对比predicted box与any ground truth box)
- P r ( C l a s s ∣ O b j e c t ) Pr(Class|Object) Pr(Class∣Object)在确认grid cell内有物体的前提下,该物体是某类别的概率
confidence score的完整公式
- P r ( C l a s s ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class|Object)*Pr(Object)*IOU^{truth}_{pred}=Pr(Class_i)*IOU^{truth}_{pred} Pr(Class∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
- confidence score
- encode两个数值的关系
-
- 某类别物体出现在bb的概率
- bb框住物体的贴合程度
图解YOLO算法
- 分割成S × × ×S(7$×$7)个grid cells
- 每个grid cells 内进行的工作如下:
- 是否有物体的概率,1个值
- 是某种类别物体的概率,因为模型能识别20个类别,所有生产20个概率
- 计算confidence score,设置阈值NMS留下score高的bb
- tensor
7
×
7
(
2
×
5
+
20
)
7\times7(2\times5+20)
7×7(2×5+20)
- 7×7 = grid cells 个数
- B=2 ,bb的个树
- ×5,一个bb对应(x,y,w,h,confidence score)
- C = 20,20个类别物体的概率(PASCAL VOC)
2.1 Network Design
- 训练数据:PASCAL VOC has 20 labelled classes
- conv layerss: 特征提炼
- FC layers: 输出概率值和coordinater(x, y, w, h)
模型结构采用Inception类似结构
- 24 conv layers
- 2 FC layers
- 中间conv block采用先1×1conv缩小,在用3×3还原(见图)
YOLO有fast,accurate两个版本
- 两个版本的参数几乎一样
- Fast只用了9层且filter的数量也减少了,accurate有24层(如上)
- 输出tensor 7×7×30
2.2 Training PPT
pretraining
- ImageNet 1000-calss
- 20 conv layers + average-pool + FC
- a week
detection(类似于测试,模型调整如下)
- add 4 conv layers + 2 FC layers(initial random weights)(任少卿的研究)
- input image from 224×224 to 448×448
- output layer 输出cp, bb
- bb(x, y, w, h)值都在0~1之间
- w, h 相对于image长度做normalization
- x, y 相对于grid cell 长度做normalization
- leaky rectified linear activation
- θ ( x ) = x , x > 0 \theta(x)=x,x>0 θ(x)=x,x>0
- θ ( x ) = 0.1 x , o t h e r w i s e \theta(x)=0.1x,otherwise θ(x)=0.1x,otherwise
- loss function: sum-squared error
sum-squared error 在这里有3点不足
- 不足1:
- 我们内心目标:最大化预测accuracy的均值
- 但SSE眼里,定位的error与accuracy的error,没什么不同,无需区别对待
- 猜想:如果accuracy error低,但定位error高,不应该让定位error对accuracy最大化干扰过大
- 不足2:
- 图片很多区域是没有物体的,使对应grid cell confidence score为0
- 导致有物体的grid cell的对应的gradients不断强化(值放大了),其他的grid cell对应的gradients被弱化
- 从而导致模型过度依赖某些区域的parameters或者weights,使模型不稳定
- 甚至造成训练时很快diverge(损失曲线上翘)
- 不足3:
- 大的小的bb产生的error,sum-squared error眼里没什么不同
- 猜想:我们应该希望损失函数能区别对待
如何解决上述不足?
- 强制来自bb的损失值变大,强制来自没有物体的grid cell的损失值变小(针对不足1,2,)
- 给bb有物体的grid cell损失值×5,没物体的×0.5
- 预测bb的
w
,
h
\sqrt{w},\sqrt{h}
w,h,而不是预测
w
,
h
w,h
w,h(针对不足3)
- 大的bb的长和宽做square root处理时,即增大small box的敏感度,减少large box的敏感度
如何理解训练时的predictor and predictions?
- 预测时,针对同一个grid cell会预测出多个bb
- 训练时,哪个bb负责对应的物体,由IOU决定
- leads to specialization between bb predictors
- each predictor get better at predicting certain sized, ratios, classes of object
Training的其他超参数
- num_epochs = 135
- batch_size = 64
- momentum = 0.9
- weight_decay = 0.0005
避免过拟合所做的处理
- 在第一个FClayer后面做dropout处理, rate = 0.5
- 数据增强(引入了随机缩放比例和翻译原始图像大小的20%,还在HSV颜色空间中随机调整图像的曝光率和饱和度,达到1:5)
2.3 Inference
在训练好 YOLO 网络模型后,在 PASCAL VOC 数据集上进行 inference,每一张图像得到 98 个 bounding boxes,以及每个 bounding box 的所属类别概率
- 当图像中的物体较大,或者处于 grid cells 边界的物体,可能在多个 cells 中被定位出来。可以用Non-Maximal Suppression(NMS,非极大值抑制) 进行去除重复检测的物体,可以使最终的 mAP 提高2−3%,相比较于 NMS 对于 DPM、R-CNN 的提高,不算大
2.4 Limitations of YOLO
哪些局限性
- 每个grid cell 预测2个bb
- 但只预测一个类别
- 以上两点限制了临近的多个物体的识别能力
- 比如识别一群飞鸟中的单体,很难
局限性的来源
- 因为是通过数据来预测bb的位置
- 所以,当物体处于新的或者不常见的比例或设置时,很难有效预测
- 原图在处理前精度被缩小了,特征信息也降低了,不利于预测bb
- Loss functions中对于small bounding boxes,以及large bounding boxes的误差,均等对待。尽管已经用了平方根的方法优化了这个问题,但是这个问题还没有很好的解决
- YOLO中最主要的误差仍是定位不准造成的误差
6 Conclusion
- 特点是unified model来解决object detection的问题
- 结构简单,可直接用完整的原题来训练
- 其损失函数可以直接对detection的表现来评估
- 整个模型是作为一个整体被训练的
- fast YOLO 让实时object detection的表现更好
- YOLO对新的domain的图片也能做出快速和稳定的识别