1 问题发现
ImageNet可以说是最受欢迎的图像分类基准,但它也是label noise水平很高的基准。最近的研究表明,尽管被认为是单标签基准,但许多样本仍包含多个类别。因此,本文提出了将ImageNet预测转变为多标签任务的方法,因此每个图像都使用详尽的多标签标注。但是,由于标注成本高昂,所以没有固定训练集以供使用。
本文作者认为,单标签标注和有效多标签图像之间的不匹配在采用Random crops的训练中同样存在问题。如下图所示,使用单标签注释,图像的随机裁剪可能包含与Ground Truth情况完全不同的目标对象,从而在训练过程中引入噪声甚至错误的标签。
同时Random crops增强不仅对多目标类图像产生监督噪声。即使对于只有一个对象类的图像Random crops通常也有可能不包含前景对象。如下图所示,在标准ImageNet训练设置下有8%的Random crops与Ground Truth没有重叠。只有23.5%的Random crops在使用Ground Truth Box时具有大于50%的IoU。因此在ImageNet上训练模型不可避免地会存在大量的噪声干扰。
因此,本文提出了一种Re-Label策略,在ImageNet训练集上获得像素级标签,即Localized Multi-Labels。方法是使用在外部训练数据上训练的强分类器来生成这些标签。然后在最后的池化层之前的预测已经被使用。
本文还提出了一种新的基于密集标签训练分类器的训练方案LabelPooling。对于每个Random crops样本,通过计算Random crops的标签分数来计算多标签的Ground Truth。而ReLabel只需要一次计算即可为每个数据集生成标签映射,而不像知识蒸馏那样,每次训练迭代需要一个前向传递来生成监督信息。
实验结果表明,使用Localized Multi-Labels,ResNet-50在ImageNet上的Top-1分类精度达到78.9%,而通过CutMix正则化可以进一步提高到80.2%。实验结果显示,使用Localized Multi-labels训练的模型在迁移学习到目标检测和实例分割任务都有比较明显的提升。
2 相关工作
2.1 ImageNet上的Label问题
ImageNet俨然已经成为图像分类器的标准基准,而方法的优劣则取决于这些方法在这个基准上的性能。因此,基准本身的可靠性已成为仔细研究和分析的主题。
与许多其他数据集一样,ImageNet包含了很多标签噪声。在ImageNet上最持久的标签错误类型之一便是错误的单一标签,指的是一个图像中存在多个类别而只有一个类别被注释的情况。这样的错误很普遍,因为ImageNet包含许多带有多个类的图像。
Shankar等人已经为错误的单一标签确定了3个子类别:
- 1)一幅图像包含多个对象类;
- 2)存在多个同义或分层的标签,包括其他的标签;
- 3)一幅图像固有的模糊性使得多个标签可能存在。
这些研究将验证集标签细化为多标签,建立了有效多标签图像的真实、公正的评价模型。然而,有部分学者工作的重点只是验证,而不是训练。也有学者在方法引入了一种清理方案,通过用强分类器的预测来验证它们标签的正确性,从而删除带有潜在错误标签的训练样本。
本文的工作重点是ImageNet培训标签的清理策略。利用强分类器来清理训练标签。本文纠正了错误的标签,而不是删除。同时本文的标签也是按区域给出的。本文方案也得到了更好的性能。
2.2 知识蒸馏
知识蒸馏则是利用教师网络产生的监督信息。同时知识蒸馏的研究也丰富了教师模型的选择,如特征映射蒸馏、关系蒸馏、集合蒸馏或迭代自蒸馏。
虽然这些研究追求更强的监督形式,但是这些方法比较繁重而复杂略显不切实际。
由于加入了Random crops数据增广,Teacher Model每次训练迭代都非常的繁琐而复杂。如下表所示LabelPooling的相似之处在于,该模型是在机器监督下训练的,但效率更高。
LabelPooling使用预先计算的标签映射来监督模型,而不是在训练期间通过Teacher Model为每一个Random crops动态生成标签。
2.3 ImageNet的训练Tricks
数据增强是一种简单而强大的ImageNet训练策略。传统的数据增强方法包括Random crops、Flipping和Color jittering。Random crops即在图像中根据Random crops坐标进行裁剪然后将其调整为固定大小。
本文的工作考虑了Localized Multi-Labels,使对每个Random crops的监管更加合理。对于训练分类器还有一些额外的训练技巧与ReLabel的训练数据正交。展示了这些技巧可以与ReLabel相结合以提高性能。
3 方法原理
3.1 Re-labeling ImageNet
本文实验注意到,尽管在ImageNet上使用单标签监督(softmax交叉熵损失)训练Machine Annotators,它们仍然倾向于对多类别图像进行多标签预测。作为说明,考虑具有两个正确类别0和1的图像x。
假设在训练过程中模型同时输入带有噪声的标签和。然后,交叉熵损失为:
化简后为:
其中,是指index=c时的标签为1的One-Hot编码,是的预测向量。注意,函数在时取的最小值。因此,模型通过预测使损失最小化。
因此,如果数据集中存在大量的标签噪声,使用单标签交叉熵损失训练的模型会倾向于预测多标签输出。
从分类器中获取标签的另一个好处是可以提取特定于位置的标签。
本文方法去掉分类器的全局平均池化层,将后面的FC层变成1×1的卷积层,从而将分类器变成一个全卷积网络。模型的输出变成。然后使用输出的作为标签映射输出。
本文利用EfficientNet-L2作为Machine Annotators分类器,其输入大小为475×475。对于所有训练图像,将它们调整为475×475而不进行裁剪,并通过前向传播来生成标签Maps。标签Map的Spatial大小为,d通道数量为5504个,C=类别数量为1000。
在上图中给出了几个标签映射的例子。在标签Map中,这里只显示了分类器前2个类别的2个heatmap。heatmap为,其中是前2名之一。如示例所示,top-1和top-2 heatmap位于每个物体的位置上。
import os import torch import torch.distributed import torch.nn as nn import torchvision from torchvision.ops import roi_align from torchvision.transforms import functional as torchvision_F def get_labelmaps(label_maps_topk, num_batches): label_maps_topk_sizes = label_maps_topk[0].size() label_maps = torch.zeros([num_batches, 1000, label_maps_topk_sizes[2], label_maps_topk_sizes[3]]) for _label_map, _label_topk in zip(label_maps, label_maps_topk): _label_map = _label_map.scatter_( 0, _label_topk[1][:, :, :].long(), _label_topk[0][:, :, :] ) label_maps = label_maps.cuda() return label_maps def get_relabel(label_maps, batch_coords, num_batches): target_relabel = roi_align( input=label_maps, boxes=torch.cat( [torch.arange(num_batches).view(num_batches, 1).float().cuda(), batch_coords.float() * label_maps.size(3) - 0.5], 1), output_size=(1, 1)) target_relabel = torch.nn.functional.softmax(target_relabel.squeeze(), 1) return target_relabel class ComposeWithCoords(torchvision.transforms.Compose): def __init__(self, **kwargs): super(ComposeWithCoords, self).__init__(**kwargs) def __call__(self, img): coords = None for t in self.transforms: if type(t).__name__ == 'RandomResizedCropWithCoords': img, coords = t(img) elif type(t).__name__ == 'RandomCropWithCoords': img, coords = t(img) elif type(t).__name__ == 'RandomHorizontalFlipWithCoords': img, coords = t(img, coords) else: img = t(img) return img, coords class RandomResizedCropWithCoords(torchvision.transforms.RandomResizedCrop): def __init__(self, **kwargs): super(RandomResizedCropWithCoords, self).__init__(**kwargs) def __call__(self, img): i, j, h, w = self.get_params(img, self.scale, self.ratio) coords = (i / img.size[1], j / img.size[0], h / img.size[1], w / img.size[0]) return torchvision_F.resized_crop(img, i, j, h, w, self.size, self.interpolation), coords class ImageFolderWithCoordsAndLabelMap(torchvision.datasets.ImageFolder): def __init__(self, **kwargs): self.relabel_root = kwargs['relabel_root'] kwargs.pop('relabel_root') super(ImageFolderWithCoordsAndLabelMap, self).__init__(**kwargs) def __getitem__(self, index): path, target = self.samples[index] score_path = os.path.join( self.relabel_root, '/'.join(path.split('/')[-2:]).split('.')[0] + '.pt') sample = self.loader(path) if self.transform is not None: sample, coords = self.transform(sample) else: coords = None if self.target_transform is not None: target = self.target_transform(target) score_maps = torch.load(score_path) return sample, target, coords, score_maps
3.2 LabelPooling for Training
通过前面的一系列操作我们可以得到稠密的多标签,那我们如何用它们来训练分类器?
为此,本文提出了一种新的训练方案,LabelPooling,它考虑了Localized Ground Truths。在下图中展示了LabelPooling和原始ImageNet训练之间的区别。
在一个标准的ImageNet训练中,对Random crops的监督是由每张图像给出的单一标签的Ground Truths给出的。
另一方面,LabelPooling加载一个预先计算好的标签Map,并对Random crops坐标对应的标签Map进行区域池化操作。
LabelPooling采用RoIAlign区域池化方式。对池化预测Maps进行全局平均池化和Softmax操作,然后得到多标签Ground-Truth向量用来训练模型。
伪代码如下: