导⾔
⽬标检测是计算机视觉和数字图像处理的⼀个热门⽅向,⼴泛应⽤于机器⼈导航、智能视频监控、⼯业检测、航空航天等诸多领域,通过计算机视觉减少对⼈⼒资本的消耗,具有重要的现实意义。因此,⽬标检测也就成为了近年来理论和应⽤的研究热点,它是图像处理和计算机视觉学科的重要分⽀,也是智能监控系统的核⼼部分,同时⽬标检测也是泛⾝份识别领域的⼀个基础性的算法,对后续的⼈脸识别、步态识别、⼈计数、实例分割等任务起着⾄关重要的作⽤。由于深度学习的⼴泛运⽤,⽬标检测算法得到了较为快速的发展,本⽂⼴泛调研国内外⽬标检测⽅法,主要介绍基于深度学习的两种⽬标检测算法思路,分别为One-Stage⽬标检测算法和Two-Stage⽬标检测算法。 1. 相关介绍
1.1 背景介绍
从 2006 年以来,在 Hinton、Bengio、Lecun 等⼈的引领下,⼤量深度神经⽹络的论⽂被发表,尤其是 2012 年,Hinton课题组⾸次参加 ImageNet图像识别⽐赛,其通过构建的 CNN ⽹络AlexNet[1]⼀举夺得冠军,从此神经⽹络开始受到⼴泛的关注。深度学习利⽤多层计算模型来学习抽象的数据表⽰,能够发
现⼤数据中的复杂结构,⽬前,这项技术已成功地应⽤在包括计算机视觉领域在内的多种模式分类问题上。计算机视觉对于⽬标运动的分析可以⼤致分为三个层次:运动分割,⽬标检测;⽬标跟踪;动作识别,⾏为描述[2]。其中,⽬标检测既是计算机视觉领域要解决的基础任务之⼀,同时它也是视频监控技术的基本任务。由于视频中的⽬标具有不同姿态且经常出现遮挡、其运动具有不规则性,同时考虑到监控视频的景深、分辨率、天⽓、光照等条件和场景的多样性,⽽且⽬标检测算法的结果将直接影响后续的跟踪、动作识别和⾏为描述的效果。故即使在技术发展的今天,⽬标检测这⼀基本任务仍然是⾮常具有挑战性的课题,存在很⼤的提升潜⼒和空间。 1.2 什么是⽬标检测
图1: 任务对⽐图
⽬标检测即出图像中所有感兴趣的物体,包含物体定位和物体分类两个⼦任务,同时确定物体的类别和位置。 1.3 传统算法概述
传统⽬标检测的⽅法⼀般分为三个阶段:⾸先在给定的图像上选择⼀些候选的区域,然 后对这些区域提取特征,最后使⽤训练的分类器进⾏分类。下⾯我们对这三个阶段分别进⾏介绍。
(1)区域选择:这⼀步是为了对⽬标的位置进⾏定位。由于⽬标可能出现在图像的任何位置,⽽且⽬标的⼤⼩、长宽⽐例也不确定,所以最初采⽤滑动窗⼝的策略对整幅图像进⾏遍历,⽽且需要设置不同的尺度,不同的长宽⽐。这种穷举的策略虽然包含了⽬标所有可能出现的位置,但是缺点也是显⽽易见的:时间复杂度太⾼,产⽣冗余窗⼝太多,这也严重影响后续特征提取和分类的速度和性能。
(2)特征提取:由于⽬标的形态多样性,光照变化多样性,背景多样性等因素使得设计⼀个鲁棒的特征并不是那么容易。然⽽提取特征的好坏直接影响到分类的准确性。其中,这个阶段常⽤的特征有 SIFT[3]、HOG[4]等。
(3)分类:根据第⼆步提取到的特征对⽬标进⾏分类,分类器主要有 SVM,AdaBoost 等。
1. 基于深度学习的⽬标检测算法
2.1 算法概述
⽬标检测任务可分为两个关键的⼦任务:⽬标分类和⽬标定位。⽬标分类任务负责判断输⼊图像或所选择图像区域(Proposals)中是否有感兴趣类别的物体出现,输出⼀系列带分数的标签表明感兴趣类别的物体出现在输⼊图像或所选择图像区域(Proposals)中的可能性。⽬标定位任务负责确定输⼊图像或所选择图像区域(Proposals)中感兴趣类别的物体的位置和范围,输出物体的包围盒、或物体中⼼、或物体的闭合边界等,通常使⽤⽅形包围盒,即Bounding Box⽤来表⽰物体的位置信息。
⽬前主流的⽬标检测算法主要是基于深度学习模型,⼤概可以分成两⼤类别:(1)One-Stage⽬标检测算法,这类检测算法不需要Region Proposal阶段,可以通过⼀个Stage直接产⽣物体的类别概率和位置坐标值,⽐较典型的算法有YOLO、SSD和CornerNet;(2)Two-Stage⽬标检测算法,这类检测算法将检测问题划分为两个阶段,第⼀个阶段⾸先产⽣候选区域(Region Proposals),包含⽬标⼤概的位置信息,然后第⼆个阶段对候选区域进⾏分类和位置精修,这类算法的典型代表有R-CNN,Fast R-CNN,Faster R-CNN 等。⽬标检测模型的主要性能指标是检测准确度和速度,其中准确度主要考虑物体的定位以及分类准确度。⼀般情况下,Two-Stage算法在准确度上有优势,⽽One-Stage算法在速度上有优势。不过,随着研究的发展,两类算法都在两个⽅⾯做改进,均能在准确度以及速度上取得较好的结果。
2.2 One-Stage⽬标检测算法
One-Stage⽬标检测算法可以在⼀个stage直接产⽣物体的类别概率和位置坐标值,相⽐于Two-Stage的⽬标检测算法不需要Region Proposal阶段,整体流程较为简单。如下图所⽰,在Testing的时候输⼊图⽚通过CNN⽹络产⽣输出,解码(后处理)⽣成对应检测框即可;在Training的时候则需要将Ground Truth编码成CNN输出对应的格式以便计算对应损失loss。
图2:One-Stage检测算法⽰意图
⽬前对于One-Stage算法的主要创新主要集中在如何设计CNN结构、如何构建⽹络⽬标以及如何设计损失函数上,接下来我将从这⼏个⽅⾯进⾏阐述。
2.2.1 如何设计CNN结构
设计CNN⽹络结构主要有两个⽅向,分别为追求精度和追求速度。最简单的⼀种实现⽅式就是替换Backbone⽹络结构,即使⽤不同的基础⽹络结构对图像提取特征。举例来说,ResNet101的表征能⼒要强于MobileNet,然⽽MobileNet的计算量要远远低于ResNet101,如果将ResNet101替换为MobileNet,那么检测⽹络在精度应该会有⼀定的损失,但是在速度上会有⼀定提升;如果将MobileNet替换为ResNet101,那么检测⽹络在速度上会有⼀定的损失,但是在精度上会有⼀定的提升。当然这只是⼀种相对简单的改进CNN⽹络结构的⽅式,实际上在改进CNN结构的时候需要很多的学术积累和经验,我将通过⼏篇SSD相关论⽂做⼀下简要分析。
SSD[5]:SSD检测算法的⽹络结构如下图所⽰,其中Backbone为VGG⽹络,使⽤不同阶段不同分辨率的feature maps进⾏预测。无纺布储物箱
图3:SSD⽹络结构⽰意图
DSSD[6]:DSSD检测算法的⽹络结构如下图所⽰,DSSD也是使⽤不同阶段不同分辨率的feature maps进⾏预测,在不考虑Backbone ⽹络结构差别的情况下,可以发现DSSD相⽐于SSD多了⼀系列的后续上采样操作,SSD是使⽤下采样过程中的feature maps进⾏预测,⽽DSSD是使⽤上采样过程中的feature maps进⾏预测。显⽽易见的是,SSD⽤于检测的feature maps位于⽹络的较低层,表征能⼒较弱,⽽DSSD⽤于检测的feature maps位于⽹络的较⾼层,表征能⼒较强,同时DSSD在反卷积的过程中通过Skip-Connection引⼊了较低层的feature maps,实现了⼀定程度的特征融合。所以DSSD的效果要优于SSD检测算法。
图4:DSSD⽹络结构⽰意图
果酱瓶
FSSD[7]:FSSD检测算法的⽹络结构如下图所⽰,同样,FSSD也是使⽤不同阶段不同分辨率的feature maps进⾏预测,相⽐于
SSD,FSSD多了⼀个特征融合处理,将⽹络较低层的特征引⼊到⽹络的较⾼层,在检测的时候能够同时考虑不同尺度的信息,使得检测更加准确。
五仁参芪汤
图5:FSSD⽹络结构⽰意图
链路层劫持
2.2.2 如何构建回归⽬标
如何构建⽹络回归⽬标即如何区分正负样本使其与卷积神经⽹络的输出相对应,最简单直接的⽅法是直接回归物体的相关信息(类别和坐标),稍微复杂⼀些,在回归坐标时可以回归物体坐标相对于anchor的偏移量等等。对于One-Stage检测⽅法主要有如下三种典型的回归⽬标构建⽅式,其中代表⽅法分别为YOLO系列算法、SSD系列算法以及CornerNet⽬标检测算法。
YOLO系列算法:如下图所⽰,其中左图取⾃YOLOv1[8],右图取⾃YOLOv2[9],需要说明的是YOLOv1相⽐于YOLOv2在坐标回归的时候没有anchor的概念。YOLO系列算法在构建回归⽬标时⼀个主要的区别就是如果将图像划分成SxS的格⼦,每个格⼦只负责⽬标中⼼点落⼊该格⼦的物体的检测;如果没有任何⽬标的中⼼点落⼊该格⼦,则为负样本。
图6:YOLO系列算法正负样本区分图
SSD系列算法:如下图所⽰,SSD系列检测算法在确定正负样本的时候通过交并⽐⼤⼩进⾏区分,当某⼀个Ground Truth的⽬标框与anchor的交并⽐最⼤且对应的交并⽐⼤于某⼀个阈值的时候,对应anchor即负责检测该Ground Truth,即每⼀个anchor最多负责⼀个物体的检测,同⼀个物体可能被多个anchor同时检测。
图7:IOU(交并⽐)⽰意图
CornerNet[10]:如下图所⽰,CornerNet检测算法巧妙的将检测框转换成了关键点,显⽽易见,⼀个⽬标框可以由两个点(左上⾓和右下⾓)来表⽰,那么对于⼀个⽬标物体在预测的时候就可以直接预测两个类别的关键点,然后对关键点进⾏组合即可⽣成对应的⽬标框。
图8:CornerNet⽬标⽰意图
2.2.3 如何设计损失函数
⽬标检测算法主要分为两个⼦任务,分别为物体分类和物体定位。损失主要包括分类损失(Cls Loss)和定位损失(Loc Loss),常见的损失组合主要有如下两种Cls Loss + Loc Loss(SSD系列算法)、Cls Loss + Obj Loss + Loc Loss (YOLO系列算法),其中YOLO 系列算法相⽐于SSD系列算法多了Object Loss,即判断对应区域是否为物体的损失。除此之外,One-Stage⽬标检测算法的正负
五方通话系统
样本不均衡的问题⽐较严重,对于设计损失函数还会有⼀些针对创新。
Hard Negative Mining:即对于⼤量的负样本只挑取其中适当⽐例的损失较⼤的负样本来计算损失,其余损失较⼩的负样本忽略不计,防⽌负样本过多⼲扰⽹络学习;
Focal Loss:由于⼤多数都是简单易分的负样本(属于背景的样本),使得训练过程不能充分学习到属于那些有类别样本的信息;其次简单易分的负样本太多,可能掩盖了其他有类别样本的作⽤。Focal Loss希望那些hard examples对损失的贡献变⼤,使⽹络更倾向于从这些样本上学习。
需要说明的是,个⼈任务One-Stage检测算法和Two-Stage检测算法的第⼀个Stage并没有太⼤区别,在某种程度上Two-Stage检测算法的第⼀个Stage可以看成是One-Stage检测算法,⽽第⼆个Stage只是对前⼀个Stage的结果做进⼀步精化,上述所有思路本⼈觉得都适⽤于Two-Stage检测算法的第⼀个Stage。除此之外针对于Two-Stage检测框架设计的相关损失函数同样适⽤于One-Stage检测算法,如针对遮挡问题设计的相关loss,具体不再阐述。
2.3 Two-Stage⽬标检测算法
Two-Stage⽬标检测算法本⼈认为可以看作是进⾏两次One-Stage检测,第⼀个Stage初步检测出物体位置,第⼆个Stage对第⼀个阶段的结果做进⼀步的精化,对每⼀个候选区域进⾏One-Stage检测。整
小毛刷体流程如下图所⽰,在Testing的时候输⼊图⽚经过卷积神经⽹络产⽣第⼀阶段输出,对输出进⾏解码处理⽣成候选区域,然后获取对应候选区域的特征表⽰(ROIs),然后对ROIs进⼀步精化产⽣第⼆阶段的输出,解码(后处理)⽣成最终结果,解码⽣成对应检测框即可;在Training的时候需要将Ground Truth编码成CNN输出对应的格式以便计算对应损失loss。
图9:Two-Stage检测算法⽰意图
如上图所⽰,Two-Stage的两个阶段拆开来看均与One-Stage检测算法相似,所以我觉得Two-Stage可以看成是两个One-Stage检测算法的组合,第⼀个Stage做初步检测,剔除负样本,⽣成初步位置信息(Region of Interest),第⼆个Stage再做进⼀步精化并⽣成最终检测结果。⽬前对于Two-Stage算法的主要创新主要集中在如何⾼效准确地⽣成Proposals、如何获取更好的ROI features、如何加速Two-Stage检测算法以及如何改进后处理⽅法,接下来我将从这⼏个⽅⾯进⾏阐述。
2.3.1 如何⾼效准确地⽣成Proposals
如何⾼效准确地⽣成Proposals考虑的是Two-Stage检测算法的第⼀个Stage,获取初步的检测结果,供下⼀个Stage做进⼀步精化。接下来我将通过对⽐R-CNN、Faster R-CNN和FPN来做简要说明。
R-CNN[11]:R-CNN⽣成Proposals的⽅法是传统⽅法Selective Search,主要思路是通过图像中的纹理、边缘、颜⾊等信息对图像进⾏⾃底向上的分割,然后对分割区域进⾏不同尺度的合并,每个⽣成的区域即⼀个候选Proposal,如下图所⽰。这种⽅法基于传统特征,速度较慢。