目标检测(Object Detection)
本文为课程研讨需要,对目标检测算法进行理论学习,无实战内容,欢迎交流探讨
一、目标检测的基本概念
(一)什么是目标检测
目标检测(Object Detection) 的任务是找出图像中所有感兴趣的目标(物体),不同于分类和回归问题,目标检测还需要确定目标在图像中的位置 (定位),而确定识别目标的类别和位置 (分类和定位),是计算机视觉领域的核心问题之一。
(二)目标检测的任务
计算机视觉中关于图像识别有四大类任务:
(1)分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
(2)定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
(3)检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。
(4)分割-Segmentation:解决“每一个像素属于哪个目标物或场景”的问题。从像素级别回答了“在哪里?是什么”的问题
(如下图)
(三)目标检测算法分类
1、传统目标检测算法
具体参考:常见经典目标检测算法
不同于现在的卷积神经网络可以自动提取高效特征进行图像表示,以往的传统目标检测算法主要基于手工提取特征。
传统检测算法流程可概括如下:
1)选取感兴趣区域,选取可能包含物体的区域
2)对可能包含物体的区域进行特征提取
3)对提取的特征进行检测分类
传统检测算法局限性:
基于手工提取特征的传统目标检测算法主要有以下三个缺点:
1)识别效果不够好,准确率不高
2)计算量较大,运算速度慢
3)可能产生多个正确识别的结果
(1) Viola Jones Detector
VJ (Viola Jones)检测器采用滑动窗口的方式以检查目标是否存在窗口之中,该检测器看起来似乎很简单稳定,但由于计算量庞大导致时间复杂度极高,为了解决该项问题,检测器通过合并三项技术极大提高了检测速度,这三项技术分别是:
1)特征的快速计算方法——积分图;
2)有效的分类器学习方法——AdaBoost;
3)高效的分类策略——级联结构的设计。
(2)HOG Detector
HOG(Histogram of Oriented Gradients)检测器于2005年提出,是当时尺度特征不变性(Scale Invariant Feature Transform)和形状上下文(Shape Contexts)的重要改进,为了平衡特征不变性(包括平移,尺度,光照等)和非线性(区分不同的对象类别),通过在均匀间隔单元的密集网格上计算重叠的局部对比度归一化来提高检测准确性,因此检测器是基于本地像素块进行特征直方图提取的一种算法,它在目标局部变形和受光照影响下都有很好的稳定性。为后期很多检测方法奠定了重要基础,相关技术被广泛应用于计算机视觉各大应用。
(3)DPM Detector
作为VOC 2007-2009目标检测挑战赛的冠军,DPM(Deformable Parts Model)是目标检测传统算法中当之无愧的SOTA(State Of The Art)算法。于2008年提出,作了很多改进,因此该算法可以看作的延申算法。算法由一个主过滤器(Root-filter)和多个辅过滤器(Part-filters)组成,通过硬负挖掘(Hard negative mining),边框回归(Bounding box regression)和上下文启动(Context priming)技术改进检测精度。作为传统目标检测算法的SOTA,方法运算速度快,能够适应物体形变,但它无法适应大幅度的旋转,因此稳定性差。
2、基于深度学习的目标检测算法
基于手工提取特征的传统目标检测算法进展缓慢,性能低下。直到2012年卷积神经网络(Convolutional Neural Networks, CNNs)的兴起将目标检测领域推向了新的台阶。基于CNNs的目标检测算法主要有两条技术发展路线:Anchor-Based和Anchor-Free方法,其区别是是否使用Anchor进行训练和预测;Anchor-based方法则包括一阶段和二阶段检测算法,二阶段目标检测算法一般比一阶段精度要高,但一阶段检测算法速度会更快,Anchor-Free算法近几年逐步完善。
(1)Two Stage
先进行区域生成,该区域称之为region proposal(简称RP,一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。
任务流程:特征提取 --> 生成RP --> 分类/定位回归。
常见two stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。
(2)One Stage
不用RP,直接在网络中提取特征来预测物体分类和位置。
任务流程:特征提取–> 分类/定位回归。
常见的one stage目标检测算法有:OverFeat、YOLO系列、SSD和RetinaNet等。
(3)Anchor-Free
不使用Anchor
主要分如下两类表示检测框的方法:
1.基于关键点的检测算法:先检测目标左上角和右下角点,再通过角点组合形成检测框。
2.基于中心的检测算法:直接检测物体的中心区域和边界信息,将分类和回归解耦为两个子网格。
(四)目标检测算法应用
二、目标检测原理
参考文章:目标检测(Object Detection)
目标检测分为两大系列——RCNN系列和YOLO系列,RCNN系列是基于区域检测的代表性算法,YOLO是基于区域提取的代表性算法,另外还有著名的SSD是基于前两个系列的改进。
(一)候选区域的产生
1、滑动窗口
通过滑窗法流程图可以很清晰理解其主要思路:首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,最后采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选。最终,经过NMS筛选后获得检测到的物体。
滑窗法简单易于理解,但是不同窗口大小进行图像全局搜索导致效率低下,而且设计窗口大小时候还需要考虑物体的长宽比。所以,对于实时性要求较高的分类器,不推荐使用滑窗法。
2、选择窗口
滑窗法类似穷举进行图像子区域搜索,但是一般情况下图像中大部分子区域是没有物体的。学者们自然而然想到只对图像中最有可能包含物体的区域进行搜索以此来提高计算效率。选择搜索(selective search,简称SS)方法是当下最为熟知的图像bounding boxes提取算法,由Koen E.A于2011年提出。
选择搜索算法的主要思想:图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取bounding boxes。首先,对输入图像进行分割算法产生许多小的子区域。其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框。
流程如下:
step0:生成区域集R
step1:计算区域集R里每个相邻区域的相似度S={s1, s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空
优点如下:
1.计算效率优于滑窗法
2.由于采用子区域合并策略,所以可以包含各种大小的疑似物体框
3.合并区域相似的指标多样性,提高了检测物体的概率
(二)数据表示
标记后的样本:
预测输出:
(三)效果评估
使用IoU(Intersection over Union,交并比)来判断模型的好坏。所谓交并比,是指预测边框、实际边框交集和并集的比率,一般约定0.5为一个可以接收的值。
(四)非极大值抑制(NMS)
预测结果中,可能多个预测结果间存在重叠部分,需要保留交并比最大的、去掉非最大的预测结果,这就是非极大值抑制(Non-Maximum Suppression,简写作NMS)。如下图所示,对同一个物体预测结果包含三个概率0.8/0.9/0.95,经过非极大值抑制后,仅保留概率最大的预测结果。
三、目标检测模型
(一)R-CNN系列
参考文章:R-CNN系列算法精讲:R-CNN —》Fast R-CNN —》Faster R-CNN 进阶之路
R-CNN(全称Regions with CNN features) ,是R-CNN系列的第一代算法,其实没有过多的使用“深度学习”思想,而是将“深度学习”和传统的“计算机视觉”的知识相结合。比如R-CNN pipeline中的第二步和第四步其实就属于传统的“计算机视觉”技术。使用selective search提取region proposals,使用SVM实现分类。
1、R-CNN
1) 流程
①预训练模型。选择一个预训练 (pre-trained)神经网络(如AlexNet、VGG)。
②重新训练全连接层。使用需要检测的目标重新训练(re-train)最后全连接层(connected layer)。
③提取 proposals并计算CNN 特征。利用选择性搜索(Selective Search)算法提取所有proposals(大约2000幅images),调整(resize/warp)它们成固定大小,以满足 CNN输入要求(因为全连接层的限制),然后将feature map 保存到本地磁盘。
④训练SVM。利用feature map 训练SVM来对目标和背景进行分类(每个类一个二进制SVM)
⑤边界框回归(Bounding boxes Regression)。训练将输出一些校正因子的线性回归分类器
2)效果
R-CNN在VOC 2007测试集上mAP达到58.5%,打败当时所有的目标检测算法
3)缺点
①重复计算,每个region proposal,都需要经过一个AlexNet特征提取,为所有的RoI(region of interest)提取特征大约花费47秒,占用空间
②selective search方法生成region proposal,对一帧图像,需要花费2秒
③三个模块(提取、分类、回归)是分别训练的,并且在训练时候,对于存储空间消耗较大
2、SPPNet
论文链接:SPPNet
【简介】 SPPNet[5]提出了一种空间金字塔池化层(Spatial Pyramid Pooling Layer, SPP)。它的主要思路是对于一副图像分成若干尺度的图像块(比如一副图像分成1份,4份,8份等),然后对每一块提取的特征融合在一起,从而兼顾多个尺度的特征。SPP使得网络在全连接层之前能生成固定尺度的特征表示,而不管输入图片尺寸如何。当使用SPPNet网络用于目标检测时,整个图像只需计算一次即可生成相应特征图,不管候选框尺寸如何,经过SPP之后,都能生成固定尺寸的特征表示图,这避免了卷积特征图的重复计算。
【性能】 相比于RCNN算法,SPPNet在Pascal-07数据集上不牺牲检测精度(VOC-07, mAP=59.2%)的情况下,推理速度提高了20多倍。
【不足】 和RCNN一样,SPP也需要训练CNN提取特征,然后训练SVM分类这些特征,这需要巨大的存储空间,并且多阶段训练的流程也很繁杂。除此之外,SPPNet只对全连接层进行微调,而忽略了网络其它层的参数。
为了解决以上存在的一些不足,2015年R. Girshick等人提出Fast RCNN
3、Fast R-CNN
Fast R-CNN是基于R-CNN和SPPnets进行的改进。SPPnets,其创新点在于只进行一次图像特征提取(而不是每个候选区域计算一次),然后根据算法,将候选区域特征图映射到整张图片特征图中。
具体见参考文献
4、Faster R-CNN
经过R-CNN和Fast-RCNN的积淀,Ross B.Girshick在2016年提出了新的Faster RCNN,在结构上将特征抽取、region proposal提取, bbox regression,分类都整合到了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显
具体见参考文献
(二)YOLO系列
参考文章:目标检测算法综述
目标检测(Object Detection)
YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)
1、YOLOv1
在YOLOv1提出之前,R-CNN系列算法在目标检测领域独占鳌头。R-CNN系列检测精度高,但是由于其网络结构是双阶段(two-stage)的特点,使得它的检测速度不能满足实时性,饱受诟病。为了打破这一僵局,设计一种速度更快的目标检测器是大势所趋。
2016年,Joseph Redmon、Santosh Divvala、Ross Girshick等人提出了一种单阶段(one-stage)的目标检测网络。它的检测速度非常快,每秒可以处理45帧图片,能够轻松地实时运行。由于其速度之快和其使用的特殊方法,作者将其取名为:You Only Look Once(也就是我们常说的YOLO的全称),并将该成果发表在了CVPR 2016上,从而引起了广泛地关注。
YOLO 的核心思想就是把目标检测转变成一个回归问题,利用整张图作为网络的输入,仅仅经过一个神经网络,得到bounding box(边界框) 的位置及其所属的类别。
现在看来,YOLOv1的网路结构非常明晰,是一种传统的one-stage的卷积神经网络:
网络输入:448×448×3的彩色图片。
中间层:由若干卷积层和最大池化层组成,用于提取图片的抽象特征。
全连接层:由两个全连接层组成,用来预测目标的位置和类别概率值。
网络输出:7×7×30的预测结果。
(1)检测策略
YOLOv1采用的是“分而治之”的策略,将一张图片平均分成7×7个网格,每个网格分别负责预测中心点落在该网格内的目标。回忆一下,在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度高,但是需要额外再训练一个RPN网络,这无疑增加了训练的负担。在YOLOv1中,通过划分得到了7×7个网格,这49个网格就相当于是目标的感兴趣区域。通过这种方式,我们就不需要再额外设计一个RPN网络,这正是YOLOv1作为单阶段网络的简单快捷之处!
具体实现过程如下:
1.将一幅图像分成 S×S个网格(grid cell),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个object。
2.每个网格要预测 B 个bounding box,每个 bounding box 要预测 (x, y, w, h) 和 confidence 共5个值。
3.每个网格还要预测一个类别信息,记为 C 个类。
4.总的来说,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C) 的张量。在实际过程中,YOLOv1把一张图片划分为了7×7个网格,并且每个网格预测2个Box(Box1和Box2),20个类别。所以实际上,S=7,B=2,C=20。那么网络输出的shape也就是:7×7×30。
(2)目标损失函数
损失由三部分组成,分别是:坐标预测损失、置信度预测损失、类别预测损失。
使用的是差方和误差。需要注意的是,w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding
box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。而差方和误差函数中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h取平方根代替原本的w和h。
定位误差比分类误差更大,所以增加对定位误差的惩罚,使λcoord=5。
在每个图像中,许多网格单元不包含任何目标。训练时就会把这些网格里的框的“置信度”分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,训练早期发散。因此要减少了不包含目标的框的置信度预测的损失,使
λnoobj=0.5
(3)优点:
1.YOLO检测速度非常快。标准版本的YOLO可以每秒处理 45 张图像;YOLO的极速版本每秒可以处理150帧图像。这就意味着 YOLO 可以以小于 25 毫秒延迟,实时地处理视频。对于欠实时系统,在准确率保证的情况下,YOLO速度快于其他方法。
2.YOLO 实时检测的平均精度是其他实时监测系统的两倍。
3.迁移能力强,能运用到其他的新的领域(比如艺术品目标检测)。
(4)局限:
1.YOLO对相互靠近的物体,以及很小的群体检测效果不好,这是因为一个网格只预测了2个框,并且都只属于同一类。
2.由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。(因为对于小的bounding boxes,small error影响更大)
3.YOLO对不常见的角度的目标泛化性能偏弱。
2、YOLOv2
2017年,作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了大量改进,提出了 YOLOv2 和 YOLO9000。重点解决YOLOv1召回率和定位精度方面的不足。
YOLOv2 是一个先进的目标检测算法,比其它的检测器检测速度更快。除此之外,该网络可以适应多种尺寸的图片输入,并且能在检测精度和速度之间进行很好的权衡。
相比于YOLOv1是利用全连接层直接预测Bounding Box的坐标,YOLOv2借鉴了Faster R-CNN的思想,引入Anchor机制。利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率。同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测。
YOLO9000 使用 WorldTree 来混合来自不同资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,能够实时地检测超过9000种物体。由于 YOLO9000 的主要检测网络还是YOLOv2,所以这部分以讲解应用更为广泛的YOLOv2为主。
具体见参考文献:YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)
3、YOLOv3
2018年,作者 Redmon 又在 YOLOv2 的基础上做了一些改进。特征提取部分采用darknet-53网络结构代替原来的darknet-19,利用特征金字塔网络结构实现了多尺度检测,分类方法使用逻辑回归代替了softmax,在兼顾实时性的同时保证了目标检测的准确性。
从YOLOv1到YOLOv3,每一代性能的提升都与backbone(骨干网络)的改进密切相关。在YOLOv3中,作者不仅提供了darknet-53,还提供了轻量级的tiny-darknet。如果你想检测精度与速度兼具,可以选择darknet-53作为backbone;如果你希望达到更快的检测速度,精度方面可以妥协,那么tiny-darknet是你很好的选择。总之,YOLOv3的灵活性使得它在实际工程中得到很多人的青睐!
具体见参考文献:YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)
4、YOLOv4
具体见参考文献:YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)
5、YOLOv5
具体见参考文献:YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)
6、SSD
SSD的英文全名是Single Shot MultiBox Detector,Single shot说明SSD算法属于one-stage方法,MultiBox说明SSD算法基于多框预测。
SSD是一种非常优秀的one-stage目标检测方法,one-stage算法就是目标检测和分类是同时完成的,其主要思路是利用CNN提取特征后,均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,物体分类与预测框的回归同时进行,整个过程只需要一步,所以其优势是速度快。
但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡(参见Focal Loss),导致模型准确度稍低。
1)主干网络
具体实现请见参考文献:睿智的目标检测23——Pytorch搭建SSD目标检测平台
(三)Anchor-Free系列
具体参考:AnchorFree系列算法详解
去除Anchor后如何表示检测框呢?
Anchor-based方法中通过Anchor和对应的编码信息来表示检测框。对应的编码信息换言之也就是偏移量。
Anchor Free目前主要分如下两类表示检测框的方法:
1.基于关键点的检测算法:先检测目标左上角和右下角点,再通过角点组合形成检测框。
2.基于中心的检测算法:直接检测物体的中心区域和边界信息,将分类和回归解耦为两个子网格。
!在这里插入图片描述文章来源:https://www.toymoban.com/news/detail-786319.html
参考文献
1.目标检测(Object Detection)
2.常见经典目标检测算法
3.CNN笔记:通俗理解卷积神经网络
4.目标检测算法综述
5.AnchorFree系列算法详解
6.睿智的目标检测23——Pytorch搭建SSD目标检测平台
7.YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)文章来源地址https://www.toymoban.com/news/detail-786319.html
到了这里,关于目标检测(Object Detection)学习笔记(概述与传统算法与基于深度学习算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!