object detection 我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。object detection 要解决的问题就是物体在哪里,是什么这整个流程的问题。然而,这个问题可不是那么容易解决的,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,更何况物体还可以是多个类别。

    object detection 技术的演进:
    RCNN->SppNET->Fast-RCNN->Faster-RCNN

    从图像识别的任务说起
    这里有一个图像任务:
    既要把图中的物体识别出来,又要用方框框出它的位置。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图1

    上面的任务用专业的说法就是:图像识别 + 定位
    图像识别(classification):
    输入:图片
    输出:物体的类别
    评估方法:准确率

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图2

    定位(localization):
    输入:图片
    输出:方框在图片中的位置(x,y,w,h)
    评估方法:检测评价函数 intersection-over-union (IOU)

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图3

    卷积神经网络 CNN 已经帮我们完成了图像识别(判定是猫还是狗)的任务了,我们只需要添加一些额外的功能来完成定位任务即可。

    定位的问题的解决思路有哪些?
    思路一:看做回归问题
    看做回归问题,我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图4

    步骤 1:
      • 先解决简单问题, 搭一个识别图像的神经网络
      • 在 AlexNet VGG GoogleLenet 上 fine-tuning 一下

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图5

    步骤 2:
      • 在上述神经网络的尾部展开(也就说 CNN 前面保持不变,我们对 CNN 的结尾处作出改进:加了两个头:“分类头” 和 “回归头”)
      • 成为 classification + regression 模式

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图6

    步骤 3:
      • Regression 那个部分用欧氏距离损失
      • 使用 SGD 训练

    步骤 4:
      • 预测阶段把 2 个头部拼上
      • 完成不同的功能

    这里需要进行两次 fine-tuning
    第一次在 ALexNet 上做,第二次将头部改成 regression head,前面不变,做一次 fine-tuning

    Regression 的部分加在哪?

    有两种处理方法:
      • 加在最后一个卷积层后面(如 VGG)
      • 加在最后一个全连接层后面(如 R-CNN)

    regression 太难做了,应想方设法转换为 classification 问题。
    regression 的训练参数收敛的时间要长得多,所以上面的网络采取了用 classification 的网络来计算出网络共同部分的连接权值。

    思路二:取图像窗口
      • 还是刚才的 classification + regression 思路
      • 咱们取不同的大小的 “框”
      • 让框出现在不同的位置,得出这个框的判定得分
      • 取得分最高的那个框

    左上角的黑框:得分 0.5
    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图7

    右上角的黑框:得分 0.75

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图8

    左下角的黑框:得分 0.6
    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图9

    右下角的黑框:得分 0.8

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图10

    根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。
    注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。

    疑惑:框要取多大?
    取不同的框,依次从左上角扫到右下角。非常粗暴啊。

    总结一下思路:
    对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到 CNN,然后 CNN 会输出这个框的得分(classification)以及这个框图片对应的 x,y,h,w(regression)。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图11

    这方法实在太耗时间了,做个优化。
    原来网络是这样的:

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图12

    优化成这样:把全连接层改为卷积层,这样可以提提速。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图13

    物体检测(Object Detection)
    当图像有很多物体怎么办的?难度可是一下暴增啊。

    那任务就变成了:多物体识别 + 定位多个物体
    那把这个任务看做分类问题?
    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图14

    看成分类问题有何不妥?
      • 你需要找很多位置, 给很多个不同大小的框
      • 你还需要对框内的图像分类
      • 当然, 如果你的 GPU 很强大, 恩, 那加油做吧…

    看做 classification, 有没有办法优化下?我可不想试那么多框那么多位置啊!
    有人想到一个好方法:
    找出可能含有物体的框(也就是候选框,比如选 1000 个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举的所有框了。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图15

    大牛们发明好多选定候选框的方法,比如 EdgeBoxes 和 Selective Search。
    以下是各种选定候选框的方法的性能对比。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图16

    有一个很大的疑惑,提取候选框用到的算法 “选择性搜索” 到底怎么选出这些候选框的呢?那个就得好好看看它的论文了,这里就不介绍了。

    R-CNN 横空出世
    基于以上的思路,RCNN 的出现了。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图17

    步骤一:训练(或者下载)一个分类模型(比如 AlexNet)
    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图18

    步骤二:对该模型做 fine-tuning
      • 将分类数从 1000 改为 20
      • 去掉最后一个全连接层

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图19

    步骤三:特征提取
      • 提取图像的所有候选框(选择性搜索)
      • 对于每一个区域:修正区域大小以适合 CNN 的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图20

    步骤四:训练一个 SVM 分类器(二分类)来判断这个候选框里物体的类别
    每个类别对应一个 SVM,判断是不是属于这个类别,是就是 positive,反之 nagative
    比如下图,就是狗分类的 SVM

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图21

    步骤五:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图22

    RCNN 的进化中 SPP Net 的思想对其贡献很大,这里也简单介绍一下 SPP Net。

    SPP Net
    SPP:Spatial Pyramid Pooling(空间金字塔池化)
    它的特点有两个:

    1. 结合空间金字塔方法实现 CNNs 的对尺度输入。
      一般 CNN 后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行 crop 或者 warp,这些预处理会造成数据的丢失或几何的失真。SPP Net 的第一个贡献就是将金字塔思想加入到 CNN,实现了数据的多尺度输入。

    如下图所示,在卷积层和全连接层之间加入了 SPP layer。此时网络的输入可以是任意尺度的,在 SPP layer 中每一个 pooling 的 filter 会根据输入调整大小,而 SPP 的输出尺度始终是固定的。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图23

    1. 只对原图提取一次卷积特征
      在 R-CNN 中,每个候选框先 resize 到统一大小,然后分别作为 CNN 的输入,这样是很低效的。
      所以 SPP Net 根据这个缺点做了优化:只对原图进行一次卷积得到整张图的 feature map,然后找到每个候选框 zaifeature map 上的映射 patch,将此 patch 作为每个候选框的卷积特征输入到 SPP layer 和之后的层。节省了大量的计算时间,比 R-CNN 有一百倍左右的提速。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图24

    Fast R-CNN
    SPP Net 真是个好方法,R-CNN 的进阶版 Fast R-CNN 就是在 RCNN 的基础上采纳了 SPP Net 方法,对 RCNN 作了改进,使得性能进一步提高。

    R-CNN 与 Fast RCNN 的区别有哪些呢?
    先说 RCNN 的缺点:即使使用了 selective search 等预处理步骤来提取潜在的 bounding box 作为输入,但是 RCNN 仍会有严重的速度瓶颈,原因也很明显,就是计算机对所有 region 进行特征提取时会有重复计算,Fast-RCNN 正是为了解决这个问题诞生的。

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图25

    大牛提出了一个可以看做单层 sppnet 的网络层,叫做 ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu 等操作都不需要固定 size 的输入,因此,在原始图片上执行这些操作后,虽然输入图片 size 不同导致得到的 feature map 尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的 ROI Pooling 层,对每个 region 都提取一个固定维度的特征表示,再通过正常的 softmax 进行类型识别。另外,之前 RCNN 的处理流程是先提 proposal,然后 CNN 提取特征,之后用 SVM 分类器,最后再做 bbox regression,而在 Fast-RCNN 中,作者巧妙的把 bbox regression 放进了神经网络内部,与 region 分类和并成为了一个 multi-task 模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。Fast-RCNN 很重要的一个贡献是成功的让人们看到了 Region Proposal+CNN 这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的 Faster-RCNN 做下了铺垫。

    画一画重点:
    R-CNN 有一些相当大的缺点(把这些缺点都改掉了,就成了 Fast R-CNN)。
    大缺点:由于每一个候选框都要独自经过 CNN,这使得花费的时间非常多。
    解决:共享卷积层,现在不是每一个候选框都当做输入进入 CNN 了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征

    原来的方法:许多候选框(比如两千个)—>CNN—> 得到每个候选框的特征 —> 分类 + 回归
    现在的方法:一张完整图片 —>CNN—> 得到每张候选框的特征 —> 分类 + 回归

    所以容易看见,Fast RCNN 相对于 RCNN 的提速原因就在于:不过不像 RCNN 把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到 conv5 上,而 SPP 只需要计算一次特征,剩下的只需要在 conv5 层上操作就可以了。

    在性能上提升也是相当明显的:

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图26

    Faster R-CNN
    Fast R-CNN 存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?
    解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
    做这样的任务的神经网络叫做 Region Proposal Network(RPN)。

    具体做法:
      • 将 RPN 放在最后一个卷积层的后面
      • RPN 直接训练得到候选区域

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图27

    RPN 简介:
      • 在 feature map 上滑动窗口
      • 建一个神经网络用于物体分类 + 框位置的回归
      • 滑动窗口的位置提供了物体的大体位置信息
      • 框的回归提供了框更精确的位置

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图28

    一种网络,四个损失函数;
      • RPN calssification(anchor good.bad)
      • RPN regression(anchor->propoasal)
      • Fast R-CNN classification(over classes)
      • Fast R-CNN regression(proposal ->box)

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图29

    速度对比

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN - Madcola - 博客园 - 图30

    Faster R-CNN 的主要贡献是设计了提取候选区域的网络 RPN,代替了费时的选择性搜索,使得检测速度大幅提高。

    最后总结一下各大算法的步骤:
    RCNN
      1. 在图像中确定约 1000-2000 个候选框 (使用选择性搜索)
      2. 每个候选框内图像块缩放至相同大小,并输入到 CNN 内进行特征提取
      3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
      4. 对于属于某一特征的候选框,用回归器进一步调整其位置

    Fast RCNN
      1. 在图像中确定约 1000-2000 个候选框 (使用选择性搜索)
      2. 对整张图片输进 CNN,得到 feature map
      3. 找到每个候选框在 feature map 上的映射 patch,将此 patch 作为每个候选框的卷积特征输入到 SPP layer 和之后的层
      4. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
      5. 对于属于某一特征的候选框,用回归器进一步调整其位置

    Faster RCNN
      1. 对整张图片输进 CNN,得到 feature map
      2. 卷积特征输入到 RPN,得到候选框的特征信息
      3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
      4. 对于属于某一特征的候选框,用回归器进一步调整其位置

    总的来说,从 R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN 一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于 region proposal 的 R-CNN 系列目标检测方法是当前目标检测技术领域最主要的一个分支。
    https://www.cnblogs.com/skyfsm/p/6806246.html