目标检测之YOLO,SSD

转自:http://lanbing510.info/2017/08/28/YOLO-SSD.html

在深度学习出现之前,传统的目标检测方法大概分为区域选择(滑窗)、特征提取(SIFT、HOG等)、分类器(SVM、Adaboost等)三个部分,其主要问题有两方面:一方面滑窗选择策略没有针对性、时间复杂度高,窗口冗余;另一方面手工设计的特征鲁棒性较差。自深度学习出现之后,目标检测取得了巨大的突破,最瞩目的两个方向有:1 以RCNN为代表的基于Region Proposal的深度学习目标检测算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等);2 以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD等)。前篇文章介绍了基于Region Proposal的深度学习目标检测算法,本篇将对基于回归方法的深度学习目标检测方法(YOLO,SSD)进行介绍,前者在速度上并不能满足实时要求,后者利用回归的思想(既给定输入图像,直接在图像的多个位置上回归出这个位置的目标边框以及目标类别),很大的加快了检测的速度。

YOLO


算法特点


1 将物体检测作为回归问题求解。基于一个单独的End-To-End网络,完成从原始图像的输入到物体位置和类别的输出,输入图像经过一次Inference,便能得到图像中所有物体的位置和其所属类别及相应的置信概率。

2 YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用Inception Module,而是使用1*1卷积层(此处1*1卷积层的存在是为了跨通道信息整合)+3*3卷积层简单替代。

3 Fast YOLO使用9个卷积层代替YOLO的24个,网络更轻快,速度从YOLO的45fps提升到155fps,但同时损失了检测准确率。

4 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。

5 泛化能力强。在自然图像上训练好的结果在艺术作品中的依然具有很好的效果。

网络结构


几个要点


一、大致流程

1 给个一个输入图像,首先将图像划分成7*7的网格。

2 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)。

3 根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可。

二、训练

1 预训练分类网络:在 ImageNet 1000-class Competition Dataset上预训练一个分类网络,这个网络是前文网络结构中的前20个卷机网络+Average-Pooling Layer+Fully Connected Layer(此时网络输入是224*224)。

2 训练检测网络:文献[6]提到在预训练网络中增加卷积和全链接层可以改善性能。YOLO添加4个卷积层和2个全链接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入也从224*224变成448*448。

(1)一幅图片分成7*7个网格,某个物体的中心落在这个网格中此网格就负责预测这个物体。每个网格预测两个Bounding Box。网格负责类别信息,Bounding Box负责坐标信息(4个坐标信息及一个置信度),所以最后一层输出为7*7*(2*(4+1)+20)=7*7*30的维度。

(2)Bounding Box的坐标使用图像的大小进行归一化0-1。Confidence使用Pr(Object)IOUtruthpredPr(Object)∗IOUpredtruth计算,其中第一项表示是否有物体落在网格里,第二项表示预测的框和实际的框之间的IOU值。

3 损失函数的确定:损失函数的定义如下,损失函数的设计目标就是让坐标,置信度和类别这个三个方面达到很好的平衡。简单的全部采用了Sum-Squared Error Loss来做这件事会有以下不足:① 8维的Localization Error和20维的Classification Error同等重要显然是不合理的;② 如果一个网格中没有Object(一幅图中这种网格很多),那么就会将这些网格中的Box的Confidence Push到0,相比于较少的有Object的网格,这种做法是Overpowering的,这会导致网络不稳定甚至发散。 解决方案如下。

(1)更重视8维的坐标预测,给这些损失前面赋予更大的Loss Weight, 记为λcoordλcoord ,在Pascal VOC训练中取5。(上图蓝色框)。

(2)对没有Object的Bbox的Confidence Loss,赋予小的Loss Weight,记为 λnoobjλnoobj ,在Pascal VOC训练中取0.5。(上图橙色框)。

(3)有Object的Bbox的Confidence Loss(上图红色框)和类别的Loss (上图紫色框)的Loss Weight正常取1。

(4)对不同大小的Bbox预测中,相比于大Bbox预测偏一点,小Bbox预测偏一点更不能忍受。而Sum-Square Error Loss中对同样的偏移Loss是一样。为了缓和这个问题,将Bbox的Width和Height取平方根代替原本的Height和Width。 如下图:Small Bbox的横轴值较小,发生偏移时,反应到y轴上的Loss(下图绿色)比Big Bbox(下图红色)要大。

(5)一个网格预测多个Bbox,在训练时我们希望每个Object(Ground True box)只有一个Bbox专门负责(一个Object 一个Bbox)。具体做法是与Ground True Box(Object)的IOU最大的Bbox 负责该Ground True Box(Object)的预测。这种做法称作Bbox Predictor的Specialization(专职化)。每个预测器会对特定(Sizes,Aspect Ratio or Classed of Object)的Ground True Box预测的越来越好。

三、测试

1 计算每个Bbox的Class-Specific Confidence Score:每个网格预测的Class信息( Pr(Classi|Object)Pr(Classi|Object))和Bbox预测的Confidence信息( Pr(Object)IOUtruthpredPr(Object)∗IOUpredtruth) 相乘,就得到每个Bbox的Class-Specific Confidence Score。

Pr(Classi|Object)Pr(Object)IOUtruthpred=Pr(Classi)IOUtruthpredPr(Classi|Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth

2 进行Non-Maximum Suppression(NMS):得到每个Bbox的Class-Specific Confidence Score以后,设置阈值,滤掉得分低的Bboxes,对保留的Bboxes进行NMS处理,就得到最终的检测结果。更为直观详细的流程可参见[5]。

存在问题


1 YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。

2 测试图像中,当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱。

3 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。

SSD


算法特点


1 SSD结合了YOLO中的回归思想和Faster-RCNN中的Anchor机制,使用全图各个位置的多尺度区域特征进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster-RCNN一样比较精准。

2 SSD的核心是在特征图上采用卷积核来预测一系列Default Bounding Boxes的类别、坐标偏移。为了提高检测准确率,SSD在不同尺度的特征图上进行预测。

网络结构


几个要点


一、模型结构

1 多尺度特征图(Mult-scale Feature Map For Detection)

在图像Base Network基础上,将Fc6,Fc7变为了Conv6,Conv7两个卷积层,添加了一些卷积层(Conv8,Conv9,Conv10,Conv11),这些层的大小逐渐减小,可以进行多尺度预测。

2 卷积预测器(Convolutional Predictors For Detection)

每个新添加的卷积层和之前的部分卷积层,使用一系列的卷积核进行预测。对于一个大小为m*n大小,p通道的卷积层,使用3*3的p通道卷积核作为基础预测元素进行预测,在某个位置上预测出一个值,该值可以是某一类别的得分,也可以是相对于Default Bounding Boxes的偏移量,并且在图像的每个位置都将产生一个值。

3 默认框和比例(Default Boxes And Aspect Ratio)

在特征图的每个位置预测K个Box。对于每个Box,预测C个类别得分,以及相对于Default Bounding Box的4个偏移值,这样需要(C+4)*k个预测器,在m*n的特征图上将产生(C+4)*k*m*n个预测值。这里,Default Bounding Box类似于Faster-RCNN中Anchors,如下图所示。

二、模型训练

1 监督学习的训练关键是人工标注的label。对于包含Default Box(在Faster R-CNN中叫做Anchor)的网络模型(如:YOLO,Faster R-CNN, MultiBox)关键点就是如何把 标注信息(Ground True Box,Ground True Category)映射到(Default Box上)。

2 给定输入图像以及每个物体的Ground Truth,首先找到每个Ground True Box对应的Default Box中IOU最大的作为正样本。然后,在剩下的Default Box中找到那些与任意一个Ground Truth Box的IOU大于0.5的Default Box作为正样本。其他的作为负样本(每个Default Box要么是正样本Box要么是负样本Box)。如上图中,两个Default Box与猫匹配,一个与狗匹配。在训练过程中,采用Hard Negative Mining 的策略(根据Confidence Loss对所有的Box进行排序,使正负例的比例保持在1:3) 来平衡正负样本的比率。

3 损失函数

与Faster-RCNN中的RPN是一样的,不过RPN是预测Box里面有Object或者没有,没有分类,SSD直接用的Softmax分类。Location的损失,还是一样,都是用Predict box和Default Box/Anchor的差 与Ground Truth Box和Default Box/Anchor的差进行对比,求损失。

其中,xpij=1xijp=1表示 第ii个Default Box 与类别pp的第jj个Ground Truth Box相匹配,否则若不匹配的话,则xpij=0xijp=0

4 Default Box的生成

对每一张特征图,按照不同的大小(Scale) 和长宽比(Ratio)生成生成k个默认框(Default Boxes)。

(1)Scale:每一个Feature Map中Default Box的尺寸大小计算如下:

sk=smin+smaxsminm1(k1),          k[1,m]sk=smin+smax−sminm−1(k−1),          k∈[1,m]

其中,sminsmin取值0.2,smaxsmax取值0.95,意味着最低层的尺度是0.2,最高层的尺度是0.95。

(2)Ratio:使用不同的Ratio值ar=1,2,3,12,13ar=1,2,3,12,13计算Default Box的宽度和高度:wak=skar,hak=sk/arwka=skar,hka=sk/ar。另外对于Ratio=1的情况,还增加了一个Default Box,这个Box的Scale为sk=sksk+1s′k=sksk+1。也就是总共有6种不同的Default Box。

(3)Default Box中心:每个Default Box的中心位置设置成(i+0.5|fk|,j+0.5|fk|)(i+0.5|fk|,j+0.5|fk|),其中 |fk||fk|表示第k个特征图的大小i,j[0,|fk|)i,j∈[0,|fk|) 。

5 Data Augmentation:为了模型更加鲁棒,需要使用不同尺寸的输入和形状,作者对数据进行了多种方式的随机采样。

小结


至此,介绍完了以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD),主要介绍了算法的核心思想和要点难点,代码可以从GitHub得到,更多实现细节可以阅读原论文和代码。在继YOLO和SSD之后,YOLO作者又提出了YOLOv2版,使用一系列的方法对YOLO进行了改进,在保持原有速度的同时提升精度得到YOLOv2。提出了一种目标分类与检测的联合训练方法,同时在COCO和ImageNet数据集中进行训练得到YOLO9000,实现9000多种物体的实时检测。后面会写一篇对YOLOv2的总结分析整理。

参考文献


[1] YOLO:"You Only Look Once: Unified, Real-Time Object Detection"

[2] 图解YOLO

[3] YOLO详解

[4] 基于深度学习的目标检测研究进展

[5] YOLO PPT by Deepsystems.io

[6] Ren S, He K, Girshick R, et al. "Object detection networks on convolutional feature maps" [J].

[7] SSD:"Single Shot MultiBox Detector"

[8] 读文笔记SSD

[9] 论文阅读:SSD: Single Shot MultiBox Detector

[10] SSD

[11] SSD PPT by Deepsystems.io

[12] SSD关键源码解析


版权声明:本文为博主原创文章,转载请注明 出处

  • 10
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLOSSD是两种常用的目标检测算法。针对过拟合和欠拟合问题,可以使用一些正则化技术进行处理。 正则化技术有助于避免过拟合问题。其中,L1和L2正则化可以通过对模型的权重进行惩罚来降低过拟合的风险。Dropout技术可以在训练过程中随机丢弃一部分神经元,以减少模型的复杂度和依赖性,从而降低过拟合的可能性。Early Stopping是一种基于验证集性能的策略,当验证集性能不再提升时停止训练,以防止过拟合。数据增强是一种通过对训练数据进行扩充来增加样本多样性的方法,可以减少过拟合。 对于欠拟合问题,可以考虑增加模型的复杂度或增加训练数据量。通过增加模型的复杂度,例如增加网络层数或增加每层的神经元数量,可以提高模型的表达能力,从而减少欠拟合。如果训练数据量较少,可以使用数据增强技术来扩充数据集,提高模型的泛化能力。 综上所述,针对过拟合问题,可以使用正则化技术如L1和L2正则化、Dropout、Early Stopping和数据增强。对于欠拟合问题,可以增加模型复杂度或增加训练数据量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [目标检测YOLO实战应用案例100讲-自动驾驶场景下的三维目标检测技术研究](https://blog.csdn.net/qq_36130719/article/details/130657588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [《从零深入理解Yolo系列v1-v8全家桶 + 目标检测面试提问+目标检测算法总览》](https://blog.csdn.net/weixin_54338498/article/details/128714742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值