阅读书籍 《深度学习之PyTorch物体检测实战》

阅读书籍 《深度学习之PyTorch物体检测实战》

第一篇 物体检测基础知识

计算机视觉领域

  • 图像成像:成像是计算机视觉较为底层的技术,深度学习在此发挥的空间更多的是成像后的应用,如修复图像的DCGAN网络,图像风格迁移的CycleGAN,这些任务中GAN有着广阔的发挥空间。此外,在医学成像、卫星成像等领域中,超分辨率也至关重要,例如SRCNN(Super-Resolution CNN)。
  • 2.5D空间:我们通常将涉及2D运动或者视差的任务定义为2.5D空间问题,因为其任务跳出来单纯的2D图像,但又缺乏3D空间信息。这里包含的任务有光流的估计、单目的深度估计及双目的深度估计。
  • 3D空间:3D空间的任务通常应用于机器人或者自动驾驶领域,将 2D图像检测与3D空间进行结合。这其中,主要任务有相机标定 (Camera Calibration)、视觉里程计(Visual Odometry,VO)及SLAM(Simultaneous Localization and Mapping)等。
  • 环境理解:环境的高语义理解是深度学习在计算机视觉中的主战 场,相比传统算法其优势更为明显。主要任务有图像分类 (Classification)、物体检测(Object Detection)、图像分割 (Segmentation)、物体跟踪(Tracking)及关键点检测。其中,图像分 割又可以细分为语义分割(Semantic Segmentation)与实例分割 (Instance Segmentation)。

PyTorch中的数据可视化

  • TensorboardX:在PyTorch中,也可以使用Tensorboard_logger进行可视化,但其功 能较少。Tensor-BoardX是专为PyTorch开发的一套数据可视化工具,功 能与TensorBoard相当,支持曲线、图片、文本和计算图等不同形式的 可视化,而且使用简单。
  • Visdom:Visdom由Facebook团队开发,是一个非常灵活的可视化工具,可用 于多种数据的创建、组织和共享,支持NumPy、Torch与PyTorch数据, 目的是促进远程数据的可视化,支持科学实验。

网络骨架:Backbone

  当前的物体检测算法虽然各不相同,但第一步通常是利用卷积神经网络处理输入图像,生成深层的特征图,然后再利用各种算法完成区域生成和损失计算,这部分卷积神经网络是整个检测算法的骨架,也被称为Backbone。
阅读书籍 《深度学习之PyTorch物体检测实战》_第1张图片

卷积网络中的各种层

  • 卷积层:
    padding:填充,常见的有零填充、边缘填充等,PyTorch默认为零填充。
    dilation:空洞卷积,当大于1时可以增大感受野的同时保持特征图的尺寸,默认为1。
    阅读书籍 《深度学习之PyTorch物体检测实战》_第2张图片
    空洞卷积的缺陷:
      ·网格效应(Gridding Effect):由于空洞卷积是一种稀疏的采样方式,当多个空洞卷积叠加时,有些像素根本没有被利用到,会损失信息 的连续性与相关性,进而影响分割、检测等要求较高的任务。
      ·远距离的信息没有相关性:空洞卷积采取了稀疏的采样方式,导 致远距离卷积得到的结果之间缺乏相关性,进而影响分类的结果。
      ·不同尺度物体的关系:大的dilation rate对于大物体分割与检测有 利,但是对于小物体则有弊无利,如何处理好多尺度问题的检测,是空 洞卷积设计的重点
  • 激活函数层:
      神经网络如果仅仅是由线性的卷积运算堆叠组成,则其无法形成复杂的表达空间,也就很难提取出高语义的信息,因此还需要加入非线性的映射,又称为激活函数,可以逼近任意的非线性函数,以提升整个神经网络的表达能力。在物体检测任务中,常用的激活函数有Sigmoid、ReLU及Softmax函数。
  • Dropout为什么可以防止过拟合:
      多模型的平均:不同的固定神经网络会有不同的过拟合,多个取平均则有可能让一些相反的拟合抵消掉,而Dropout每次都是不同的神经元失活,可以看做是多个模型的平均,类似于多数投票取胜的策略。
      减少神经元间的依赖:由于两个神经元不一定同时有效,因此减少了特征之间的依赖,迫使网络学习有更为鲁棒的特征,因为神经网络不应该对特定的特征敏感,而应该从众多特征中学习更为共同的规律,这也起到了正则化的效果。
      生物进化:Dropout类似于性别在生物进化中的角色,物种为了适应环境的变化,在繁衍时取雄性和雌性的各一半基因进行组合,这样可以适应更复杂的新环境,避免了单一基因的过拟合,当环境发生变化时也不至于灭绝。
  • Group Normalization(GN)
      从通道方向计算均值与方差,使用更为灵活有效,避开了batch大小对归一化的影响(BN层要求较大的batch才能有效的工作)。具体来讲,GN先将特征图的通道分为很多个组,对每一个组内的 参数做归一化,而不是batch。GN之所以能够工作的原因,笔者认为是 在特征图中,不同的通道代表了不同的意义,例如形状、边缘和纹理 等,这些不同的通道并不是完全独立地分布,而是可以放到一起进行归 一化分析。
  • 全连接层:
      全连接层(Fully Connected Layers)一般连接到卷积网络输出的特征图后面,特点是每一个节点都与上下层的所有节点相连,输入与输出都被延展成一维向量,因此从参数量来看全连接层的参数量是最多的。
      在物体检测算法中,卷积网络的主要作用是从局部到整体地提取图像的特征,而全连接层则用来将卷积抽象出的特征图进一步映射到特定维度的标签空间,以求取损失或者输出预测的结果。
      在很多场景中,我们可以使用全局平均池化层(Global Average Pooling,GAP)来取代全连接层,这种思想最早见于NIN(Network in Network)网络中,总体上,使用GAP有如下3点好处:
       - 利用池化降低了维度,极大地减少了网络的参数量。
       - 将特征提取和分类合二为一,一定程度上可以防止过拟合。
       - 由于除去了全连接层,可以实现任意图像尺度的输入。

第二篇 物体检测经典框架

RCNN

  RCNN仍然延续传统物体检测的思想,将物体检测当做分类问题处理,即先提取一系列的候选区域,然后对候选区域进行分类。具体过程主要包含4步:

  1. 候选区域生成。采用Region Proposal提取候选区域,例如Selective Search算法,先将图像分割成小区域,然后合并包含同一物体可能性高的区域,并输出,在这一步需要提取约2000个候选区域。在提取完后,还需要将每一个区域进行归一化处理,得到固定大小的图像。
  2. CNN特征提取。将上述固定大小的图像,利用CNN网络得到固定维度的特征输出。
  3. SVM分类器。使用线性二分类器对输出的特征进行分类,得到是否属于此类的结果,并采用难样本挖掘来平衡正负样本的不平衡。
  4. 位置精修。通过一个回归器,对特征进行边界回归已得到更为精确的目标区域。
    阅读书籍 《深度学习之PyTorch物体检测实战》_第3张图片

  RCNN虽然显著提升了物体检测的效果,但仍存在3个较大的问 题。首先RCNN需要多步训练,步骤烦琐且训练速度较慢;其次,由于 涉及分类中的全连接网络,因此输入尺寸是固定的,造成了精度的降 低;最后,候选区域需要提前提取并保存,占用空间较大。

端到端:Fast RCNN

Fast RCNN相比起RCNN,主要有3点改进:

  • 共享卷积:将整幅图送到卷积网络中进行区域生成,而不是像RCNN那样一个个的候选区域。虽然仍采用Selective Search方法,但共享卷积的优点使得计算量大大减少。
  • RoI Pooling:利用特征池化(RoI Pooling)的方法进行特征尺度变换,这种方法可以有任意大小图片的输入,使得训练过程更加灵活、准确。
  • 多任务损失:将分类与回归放到一起训练,并且为了避免SVM分类器带来的单独训练与速度慢的缺点,使用了Softmax函数进行分类。
    阅读书籍 《深度学习之PyTorch物体检测实战》_第4张图片

走向实时:Faster RCNN

  该算法最大的创新点在于提出来RPN(Region Proposal Network)网络,利用Anchor机制将区域生成与卷积网络联系到一起。
  Anchor可以看做是图像上很多固定大小与宽高的方框,由于需要检 测的物体本身也都是一个个大小宽高不同的方框,因此Faster RCNN将 Anchor当做强先验的知识,接下来只需要将Anchor与真实物体进行匹 配,进行分类与位置的微调即可。相比起没有Anchor的物体检测算法, 这样的先验无疑降低了网络收敛的难度,再加上一系列的工程优化,使得Faster RCNN达到了物体检测中的一个高峰。

  • 特征提取网络Backbone:输入图像首先经过Backbone得到特征图, 在此以VGGNet为例,假设输入图像的维度为3×600×800,由于VGGNet 包含4个Pooling层(物体检测使用VGGNet时,通常不使用第5个Pooling 层),下采样率为16,因此输出的feature map的维度为512×37×50。
  • RPN模块:区域生成模块,如图4.3的中间部分,其作用是生成较好 的建议框,即Proposal,这里用到了强先验的Anchor。RPN包含5个子模块:
       1. Anchor生成:RPN对feature map上的每一个点都对应了9个Anchors,这9个Anchors大小宽高不同,对应到原图基本可以覆盖所有可能出现的物体。因此,有了数量庞大的Anchors,RPN接下来的工作就是从中筛选,并调整出更好的位置,得到Proposal。
       2. RPN卷积网络:与上面的Anchor对应,由于feature map上每个点对 应了9个Anchors,因此可以利用1×1的卷积在feature map上得到每一个 Anchor的预测得分与预测偏移值。
       3. 计算RPN loss:这一步只在训练中,将所有的Anchors与标签进行 匹配,匹配程度较好的Anchors赋予正样本,较差的赋予负样本,得到分类与偏移的真值,与第二步中的预测得分与预测偏移值进行loss的计算。
       4. 生成Proposal:利用第二步中每一个Anchor预测的得分与偏移量, 可以进一步得到一组较好的Proposal,送到后续网络中。
       5. 筛选Proposal得到RoI:在训练时,由于Proposal数量还是太多(默 认是2000),需要进一步筛选Proposal得到RoI(默认数量是256)。在 测试阶段,则不需要此模块,Proposal可以直接作为RoI,默认数量为 300。
  • RoI Pooling模块:这部分承上启下,接受卷积网络提取的feature map和RPN的RoI,输出送到RCNN网络中。由于RCNN模块使用了全连 接网络,要求特征的维度固定,而每一个RoI对应的特征大小各不相同,无法送入到全连接网络,因此RoI Pooling将RoI的特征池化到固定 的维度,方便送到全连接网络中。
  • RCNN模块:将RoI Pooling得到的特征送入全连接网络,预测每一 个RoI的分类,并预测偏移量以精修边框位置,并计算损失,完成整个 Faster RCNN过程。主要包含3部分:
       1.RCNN全连接网络:将得到的固定维度的RoI特征接到全连接网络中,输出为RCNN部分的预测得分与预测回归偏移量。
       2. 计算RCNN的真值:对于筛选出的RoI,需要确定是正样本还是负样本,同时计算与对应真实物体的偏移量。在实际实现时,为实现方便,这一步往往与RPN最后筛选RoI那一步放到一起。
       3. RCNN loss:通过RCNN的预测值与RoI部分的真值,计算分类与回归loss。
    阅读书籍 《深度学习之PyTorch物体检测实战》_第5张图片
       从整个过程可以看出,Faster RCNN是一个两阶的算法,即RPN与 RCNN,这两步都需要计算损失,只不过前者还要为后者提供较好的感 兴趣区域。

你可能感兴趣的:(杂记,深度学习,pytorch,计算机视觉)