算法对比:
(1)Yolo的缺陷:
- 每个网格智能预测一个物体,容易漏检;
- 对于物体的尺度比较敏感,面对物体尺度变化比较大的物体时泛化能力较差。
(2)two-stage方法和one-stage方法对比:
- two-stage方法如R-CNN系列算法,主要思想是先通过启发式方法或者CNN网络(RPN),产生一系列稀疏的候选框,然后对这些候选框进行分类和回归,其优势是准确度高。
- one-stage方法如Yolo和SSD算法,主要思想是在多层特征图上进行密集抽样,抽样时采用不同的尺度和长宽比,然后利用CNN 进行分类和回归,整个过程只需要一步,其优势是速度快,但均匀的密集采样的一个重要缺点是训练比较困难,正负样本极不平衡导致模型准确率低。
SSD算法的步骤:
- 输入一张300300(或者512512)的图片,将其输入到经与训练好的分类网络中获得不同大小的特征映射;
- 抽取6层feature map,然后在feature map层上面的每一个点构造不同尺度大小的Default box(8732个Default box),然后分别进行检测和分类,生成多个初步符合条件的Default boxes;
- 将不同的feature map获得的Default boxes结合起来,经过NMS(非极大值抑制)来过滤掉一部分重叠或者不正确的Default boxes,生成最终的检测结果。
SSD的三大核心设计理念
- 采用多尺度特征图用于检测:
比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标。采用多尺度特征用于检测可以提高识别的准确度 - 设置Default boxes:
Default boxes其实就是在某一feature map上每一点处选取的不同长宽比的选框。与YOLO不同的是,YOLO在每个位置只选取正方形选框,但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。
对于先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加。 - 利用卷积进行检测:
与 Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。
对网络中 6 个特定的卷积层(Conv4_3,Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2)的输出分别用两个 3*3 的卷积核进行卷积,一个输出分类用的confidence,每个default box生成21个confidence(这是针对VOC数据集包含20 个 object 类别而言的,另外一个是背景的分类);一个输出回归用的 localization,每个 default box生成4个坐标值(x,y,w,h)。
Default box的匹配
在训练过程中,首先要确定训练图片中的Ground Truth与哪个先验框进行匹配,与之匹配的先验框所对应的边界框将负责预测它,SSD的先验框与Ground Truth的匹配原则主要有两点:
- 首先寻找与每一个ground truth有最大IOU的default box,这样能保证每一个Ground Truth能与至少一个default box对应起来。
- SSD之后将剩余的还没配对的default box与任意一个GT尝试配对,只要两者的IOU大于阈值就进行匹配。
通常,称与GT匹配的default box为正样本,反之,若一个default box没有与任意一个GT匹配,那么该default box只能与负样本匹配,称为负样本。
尽管一个GT可以与多个default box匹配,但GT相对default box还是太少了,故负样本相对正样本会很多。为了保证正负样本平衡,对负样本进行抽样,抽样时按照置信度误差进行降序排列,选取误差较大的top-k作为训练负样本,以保证正负样本比例接近1:3.
损失函数
损失函数定义为位置误差与置信度误差的加权和,其中位置误差仅针对正样本进行,置信度误差包括正样本的误差和负样本的误差。
NMS(非极大值抑制)
首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。
SSD加速的原因分析
- 首先SSD是一个one-stage网络,只需要一个阶段就可以输出结果,Faster R-CNN是一个two-stage网络;尽管Faster R-CNN中的bounding boxes少很多,但其需要大量的前向和反向推理,而且需要交替训练两个网络。
- Yolo网络看起来比SSD网络简单,但是Yolo网络中含有大量的全连接层,和FC相比,卷积层具有更少的参数;同时,Yolo获取候选框bounding boxes的操作比较费时,SSD算法中调整了VGG网络的架构,将两层FC换成了CONV层。
- SSD算法设置了输入图片的大小,将不同大小的图片裁剪成300*300或512*512,和Faster R-CNN相比,在图片的输入上少了很多的计算。
SSD算法的优缺点比较
- 需要人工设置default box的初始尺寸和长宽比,网络总default box的基础大小和形状不能直接通过学习获得,只能手工设置。而网络中每一层feature使用的default box大小和形状都不一样,导致调试过程非常依赖经验。
- 对小尺寸目标的识别任然比较差,达不到Faster R-CNN 的水平,使用SSD使用conv4_3层的低级feature去检测小目标,而低级特征卷积层数较少,存在特征提取不充分发的问题。
Yolo算法
Yolo算法将目标检测问题视为回归问题,所采用的是均方差损失函数,并对不同的部分采用了不同的权重值。
Yolo V1 算法特点:
- 同时预测多个Box位置和类别
- 端到端的目标检测和识别
- 速度更快
- 实现回归功能的CNN不需要复杂的计算过程(SSD anchor)
- 直接选用整图训练模型,更好地区分目标和背景区域
Yolo V1 算法原理:
- 图像被分成S*S个格子
- 包含GT物体中心的格子负责检测相应的物体
- 每个格子预测B(B通常为2)个检测框及其置信度(x,y,w,h,c)c为置信度,以及C个类别概率;每个格子预测出向量的长度为:5B+c
每个图预测出向量的长度为:S*S(5*B+c) - bbox信息(x,y,w,h)为物体的中心位置相对格子位置的偏移及宽度和高度,均被归一化
- 置信度反映是否包含物体及包含物体情况下位置的准确性,定义为
P r ( o b j e c t ) × I O U p r e d t r u t h 其 中 , P r ( o b j e c t ) ∈ { 0 , 1 } Pr(object) \times IOU_{pred}^{truth} 其中,Pr(object) \in \{0,1\} Pr(object)×IOUpredtruth其中,Pr(object)∈{0,1}
- 网络使用小卷积,即1x1 和3x3
- FC 输出为:SxSx(Bx5+C)
- 网络比VGG16快,准确率稍差
- Loss函数:均方和误差
- 坐标误差、IOU误差和分类误差
- 权重考量
l o s s = ∑ i = 0 s 2 c o o r E r r + i o u E r r + c l s E r r = λ c o o r d ∑ i = 0 s 2 ∑ j = 0 B . . . loss = \sum _{i=0}^{s^2}coorErr + iouErr + clsErr \\= \lambda _coord \sum_{i=0}^{s^2}\sum_{j=0}^{B}... loss=i=0∑s2coorErr+iouErr+clsErr=λcoordi=0∑s2j=0∑B...
- 预训练
- 使用预训练参数(20个con)来初始化YOLO,并训练VOC20
- 将输入图像分辨率从224x224Resize到448x448 (卷积层堆feature map的大小不敏感,仅关注卷积核的大小)
- 训练时B个Bbox的GT设置相同
Yolo V1 网络存在的问题
- 输入尺寸固定(yolo为一个卷积网络,没有多尺度提取feature map)
- 小目标检测效果差
- 同一个格子包含多个目标时,仅预测一个(IOU最高),必然有漏检目标
Yolo V2/Yolo9000 算法原理
- 引入anchor box思想
- 输出层:卷积层替代YOLO V1的全连接层
- 联合使用coco和imagenet物体分类标注数据
- 识别种类、精度、速度和定位准确性等都有较大提升
Yolo V2 改进之处:
- Batch Normalization:
v1中也使用了大量的BN,同时在定位层dropout;
v2中取消了dropout,均使用BN
- 高分辨率分类器:
v1中使用224x224预训练,448x448用于检测网络;
v2以448x448的分辨率微调最初的分类网络
- Anchor Boxes:
预测bbox的偏移,使用卷积代替FC;
输入尺度:416 (448*448 经过32倍的下采样,)中心的cell预测处于中心的物体
Max pooling下采样
预测超过1000个
mAP降低,recall显著提高
- 细粒度特征
添加pass through layer,把浅层特征图(26*26)连接到深层特征图
Resnet中的identity mapping
- Multi-Scale Training 多尺度训练
每隔几次迭代后就会微调网络的输入尺寸
- Darknet-19
主要使用3x3卷积
pooling之后channel数
global average pooling
1x1卷积
- 每个box包含4个坐标值,1个置信度和classes个条件类别概率
Yolo9000
Yolo9000是在yolo v2的基础上提出的一种可以检测超过9000个类别的模型,主要贡献在于提出了一种分类和检测的联合训练策略
wordTree 融合分类和检测两个任务
Yolo V3 算法原理
Yolo v3改进策略
- 更好的主干网络(类ResNet)
- 多尺度预测(类FPN)
聚类来得到Bbox的先验,选择9个簇以及3个尺度
将9个簇均匀分布在这三个尺度上
- 更好的分类器:binary cross-entropy loss
softmax 不适用于多标签分类
softmax 可被独立的多个logistic分类器替代,且准确率不会下降
Darknet框架:
- 由C语言和CUDA实现,一个较为轻型的开源深度学习框架,适合用来做底层研究,可以更为方便地从底层对其进行改进和扩展
- GPU显存利用率较高
- 第三方库依赖较少
- 容易移植到其他平台,windows和嵌入式设备
- http://pjreddie.com/darknet
- 可以使用OpenCV ,用来显示图片,更好地进行可视化
- darknet的实现与caffee的实现存在相似的地方,搭建网络结构通过配置文件来完成
- 网络配置文件:.weights
- 权值文件:.weights
Yolo系列网络优缺点:
优点:
- 快速,pipline简单
- 背景误检率低
- 通用性强
相比RCNN系列物体检测方法,Yolo具有以下缺点:
- 物体是被位置精度性差
- 召回率低
物体检测业务场景综述:
算法性能的评价:
- TP:标注框重叠率很高
- FP:重叠率低和重复检测的框
- precision和recall
- AP 和mAP
技术难点:
- 物体种类多
- 物体变化丰富
- 场景变化丰富
- 尺度、光照、遮挡…