有人称为数据扩充,不过更多按原意翻译为:数据增强(补充:数据增广更准确)

数据增强的方法种类

一些常见方法,如裁剪/缩放/彩色变换/翻转等,可参考: ,海康威视也有一些数据增强的处理文档,对“裁剪”这种方法的使用更积极一些:https://zhuanlan.zhihu.com/p/23249000 ,这两篇blog都是相类似的方法,更多是对数据增强方法上的一些考虑。但是在数据增强这一环节,大牛更保守一些,他们使用了有限的变换方法: 。这篇blog中提到,一篇论文中用很大的比例去裁剪,而不做随机裁剪,以及增加噪声两种方法;另外一篇只用到了水平翻转。
论文 Some improvements on deep convolutional neural network based image classification 是对典型网络中用到的方法给出的总结,给出了三种数据增强的方法:裁剪/翻转/颜色亮度变化。

一些操作层面的增强方法

可以参考blog: ,使用现有工具来做这些事情。的blog中很多人提到使用Keras来做这件事,其实pytorch也有很多的增强方法集成,http://pytorch.org/tutorials/beginner/data_loading_tutorial.html#compose-transforms 。caffe也有相关的方法: 。去读它们的代码(在blog中有部分代码)也是在给定大小(比如在caffe中,变量名为crop_size,表示框的大小)然后随机在剩下的区域随机产生高和宽的偏移量:h_off & w_off。

对于crop的总结

crop方法在以上方法中有提到具体的做法,第1/3/5链接中用到的方法都是给定size的random crop。海康威视中提到random crop可能会偏离框选的主要内容,如一只羊的ground truth,随机产生的框可能只有草地。‘海’于是使用一个简单网络得到框选区“类别的信息概率分布”来避免主要信息被crop掉的情况。在上面提到的论文也是固定到了244×244,或者256×N或N*256的框随机选择。

SSD中的数据增强

在SSD – SSD: Single Shot MultiBox Detector 网络中,有提到:The data augmentation strategy described in Sec. 2.2 helps to improve the performance dramatically, especially on small datasets such as PASCAL VOC. The random crops generated by the strategy can be thought of as a ”zoom in” operation and can generate many larger training examples. To implement a ”zoom out” operation that creates more small training examples, we first randomly place an image on a canvas of 16× of the original image size filled with mean values before we do any random crop operation.
在SSD中作者也提到裁剪相当与zoom in放大效果,可以使网络对尺度更加不敏感,因此可以识别小的物体。通过将原图缩小放到一个画布上再去裁剪达到缩小的效果。在原文中的Fig.6提到了在数据增强之后SSD网络确实对小物体识别能力有很大提升。

而上面提到的Sec. 2.2提出的方法是随机采样,所采区块占原图的大小 [0.1, 1],且长宽比取值区间为 [0.5,2]( aspect ratio is between 1/2 and 2)。最后加上一个限制条件,原ground truth的中心需要在随机patch内(We keep the overlapped part of the ground truth box if the center of it is in the sampled patch)。等裁剪结束,图像将被缩放到固定大小,然后有一定概率(0.5)翻转。

等SSD 提出的技巧用完之后,又用到了上面那篇论文的技巧。所有的结果集合到一块去得到数据增强(in addition to applying some photo-metric distortions similar to those described in [14])。不过有不解的地方是怎么处理框选区域目标的主要信息不在random patch内怎么办?前面用到的随机选取方法都是将size固定到很大的一个范围,以防止出现这个问题。这篇文章提到的数据增强方法很是奔放。而且也没有太多提到‘海’所遇到的问题(随机框脱离了目标主体),其实我也一直纠结这个问题

具体实现

首先先给出一个带标注数据的旋转处理的blog:
然后想办法读取训练数据集的方法。其中xml的解析方法:http://www.runoob.com/python/python-xml.html ,用来读取PASCAL数据的标注数据信息。
然后随机产生左上角点,再随机产生一个小数,计算剩下空间(左上点到图片长宽最大值)能产生的随机框的长宽,用这些数据去匹配SSD中给出的几个限制条件:
1.长宽比。2.ground truth中心点。3.计算jaccard overlap比例,留做后用(感觉这是解决怎么避免随机框裁剪出ground truth不重要部分的关键)
然后调整上面解析得到的标注信息。