进来的都是缘分,感谢大家宝贵的时间分给了我。喜欢的可以点下关注,感谢!
论文阅读
Redmon J, Divvala S, Girshick R, et al. You Only Look Once: Unified, Real-Time Object Detection[J]. 2015:779-788.
大牛们
跟大牛学习,不迷路!
[Ross Girshick](http://www.rossgirshick.info/)
这篇Paper实现的网站:
[Darknet-YOLO](https://pjreddie.com/darknet/yolo/)
[代码实现1](https://github.com/pjreddie/darknet)
[代码实现2](https://github.com/AlexeyAB/darknet#how-to-use)
摘要
我们一般只需要对一幅图瞥一下,就能很快速的知道图中的是什么物体、其定位以及相互的关系。
一个快速、精准的算法在目标检测中将大有可为
Fast, accurate algorithms for object detection would allow computers to drive cars without specialized sensors, enable assistive devices to convey real-time scene information to human users, and unlock the potential for general purpose, responsive robotic systems.
这篇Paper提出一种新的(2015)目标检测的方法——**YOLO**。
YOLO特殊之处在于:
**1**-此前的方法是用分类器来进行目标检测,**而YOLO则将之视为一个回归问题**。
YOLO:从输入的图像,到得到bounding boxes以及每个bounding box所属类别的概率之间仅经过一个神经网络。是一种端到端end to end的网络结构。
**2**-YOLO结构很快,在视频检测方面可以实现实时检测。
**3**-相比其他的目标检测的方法,YOLO虽有较多的定位误差,但**背景误差少**。
**4**-可以学到更加一般的特征
该领域的一些其他方法
目前的检测系统一般都是对物体采用分类器,并在测试图像中的不同位置和尺度上对其进行评估。
Deformable Parts Models (DPM)
使用滑动窗口方法,分类器在整个图像上的等距位置运行进行评估。
2. R-CNN、Fast R-CNN
采用的是 region proposals 的方法,先生成一些可能包含待检测物体的 potential bounding box,再通过一个 classifier 去判断每个 bounding box 里是否包含有物体,以及物体所属类别的 probability 或者 confidence。
区域建议方法的主要思路是:
找出可能的目标区域 + 提取目标区域特征 + 对目标区域分类 and 对目标Box回归
劣势:
由于需要经过好几个独立的部分,检测速度慢,每一个独立的部分要单独训练,难以优化。
核心思想
> 利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。
YOLO的实现方法
(1)将图片Resize成448 * 448大小。分割为S * S个网格单元,Paper中分成7 * 7
(2)CNN卷积层提取特征,全连接层预测。
(3)根据模型的置信度来确定最终的检测值。这里使用的是[非极大值抑制Non-max suppression(NMS)](https://chenzomi12.github.io/2016/12/14/YOLO-nms/)算法求得目标区域。
优势及不足
优势:
非常快,而且与其他实时检测系统相比,平均精度也更高。
与基于sliding windows和基于region proposal的方法不同的是,YOLO在做predicting和training的时 候,是基于整张图片,所以YOLO可以将图片中物体所处的语境(**contextual**)的 class information (类别信息)以及 appearance information (外观信息,也就是位置信息)进行 encoding。
学到更加一般化的特征
不足:
在accuracy方面还存在不足。对于相互靠的很近的物体以及一些小物体很难检测。
模型输出
1)分割成S * S网格单元
2)每个网格单元预测B个边界框,C个类别的概率,C是网络分类的总数,在训练时确定。
3)每一个边界框除了要回归到自身的位置(包括x,y,w,h),还要附带一个代表含有目标的置信度confidence。w,h是该边界框对应于整张图像的长宽比例;(x,y)坐标表示预测的边界框的中心相对于网格单元的边界的偏移。
所以最后输出的是一个S * S *(B * 5 + C)的张量
取S=7,B=2,C=20则:看下图怎么计算的?
另外
在形式上定义confidence =
Pr(Object):若有目标落在网格单元里,则值为1,否则为0;
IOU:预测的边界框和实际的groundtruth之间的IOU(intersection over union)值
在预测的时候,每个网格单元预测一个类别的概率,Pr(Classi | Object):
也就是说将假定类别的概率和单个边界框的置信度的预测值相乘。
网络结构
YOLO仍采用的CNN的经典形式:
开始是 convolutional layers 提取特征;
再是 fully connected layers 进行 predict;
结果输出probabilities(概率) 以及 coordinates(坐标位置)。
[参考](http://blog.csdn.net/u010167269/article/details/52638771)
YOLO 的 CNN 结构参考的两篇论文:[GoogLeNet](https://arxiv.org/abs/1409.4842)、[Network in Network](https://arxiv.org/abs/1312.4400)。
YOLO 有24个卷积层,随后就是2个全连接层。
详细的网络结构的表格见下方。
表格引用自http://blog.csdn.net/u010167269/article/details/52638771
训练
pretraining预训练
#名词:
convolution layer:卷积层
fully connected layer:全连接层
average pooling layer:平均池化层,还有一种常用的是最大池化层max pooling layer
用[ImageNet的1000类分类任务数据集](www.image-net.org/challenges/LSVRC/)来训练此前的网络的前20层卷积层,外加一个average pooling layer和fully connected layer。
Ren et al.提出在预训练的模型上同时添加convolution layer和connected layer可以提升模型的表现。所以在预训练的基础上增加了4个convolution layer 和 2个 fully connected layer,新添加的层都是随机初始化的权重。
论文引用:S. Ren, K. He, R. B. Girshick, X. Zhang, and J. Sun. Object detection networks on convolutional feature maps. CoRR, abs/1504.06066, 2015. 3, 7
由于一般目标检测都需要**细粒度级别**的视觉信息(比如不仅仅要知道这是条狗,还要区分出这是哈士奇还是爱斯基摩犬?),所以Paper中将输入图像的分辨率从224 * 224 变成448 * 448 的分辨率。
激活函数
除了最后一层使用了线性激活函数,其他所有层都是用的是[leaky rectified linear activation]
关于激活函数更多的知识在wiki--------(https://en.wikipedia.org/wiki/Activation_function)
leaky rectified linear activation
损失函数
图片来自于:https://zhuanlan.zhihu.com/p/24916786?refer=xiaoleimlnote
但直接使用sum-square error(误差平方和)并不妥当。因为定位误差和分类误差二者并不等同,所以要引入权重λ来衡量。另外,在一幅图像中,不含目标的网格单元还是挺多的,这些网格单元的confidence将被置为0,不包含目标的网格单元的梯度更新将会极大压制含目标的网格单元的梯度更新,最终导致模型的不稳定,甚至是网络的发散。
> We use two parameters, λcoord and λnoobj to accomplish this. We set **λcoord** = 5 and **λnoobj** = 0.5。
这里使用λcoord和λnoobj来完成。
在大目标和小目标的loss上采取了一些trick。小目标相对于ground truth的偏差比大目标敏感。
> Our error metric should reflect that small deviations in large boxes matter less than in small boxes. To partially address this we predict the square root of the bounding box width and height instead of the width
and height directly.
怎么样解决小目标比大目标敏感呢?作者使用了平方根来缓解这一问题,但很明显效果虽然改善了,但还是有这方面的不足,需要后续改进。
TRICK奇技淫巧(这些TRICK在深度学习中举足轻重哦)
Learning rate 学习率的设置:
(1)在一开始,learning rate 逐渐从**10^-3**增加到**10^-2**。
如果训练时从一个较大的learning rate开始,通常会因为不稳定的梯度,而使得模型发散。
(2)之后,保持**10^-2**直到 epoch =75;
(3)再接下的30轮epoch,**10^-3**;
(4)最后 30 轮 epoch,**10^-4** 。
防止过拟合:这里有两个比较常用的技巧tricks
[Dropout](https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf)
> A dropout layer with rate = .5 after the first connected layer prevents co-adaptation between layers。
dropout layer:一般不直译它,就叫为dropout层,它是用来随机丢掉一些神经元,防止过拟合
作者这里在第一个连接层之后加入一个dropout率为0.5的dropout层。
注:经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。
[Data Augmentation](http://210.28.132.67/weixs/project/CNNTricks/CNNTricks.html)
> For data augmentation we introduce random scaling and translations of up to 20% of the original image size.
作者引入了随机缩放和平移,达到原始图像大小的20%。
数据的随机缩放和平移都属于数据增强data augmentation里面的。
总结
由于YOLO每个网格单元只能预测两个边界框,较强的空间约束使得YOLO在检测相邻目标的数量上受到了限制。
由于YOLO是从数据中学习到了预测边界框,所以很难推广到一些新的或者不太寻常的比例和配置的图像。
损失函数对小目标的偏差比较敏感,文中虽然使用了平方根来缓解这个问题,但并没有很好的解决。
YOLO 中最主要的误差仍是定位不准造成的误差。
Our model is simple to construct and can be trained directly on full images.
能训练一整张图片,模型容易建立
Fast YOLO is the fastest general-purpose object detector in the literature.
Fast YOLO 在论文发表时是最快的目标检测器
YOLO also generalizes well to new domains making it ideal for applications that rely on fast, robust object detection.
YOLO泛化能力强,在新领域的效果也很好
其他参考
> [图解YOLO](https://zhuanlan.zhihu.com/p/31227909)
> [YOLO目标检测原理与实践](https://zhuanlan.zhihu.com/p/24916786?refer=xiaoleimlnote)
> [ZOMI](https://chenzomi12.github.io/)
> [chenxp2311](http://blog.csdn.net/u010167269/article/details/52638771)
END
感谢你的阅读 !如果这篇文章对你有帮助,希望你点下关注,并留下珍贵的评论。
本文暂时没有评论,来添加一个吧(●'◡'●)