You Only Look Once: Unified, Real-Time Object Detection笔记
1. 统一检测
在YOLO之前的的目标检测算法采用的思路大致为选取候选区+候选区目标分类的方式(RCNN,Fast RCNN及Faster RCNN等)。这类算法检测精度高,但运行速度慢。YOLO提供了另一种检测思路,将目标检测当作回归问题处理,直接在输出层回归出目标边框及其所属类别。
YOLO将输入图像划分为 7 × 7 7\times 7 7×7个网格,每个网格预测 2 2 2个目标边框位置及其置信度。置信度的定义为 P r ( O b j e c t ) ∗ I O U p r e d t r u t h \mathrm{Pr}(\mathrm{Object})*\mathrm{IOU}_{\mathrm{pred}}^{\mathrm{truth}} Pr(Object)∗IOUpredtruth,前部分表示预测边框含有目标的概率,后部分表示预测边框与实际边框的交并比。
每个目标边框包含 5 5 5个数值: x x x, y y y, w w w, h h h及置信度。坐标 ( x , y ) (x,y) (x,y)表示目标边框中心点相对于网格单元左上角坐标的偏移量,由网格单元大小归一化。宽度 w w w及高度 h h h是目标边框相对于整个输入图像大小的归一化值。
除去上述 5 5 5个数值外,每个单元格还需要输出 C C C个条件概率 P r ( C l a s s i ∣ O b j e c t ) \mathrm{Pr}(\mathrm{Class}_i|\mathrm{Object}) Pr(Classi∣Object),表示单元格属于 C l a s s i \mathrm{Class}_i Classi的概率。
测试时,将条件概率与置信度相乘可得类别置信度:
P r ( C l a s s i ∣ 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 (1) \mathrm{Pr}(\mathrm{Class}_i|\mathrm{Object})*\mathrm{Pr}(\mathrm{Object})*\mathrm{IOU}_\mathrm{pred}^\mathrm{truth}=\mathrm{Pr}(\mathrm{Class}_i)*\mathrm{IOU}_\mathrm{pred}^\mathrm{truth}\tag{1} Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth(1)
1.1. 网络设计
YOLO网络包含24个卷积层及2个全连接层,如下图所示:
YOLO也存在一个Fast版本,卷积层由24层缩减至9层。
1.2. 训练
YOLO的前20层卷积层是在ImageNet数据集上通过接入 1 1 1层平均池化层及 1 1 1层全连接层进行训练的。训练完成后,YOLO舍弃掉上述的池化层及全连接层,重新接入了 4 4 4层卷积层及 1 1 1层全连接层,并随机初始化了权重参数。检测往往需要细粒度的视觉信息,因此网络输入图像的分辨率由 224 × 224 224\times 224 224×224提升至 448 × 448 448\times 448 448×448。YOLO除最后一层网络采用 R e L U ( x ) \mathrm{ReLU}(x) ReLU(x)作为激活函数外,其余层网络采用 L e a k y R e L U ( x ) \mathrm{LeakyReLU}(x) LeakyReLU(x)作为激活函数:
ϕ = { x , i f x > 0 0.1 x , o t h e r w i s e (2) \phi=\left\{\begin{matrix} x&,if\ x>0\\0.1x &,otherwise \end{matrix}\right.\tag{2} ϕ={x0.1x,if x>0,otherwise(2)
YOLO的损失函数分为三个部分:坐标误差、置信度误差及分类误差。误差平方和通过两个参数 λ c o o r d = 5 \lambda_{\mathrm{coord}}=5 λcoord=5及 λ n o o b j = 0.5 \lambda_{\mathrm{noobj}}=0.5 λnoobj=0.5进行加权,其中 λ c o o r d \lambda_{\mathrm{coord}} λcoord代表坐标误差加权系数, λ n o o b j \lambda_{\mathrm{noobj}} λnoobj代表无目标网格置信度误差。应为无目标网格占大多数,相较于有目标网格,其置信度误差梯度占主导地位,因此对该部分误差乘以了一个小于 1 1 1的系数。整个网络训练所使用的损失函数如下:
λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 (3) \lambda_{\mathrm{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\mathrm{obj}}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2]\\+\lambda_{\mathrm{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\mathrm{obj}}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2]\\+\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\mathrm{obj}}(C_i-\hat{C}_i)^2\\+\lambda_{\mathrm{noobj}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\mathrm{obj}}(C_i-\hat{C}_i)^2\\+\sum_{i=0}^{S^2}\mathrm{1}_{i}^{\mathrm{obj}}\sum_{c\in classes}(p_i(c)-\hat{p}_i(c))^2\tag{3} λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]+λcoordi=0∑S2j=0∑B1ijobj[(wi−w^i)2+(hi−h^i)2]+i=0∑S2j=0∑B1ijobj(Ci−C^i)2+λnoobji=0∑S2j=0∑B1ijobj(Ci−C^i)2+i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2(3)
其中, 1 i o b j \mathbb{1}_i^{\mathrm{obj}} 1iobj表示第 i i i个网格存在目标与否, 1 i j o b j \mathbb{1}_{ij}^{\mathrm{obj}} 1ijobj表示第 i i i个网格的第 j j j个目标边框存在目标与否, 1 i j n o o b j \mathbb{1}_{ij}^{\mathrm{noobj}} 1ijnoobj表示第 i i i个网格的第 j j j个目标边框不存在目标与否。
2.3. 推断
与基于分类器的方法不同,YOLO仅需要一次推断即可预测 98 98 98个目标边框,其运行速度非常快。对于一些大目标,它可以被多个网格单元很好地检测到,YOLO采用了非最大抑制来修正这些多重检测。非最大抑制虽然不像R-CNN或DPM那样对性能至关重要,但对mAP增加了2-3%。
2.4. YOLO的局限性
YOLO对目标边框有很强的约束,因为每个网格单元只能预测两个边框并且只能是一个类别。这种约束限制了临近目标的检测数量,因此YOLO对于成群小目标(例如鸟群)的检测存在局限性。
受限于训练数据的分布,YOLO网络很难对不常见的长宽比目标进行准确检测。另外,因为输入图像经过了多个下采样层,所以YOLO用于预测边框的特征相对比较粗糙。
最后,训练所使用的损失函数对于大边框和小边框中相同误差的处理是一致的。大边框中出现较小的误差对IOU影响不大,但同样的误差在小边框中就会产生很大的影响。因此YOLO模型中出现预测错误主要是定位误差造成的。
3. 实验
3.1. 与其他检测系统比较
下表给出了YOLO与其他目标检测算法在PASCAL VOC数据集上准确率及检测速度上的对比结果。
实时检测算法 | 训练 | mAP | FPS |
---|---|---|---|
100Hz DPM | 2007 | 16.0 | 100 |
30Hz DPM | 2007 | 26.1 | 30 |
Fast YOLO | 2007+2012 | 52.7 | 155 |
YOLO | 2007+2012 | 63.4 | 45 |
非实时检测算法 | |||
Fastest DPM | 2007 | 30.4 | 15 |
R-CNN Minus R | 2007 | 53.5 | 6 |
Fast R-CNN | 2007+2012 | 70.0 | 0.5 |
Faster R-CNN VGG-16 | 2007+2012 | 73.2 | 7 |
Faster R-CNN ZF | 2007+2012 | 62.1 | 18 |
YOLO VGG-16 | 2007+2012 | 66.4 | 21 |
3.2. VOC 2007错误分析
将算法在PASCAL VOC 2007数据集上预测结果分为如下五种类型:
- Correct:分类准确且 I O U > 0.5 \mathrm{IOU}>0.5 IOU>0.5
- Localization:分类准确且 0.1 < I O U < 0.5 0.1<\mathrm{IOU}<0.5 0.1<IOU<0.5
- Similar:分类近似准确且 I O U > 0.1 \mathrm{IOU}>0.1 IOU>0.1
- Other:分类错误且 I O U > 0.1 \mathrm{IOU}>0.1 IOU>0.1
- Background:网格单元存在目标但 I O U < 0.1 \mathrm{IOU}<0.1 IOU<0.1
下图比较了Fast R-CNN及YOLO的错误类型。YOLO存在的错误主要集中在Localization,而Fast-RCNN主要集中在Background。Fast R-CNN在Background上的错误率大概是YOLO的3倍。
3.3. Fast R-CNN与YOLO的联合
为了降低Fast R-CNN的Background错误率,可以采用联合YOLO检测结果的方式。将输入图像同时经过Fast R-CNN及YOLO网络,当两个结果中存在相近的边框时,利用YOLO的预测概率及两个边框之间的重叠来提升Fast R-CNN的输出结果,其余情况以Fast R-CNN的输出结果为准。
Fast R-CNN与各种模型联合的对比结果如下表所示:
mAP | 联合mAP | 增益 | |
---|---|---|---|
Fast R-CNN | 71.8 | - | - |
Fast R-CNN(2007 data) | 66.9 | 72.4 | 0.6 |
Fast R-CNN(VGG-M) | 59.2 | 72.4 | 0.6 |
Fast R-CNN(CaffeNet) | 57.1 | 72.1 | 0.3 |
YOLO | 63.4 | 75.0 | 3.2 |
由于YOLO与Fast R-CNN错误类型占比存在较大差异,因此相比于与其他版本的Fast R-CNN联合,与YOLO联合对于mAP的提升更为有效。
3.4. VOC 2012结果
YOLO在PASCAL VOC 2012测试集上的mAP得分为57.9%,这与使用VGG-16的原始R-CNN接近。与R-CNN相比,YOLO很难处理小目标。在瓶子,绵羊及电视/遥控器等类别上,YOLO比R-CNN低8-10%。然而,在如猫及火车等类别上,YOLO性能更优秀。
3.5 泛化性:艺术品中的人物检测
在学术数据集中,训练集和测试集具有相同的分布。然而,在实际应用中,测试数据可能与之前训练所使用的数据很不相同。我们将模型在PASCAL VOC数据集上进行训练,并在Picasso数据集及People-Art数据集上进行测试。下图比较了不同模型的AP性能:
YOLO与R-CNN,DPM,Poselets及D&T模型相比,其泛化性能更好。
4. 野外实时检测
YOLO与网络摄像头相结合的实时检测跟踪系统demo及源代码从项目网站上获取:http://pjreddie.com/yolo/。
5. 结论
YOLO是一个统一的目标检测模型。与基于分类器的模型不同,YOLO直接在与检测性能相关的损失函数上进行训练,整个模型是联合训练的。
Fast YOLO是目前文献中速度最快的通用目标检测模型,YOLO推动了实时目标检测的发展。另外,YOLO也能很好地推广到新的领域,这使得它非常适合于要求快速及鲁棒性的目标检测应用。