深度学习笔记-----增加网络不变性的方法(对空间变换网络和数据增强的方法进行了总结)

目录

1,常见的变换

2,从模型本身获取不变性

2.1 从网络结构获取不变性           

 2.2 学习数据变换

2.2.1 为什么提出空间变换网络STN(Why)

2.2.2 STN是什么(What)

2.2.3 STN是怎么做的(How)

2.2.4 STN小结

 3 从数据中学习不变性

3.1 空间转换 (随机尺寸,裁剪,翻转,旋转任意角度...)

3.2 像素内容变换(亮度,色度,饱和度,颜色扰动等)

3.3 多样本合成数据增强(SMOTE,SamplePairing...)

3.4 信息丢弃(随机 擦除,cutout...)

3.5 图像融合及拼接(Mixup...)


1,常见的变换

目标变换常见的可以分为刚性运动和非刚性运动,刚性运动即目标的位置和方向发生变化,非刚性运动则是指目标的形状发生变化,包括尺度变换,缩放变换,透视变换。

2,从模型本身获取不变性

        CNN网络本身对目标的平移,旋转,尺度变化具有一定的尺度不变性。除了丰富的卷积模式本身包含了不变特征提取,还有一些技术专门被用于获取不变性。 

2.1 从网络结构获取不变性           

          CNN网络结构本身拥有一定的不变性,如池化可以改变输入的大小,具有一定的平移不变性和旋转不变性和尺度不变性。如下三个例子,可以深入明白池化为什么具备平移不变性和旋转不变性和尺度不变性。  

         (1) translation invariance(平移不变性):
        这里举一个直观的例子(数字识别),假设有一个16x16的图片,里面有个数字1,我们需要识别出来,这个数字1可能写的偏左一点(图1),这个数字1可能偏右一点(图2),图1到图2相当于向右平移了一个单位,但是图1和图2经过max pooling之后它们都变成了相同的8x8特征矩阵,主要的特征我们捕获到了,同时又将问题的规模从16x16降到了8x8,而且具有平移不变性的特点。图中的a(或b)表示,在原始图片中的这些a(或b)位置,最终都会映射到相同的位置。   

                                                                     图1 平移池化的结果                                                                                                                                                                                                                         (2)rotation invariance(旋转不变性):
       下图表示汉字“一”的识别,第一张相对于x轴有倾斜角,第二张是平行于x轴,两张图片相当于做了旋转,经过多次max pooling后具有相同的特征。                                                                       

                                                               图2 旋转池化结果

        (3)scale invariance(尺度不变性):
       下图表示数字“0”的识别,第一张的“0”比较大,第二张的“0”进行了较小,相当于作了缩放,同样地,经过多次max pooling后具有相同的特征。

                                                                图3 尺度池化结果

 2.2 学习数据变换

          图像的平移,缩放,旋转本质上是对图像的空间坐标变换,如果首先对输入的图像首先完成平移,缩放,旋转的变换,再将其输入网络,那么将大大降低学习的难度。Google提出的空间变换网络(STN Spatial transform network)本文提出了一种叫做空间变换网络(Spatial Transform Networks, STN)的网络模型,该网络不需要关键点的标定,能够根据分类或者其它任务自适应地将数据进行空间变换和对齐(包括平移、缩放、旋转以及其它几何变换等)。在输入数据空间差异较大的情况下,这个网络可以加在现有的卷积网络中,提高分类的准确性。

2.2.1 为什么提出空间变换网络STN(Why)

  1. 一个理想中的模型:我们希望鲁棒的图像处理模型具有空间不变性,当目标发生某种转化后,模型依然能给出同样的正确的结果
  2. 什么是空间不变性:举例来说,如下图4所示,假设一个模型能准确把左图中的人物分类为凉宫春日,当这个目标做了放大、旋转、平移后,模型仍然能够正确分类,我们就说这个模型在这个任务上具有尺度不变性,旋转不变性,平移不变性
  3. CNN在这方面的能力是不足的:maxpooling的机制给了CNN一点点这样的能力,当目标在池化单元内任意变换的话,激活的值可能是相同的,这就带来了一点点的不变性。但是池化单元一般都很小(一般是2*2),只有在深层的时候特征被处理成很小的feature map的时候这种情况才会发生
  4. Spatial Transformer:本文提出的空间变换网络STN(Spatial Transformer Networks)可以使得模型具有空间不变性。

                                           图4  空间变换不变性图像说明

2.2.2 STN是什么(What)

  1. STN对feature map(包括输入图像)进行空间变换,输出一张新的图像。
  2. 我们希望STN对feature map进行变换后能把图像纠正到成理想的图像,然后丢进NN去识别,举例来说,如下图所示,输入模型的图像可能是摆着各种姿势,摆在不同位置的凉宫春日,我们希望STN把它纠正到图像的正中央,放大,占满整个屏幕,然后再丢进CNN去识别。
  3. 这个网络可以作为单独的模块,可以在CNN的任何地方插入,所以STN的输入不止是输入图像,可以是CNN中间层的feature map

2.2.3 STN是怎么做的(How)

  1. 如下图所示,STN的输入为U,输出为V,因为输入可能是中间层的feature map,所以画成了立方体(多channel),STN主要分为下述三个步骤
  2. Localisation net:是一个自己定义的网络,它输入U,输出变化参数ΘΘ,这个参数用来映射U和V的坐标关系
  3. Grid generator:根据V中的坐标点和变化参数ΘΘ,计算出U中的坐标点。这里是因为V的大小是自己先定义好的,当然可以得到V的所有坐标点,而填充V中每个坐标点的像素值的时候,要从U中去取,所以根据V中每个坐标点和变化参数ΘΘ进行运算,得到一个坐标。在sampler中就是根据这个坐标去U中找到像素值,这样子来填充V
  4. Sampler:要做的是填充V,根据Grid generator得到的一系列坐标和原图U(因为像素值要从U中取)来填充,因为计算出来的坐标可能为小数,要用另外的方法来填充,比如双线性插值。

下面针对每个模块阐述一下
(1) Localisation net
这个模块就是输入U,输出一个变化参数Θ,那么这个Θ具体是指什么呢?
我们知道线性代数里,图像的平移,旋转和缩放都可以用矩阵运算来做
举例来说,如果想放大图像中的目标,可以这么运算,把(x,y)中的像素值填充到(x',y')上去,比如把原来(2,2)上的像素点,填充到(4,4)上去。 

如果想旋转图像中的目标,可以这么运算:

 这些都是属于仿射变换(affine transformation)

在仿射变换中,变换的参数是6个变量:

这6个变量就是用来映射输入图输出图之间的坐标点的关系的,我们在第二步grid generator就要根据这个变化参数,来获取原图的坐标点。 

旋转的矩阵运算方法如下图所示:

(2) Grid generator
有了第一步的变化参数,这一步是做个矩阵运算,这个运算是以目标图V的所有坐标点为自变量,以Θ为参数做一个矩阵运算,得到输入图U的坐标点。

 这里的i是从V中对应过来的,表示V中的第i的坐标点映射的U中坐标,i跟U没有关系

 (3) Sampler
      由于在第二步计算出了V中每个点对应到U的坐标点,在这一步就可以直接根据V的坐标点取得对应到U中坐标点的像素值来进行填充,而不需要经过矩阵运算。需要注意的是,填充并不是直接填充,首先计算出来的坐标可能是小数,要处理一下,其次填充的时候往往要考虑周围的其它像素值。填充根据的公式如下。

其中n和m会遍历原图U的所有坐标点,Unm指原图U中某个点的像素值,k()为取样核,两个ϕ为参数,(xsi,ysi)表示V中第i个点要到U图中找的对应点的坐标,表示的坐标是U图上的,k表示使用不同的方法来填充,通常会使用双线性插值,则会得到下面的公式 

 

 举例来说,我要填充目标图V中的(2,2)这个点的像素值,经过以下计算得到(1.6,2.4)

 

如果四舍五入后直接填充,则难以做梯度下降。
我们知道做梯度下降时,梯度的表现就是权重发生一点点变化的时候,输出的变化会如何。
如果用四舍五入后直接填充,那么(1.6,2.4)四舍五入后变成(2,2)
当Θ(我们求导的时候是需要对Θ求导的)有一点点变化的时候,(1.6,2.4)可能变成了(1.9,2.1)四舍五入后还是变成(2,2),输出并没有变化,对Θ的梯度没有改变,这个时候没法用梯度下降来优化Θ

如果采用上面双线性插值的公式来填充,在这个例子里就会考虑(2,2)周围的四个点来填充,这样子,当Θ有一点点变化的时,式子的输出就会有变化,因为(x_{i}{s},y_{i}{s}) 的变化会引起V的变化。注意下式中U的下标,第一个下标是纵坐标,第二个下标才是横坐标。

V=U21(1−0.6)(1−0.4)+U22(1−0.4)(1−0.4)+U31(1−0.6)(1−0.6)+U32(1−0.4)(1−0.6)

这样就是在做计算的时候,考虑了相应的4个像素;

2.2.4 STN小结

简单总结一下,如下图所示

  1. Localization net根据输入图,计算得到一个Θ
  2. Grid generator根据输出图的坐标点和Θ,计算出输入图的坐标点,举例来说想知道输出图上(2,2)应该填充什么坐标点,则跟Θ运算,得到(1.6,2.4)
  3. Sampler根据自己定义的填充规则(一般用双线性插值)来填充,比如(2,2)坐标对应到输入图上的坐标为(1.6,2.4),那么就要根据输入图上(1.6,2.4)周围的四个坐标点(1,2),(1,3),(2,2),(2,3)的像素值来填充。

具体仿射变换过程,也可以结合下图进行理解:

上图中由Localisation Net生成仿射变换系数后,仿射变换的过程是依次执行步骤1,2,3,4。

 下图是使用STN技术后,得到的检测性能对比

STN以上内容参考博文:

论文笔记:空间变换网络(Spatial Transformer Networks) - PilgrimHui - 博客园

 3 从数据中学习不变性

     为了让模型更加鲁棒,需要大量的训练数据,以使得模型从中学习到各种不变性,除了直接使用收集更多的数据,还可以采用各种不同的数据增强方法,如几何变化类操作,颜色变换类操作来获得大量的数据。下面从操作方法上介绍不同的数据增强方法,主要参考的是有三的数据增强方法的总结:

3.1 空间转换 (随机尺寸,裁剪,翻转,旋转任意角度...)

3.2 像素内容变换(亮度,色度,饱和度,颜色扰动等)

颜色扰动:就是在某一个颜色空间通过增加或减少某些颜色分量,或者更改颜色通道的顺序。 

亮度、对比度、饱和度调整扩增数据

 

3.3 多样本合成数据增强(SMOTE,SamplePairing...)

1)多样本插值SMOTE

论文:SMOTE: Synthetic Minority Over-sampling Technique

源码:https://zhuanlan.zhihu.com/p/44055312

SMOTE:是一种通过线性插的方法,对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,解决数据不均衡问题的方法。

2)多样本插值SMOTE 

 3)SamplePairing

解决的问题:数据不均衡

论文:Data Augmentation by Pairing Samples for Images Classification

算法:训练集随机抽取的两幅图像叠加合成一个新的样本(像素取平均值),使用第一幅图像的label作为合成图像的正确label,训练集规模从 N 扩增到 N*N。

3.4 信息丢弃(随机 擦除,cutout...)

1)Random erasing

解决的问题:遮挡问题

源码:https://github.com/zhunzhong07/Random-Erasing

论文:Random erasing data augmentation 在训练中,随机擦除随机选择图像中的一个矩形区域, 通过随机擦除目标的特征模拟遮挡的效果,提高模型 的泛化能力,弱化模型对于目标全部特征的依赖。

2)Random erasing 

不同的处理需求,做法不相同

图像分类 :在原图中随机选择擦除区域 --- 漫无目的的擦除

目标检测 :在原图中随机选择擦除区域; 在每个b-box上独立执行random erasing,即此时b-box相对于图像一样成为一个独立的个体; 在图像和目标b-box上随机选择擦除区域。

3) Cutout

解决的问题:目标遮挡问题

源码:https://github.com/uoguelph-mlrg/Cutout

论文:Improved Regularization of Convolutional Neural Networks with Cutout etworks with Cutout

方法一:在训练的每个epoch过程中,保存每张图片 对应的最大激活特征图(输出的最大特征激活点), 在下一个训练回合,对每张图片的最大激活图进行 上采样到和原图一样大,然后使用阈值划分为二值 图,盖在原图上再输入到cnn中进行训练。

方法二:选择一个固定大小的正方形区域,然后将该区域填充为0即可,为了避免全0区域对训练的影响,需要对数据中心归一化到0。并且,与random erasing不同的是,其以一定概率(50%)允许擦除区域不完全在原图像中。

 数据中心归一化

目的:得到均值为0,标准差为1的服从标准正态分布的数据。可以取消由于量纲不同、自身变异或者数值相差较大所引起的误差。

方法:数值减去均值,再除以标准差

4) Hide-and-seek

论文名称:Hide-and-Seek: A Data Augmentation Technique for Weakly-Supervised Localization and Beyond

源码:https://github.com/kkanshul/Hide-and-Seek

      不再通过随机位置确定patch的位置,而是将原图划分为若干份,然后对 划分的每一份依概率进行隐藏,并且每一张图片的隐藏区域都是随机的 例如,将224*224*3的图像划分为16份,每个patch为56*56*3,每个patch是否隐藏 的概率p=0.5.

5)GridMask

 论文名称:GridMask Data Augmentation

代码:https://github.com/akuxcw/GridMask

目的: 为了避免连续区域的过度删除和保留的问题,即在 删除和保留图像上的区域信息之间达到合理的平衡, Cutout,Hide-and-Seek中依概率对划分区域进行隐 藏,很有可能造成目标全部删除或者全部保留的现 象。

 详细的做法为:

 

3.5 图像融合及拼接(Mixup...)

1)Mixup

核心就是将两张图像和label采用比例混合,即图像融合

论文:mixup: BEYOND EMPIRICAL RISK MINIMIZATION

源码:https://github.com/hongyi-zhang/mixup mixup:

采用对不同类别之间进行建模的方式实现数据增强,方法为:两张图像线性混合时,label也 要线性混合 通用数据增强方法则是针对同一类做变换

算法核心:

(xi,yi)和(xj,yj)是从训练数据中随机抽取的两个样本,且λ∈[0,1]。因此,mixup通过结合先验知识,即特征向量的线性插值应导致相关标签的线性插值,来扩展训练分布

2) Mosaic

     Mosaic是YOLOv4中提出的一种数据增强方式,属于Cutmix的扩展。Cutmix是两张图像的混合,即Cutout仅有一块区域,而Mosaic是4张图像的混合,一张图相当于4张图

主要有几个优点:

丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。

减少GPU:可能会有人说,随机缩放,普通的数据增强也可以做,但作者考虑到很多人可能只有一个GPU,因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值