参考
Introduction
-
再16年那会比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。
-
作者将目标检测作为一个回归问题,回归到空间上分离的边界框和相关的类概率。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。
-
用YOLO处理图像是简单而直接的。
- (1)将输入图像的大小调整为448×448
- (2)在图像上运行单个卷积网络
- (3)根据阈值以及置信度对模型的结果筛选
-
YOLO的特点如下
- 极其快,同时精度远胜其他实时系统。
- 能够从全局解析图片,从而使得背景预测错误更加少
- 可以高度概括目标特点
Unified Detection
-
YOLOv1的流程大致可以划分为一下部分,图参考上图:
- 首先将input划分为SxS大小的grid,如(1)所示
- 经过卷积池化之后得到feature maps,然后对于每个grid,会去预测B个bbox(xywh),以及该bbox含有对象的置信度(conf),还有所有类的概率(C种类),因此每张图的输出就会有: S ∗ S ( B ∗ 5 + C ) S*S(B*5+C) S∗S(B∗5+C)个输出,作者在Pascal VOC 中选择B=2;S=7;C=20
Network Design
-
受GooGleNet的启发(for image classification),YOLOv1的结构如下:
-
共24层conv layers,中间穿插基层Max pooling,最后接两层FC(全链接),直接输出上面提到的 S ∗ S ( B ∗ 5 + C ) S*S(B*5+C) S∗S(B∗5+C)个tensor
Training
-
预训练:先在ImageNet 2012中进行预训练(只用前20个conv的结构)
-
在最后一层layer中同时预测类别概率和bbox的边界,同时将结果归一化到 ( 0 , 1 ) (0,1) (0,1)
-
激活函数使用Leaky ReLU
-
在设计误差(loss)的时候使用了方差和(sum-squared error),
-
这种方法易于优化,但会带来正负样本不平衡的问题(且绝大多数的时候background比obj多得多),因此作者又引入了两个权重系数,用于控制二者的比重: λ c o o r d \lambda_{coord} λcoord和 λ n o o b j \lambda_{noobj} λnoobj,分别表示有对象和没对象对loss的影响比重
-
同时方差和对不同大小的对象的检测误差也是平均的,这个问题,同样的像素误差,在计算IOU的时候对大目标的时候是可以接受的范围,但对小目标则很不利,因此作者在预测的时候使用 $\sqrt{h} 和 和 和\sqrt{w}$来替代原来的h和w(但是这个问题仍然存在,因此YOLO v1对小目标的检测依然不好)
-
LOSS式子:
-
L = λ 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 n o 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 ] L = \lambda_{coord} \sum^{S^2}_{i=0} \sum^{B}_{j=0} \mathbb 1_{ij}^{obj}[(x_i- \hat x_i)^2+(y_i- \hat y_i)^2] + \lambda_{coord} \sum^{S^2}_{i=0} \sum^{B}_{j=0} 1_{ij}^{obj}[(w_i- \hat w_i)^2+(h_i- \hat h_i)^2] + \sum^{S^2}_{i=0} \sum^{B}_{j=0} 1_{ij}^{obj}[(C_i- \hat C_i)^2] + \lambda_{noobj} \sum^{S^2}_{i=0} \sum^{B}_{j=0} 1_{ij}^{noobj}[(C_i- \hat C_i)^2] + \sum^{S^2}_{i=0} 1_{i}^{obj} \sum_{c \in classes} [(p_i(c) - \hat p_i(c))^2] L=λ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∑B1ijnoobj[(Ci−C^i)2]+i=0∑S21iobjc∈classes∑[(pi(c)−p^i(c))2]
-
其中$1_{i}^{obj} $表示在cell i中是否有obj(有就return 1),同理$1_{ij}^{obj} $表示是在cell i中的第j个bbox预测是否可以作为““responsible”的预测(有就return 1),然后我找了张图可以参考一下:
-
-
-
别的设置:
- batch size = 64; momentum = 0.9; learning rate 从 1 0 − 3 10^{-3} 10−3到$10^{-2} $
- droupout=0.5; data augmentation
Limitations of YOLO
- YOLO对边界框预测施加了强大的空间约束,因为每个网格单元只能预测两个框,并且只能有一个类。这种空间约束限制了模型可以预测的附近对象的数量。
- 由于YOLO从数据中学习预测边界框,它很难推广到具有新的或不寻常的纵横比或配置的对象。
- YOLO还使用相对粗糙的特征来预测边界框,因为YOLO架构具有来自输入图像的多个下采样层。
- 最后,当训练一个近似检测性能的损失函数时,损失函数在小边界框和大边界框中处理相同的错误。
- 大方框中的小错误通常是良性的,但小方框中的小错误对IOU的影响要大得多。因此对小目标的检测效果不好