1.论文题目:You Only Look Once:Unified, Real-Time Object Detection
2.发表时间:2015
3.文献地址:https://arxiv.org/abs/1506.02640
4.论文源码: YOLO官网:https://pjreddie.com/darknet/yolo/
在YOLO之前的目标检测工作都是从分类器出发来作检测(为每个物体设置一个分类器并估计其位置与大小)这种方式不仅复杂,而且速度很慢,因为需要单独为每个类别作训练。
YOLO将目标检测视为一个空间上分离的边框盒子和其对应类的概率的回归问题,直接由像素到bounding box coordinates 和class probabilities,检测速度很快,能达到45fps。即如论文标题一般,你只需看一次就能知道物体在哪里。YOLO是一个单一网络,可以实现end to end的训练和实时检测,是one-stage方法的开山之作。
confidence score(置信度分数)反映的是模型对边框包含物体的置信度以及模型认为的边框位置准确度。confidence=Pr(Object)*IoU。前一项表示有无人工标记的物体落入网格内,如果有,则为1,否则为0.第二项代表bounding box和真实标记的box之间的IoU。值越大则box越接近真实位置。
YOLO将目标检测的各个部分整合起来形成一个单独网络,网络用整个图片的特征来预测每个bounding box,每个bounding box 的预测关于整张图片和所有的物体类别。
将输入的图片划分为S×S个格子(grid cell),如果某个物体的中心在一个格子单元,那么这个格子单元就负责检测这个物体。
每个格子单元预测B个bounding boxes以及每个box的置信度分数( confidence
scores )。置信度分数反映的是模型对边框包含物体的置信度以及模型认为的边框位置准确度。confidence=Pr(Object)*IoU
每个bounding box有五个部分组成,x, y, w, h, confidence。x,y是box相对于格子单元边界的中心位置。w,h是box相对于整幅图像的尺寸。confidence代表IoU——intersection over union (IOU) between the predicted box and the ground truth.
每个格子单元也要预测C个条件类概率,Pr(Classi|Object)表示在格子单元包含物体的条件下,该物体是每个类的概率。对于每个单元格子预测一组类概率,不考虑该单元格子预测的box数目B。
测试时,我们的通过公式得到某个box对应具体某类的置信度分值。这个分值同时涵盖了该类出现在这个box 的概率以及该box 的与物体匹配的程度。
Pr(Classi|Object) ∗ Pr(Object) ∗ IOU = Pr(Classi) ∗ IOU
如上图所示,每个图片被分为S×S
格子,每个格子B
个box
(每个box由5维向量表示
),C个类的概率。所以整个预测被编码维一个S × S × (B ∗ 5 + C)
的tensor
。
实验时使用的PASCAL VOC数据集,S=7,B=2,C=20,所以最终的预测得到的tensor是7 × 7 × 30
网络的设计如上,由24个卷积层+2个全连接层组成,与GoogleNet类似,但是将GoogleNet的Inception module简单的用1×1卷积加3×3卷积代替了。前面的卷积层提取特征,后面的全连接层预测概率与box坐标。网络的输出是7 × 7 × 30
。
在Pascal VOC数据集上,YOLOv1算法最后输出的检测结果为7x7x30的形式,其中30个值分别包括两个候选框的位置和有无包含物体的置信度以及网格中包含20个物体类别的概率。那么YOLO的损失就包括三部分:位置误差,confidence误差,分类误差。
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification
这个三个方面达到很好的平衡
confidence损失: confidence是针对bounding box的,由于每个网格有B个bounding box,所以每个网格会有B个confidence与之相对应。从损失函数上看,当网格i中的第j个预测框包含物体的时候,用上面的置信度损失,而不包含物体的时候,用下面的损失函数。对没有object的box的confidence loss,赋予小的loss weight, 记为在pascal VOC训练中取0.5。有object的box的confidence loss和类别的loss的loss weight正常取1。
位置损失: 容易理解,负责检测的才有位置损失,其他的都不需回传损失,也就不需要计算,此外,小目标对位置偏差更敏感,所以要相对强化小目标的偏差损失,所以加入根号。
类别损失: 类别损失这里也用了均方误差,实际上,感觉这里用交叉熵更好一些。其中 表示有无object的中心点落到网格i中,如果网格中包含有物体object的中心的话,那么就负责预测该object的概率。
总体来说,对于不同的任务重要程度不同,所以也应该给与不同的loss weight:
YOLOv1损失函数的详解博客:https://blog.csdn.net/x454045816/article/details/107527326
batch size=64,momentum=0.9,decay=0.0005
使用了dropout(rate=0.5)和data augmentation(随机变化尺寸与转移,随机调整曝光度与饱和度)
训练的时候,预训练采用的是ImageNet的数据,大小是224×224,后面fine tuning的时候用于目标检测的分辨率需要转为448×448.
测试时将图片输入网络只需经过单个网络评估就可以得到结果,速度很快。通常能清楚知道物体在哪个格子中,网络也只为每个物体预测一个box。可以应用非极大值抑制来去除重复的边框,但是效果步入R-CNN中好。
输入图片->7×7×30输出->NMS->结果
优点:
1、extremely fast,非常之快,能够实时检测。基础的YOLO45fps,fastYOLO能达到150fps。
2、YOLO输入是一个 full image,从全局来作图像的预测,将图像的关于某类的上下文信息都纳入考虑,因此比起R-CNN等更不容易反False Positive错误,即将背景看作某类可能更小。这一点可以用来对其他网络模型做增强,例如文中提到的为Fast R-CNN做增强,提高其分辨背景框能力。
3、YOLO学习的是对应的一般化表示,具有更强的泛化能力,当应用到新的领域和输入未知输入时不容易崩溃,有更强鲁棒性。
缺点:
速度与精度的tradeoff,然而YOLO相比之前的工作不仅速度快到了real-time,而且还有很高的准确率!