RICAP是2019年发表在TCSVT期刊上的一种数据增强方法,看论文发现RICAP在目标检测中的用法和YOLOv4中的mosaic增强几乎是完全一样的。从时间上来看,YOLOv4是2020年出来的,比RICAP晚了一年,不确定作者是否看过RICAP这篇论文。
Data Augmentation using Random Image Cropping and Patching for Deep CNNs
paper: https://arxiv.org/pdf/1811.09030
code: https://github.com/jackryo/ricap
RICAP与mixup比较类似,都是从多张图像合成新图像来训练。他们的不同之处,主要有三点:(1)RICAP选择4张图像来合成,而mixup是2张;(2)RICAP从空间上合成图像,即通过拼接的方式,而mixup是通过按比例相加的合成方式;(3)RICAP在拼接图像前加入了crop操作,而mixup直接混合两张原图像。
RICAP的图像合成示例图如下,还是很容易理解的。
RICAP实现代码如下:
beta = 0.3 # 默认为0.3
criterion = nn.CrossEntropyLoss()
for (inputs, labels) in train_loader:
# size of image
I_x, I_y = inputs.size()[2:]
# generate boundary position (w, h)
w = int(np.round(I_x * np.random.beta(beta, beta)))
h = int(np.round(I_y * np.random.beta(beta, beta)))
w_ = [w, I_x - w, w, I_x - w]
h_ = [h, h, I_y - h, I_y - h]
# select four images
cropped_images = {}
c_ = {}
W_ = {}
for k in range(4):
index = torch.randperm(inputs.size(0))
x_k = np.random.randint(0, I_x - w_[k] + 1)
y_k = np.random.randint(0, I_y - h_[k] + 1)
cropped_images[k] = inputs[index][:, :, x_k:x_k + w_[k], y_k:y_k + h_[k]]
c_[k] = labels[index]
W_[k] = (w_[k] * h_[k]) / (I_x * I_y) # 根据面积分配权重
# patch cropped images
patched_images = torch.cat(
(torch.cat((cropped_images[0], cropped_images[1]), 2),
torch.cat((cropped_images[2], cropped_images[3]), 2)), 3)
outputs = model(patched_images)
_, preds = torch.max(outputs, 1)
loss = sum([W_[k] * criterion(outputs, c_[k]) for k in range(4)])
计算loss的时候,是根据每个patch的面积来分配对应权重的。
训练的参数配置与mixup相同,结果见下表。
Method | CIFAR-10 | CIFAR-100 |
ResNet-50 | 96.76/96.82/96.81/96.79 96.72/96.69/96.60/96.82 (96.75) |
83.80/83.66/84.19/83.26 83.89/83.90/83.57/83.69 (83.74) |
ResNet-50+RICAP | 96.73/96.72/96.64/96.61 96.71/96.69/96.78/96.84 (96.71) |
83.11/83.05/83.74/83.29 83.06/83.25/83.37/83.36 (83.28) |
从上表中的结果来看,在CIFAR10和CIFAR100两个数据集上使用RICAP也没能提高模型的性能。具体原因应该与mixup类似。
数据增强实测之mixup_一个菜鸟的奋斗-CSDN博客
数据增强实测之Random Erasing_一个菜鸟的奋斗-CSDN博客
数据增强实测之cutout_一个菜鸟的奋斗-CSDN博客
数据增强实测之GridMask_一个菜鸟的奋斗-CSDN博客
数据增强实测之Hide-and-Seek_一个菜鸟的奋斗-CSDN博客