该方法的出处:《Random Erasing Data Augmentation》
论文链接:https://arxiv.org/pdf/1708.04896v2.pdf
代码链接:https://github.com/zhunzhong07/Random-Erasing
1.该方法操作后的效果图
在进行擦除过程中,在目标区域位置选择一个矩形区域,使用随机的像素值代替原始像素值,这样就对目标区域起到了一定的遮挡作用;
2.该方法的代码
from __future__ import absolute_import
from torchvision.transforms import *
import numpy as np
import torch
class RandomErasing(object):
def __init__(self, EPSILON = 0.5, sl = 0.02, sh = 0.4, r1 = 0.3, mean=[0.4914, 0.4822, 0.4465]):
self.EPSILON = EPSILON
self.mean = mean
self.sl = sl
self.sh = sh
self.r1 = r1
def __call__(self, img):
if random.uniform(0, 1) > self.EPSILON:
return img
for attempt in range(100):
area = img.size()[1] * img.size()[2]
target_area = random.uniform(self.sl, self.sh) * area
aspect_ratio = random.uniform(self.r1, 1/self.r1)
h = int(round(math.sqrt(target_area * aspect_ratio)))
w = int(round(math.sqrt(target_area / aspect_ratio)))
if w < img.size()[2] and h < img.size()[1]:
x1 = random.randint(0, img.size()[1] - h)
y1 = random.randint(0, img.size()[2] - w)
if img.size()[0] == 3:
#img[0, x1:x1+h, y1:y1+w] = random.uniform(0, 1)
#img[1, x1:x1+h, y1:y1+w] = random.uniform(0, 1)
#img[2, x1:x1+h, y1:y1+w] = random.uniform(0, 1)
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]
#img[:, x1:x1+h, y1:y1+w] = torch.from_numpy(np.random.rand(3, h, w))
else:
img[0, x1:x1+h, y1:y1+w] = self.mean[1]
# img[0, x1:x1+h, y1:y1+w] = torch.from_numpy(np.random.rand(1, h, w))
return img
return img
3.适用场景
在原始论文中,作者将该方法分类,目标检测和行人重识别上,效果都很好;
分类任务中的效果:
目标检测中的效果:
在行人重识别上的效果:
目前,pytorch中已经可以直接调用
import torchvision.transforms as T
T.RandomErasing(p=rea_prob, value=rea_value)