著名的随机擦除方法,2017年挂的arvix,好像中了2020年的AAAI。文章提出了一种数据增强方法——随机擦除(Random Erasing),将图像随机位置选择一块随机大小的矩形区域,将其中的值赋予为没有意义的常数(或者随机数,或者0)。这样的方法主动消除了图像中的一些信息,从而起到防止模型过拟合,增强模型鲁棒性的效果,也使得识别任务检测任务的模型表现更好。
论文一览:
痛点
很多网络被涉及的过于复杂,拥有过多的参数量,往往泛化能力差,容易发生过拟合现象。网络学习到的可能是一些不重要的noise,而不是我们关心的feature的分布。这就表现在有些网络在training set上表现很好,但是到了test set中表现会异乎寻常的差。为了提高网络泛化能力,数据增强是一个很重要的方向,
诸如随机裁剪,翻转等等已经成为非常常用的方法。
对于网络泛化能力而言。遮挡是一个重要的影响因素。就如行人重识别中的遮挡数据集,考验的是网络能否关注整体和局部细节,和网络对于带遮挡对象的泛化能力。带遮挡也是ReID场景中非常常见的场景,也是制约ReID技术落地一大难点之一。
文章提出的随机擦除,通过主动引入遮挡作为一种数据增强方法,从而提高模型泛化能力,提高模型鲁棒性,且简单易用,能够兼容绝大多数的模型和应用场景。
模型
随机擦除(Random Erasing)实例如图:
模型谈不上,主要是一种数据增强方法,伪代码如图:
具体部署建议看源码:
https://github.com/zhunzhong07/Random-Erasing
我的代码注释如下:
class RandomErasing(object):
""" Randomly selects a rectangle region in an image and erases its pixels.
'Random Erasing Data Augmentation' by Zhong et al.
See https://arxiv.org/pdf/1708.04896.pdf
Args:
probability: The probability that the Random Erasing operation will be performed.
sl: Minimum proportion of erased area against input image.
sh: Maximum proportion of erased area against input image.
r1: Minimum aspect ratio of erased area.
mean: Erasing value.
"""
def __init__(self, probability=0.5, sl=0.02, sh=0.4, r1=0.3, mean=(0.4914, 0.4822, 0.4465)):
self.probability = probability
self.mean = mean
self.sl = sl # 初始化可选择的擦除区域面积设置的最小比例
self.sh = sh # 初始化可选择的擦除区域面积设置的最大比例
self.r1 = r1 # 初始化最小长宽比
def __call__(self, img):
if random.uniform(0, 1) >= self.probability:
return img
for attempt in range(100):
area = img.size()[1] * img.size()[2]
target_area = random.uniform(self.sl, self.sh) * area # 面积范围[sl, sh]*area=[0.02*area, 0.4*area]
aspect_ratio = random.uniform(self.r1, 1 / self.r1) # 长宽比范围[r1, 1/r1]=[0.3. 3.333...]
h = int(round(math.sqrt(target_area * aspect_ratio))) # 擦除区域高度(height)
w = int(round(math.sqrt(target_area / aspect_ratio))) # 擦除区域宽度(width)
if w < img.size()[2] and h < img.size()[1]:
x1 = random.randint(0, img.size()[1] - h) # 随机起始点纵坐标(height方向)
y1 = random.randint(0, img.size()[2] - w) # 随机起始点横坐标(width方向)
if img.size()[0] == 3: # RGB图
img[0, x1:x1 + h, y1:y1 + w] = self.mean[0] # 将擦除区域全部赋予预设小数
img[1, x1:x1 + h, y1:y1 + w] = self.mean[1]
img[2, x1:x1 + h, y1:y1 + w] = self.mean[2]
else: # 灰度图
img[0, x1:x1 + h, y1:y1 + w] = self.mean[0]
return img
return img
实验
目标检测的随机擦除示例:
随机擦除和随机裁剪的结合示例:
在category classification测的SOTA:
对random erasing的超参数实现概率,面积比和长宽比的分离试验如下:
擦除区域的赋值分离试验如下:
与dropout的随机噪声比较:
与随机翻转,随机裁剪的结合对比:
遮挡程度与test error的关系:
目标检测测的SOTA:
ReID测的提升对比如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4nmbkpLV-1589682176663)(https://user-gold-cdn.xitu.io/2020/5/17/172204b455bbf837?w=1184&h=472&f=png&s=147443)]
market1501数据集测的SOTA如下:
DukeMTMC-reID测的SOTA如下:
CUHK03测的SOTA如下:
参考文献
[1] Zhong Z, Zheng L, Kang G, et al. Random erasing data augmentation[J]. arXiv preprint arXiv:1708.04896, 2017.