精华内容
下载资源
问答
  • 通过这个链接????进行复习学习。...目标检测 two-stage 目标检测(Object Detection)就是要从图像上找到目标。 存在的难点主要:同一种目标可能不同外观、形状、姿态;...深度学习目标检测算法

    通过这个链接🔗进行复习学习。https://github.com/scutan90/DeepLearning-500-questions

    目标检测

    目标检测(Object Detection)就是要从图像上找到目标。

    存在的难点主要有:同一种目标可能有不同外观、形状、姿态;同一张图片场景可能有不同的环境因素干扰(光照、遮挡、色差);目标检测要检测目标在图像中的位置,目标可能会出现在图像中任意位置,而且同一个位置可能有不同大小、角度的目标。

    目标检测算法分类:

    深度学习目标检测算法主要分为两类:one-stage和two-stage。

    Two-stage

    第一步先用一个网络在图像上找到可能存在目标的区域,在通过第二步一个网络进行目标分类。

    主要步骤:提取特征 -> 生成region proposal -> 分类/定位回归。

    常见的two stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。

    (1)R-CNN

    R-CNN

    R-CNN作为R-CNN系列的第一代算法,其实没有过多的使用“深度学习”思想,而是将“深度学习”和传统的“计算机视觉”的知识相结合。

    通过上面two-stage的步骤,R-CNN实现的方式也一样。
    先通过选择性搜索提取图像上所有可能为目标的proposals,然后resize 成后面特征提取器的大小格式(CNN),得到所有RP的特征,然后进行SVM分类得到目标框的类别,最后通过回归矫正目标框。

    速度慢,准确率不高。

    特征提取:(深度学习)

    预训练模型,选择一个预训练 (pre-trained)神经网络(如AlexNet、VGG)。
    重新训练全连接层。使用需要检测的目标重新训练(re-train)最后全连接层(connected layer)

    region proposal (机器学习)

    选择性搜索(Selective Search)算法提取所有proposals,调整(resize/warp)它们成固定大小,以满足CNN输入要求(因为全连接层的限制),然后将feature map 保存到本地磁盘。

    分类(机器学习)

    训练SVM。利用feature map 训练SVM来对目标和背景进行分类(每个类一个二进制SVM)

    回归(机器学习)

    边界框回归(Bounding boxes Regression)。训练将输出一些校正因子的线性回归分类器

    结果
    R-CNN在VOC 2007测试集上mAP达到58.5%。

    (2)Fast R-CNN

    Fast R-CNN

    SPPNet 原理:先对图像进行一遍卷积计算,得到整个图像的卷积特征。接着, 对于原始图像中的各种候选框,只需要在卷积特征中找到对应的位置框,再使用 ROI 池化层对位置框中的卷积提取特征,就可以完成特征提取工作。在提取特征后,使用了SVM 进行分类。

    R-CNN 要对每个区域(有重叠)计算卷积,而SPPNet 只需要对整张图片计算一次,因此 SPPNet 的效率比 R-CNN 高得多。

    Fast R-CNN是基于R-CNN和SPPnets进行的改进。

    特征提取:

    根SPPNet提取特征的原理一样,只对整幅图像进行一次特征提取,避免R-CNN中的冗余特征提取。

    region proposal

    选择性搜索(Selective Search)算法提取所有proposals,调将候选区域(proposals)直接应用于特征图,并使用RoI池化将其转化为固定大小的特征图块(feature map )。然后将feature map 保存到本地磁盘。

    分类&回归

    于R-CNN不同,Fast R-CNN不使用SVM进行分类,而是使用神经网络进行分类,这样就可以同时训练特征提取网络和分类网络。

    Fast R-CNN 使用全连接层进行分类。全连接层有两个输出,一个输出负责分类(Softmax),另一个输出负责框回归

    Fast R-CNN网络末尾采用并行的不同的全连接层,可同时输出分类结果和窗口回归结果,实现了end-to-end的多任务训练【建议框提取除外】,也不需要额外的特征存储空间【R-CNN中的特征需要保持到本地,来供SVM和Bounding-box regression进行训练】

    结果
    Fast R-CNN在VOC 2007测试集上mAP达到为70%。

    (3)Faster R-CNN

    Faster R-CNN pytorch代码:https://github.com/jwyang/faster-rcnn.pytorch
    Faster R-CNN

    Fast R-CNN和R-CNN都有一个共同的问题就是在选择候选区域方法上,使用选择性搜索算法。这种算法只能在CPU上运行而且速度非常慢。

    Faster R-CNN采用与Fast R-CNN相同的设计,只是它用内部深层网络代替了候选区域方法。将Fast R-CNN中的ROI,替换成RPN网络。

    特征提取:
    可用VGG-16或ResNet等网络进行特征提取。(根据速度性能的需要)

    候选区域网络 RPN & 分类 FC

    候选区域网络(RPN)将第一个卷积网络的输出特征图作为输入。它在特征图上滑动一个3×3的卷积核,以使用卷积网络(如下所示的ZF网络)构建与类别无关的候选区域。其他深度网络(如VGG或ResNet)可用于更全面的特征提取,但这需要以速度为代价。ZF网络最后会输出256个值,它们将馈送到两个独立的全连接层,以预测边界框和两个objectness分数,这两个objectness分数度量了边界框是否包含目标。我们其实可以使用回归器计算单个objectness分数,但为简洁起见,Faster R-CNN使用只有两个类别的分类器:即带有目标的类别和不带有目标的类别。

    RPN

    结果 (tesla K40)
    Faster R-CNN(VGG-16)在VOC 2007测试集上mAP达到为70%,198ms/img。
    Faster R-CNN(VGG-16)在VOC 2007&2012测试集上mAP达到为73.2%,198ms/img。
    Faster R-CNN(VGG-16)在VOC 2012测试集上mAP达到为67%,198ms/img。

    Faster R-CNN存在的问题:
    对小目标检测效果很差;
    模型大,检测速度较慢。

    展开全文
  • 通过这个链接????进行复习学习。...目标检测 目标检测(Object Detection)就是要从图像上找到目标。 存在的难点主要:同一种目标可能不同外观、形状、姿态;...单次目标检测算法(包括SSD系列和YOLO

    通过这个链接🔗进行复习学习。https://github.com/scutan90/DeepLearning-500-questions

    目标检测

    上一节讲了two-stage目标检测算法;
    主要代表就是Faster R-CNN,但它存在一些问题。
    对小目标检测效果很差;(只在一个特征层进行预测,特征层较高,细节信息较少,对小目标检测效果不好。)
    模型大,检测速度较慢。(网络经过两步走)

    One-stage

    单次目标检测算法(包括SSD系列和YOLO系列等算法)

    单次目标检测算法使用神经网络作为特征提取器,后面接一个卷积层,并在之后添加自定义卷积层(根据输出的类别数和anchor),并在最后直接采用卷积进行检测。

    通过图像金字塔在多个尺寸的特征图上进行检测,靠前的大尺度特征图可以捕捉到小物体的信息,而靠后的小尺度特征图能捕捉到大物体的信息,从而提高检测的准确性和定位的准确性。

    (1)SSD

    SSD网络结构如下图,截取至官方论文SSD
    ssd

    首先将图像缩放至300*300尺寸,然后放入VGG-16。这里的VGG-16模型和原VGG-16模型上不同。(在池化层的步长和核大小,以及卷积层上核和padding上的不同,主要为了输出不同大小的特征图)
    从上图上看SDD,可以看到最终侦测包括了六个部分网络的输出(不同的特征图)。每个输出负责不同大小的物体检测。
    特征图较大检测较小的目标,特征图较小检测较大的目标。
    (抽象程度越深,细节信息越少,感受野越大。)
    pic

    DSSD

    1. Backbone:将ResNet替换SSD中的VGG网络,增强了特征提取能力
    2. 添加了Deconvolution层,增加了大量上下文信息

    (2)yolo

    yolo特点:

    1. 将整张图作为网络的输入,直接在输出层回归bounding box的位置和所属的类别
    2. 速度快,one stage detection的开山之作

    YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。

    yoloV1

    实际上yolo也是需要提取候选框,只是提取候选框的方法在网络内部自己实现。yolo将输入图片划分成7 * 7(49)个网格,每个网格要回归两个预测框,也就是说,一张图要选取49 * 2(98)个预测框,然后通过最终网络进行分类和回归。
    最后采用非极大值抑制(NMS)算法从输出结果中提取最有可能的对象和其对应的边界框。

    由于输出层使用全连接层进行输出,所以这就规定yolo必须要求输入图像有固定的大小,论文中作者设计的输入尺寸为448 * 448。

    yoloV1的损失函数:置信度loss + 坐标loss + 类别loss。
    yoloV1损失函数

    主要步骤:
    第一步,先将原图划分为S * S的格子。(7*7)每个格子都有自己的置信度,通过置信度判断格子有无目标,并且进行分类。如果格子有目标,则进入第二步。
    第二步,每个格子根据其中心点都可以得到两个建议框,(提前设置以中心点为原点的两个框/实质就是anchor框)即中心点固定,建议框和实际框做偏移。

    存在的问题:

    1. 由于每个各自只有一个类别输出,但是一个各自会预测两个建议框。因此这两个建议框只能预测出一个类别,导致加入一个各自有多个目标的时候无法被检测到。
    2. 由于输出只有一层特征图 7 * 7,因此当存在大物体或者小物体的时候,很难检测到。

    yoloV2

    针对yoloV1存在的问题,yoloV2做出了几种改进策略。

    1. 引入预训练模型
    2. 主干网络换成:Darknet-19
    3. 引入anchor机制(类似于yoloV1每个格子有两个建议框的思想)
    4. 在每个卷积层后加入BatchNorm层,去掉dropout。(使训练时,模型收敛速度得到提升,防止模型过拟合。)
    5. YOLOv2借鉴SSD使用多尺度的特征图做检测,提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。
    6. YOLOv2中使用的Darknet-19网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。

    (1)预训练:
    yoloV2在分类网络上先在ImageNet上做预训练,作为它的特征提取器。(预训练模型输入图片:448 * 448)
    (2)YOLOv2采用了Darknet-19作为主干网络,模型的mAP值没有显著提升,但计算量减少了。
    (3)anchor:首先根据数据集的真实框位置,通过聚类(Kmeans)得到五个anchor框,作为每个格子的建议框。(yoloV2每个格子有5个anchor中心,每个中心通过格子大小都可以反算得到实际位置。)
    (4) 损失函数区别与yoloV1,这里每个anchor都有自己的类别标签。(输出13 * 13 * 5 * (5 + 20))

    yoloV3

    yoloV3

    yoloV3在yoloV2的基础上增加了一些改进。提升模型性能。

    1. 主干网络由DarkNet-19替换成DarkNet-53。(由于增加了层数,所以加入残差模型。)
    2. 结合FPN模型,实现多尺度检测。
    3. 用逻辑回归代替softmax作为分类器。

    (1)主干网络结构中,最后三次下采样得到的特征图都会作为预测。(分别是13 * 13、 26 * 26、 52 * 52 大小的特征图)每个格子都有三个anchor框,根据特征图的尺寸不同,预测的物体小大也不同。
    (2)结合FPN(上图上采样和concat部分):将不同尺寸的特征图,通过上采样进行融合,融合最后三层下采样的特征图。增加检测小目标的特征图(较大的特征图)的细腻度,从而提高对于小目标检测的效果。
    (3)anchor:由yoloV2的5个anchor box 变为9个(由K-means聚类算法根据数据集生成。)每个尺寸特征图分配3个anchor box。

    yoloV4

    (1)结构改进:(CSPDarkNet53+SPP+PANet+YoloV3-head)

    • 主干网络:CSPDarkNet53(选择具有更大感受野、更大参数的模型。)
    • SPP层:使用空间池化金字塔,对特征图分别进行三次池化,最后通过concat进行拼接。(增大感受野)
    • PANet代替FPN,进行参数聚合以适用于不同level的目标检测。(YoloV3使从下层通过上采样到上层做拼接输出,yoloV4是从上层到下,通过concat拼接输出。)
    • 对图像特征进行预测,生成边界框和并预测类别仍然和yoloV3的结构一致。
    • 残差块采用两个CBM(conv+bn+mish)
    • 特征拼接上的改进:加法更加注重防止过拟合(增加信息传输);concat更加注重保留特征细腻度信息。(PANet中的PAN结构是用加号拼接,yoloV4改成concat)
    • 激活函数采用mish函数。(CBM结构)

    (2)损失改进:
    主要对iou损失进行改进;

    • 普通IOU损失:不会判断框的方向性和距离。
    • GIOU损失:根据不同方向框重叠后的最小外接矩形大小不同,给iou提供方向性。(缺点:当预测框在真实框内部,没有方向感。)
    • DIOU损失:引入对角线来判断方向。(当预测框在真实框内部,无法作比较。)
    • CIOU损失:引入对角线的角度来判断方向性。(YoloV4采用CIOU损失)

    (3)训练改进:

    数据增强

    • RandomErase:随机遮挡;
    • cutout:随机去除;
    • hide-and-seek:随机隐藏;
    • GridMask:等份格子进行间隔遮挡;
    • 正则化遮挡:dropout,随机去除像素点(神经网络能力大,随机去除像素,影响不大。);dropblock,随机去除像素块;
    • Mosaic:将正样本裁剪出来拼接在一起;

    策略

    • 引入学习率调度。
    展开全文
  • 传统的基于局部特征的图像目标检测算法具有对遮挡和旋转敏感、检测精度不高以及运算速度慢的特点,为了改进该算法的性能,提出了一种将图像局部特征应用于稀疏表示理论的图像目标检测算法。该算法利用随机树的方式...
  • 基于深度学习的目标检测算法综述

    万次阅读 多人点赞 2018-06-19 16:04:53
    其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明...由于各类物体不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测 一直是机器视觉领...

    其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。

    导言
    目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核
    心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测
    一直是机器视觉领域最具有挑战性的问题。本文将针对目标检测(Object Detection)这个机器视觉
    中的经典任务进行解析,抛砖引玉。如对文中的内容持不同观点,欢迎到SIGAI公众号发消息给我们,一
    起探讨!
    

    什么是目标检测?

    目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。

    计算机视觉中关于图像识别有四大类任务:

    • 分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
    • 定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
    • 检测-Detection:解决“是什么?在哪里?”的问题,即定位出这个目标的的位置并且知道目标物是什么。
    • 分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
    •  
    •  
    •  

    目标检测要解决的核心问题

    除了图像分类之外,目标检测要解决的核心问题是:

    1.目标可能出现在图像的任何位置。

    2.目标有各种不同的大小。

    3.目标可能有各种不同的形状。

    如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。

     

    目标检测的应用

    目标检测在很多领域都有应用需求。其中被广为研究的是人脸检测,行人检测,车辆检测等重要目标的检测。人脸检测在SIGAI上一篇文章“人脸识别算法演化史”中已经简单介绍,后面我们会针对这个问题撰写综述文章。

    行人检测

    行人检测在视频监控,人流量统计,自动驾驶中都有重要的地位,后续也会有相关综述文章。

     

    车辆检测

    车辆检测在智能交通,视频监控,自动驾驶中有重要的地位。车流量统计,车辆违章的自动分析等都离不开它,在自动驾驶中,首先要解决的问题就是确定道路在哪里,周围有哪些车、人或障碍物。

    其他应用

    交通标志如交通灯、行驶规则标志的识别对于自动驾驶也非常重要,我们需要根据红绿灯状态,是否允许左右转、掉头等标志确定车辆的行为。

    交通标志检测

    除了这些常见目标的检测之外,很多领域里也需要检测自己感兴趣的目标。比如工业中材质表面的缺陷检测,硬刷电路板表面的缺陷检测等。

    农业中农作物表面的病虫害识别也需要用到目标检测技术:

    农作物病虫害检测

    人工智能在医学中的应用目前是一个热门的话题,医学影像图像如MRI的肿瘤等病变部位检测和识别对于诊断的自动化,提供优质的治疗具有重要的意义。

    肿瘤检测

     

    目标检测相关算法

     

    DPM算法

    与人脸、行人等特定类型的目标检测不同,通用目标检测要同时检测出图像中的多类目标,难度更大。处理这一问题的经典方法是DPM(Deformable Part Model),正如其名,这是可变形的组件模型,是一种基于组件的检测算法。该模型由Felzenszwalb在2008年提出,并发表了一系列的CVPR,NIPS文章,蝉联三届PASCAL VOC目标检测冠军,拿下了2010年PASCAL VOC的“终身成就奖”。

    在深度卷积神经网络(DCNN)出现之前,DPM算法一直是目标检测领域最优秀的算法,它的基本思想是先提取DPM人工特征(如下图所示),再用latentSVM分类。这种特征提取方式存在明显的局限性,首先,DPM特征计算复杂,计算速度慢;其次,人工特征对于旋转、拉伸、视角变化的物体检测效果差。这些弊端很大程度上限制了算法的应用场景。

                                                                                                       DPM目标检测流程

     

    Alexnet

    现代深度神经网络的想法早在2006年就被 Geoffrey Hinton 提出,直到2012年,Alex Krizhevsky凭借著名的Alexnet卷积神经网络模型以领先第二名10%的成绩夺得ILSVRC2012图像分类比赛冠军,深度学习技术才真正走进主流学术界和工业界的视野。深度神经网络的出现颠覆了传统的特征提取方式,凭借其强大的表达能力,通过丰富的训练数据和充分的训练能够自主学习有用的特征。这相比传统的人工发现特征并根据特征设计算法的方式是质的飞跃。

    通过卷积神经网络可以学到物体在各个层次的抽象表达(关于卷积神经网络的原理以及为什么会有效,SIGAI会在接下来的文章中介绍):

    深度学习得到的层次特征表达

     

    OverFeat

    2013年纽约大学Yann LeCun团队中Zhang xiang等提出的OverFeat在ILSVRC2013比赛中获得了多项第一,他们改进了Alexnet,提出了使用同一个卷积网络完成了多个任务的方法。该方法充分利用了卷积神经网络的特征提取功能,它把分类过程中提取到的特征同时又用于定位检测等各种任务,只需要改变网络的最后几层,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。这充分体现和发掘了CNN特征共享的优点。

    该文主要的亮点是:

    1. 共享卷基层用于多任务学习。
    2. 全卷积网络思想。
    3. 在特征层进行滑窗操作(Sliding Window)避免大量重复运算,这也是后来的系列算法不断沿用和改进的经典做法。

    OverFeat几个明显的缺陷:

    1. 采用了多尺度贪婪的划窗策略,导致计算量还是很大 。
    2. 由于当时并没有太优秀的backbone网络,共享特征层的表征能力不是太强,没有考虑多尺度特征融合,对小目标效果差,整体的检测效果不尽如人意。ILSVRC 2013数据集上的mAP(可以简单的理解为检测准确率)为24.3%。

    经典的卷积神经网络有一个问题是它只能接受固定大小的输入图像,这是因为第一个全连接层和它之前的卷积层之间的权重矩阵大小是固定的,而卷积层、全连接层本身对输入图像的大小并没有限制。而在做目标检测时,卷积网络面临的输入候选区域图像大小尺寸是不固定的。

    下面用一个例子说明怎么让一个已经设计好的DCNN模型,可以支持任意大小图片输入,其中一种方案是全卷积网络(FCN),即去掉所有全连接层,全部由卷积层来替代:

    FCN并不是把5×5的图片展平成一维向量再进行计算,而是直接采用5×5的卷积核对一整张图片进行卷积运算。比如16×16大小的特征图片,那么会是什么样的结果?请看下面的示意图:

     

    这个时候就会发现,网络最后的输出是一张2×2大小的特征图片。可以发现采用FCN网络,可以输入任意大小的图片。需要注意的是网络最后输出的特征图片大小不再总是1×1而是一个与输入图片大小相关。

    OverFeat有很多创新,但是不能算是目标检测典型的Pipeline,所以我们单独提了出来。下面将从R-CNN开始介绍目前基于DCNN物体检测发展脉络。

    卷积神经网络用于目标检测之后,进展神速,在短期内大幅度的提高了算法的精度,推动这一技术走向实用。

     

    R-CNN

    Region CNN(简称R-CNN)由Ross Girshick(江湖人称RBG大神,Felzenszwalb的学生)提出,是利用深度学习进行目标检测的里程碑之作,奠定了这个子领域的基础。这篇文章思路清奇,在DPM方法经历多年瓶颈期后,显著提升了检测率(ILSVRC 2013数据集上的mAP为31.4%)。RBG是这个领域神一样的存在,后续的一些改进方法如Fast R-CNN、Faster R-CNN、YOLO等相关工作都和他有关。

     

    R-CNN检测时的主要步骤为:

    1.使用Selective Search算法从待检测图像中提取2000个左右的区域候选框,这些候选框可能包含要检测的目标。

    2.把所有侯选框缩放成固定大小(原文采用227×227)。

    3.用DCNN提取每个候选框的特征,得到固定长度的特征向量。

    4.把特征向量送入SVM进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。

     

    R-CNN不采用滑动窗口方案的原因一是计算成本高,会产生大量的待分类窗口;另外不同类型目标的矩形框有不同的宽高比,无法使用统一尺寸的窗口对图像进行扫描。用于提取特征的卷积网络有5个卷积层和2个全连接层,其输入是固定大小的RGB图像,输出为4096维特征向量。对候选区域的分类采用线性支持向量机,对每一张待检测图像计算所有候选区域的特征向量,送入支持向量机中进行分类;同时送入全连接网络进行坐标位置回归。

     

    R-CNN虽然设计巧妙,但仍存在很多缺点:

    1.重复计算。R-CNN虽然不再是穷举,但通过Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过backbone网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。

    2.训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。

    3.速度慢。前面的缺点最终导致R-CNN出奇的慢,GPU上处理一张图片需要十几秒,CPU上则需要更长时间。

    4.输入的图片Patch必须强制缩放成固定大小(原文采用227×227),会造成物体形变,导致检测性能下降。

     

    SPPNet

    此后MSRA的Kaiming He等人在R-CNN的基础上提出了SPPNet,该方法虽然还依赖候选框的生成,但将提取候选框特征向量的操作转移到卷积后的特征图上进行,将R-CNN中的多次卷积变为一次卷积,大大降低了计算量(这一点参考了OverFeat)。

     

    R-CNN的卷积网络只能接受固定大小的输入图像。为了适应这个图像尺寸,要么截取这个尺寸的图像区域,这将导致图像未覆盖整个目标;要么对图像进行缩放,这会产生扭曲。在卷积神经网络中,卷积层并不要求输入图像的尺寸固定,只有第一个全连接层需要固定尺寸的输入,因为它和前一层之间的权重矩阵是固定大小的,其他的全连接层也不要求图像的尺寸固定。如果在最后一个卷积层和第一个全连接层之间做一些处理,将不同大小的图像变为固定大小的全连接层输入就可以解决问题。

     

    SPPNet引入了Spatial Pyramid pooling层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。具体做法是对特征图像区域进行固定数量的网格划分,对不同宽高的图像,每个网格的高度和宽度是不规定的,对划分的每个网格进行池化,这样就可以得到固定长度的输出。下图是SPP操作示意图:

    相比R-CNN,SPPNet的检测速度提升了30倍以上。下图是R-CNN和SPPNet 检测流程的比较:

    下图是SPPNet的原理:

                                                                                                         SPPNet 检测框架图

     

    SPPNet和R-CNN一样,它的训练要经过多个阶段,中间特征也要进行存储;backbone网络参数沿用了分类网络的初始参数,没有针对检测问题进行优化。

     

    Fast RCNN

    Ross Girshick 针对SPPNet做了进一步改进提出的FRCNN ,其主要创新是RoI Pooling 层,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。ROI池化层的做法和SPP层类似,但只使用一个尺度进行网格划分和池化。该层可以直接求导,训练时直接将梯度传导到backbone网络进行优化。FRCNN针对R-CNN和SPPNet在训练时是多阶段的和训练的过程中很耗费时间空间的问题进行改进。将深度网络和后面的SVM分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。使得网络在Pascal VOC上的训练时间从R-CNN的84小时缩短到9.5小时,检测时间更是从45秒缩短到0.32秒。

                              

     

    重要的是Fast RCNN的backbone网络也可以参与训练了!!!

     

    Faster RCNN

    SPPNet和Faster RCNN都需要独立的候选区域生成模块,这个模块计算量很大,而且不易用GPU加速。针对这个问题,Shaoqin Ren 等人在Faster RCNN基础上提出Faster R-CNN ,在主干网络中增加了RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在RPN的卷积特征层提取候选框来代替Selective Search等传统的候选框生成方法,实现了网络的端到端训练。候选区域生成、候选区域特征提取、框回归和分类全过程一气呵成,在训练过程中模型各部分不仅学习如何完成自己的任务,还自主学习如何相互配合。这也是第一个真正意义上的深度学习目标检测算法。

    注:Shaoqin Ren实现的matlab版本中RPN阶段和FRCNN阶段是分开训练的,但是在实际的实践中
    (RBG实现的Python版本)发现二者可以一起优化训练,而且精度没有损失,可以说Faster RCNN真
    正实现了端到端的训练。

     

    R-FCN

    由于现在的主流网络层数越来越多,基于Faster RCNN检测框架的方法的计算量受到了3个因素的影响:

    1.基础网络的复杂度

    2.候选框数量的多少

    3.分类和位置回归子网络的复杂度(每个候选框的box都会独立进行前向计算)。

    一般来说直接优化前两点性价比不太高。如果直接优化RoI-wise subnetwork是否可行呢,将子网络的深度尽可能减少?分类是要增加物体的平移不变性(不同的位置都是同一个物体);目标检测时减少物体的平移变化(目标检测需要得到物体所在的位置)。通常我们所用的网络都是ImageNet的分类任务训练得到的,在目标检测的时候进行Finetune。由于得到的初始模型基于分类任务,那么会偏向于平移不变性,这和目标检测就出现了矛盾。

    MSRA的Jifeng Dai等人提出了R-FCN,通过position-positive score maps(位置敏感得分图)来解决这个矛盾。位置敏感得分图通过预测RoI中不同部位的类别投票表决产生该RoI的类别预测。引用原文中的例子,“如果我们的算法要识别婴儿,那么把一个目标区域分成九宫格,其中算法认为其中五个格子中的区域分别像婴儿的头、四肢和躯干,那么根据投票机制,就认为这个目标区域里的是一个婴儿。这很符合我们人类的判断逻辑。

    R-FCN沿用了 Faster RCNN 的框架结构,不同的是在Faster R-CNN的基础上通过引入位置敏感得分图,将RoI-wise subnetwork消灭了,直接在位置敏感得分图上利用ROI Pooling进行信息采样融合分类和位置信息。

                                                                         ResNet101为例,不同检测框架复用卷积网络层数

     

    Mask R-CNN

    2017年Kaiming He等提出了Mask R-CNN ,并获得ICCV2017 Best Paper Award。作者指出,Faster R-CNN在做下采样和RoI Pooling时都对特征图大小做了取整操作,这种做法对于分类任务基本没有影响,但对检测任务会有一定影响,对语义分割这种像素级任务的精度影响则更为严重。为此,作者对网络中涉及特征图尺寸变化的环节都不使用取整操作,而是通过双线性差值填补非整数位置的像素。这使得下游特征图向上游映射时没有位置误差,不仅提升了目标检测效果,还使得算法能满足语义分割任务的精度要求。

    以上介绍的检测方法都属于two-stage的方案,即分为候选区域生成和区域分类两步,接下来我们将介绍几种single-stage的经典方法。

     

    YOLO系列

    2015年,随着YOLO算法的出现,深度学习目标检测算法开始有了两步(two-stage)和单步(single-stage)之分。区别于R-CNN系列为代表的两步检测算法,YOLO舍去了候选框提取分支(Proposal阶段),直接将特征提取、候选框回归和分类在同一个无分支的卷积网络中完成,使得网络结构变得简单,检测速度较Faster R-CNN也有近10倍的提升。这使得深度学习目标检测算法在当时的计算能力下开始能够满足实时检测任务的需求。

    算法将待检测图像缩放到统一尺寸,为了检测不同位置的目标,将图像等分成的网格,如果某个目标的中心落在一个网格单元中,此网格单元就负责预测该目标。

    YOLOv1只针对最后7x7的特征图进行分析,使得它对小目标的检测效果不佳,当多个目标出现在一个Grid Cell时不容易区分。

    YOLOv2改进了YOLOv1的网络结构,除加入时下热门的批量归一化层以及残差网络结构以外,还针对性的训练了一个高分辨率的分类网络(448x448)然后利用该网络训练检测网络,单单通过提升输入的分辨率,mAP获得了4%的提升。YOLOv1利用单个grid cell拼接成全连接层完成边框的预测,导致丢失较多的空间信息,定位不准,作者在这一版本中进行了优化改进:

    1.借鉴了Faster R-CNN中的Anchor思想,但是作者在实践中发现用基于规则选择的Anchor效果并没有得到提升,实验中作者对Pascal VOC和COCO的数据集进行了统计分析(聚类分析)选择针对行的Anchor的尺寸性能的到了明显提升。

     

    2.作者在使用anchor boxes时发现模型收敛不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的 (x,y) 坐标的优化上。因此作者就没有采用直接预测offset的方法,而使用了预测相对于grid cell的坐标位置的办法,利用logistic函数把ground truth归一化到0到1之间,坐标值被归一化后,模型优化会更稳定。

    YOLOv3在YOLOv2的基础上使用了全新设计的Darknet53残差网络并结合FPN网络结构,在网络后两个特征图上采样后于网络前期相应尺寸的特征图聚合再经过卷积网络后得到预测结果。这些改进使得YOLOv3用三分之一的时间达到与SSD相当的精确度。在 COCO test-dev 上 mAP@0.5 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,但速度快4倍。

     

    YOLOv3的模型比之前的版本复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

    YOLOv3的改进点:

    1. 多尺度预测(FPN)

    2. 更好的Backbone网络(Darknet53残差网络)

    3. 分类损失采用binary cross-entropy损失函数替换Softmax损失函数(Softmax会选择分数最高的类别判定为当前框所属的类别,而现实中一个目标可能属于多个类别标签)

    SSD

    SSD对YOLO进行了改进,达到了和两阶段方法相当的精度,同时又保持了较快的运行速度。SSD也采用了网格划分的思想,和Faster RCNN不同的是它将所有的操作整合在一个卷积网络中完成。为了检测不同尺度的目标,SSD对不同卷积层的特征图像进行滑窗扫描;在前面的卷积层输出的特征图像中检测小的目标,在后面的卷积层输出的特征图像中检测大的目标。它的主要特点是:

    1.基于多尺度特征图像的检测:在多个尺度的卷积特征图上进行预测,以检测不同大小的目标,一定程度上提升了小目标物体的检测精度。

    2.借鉴了Faster R-CNN中的Anchor boxes思想,在不同尺度的特征图上采样候选区域,一定程度上提升了检测的召回率以及小目标的检测效果。下图是SSD的原理:

    FPN

    FPN(Feature Pyramid Network)方法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到提升预测的效果的作用。FPN中预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式有所不同。

    FPN 网络结构如下图d(其中YOLO使用b结构,SSD使用c结构)所示,它的结构具有相当的灵活性,可以和各种特征提取网络结合作为检测算法的基础网络。在后文中会看到,目前大多数state-of-art的模型都采用了这种结构。其中RetinaNet在FPN的基础上使用了ResNet网络提取特征,并用Focal Loss损失改善单步目标检测算法中普遍存在的前景类和背景类损失不均衡的问题。这些基于FPN结构的检测算法能够在增加网络深度、获取更丰富语义信息的同时从浅层特征图中获取更丰富且高分辨率的图像特征,这使得这种网络结构在实际应用中表现出优异的性能。

    目前主流检测框架有4种使用特征的形式:

    1.图像金字塔。即将图像缩放到不同的大小,然后不同大小的图像生成对应的特征。这种方法的缺点是增加了时间成本。有些算法会在检测时采用这种图像金字塔的方案。

    2.单一尺度特征层。SPPNet,Fast RCNN,Faster RCNN采用这种方式,即仅采用网络最后一层卷积层的特征。

    3.SSD采用这种多尺度特征融合的方式,但是没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而足够低层的特征对于检测小物体是很有帮助的。

    4.FPN采用bottom-up与top-down的结构,实现了低层特征和高层语义特征的融合,提高了特征映射的信息密度和分辨率,提高了小目标物体的检测效果;区别于SSD,FPN每层都是独立预测的。

    COCO2017排行榜

    最后我们来看通用目标检测算法的最新进展。下图是MSCOCO 2017年目标检测竞赛的领先算法:

    其中排名第一的模型为旷视科技(face++)提交的MegDet。他们的方案没有在检测算法方面做过多优化(采用的是ResNet50+FPN),而是在并行训练规模上做了优化。训练硬件环境是由128个GPU组成的集群,通过改进跨GPU批量归一化算法和学习率变化策略,将batch size增大到256张,这使得批量归一化层中使用的批均值和方差更能够反应总体特征,有效提升了归一化效果,从而大幅提升训练速度并且得到了非常好的结果。

    排名第二的方案PAN改进了FPN算法,如下图所示。它在FPN的基础上不仅增加了一个降采样网络(b),还聚合使用了多个不同尺度特征图上的预测候选框(c)。该模型不仅在这一届的COCO目标检测竞赛中名列第二,而且取得了语义分割任务的冠军。

    第三名的模型出自MSRA之手,他们同样没有对检测算法本身做过多改进,在FPN基础上使用了Xception网络结构和SoftNMS,但与以往不同的是使用了可变卷积层DCN(deformable convnet)替代了传统卷积,使得卷积层能够根据图片的语义信息调整卷积核感受点的位置,达到提升网络特征提取能力的目的。下图是可变卷积层的原理:

    排名第四的结果是用以FPN+ResNeXt网络为作为基础网络的Mask R-CNN算法得到的。后面大多数成绩优异的模型都是R-FCN、FPN、Faster-RCNN等经典模型结合DCN、Attention机制、先进分类网络结构和模型融合等技术而形成的算法。

     

     

     

    推荐文章

    [1] 机器学习-波澜壮阔40年 SIGAI 2018.4.13.

    [2] 学好机器学习需要哪些数学知识?SIGAI.4.17.

    [3] 人脸识别算法演化史 SIGAI 2018.4.20.

     

    展开全文
  • sigai 基于深度学习的目标检测算法综述导言目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体不同的外观,形状,姿态,加上成像时光照,...

    sigai 基于深度学习的目标检测算法综述

    导言

    目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。本文将针对目标检测(Object Detection)这个机器视觉中的经典任务进行解析,抛砖引玉。如对文中的内容持不同观点,欢迎到SIGAI公众号发消息给我们,一起探讨!

    什么是目标检测?

    目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。

    计算机视觉中关于图像识别有四大类任务:

    分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。

    定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。

    检测-Detection:解决“是什么?在哪里?”的问题,即定位出这个目标的的位置并且知道目标物是什么。

    分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。

    0e3aabe3d53bcab3267de9abcc128045.png

    目标检测要解决的核心问题

    除了图像分类之外,目标检测要解决的核心问题是:

    1.目标可能出现在图像的任何位置。

    2.目标有各种不同的大小。

    3.目标可能有各种不同的形状。

    如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。

    目标检测的应用

    目标检测在很多领域都有应用需求。其中被广为研究的是人脸检测,行人检测,车辆检测等重要目标的检测。人脸检测在SIGAI上一篇文章“人脸识别算法演化史”中已经简单介绍,后面我们会针对这个问题撰写综述文章。

    行人检测

    行人检测在视频监控,人流量统计,自动驾驶中都有重要的地位,后续也会有相关综述文章。

    792a12b77820f6f1901e895943da44d7.png

    车辆检测

    车辆检测在智能交通,视频监控,自动驾驶中有重要的地位。车流量统计,车辆违章的自动分析等都离不开它,在自动驾驶中,首先要解决的问题就是确定道路在哪里,周围有哪些车、人或障碍物。

    3a74b2bf75b933cb41f42ab5397a3ec7.png

    其他应用

    交通标志如交通灯、行驶规则标志的识别对于自动驾驶也非常重要,我们需要根据红绿灯状态,是否允许左右转、掉头等标志确定车辆的行为。

    d052cd993faa0e096c3e726b02d0e089.png

    交通标志检测

    除了这些常见目标的检测之外,很多领域里也需要检测自己感兴趣的目标。比如工业中材质表面的缺陷检测,硬刷电路板表面的缺陷检测等。

    98a7cfb2879aa03bf310db6a44ff3f38.png

    表面缺陷检测

    农业中农作物表面的病虫害识别也需要用到目标检测技术:

    4c6b8dcc858950bc65ec30f278386c87.png

    农作物病虫害检测

    人工智能在医学中的应用目前是一个热门的话题,医学影像图像如MRI的肿瘤等病变部位检测和识别对于诊断的自动化,提供优质的治疗具有重要的意义。

    54609fb39f687aed515e62b7df4d699c.png

    肿瘤检测

    目标检测相关算法

    DPM算法

    与人脸、行人等特定类型的目标检测不同,通用目标检测要同时检测出图像中的多类目标,难度更大。处理这一问题的经典方法是DPM(Deformable Part Model),正如其名,这是可变形的组件模型,是一种基于组件的检测算法。该模型由Felzenszwalb在2008年提出,并发表了一系列的CVPR,NIPS文章,蝉联三届PASCAL VOC目标检测冠军,拿下了2010年PASCAL VOC的“终身成就奖”。

    在深度卷积神经网络(DCNN)出现之前,DPM算法一直是目标检测领域最优秀的算法,它的基本思想是先提取DPM人工特征(如下图所示),再用latentSVM分类。这种特征提取方式存在明显的局限性,首先,DPM特征计算复杂,计算速度慢;其次,人工特征对于旋转、拉伸、视角变化的物体检测效果差。这些弊端很大程度上限制了算法的应用场景。

    88c7792a156cef7f76a50675f512784d.png

    DPM目标检测流程

    Alexnet

    现代深度神经网络的想法早在2006年就被 Geoffrey Hinton 提出,直到2012年,Alex Krizhevsky凭借著名的Alexnet卷积神经网络模型以领先第二名10%的成绩夺得ILSVRC2012图像分类比赛冠军,深度学习技术才真正走进主流学术界和工业界的视野。深度神经网络的出现颠覆了传统的特征提取方式,凭借其强大的表达能力,通过丰富的训练数据和充分的训练能够自主学习有用的特征。这相比传统的人工发现特征并根据特征设计算法的方式是质的飞跃。

    6d06740b014e943e6343769da1da2409.png

    AlexNet 网络结构

    通过卷积神经网络可以学到物体在各个层次的抽象表达(关于卷积神经网络的原理以及为什么会有效,SIGAI会在接下来的文章中介绍):

    5ace2b3aed5055ed5929f94095d82d5d.png

    深度学习得到的层次特征表达

    OverFeat

    2013年纽约大学Yann LeCun团队中Zhang xiang等提出的OverFeat在ILSVRC2013比赛中获得了多项第一,他们改进了Alexnet,提出了使用同一个卷积网络完成了多个任务的方法。该方法充分利用了卷积神经网络的特征提取功能,它把分类过程中提取到的特征同时又用于定位检测等各种任务,只需要改变网络的最后几层,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。这充分体现和发掘了CNN特征共享的优点。

    该文主要的亮点是:

    1.共享卷基层用于多任务学习。

    2.全卷积网络思想。

    3.在特征层进行滑窗操作(Sliding Window)避免大量重复运算,这也是后来的系列算法不断沿用和改进的经典做法。

    OverFeat几个明显的缺陷

    1.采用了多尺度贪婪的划窗策略,导致计算量还是很大 。

    2.由于当时并没有太优秀的backbone网络,共享特征层的表征能力不是太强,没有考虑多尺度特征融合,对小目标效果差,整体的检测效果不尽如人意。ILSVRC 2013数据集上的mAP(可以简单的理解为检测准确率)为24.3%。

    经典的卷积神经网络有一个问题是它只能接受固定大小的输入图像,这是因为第一个全连接层和它之前的卷积层之间的权重矩阵大小是固定的,而卷积层、全连接层本身对输入图像的大小并没有限制。而在做目标检测时,卷积网络面临的输入候选区域图像大小尺寸是不固定的。

    下面用一个例子说明怎么让一个已经设计好的DCNN模型,可以支持任意大小图片输入,其中一种方案是全卷积网络(FCN),即去掉所有全连接层,全部由卷积层来替代:

    7fc8d952aff7a48981dc8d1f69841394.png

    FCN并不是把5×5的图片展平成一维向量再进行计算,而是直接采用5×5的卷积核对一整张图片进行卷积运算。比如16×16大小的特征图片,那么会是什么样的结果?请看下面的示意图:

    12825efebd08f5929f7ecfb3df971554.png

    这个时候就会发现,网络最后的输出是一张2×2大小的特征图片。可以发现采用FCN网络,可以输入任意大小的图片。需要注意的是网络最后输出的特征图片大小不再总是1×1而是一个与输入图片大小相关。

    OverFeat有很多创新,但是不能算是目标检测典型的Pipeline,所以我们单独提了出来。下面将从R-CNN开始介绍目前基于DCNN物体检测发展脉络。

    卷积神经网络用于目标检测之后,进展神速,在短期内大幅度的提高了算法的精度,推动这一技术走向实用。

    5b5b9b57203d3ada3ec040f4179ad503.png

    基于DCNN的目标检测算法发展路线图

    R-CNN

    Region CNN(简称R-CNN)由Ross Girshick

    (江湖人称RBG大神,Felzenszwalb的学生)提出,是利用深度学习进行目标检测的里程碑之作,奠定了这个子领域的基础。这篇文章思路清奇,在DPM方法经历多年瓶颈期后,显著提升了检测率(ILSVRC 2013数据集上的mAP为31.4%)。RBG是这个领域神一样的存在,后续的一些改进方法如Fast R-CNN、Faster R-CNN、YOLO等相关工作都和他有关。

    b87fc5a34ef5468b6921549c8b7a2c6a.png

    R-CNN检测时的主要步骤为:

    1.使用Selective Search算法从待检测图像中提取2000个左右的区域候选框,这些候选框可能包含要检测的目标。

    2.把所有侯选框缩放成固定大小(原文采用227×227)。

    3.用DCNN提取每个候选框的特征,得到固定长度的特征向量。

    4.把特征向量送入SVM进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。

    R-CNN不采用滑动窗口方案的原因一是计算成本高,会产生大量的待分类窗口;另外不同类型目标的矩形框有不同的宽高比,无法使用统一尺寸的窗口对图像进行扫描。用于提取特征的卷积网络有5个卷积层和2个全连接层,其输入是固定大小的RGB图像,输出为4096维特征向量。对候选区域的分类采用线性支持向量机,对每一张待检测图像计算所有候选区域的特征向量,送入支持向量机中进行分类;同时送入全连接网络进行坐标位置回归。

    255606f026fe0e058da8389957f81b42.png

    R-CNN虽然设计巧妙,但仍存在很多缺点:

    1.重复计算。R-CNN虽然不再是穷举,但通过Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过backbone网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。

    2.训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。

    3.速度慢。前面的缺点最终导致R-CNN出奇的慢,GPU上处理一张图片需要十几秒,CPU上则需要更长时间。

    4.输入的图片Patch必须强制缩放成固定大小(原文采用227×227),会造成物体形变,导致检测性能下降。

    SPPNet

    此后MSRA的Kaiming He等人在R-CNN的基础上提出了SPPNet,该方法虽然还依赖候选框的生成,但将提取候选框特征向量的操作转移到卷积后的特征图上进行,将R-CNN中的多次卷积变为一次卷积,大大降低了计算量(这一点参考了OverFeat)。

    R-CNN的卷积网络只能接受固定大小的输入图像。为了适应这个图像尺寸,要么截取这个尺寸的图像区域,这将导致图像未覆盖整个目标;要么对图像进行缩放,这会产生扭曲。在卷积神经网络中,卷积层并不要求输入图像的尺寸固定,只有第一个全连接层需要固定尺寸的输入,因为它和前一层之间的权重矩阵是固定大小的,其他的全连接层也不要求图像的尺寸固定。如果在最后一个卷积层和第一个全连接层之间做一些处理,将不同大小的图像变为固定大小的全连接层输入就可以解决问题。

    SPPNet引入了Spatial Pyramid pooling层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。具体做法是对特征图像区域进行固定数量的网格划分,对不同宽高的图像,每个网格的高度和宽度是不规定的,对划分的每个网格进行池化,这样就可以得到固定长度的输出。下图是SPP操作示意图:

    255606f026fe0e058da8389957f81b42.png

    相比R-CNN,SPPNet的检测速度提升了30倍以上。下图是R-CNN和SPPNet 检测流程的比较:

    255606f026fe0e058da8389957f81b42.png

    下图是SPPNet的原理:

    d2e5cc0528d707ca79cab8083bd18605.png

    SPPNet 检测框架图

    SPPNet和R-CNN一样,它的训练要经过多个阶段,中间特征也要进行存储;backbone网络参数沿用了分类网络的初始参数,没有针对检测问题进行优化。

    Fast RCNN

    Ross Girshick 针对SPPNet做了进一步改进提出的FRCNN ,其主要创新是RoI Pooling 层,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。ROI池化层的做法和SPP层类似,但只使用一个尺度进行网格划分和池化。该层可以直接求导,训练时直接将梯度传导到backbone网络进行优化。FRCNN针对R-CNN和SPPNet在训练时是多阶段的和训练的过程中很耗费时间空间的问题进行改进。将深度网络和后面的SVM分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。使得网络在Pascal VOC上的训练时间从R-CNN的84小时缩短到9.5小时,检测时间更是从45秒缩短到0.32秒。

    1b279ec4242514b1e9861189d9c8c318.png

    v2-8f54e058c657b90044715a39e94dada8_b.jpg

    重要的是Fast RCNN的backbone网络也可以参与训练了!!!

    Faster RCNN

    SPPNet和Faster RCNN都需要独立的候选区域生成模块,这个模块计算量很大,而且不易用GPU加速。针对这个问题,Shaoqin Ren 等人在Faster RCNN基础上提出Faster R-CNN ,在主干网络中增加了RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在RPN的卷积特征层提取候选框来代替Selective Search等传统的候选框生成方法,实现了网络的端到端训练。候选区域生成、候选区域特征提取、框回归和分类全过程一气呵成,在训练过程中模型各部分不仅学习如何完成自己的任务,还自主学习如何相互配合。这也是第一个真正意义上的深度学习目标检测算法。

    注:Shaoqin Ren实现的matlab版本中RPN阶段和FRCNN阶段是分开训练的,但是在实际的实践中(RBG实现的Python版本)发现二者可以一起优化训练,而且精度没有损失,可以说Faster RCNN真正实现了端到端的训练。

    8de47faf942f7217b635be5fa018854f.png

    Fast RCNN(左) 和 Faster RCNN(右)框架结构对比

    R-FCN

    由于现在的主流网络层数越来越多,基于Faster RCNN检测框架的方法的计算量受到了3个因素的影响:

    1.基础网络的复杂度

    2.候选框数量的多少

    3.分类和位置回归子网络的复杂度(每个候选框的box都会独立进行前向计算)。

    一般来说直接优化前两点性价比不太高。如果直接优化RoI-wise subnetwork是否可行呢,将子网络的深度尽可能减少?分类是要增加物体的平移不变性(不同的位置都是同一个物体);目标检测时减少物体的平移变化(目标检测需要得到物体所在的位置)。通常我们所用的网络都是ImageNet的分类任务训练得到的,在目标检测的时候进行Finetune。由于得到的初始模型基于分类任务,那么会偏向于平移不变性,这和目标检测就出现了矛盾。

    MSRA的Jifeng Dai等人提出了R-FCN,通过position-positive score maps(位置敏感得分图)来解决这个矛盾。位置敏感得分图通过预测RoI中不同部位的类别投票表决产生该RoI的类别预测。引用原文中的例子,“如果我们的算法要识别婴儿,那么把一个目标区域分成九宫格,其中算法认为其中五个格子中的区域分别像婴儿的头、四肢和躯干,那么根据投票机制,就认为这个目标区域里的是一个婴儿。这很符合我们人类的判断逻辑。”

    77dbc5478ee1912b038544135ac7cb8f.png

    R-FCN沿用了 Faster RCNN 的框架结构,不同的是在Faster R-CNN的基础上通过引入位置敏感得分图,将RoI-wise subnetwork消灭了,直接在位置敏感得分图上利用ROI Pooling进行信息采样融合分类和位置信息。

    77dbc5478ee1912b038544135ac7cb8f.png

    R-FCN 网络框架结构

    bd7e799d7065482b766548e1ec5c7026.png

    ResNet101为例,不同检测框架复用卷积网络层数

    Mask R-CNN

    2017年Kaiming He等提出了Mask R-CNN ,并获得ICCV2017 Best Paper Award。作者指出,Faster R-CNN在做下采样和RoI Pooling时都对特征图大小做了取整操作,这种做法对于分类任务基本没有影响,但对检测任务会有一定影响,对语义分割这种像素级任务的精度影响则更为严重。为此,作者对网络中涉及特征图尺寸变化的环节都不使用取整操作,而是通过双线性差值填补非整数位置的像素。这使得下游特征图向上游映射时没有位置误差,不仅提升了目标检测效果,还使得算法能满足语义分割任务的精度要求。

    c3d8f0af285d6409701917a75c65e9fc.png

    以上介绍的检测方法都属于two-stage的方案,即分为候选区域生成和区域分类两步,接下来我们将介绍几种single-stage的经典方法。

    YOLO系列

    2015年,随着YOLO算法的出现,深度学习目标检测算法开始有了两步(two-stage)和单步(single-stage)之分。区别于R-CNN系列为代表的两步检测算法,YOLO舍去了候选框提取分支(Proposal阶段),直接将特征提取、候选框回归和分类在同一个无分支的卷积网络中完成,使得网络结构变得简单,检测速度较Faster R-CNN也有近10倍的提升。这使得深度学习目标检测算法在当时的计算能力下开始能够满足实时检测任务的需求。

    算法将待检测图像缩放到统一尺寸,为了检测不同位置的目标,将图像等分成的网格,如果某个目标的中心落在一个网格单元中,此网格单元就负责预测该目标。

    YOLOv1只针对最后7x7的特征图进行分析,使得它对小目标的检测效果不佳,当多个目标出现在一个Grid Cell时不容易区分。

    864af005c953f412a12fdf20da104de6.png

    YOLOv1原理图

    9c5b27e8fa4ab582ba508957dd8eaf36.gif

    YOLOv1在7X7特征图上对每个Grid cell进行操作

    YOLOv2改进了YOLOv1的网络结构,除加入时下热门的批量归一化层以及残差网络结构以外,还针对性的训练了一个高分辨率的分类网络(448x448)然后利用该网络训练检测网络,单单通过提升输入的分辨率,mAP获得了4%的提升。YOLOv1利用单个grid cell拼接成全连接层完成边框的预测,导致丢失较多的空间信息,定位不准,作者在这一版本中进行了优化改进:

    1.借鉴了Faster R-CNN中的Anchor思想,但是作者在实践中发现用基于规则选择的Anchor效果并没有得到提升,实验中作者对Pascal VOC和COCO的数据集进行了统计分析(聚类分析)选择针对行的Anchor的尺寸性能的到了明显提升。

    620f336fc26c62be5785bea6a1b9b16e.png

    2.作者在使用anchor boxes时发现模型收敛不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的 (x,y) 坐标的优化上。因此作者就没有采用直接预测offset的方法,而使用了预测相对于grid cell的坐标位置的办法,利用logistic函数把ground truth归一化到0到1之间,坐标值被归一化后,模型优化会更稳定。

    179d371ca937a072ba1ab4a13d0379a8.png

    YOLOv3在YOLOv2的基础上使用了全新设计的Darknet53残差网络并结合FPN网络结构,在网络后两个特征图上采样后于网络前期相应尺寸的特征图聚合再经过卷积网络后得到预测结果。这些改进使得YOLOv3用三分之一的时间达到与SSD相当的精确度。在 COCO test-dev 上 mAP@0.5 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,但速度快4倍。

    YOLOv3的模型比之前的版本复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

    YOLOv3的改进点:

    1. 多尺度预测(FPN)

    2. 更好的Backbone网络(Darknet53残差网络)

    3. 分类损失采用binary cross-entropy损失函数替换Softmax损失函数(Softmax会选择分数最高的类别判定为当前框所属的类别,而现实中一个目标可能属于多个类别标签)

    d5efb09f95b2ed3c1dbe206a364162ce.png

    SSD

    SSD对YOLO进行了改进,达到了和两阶段方法相当的精度,同时又保持了较快的运行速度。SSD也采用了网格划分的思想,和Faster RCNN不同的是它将所有的操作整合在一个卷积网络中完成。为了检测不同尺度的目标,SSD对不同卷积层的特征图像进行滑窗扫描;在前面的卷积层输出的特征图像中检测小的目标,在后面的卷积层输出的特征图像中检测大的目标。它的主要特点是:

    1.基于多尺度特征图像的检测:在多个尺度的卷积特征图上进行预测,以检测不同大小的目标,一定程度上提升了小目标物体的检测精度。

    2.借鉴了Faster R-CNN中的Anchor boxes思想,在不同尺度的特征图上采样候选区域,一定程度上提升了检测的召回率以及小目标的检测效果。下图是SSD的原理:

    30a61dd8648b053049681c1bfa263cc7.png

    FPN

    FPN(Feature Pyramid Network)方法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到提升预测的效果的作用。FPN中预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式有所不同。

    FPN 网络结构如下图d(其中YOLO使用b结构,SSD使用c结构)所示,它的结构具有相当的灵活性,可以和各种特征提取网络结合作为检测算法的基础网络。在后文中会看到,目前大多数state-of-art的模型都采用了这种结构。其中RetinaNet在FPN的基础上使用了ResNet网络提取特征,并用Focal Loss损失改善单步目标检测算法中普遍存在的前景类和背景类损失不均衡的问题。这些基于FPN结构的检测算法能够在增加网络深度、获取更丰富语义信息的同时从浅层特征图中获取更丰富且高分辨率的图像特征,这使得这种网络结构在实际应用中表现出优异的性能。

    目前主流检测框架有4种使用特征的形式:

    1.图像金字塔。即将图像缩放到不同的大小,然后不同大小的图像生成对应的特征。这种方法的缺点是增加了时间成本。有些算法会在检测时采用这种图像金字塔的方案。

    2.单一尺度特征层。SPPNet,Fast RCNN,Faster RCNN采用这种方式,即仅采用网络最后一层卷积层的特征。

    3.SSD采用这种多尺度特征融合的方式,但是没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而足够低层的特征对于检测小物体是很有帮助的。

    4.FPN采用bottom-up与top-down的结构,实现了低层特征和高层语义特征的融合,提高了特征映射的信息密度和分辨率,提高了小目标物体的检测效果;区别于SSD,FPN每层都是独立预测的。

    255606f026fe0e058da8389957f81b42.png

    COCO2017排行榜

    最后我们来看通用目标检测算法的最新进展。下图是MSCOCO 2017年目标检测竞赛的领先算法:

    9d8cbe2676ba8c3ba766d802ad24b099.png

    其中排名第一的模型为旷视科技(face++)提交的MegDet。他们的方案没有在检测算法方面做过多优化(采用的是ResNet50+FPN),而是在并行训练规模上做了优化。训练硬件环境是由128个GPU组成的集群,通过改进跨GPU批量归一化算法和学习率变化策略,将batch size增大到256张,这使得批量归一化层中使用的批均值和方差更能够反应总体特征,有效提升了归一化效果,从而大幅提升训练速度并且得到了非常好的结果。

    排名第二的方案PAN改进了FPN算法,如下图所示。它在FPN的基础上不仅增加了一个降采样网络(b),还聚合使用了多个不同尺度特征图上的预测候选框(c)。该模型不仅在这一届的COCO目标检测竞赛中名列第二,而且取得了语义分割任务的冠军。

    736c2b23248f5b9634b638444ae256d8.png

    第三名的模型出自MSRA之手,他们同样没有对检测算法本身做过多改进,在FPN基础上使用了Xception网络结构和SoftNMS,但与以往不同的是使用了可变卷积层DCN(deformable convnet)替代了传统卷积,使得卷积层能够根据图片的语义信息调整卷积核感受点的位置,达到提升网络特征提取能力的目的。下图是可变卷积层的原理:

    ff866dae900571d6eb83cdb6245cefe6.png

    排名第四的结果是用以FPN+ResNeXt网络为作为基础网络的Mask R-CNN算法得到的。后面大多数成绩优异的模型都是R-FCN、FPN、Faster-RCNN等经典模型结合DCN、Attention机制、先进分类网络结构和模型融合等技术而形成的算法。

    展开全文
  • 目标检测跟踪算法综述

    千次阅读 2019-07-09 16:19:22
    在特定的场景中,一些经典的算法可以实现比较好的目标跟踪效果。本文介绍了一般的目标跟踪算法,对几个常用的算法进行对比,并详细介绍了粒子滤波算法和基于轮廓的目标跟踪算法。最后简单介绍了目标遮挡的处理、多...
  • 其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华...由于各类物体不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测 一直是机器视觉领域最具有挑战性的...
  • 在矿井运动目标检测中,为了改善传统混合高斯模型像素点不能精确匹配及参数迭代速度慢的问题,采用三帧差分法融合混合高斯背景模型,融合后的算法有效消除了背景更新不及时而导致的画面鬼影现象,而且运算速度得到明显...
  • 由于各类物体不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。 1.1、什么是目标检测 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定...
  • 由于各类物体不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。本文将针对目标检测(Object Detection)这个机器视觉中的经典任务进行解析,抛砖引玉。如...
  • 前面介绍了一下HOG,HOG一个缺点:很难处理遮挡问题,...DPM(Deformable Part Model),正如其名称所述,可变形的组件模型,是一种基于组件的检测算法,其所见即其意。该模型由大神Felzenszwalb在2008年提出,...
  • 由于各类物体不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测 一直是机器视觉领域最具有挑战性的问题。本文将针对目标检测(Object Detection)这个机器视觉 中的经典任务进行解析,抛砖引玉...
  • 由于各类物体不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。本文将针对目标检测(Object Detection)这个机器视觉中的经典任务进行解析,抛砖引玉。如...
  • 目标检测中的遮挡问题及优化

    万次阅读 多人点赞 2019-01-11 11:54:15
    尽管目标检测算法整体上已经相对比较成熟,但是在特殊场景下的表现还有很多优化空间,比如图片中的目标有遮挡、图像运动模糊、目标为可改变形状的非刚性物体等。本文主要是针对遮挡问题,之前在做游戏目标检测时也...
  • 改进目标检测器的抗遮挡,模糊和噪声能力是在实际应用中使用检测器的关键步骤。由于不可能通过数据收集来消除所有图像缺陷,因此许多研究人员寻求在训练中生成硬样本。生成的硬样本可以是图像,也可以是特征图,但是...
  • 由于各类物体不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。本文将针对目标检测(Object Detection)这个机器视觉中的经典任务进行解析,抛砖引玉。如...
  • 在运动目标检测中,常常会出现由于光线被遮挡,或场景其他物体的遮挡,在目标附近或场景里出现阴影,阴影的出现对后期目标的正确分割与处理带了很大的不便。如今,国内外已不少文献来研究这个问题,并且提出了各种...
  • Sort算法需要先进行目标检测,然后根据目标检测的结果进行目标跟踪 OpenCV自带跟踪算法手动指定了跟踪的目标之后就会自动进行跟踪,但是有遮挡的情况下跟踪的bounding box会出现偏差
  • 赛题:多目标检测与跟踪 初赛:排名第1,复赛面试完第8。 初赛思路:第一次做跟踪任务。简单的认为是检测+reid问题。 初赛: 1.首先明确题意:多目标跟踪;指标MOTA和MOTP, 后期的大量实验证明检测算法相对于跟踪更...
  • 例如,在空运(攻击低空飞行的飞机的地面目标)或车辆跟踪中,即使物体被另一物体遮挡,也必须对其进行连续检测。 未能跟踪被遮挡的对象可能会导致其位置完全丢失或另一个对象被错误地跟踪。 两者都会导致灾难性的...
  • 基于图形处理器单元(GPU)提出了一种帧间差分与模板匹配相结合的运动目标检测算法。在CUDA-SIFT(基于统一计算设备架构的尺度不变特征变换)算法提取图像匹配特征点的基础上,优化随机采样一致性算法(RANSAC)剔除...
  • 提出了一种基于概率外观模型和Condensation的跟踪方法。该方法通过分析目标前景MBB重叠关系检测遮挡的产生和解除,在目标未遮挡...算法统一在Condensation框架下进行有遮挡和无遮挡的跟踪。实验证明了该方法的有效性。
  • 2.目标追踪是给视频中第一帧目标以及它的位置,然后跟踪这个目标,以及预测它的轨迹,(如果出现一些遮挡,也可以根据轨迹来跟踪这个目标,假如是yolo检测出的目标时候还会出现丢帧的情况,如果用了跟踪算法,...
  • 基于人体检测的算法有遮挡现象时也不能准确统计出人数.所以就要有必要研究新算法来解决以往的检测办法所带来的问题. 首先,研究了比较常用的运动目标检测方法,选择光流检测法,帧间差分法,背景...
  • 由于各类物体不同的形状、大小和数量,加上物体间还会相互遮挡, 因此目标检测一直都是机器视觉领域中最具挑战性的难题之一。 如上图所示,目标检测就是用一个矩形来定位一个物体并判断该物体是什么?现阶段,主流...
  • 像YOLOv3这样的基于CNN的目标检测方法一个缺点,即要求特征图生成对目标遮挡具有鲁棒性。而且,仅引发许多特征图并不能提高性能。已知诸如空间金字塔池之类的方法可以通过改进常规YOLOv3算法来更好地处理遮挡。 ...

空空如也

空空如也

1 2 3 4
收藏数 72
精华内容 28
关键字:

有遮挡目标检测算法