前言
最近因为工作需要,接触了目标检测领域的相关知识,主要学习了YOLO v1~v3的内容,主要参考的是YOLO官方提供的论文以及网上一些大佬的学习笔记。由于刚刚接触目标检测领域,有写的不对的地方还请指正。
YOLO v1
研究背景
之前的目标检测经常被看作一个分类问题,常见的方法包括DPM(Deformable Parts Models)、R-CNN(Fast R-CNN、Faster R-CNN)等。
DPM:
采用对应类别的分类器去评估图像中各个位置和区域是否包含物体、包含那种物体。DPM采用滑动窗口(sliding window)机制,保证分类器可以遍历整张图片。
R-CNN
采用区域预测方式(region proposals methods):首先生成潜在的bbx(bounding box),再通过分类器判断是否包含物体,最后再去判断物体的类别。
缺点:每个部分分开训练,优化困难。
注:这部分翻译自YOLO v1的官方论文,没有更加深入地了解,以后有时间会进行更加细致的了解。
YOLO v1介绍
概述
YOLO将目标检测抽象成了一个简单的回归问题,输入图像,直接输出边界框坐标和类别概率,用一个系统完成了所有工作。
优点
- 检测速度快,YOLO的检测框架仅包含一个卷积神经网络,pipline非常简单;
- YOLO采用全局图像进行检测,不容易产生背景误判;
- YOLO学习到物体更加泛化的特征,在应要到新领域的时候,表现出较好的泛化性。
实现方法
这里先给一张论文中的图,展示YOLO的基本思想:
YOLO算法首先将输入图像分割成S*S的网格(grid cell),每个网格都会预测B个bbx,每个bbx又会包含5个预测值 :(x, y), (w, h)和置信度。
(x, y) :框的中心(相对于网格边界);
(w, h):bbx相对于整个图片的宽和高;
置信度: P r ( O b j e c t ) ∗ I O U t r u t h p r e d Pr(Object)*IOU_{truth}^{pred} Pr(Object)∗IOUtruthpred(若没有物体,置信度为0,否则置信度则为预测边框和真实边框的IOU(intersection over union,交并比))。
某个网格包含某一类别物体的置信度用 P r ( C l a s s ∣ O b j e c t ) Pr(Class|Object) Pr(Class∣Object)来表示,最终,一个bbx属于某个特定类别的置信分数可以表示为:
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_{pred}^{truth}=Pr(Class_i)*IOU_{pred}^{truth} Pr(Class∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
因此,YOLO最后的输出是 [ S , S , B ∗ 5 + C ] [S, S, B*5+C] [S,S,B∗5+C]的张量!!!
网络设计
YOLO的架构沿用了GoogleNet的形式,完整版的模型中包含24个卷积层和2个全连接层;快速版的YOLO(fast YOLO)减少了卷积层(9层),其他细节均是一样的。
注1:这里存一个疑,一个卷积核难道不应该是 7 ∗ 7 ∗ 192 7*7*192 7∗7∗192吗?
注2: 1 ∗ 1 1*1 1∗1的卷积核作用:特征降维,节省计算量;增加模型的非线性表达能力。
训练
1. 预训练
基于ImageNet 1000-class数据集,将YOLO中的前20个卷积层连接上一个平均池化层和全连接层进行了预训练。训练图片的像素为224*224。
2. 训练
在预训练网络模型的基础上加入了四个卷积层和两个全连接层,采用随机权重初始化策略,并将输入图像的像素从224224增加到448448。
3. 激活函数
- 最后一层采用线型激活函数;
- 其它层采用leaky rectified非线性激活函数:
ϕ ( x ) = { 0.1 x , o t h e r w i s e x , i f x > 0 \phi(x) = \lbrace_{0.1x,\space \space \space \space otherwise}^{x,\space \space \space \space \space \space \space \space \space \space if x> 0} ϕ(x)={ 0.1x, other