CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features
CutMix:正则化策略来训练具有局部特征的强大分类器,2019ICCV
文章目录
摘要
提出了CutMix增强策略:在训练图像之间剪切粘贴块,真实标签根据块的区域成比例地混合。
1 引言
增强卷积能力的训练策略:数据增广、正则化技术、随机特征丢弃。
随机特征丢弃极大地减少了训练图像上信息像素的比例,使用增强策略CutMix来解决:不只是简单地去除像素,而是用来自另一幅图像的块替换去除的区域,真实标签和填充块按像素数成比例混合。
几种相似的增广方式与性能:
2 相关研究
区域丢弃
综合训练数据。cutmix通过剪切和粘贴块来生成新样本,提高性能,CutMix的代价可忽略不计。CutMix生成可能包含多个对象的组合样本。
Mixup在局部是模棱两可且不自然的,因此会混淆模型,尤其是对于定位而言。Mixup变体执行特征级插值和其他类型的转换。CutMix不仅对图像分类任务有好处,而且定位任务和迁移学习实验中也有。
训练深度模型的技巧:权重衰减,丢弃和批归一化之类的方法。将噪声添加到CNN的内部特征或添加额外的路径到体系结构的方法。CutMix在数据级别上运行,而无需更改内部表示或架构。
3 CutMix
3.1 方法
3.2 讨论
动机:从图像中各自识别出两个对象。
- Cutout成功地使模型专注于对象的较少区分部分,但未使用部分像素效率低下
- Mixup充分利用像素,但会引入伪像。在选择识别线索时,模型很混乱,导致其在分类和定位方面表现欠佳。
- CutMix能精确定位两个对象
总结:
CutMix的错误率更低,CutMix验证错误稳定减少,多样化的训练样本可减少过拟合
4 实验
代码地址:https://github.com/clovaai/CutMix-PyTorch
4.1 分类
代码里面对ImageNet和CIFAR的Resnet采用的是不同的层,也就是没有用预训练的权重。
ImageNet
需要极大的batch size和很长的epoch才会收敛。
CIFAR
单独使用Cutout和标签平滑不会提高准确性,但一起使用时有效。
4.2 弱监督目标定位
通过仅使用类标签来训练分类器以定位目标对象。为了很好地定位目标,**重要的是使CNN从整个目标区域中提取线索,而不是将注意力集中在目标的微小可识别部分上。**学习空间分布表示是提高WSOL任务性能的关键。
4.4 鲁棒性和不确定性
深度模型很容易被输入图像上的细微且无法识别的扰动所影响,这种现象被称为“对抗性攻击” 。增强鲁棒性和不确定性的一种直接方法是通过生成看不见的样本来增广输入。
鲁棒性
对于遮挡,通过两种方式生成样例:通过在中心孔中填充零来进行中心遮挡,以及通过在孔外部填充零来进行边界遮挡。对于两种遮挡场景,Cutout和CutMix的鲁棒性都得到了显着提高,而Mixup仅略微提高。即使是CutMix在训练过程中没有任何遮挡的样本的情况下,CutMix的性能几乎可以与Cutout相比。
不确定性
评估指标:分布外(out-of-distribution,OOD)检测器,通过得分阈值确定样本是分布内还是分布外。
5 结论
- CutMix,用于训练具有强大分类和定位能力的CNN。
- CutMix易于实现且没有计算开销,效果不错。
- CutMix可以改善图像分类器的鲁棒性和不确定性。
附录里面提到了CUB,但是没说正确率能够到多少。
6 代码
根据官方代码做了部分修改
核心代码,首先是根据 λ \lambda λ,在图像中生成填充框的坐标。
def rand_bbox(H, W, lam):
"""
:param H: 图像高度
:param W: 图像宽度
:param lam: lambda超参数
:return: 坐标
"""
cut_rat = np.sqrt(1. - lam) # 裁剪比例
cut_w = int(W * cut_rat) # 裁剪框的宽度和高度
cut_h = int(H * cut_rat)
# 随机产生框的中心坐标
cx = np.random.randint(W)
cy = np.random.randint(H)
# 根据中心坐标和宽高生成左上角和右下角的坐标
half_w = cut_w // 2
half_h = cut_h // 2
left_top_x = cx - half_w
left_top_y = cy - half_h
right_down_x = cx + half_w
right_down_y = cy + half_h
# 合法性
if left_top_x < 0:
left_top_x = 0
if left_top_y < 0:
left_top_y = 0
if right_down_x > W:
right_down_x = W
if right_down_y > H:
right_down_y = H
return left_top_x, left_top_y, right_down_x, right_down_y
用到CutMix的部分:
lam = np.random.beta(args.beta, args.beta) # 符合beta分布的参数,args.beta超参数
rand_index = torch.randperm(images.size()[0]).cuda() # 打乱batch次序,填充的部分的图片要用到他的标签
# 构造图片
bbx1, bby1, bbx2, bby2 = rand_bbox(images.size()[2], images.size()[3], lam)
images[:, :, bbx1:bbx2, bby1:bby2] = images[rand_index, :, bbx1:bbx2, bby1:bby2] # 填充
# 构造标签
labels_a = labels # 原始标签
labels_b = labels[rand_index] # 填充部分的标签
lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1) / (images.size()[-1] * images.size()[-2]))
output = model(images)
loss = criterion(output, labels_a) * lam + criterion(output, labels_b) * (1. - lam)
7 思考
CutMix会不会遇到这样的问题,在图片A用另一张图片B填充时,刚好选择的是抹去A的一块背景区域,填充的也是B的一块背景区域,这样对标签的构造是不是有消极影响,如下图:
![image-20210510212049001](https://gitee.com/zhuyu2//personal-drawing-bed-2/raw/master/img/20210510212049.png)
明明B中的目标对象在新图片中什么也没有体现,但是标签却有很大的占比。
再比如,如果占比很小但是很重要,对标签构造也是不合理的。
![image-20210510214848030](https://gitee.com/zhuyu2//personal-drawing-bed-2/raw/master/img/20210510214848.png)