
Cifar-C 데이터셋은 우리가 잘 알고 있는 Cifar 데이터셋에 15 가지 유형의 흔한 corruption과 추가적으로 4 가지의 corruption이 더해져, 총 19 가지의 corruption이 적용된 데이터셋이다.
각 corruption은 5 가지의 강도로 적용된다.
각각의 corruption이 더해져 생성되었기 때문에 corrupted dataset이라고 한다.
보통 모델의 robustness를 검증할 때 쓰이기 때문에 test 시에 사용되며, resolution은 Cifar 데이터셋과 동일한 32x32 이다.
기존 Cifar 데이터셋과 동일하게 Cifar-10 데이터셋에 대해 corrupted 된 Cifar-10-C 데이터셋과 Cifar-100 데이터셋에 대해 corrupted 된 Cifar-100-C 데이터셋으로 나뉜다.
Cifar-C에 쓰인 총 19 가지 corruption의 종류는 다음과 같다.
brightness, contrast, defocus blur, elastic, fog, frost, frosted glass blur, gaussian blur, gaussian noise, impluse noise, jpeg compression, motion blur, pixelate, saturate, shot_noise, snow, spatter, speckle noise, zoom blur
gaussian blur(강도 1단계) corruption이 적용된 예:

impluse noise(강도 1단계) corruption이 적용된 예:

아래 링크를 통해 다운 받을 수 있다.
https://zenodo.org/records/2535967
Cifar-C 데이터셋을 불러오는 방법

class CIFARC(datasets.CIFAR10):
def __init__(
self,
root,
key = 'zoom_blur',
transform = None,
target_transform = None,
):
super(CIFAR10, self).__init__(root, transform=transform,
target_transform=target_transform)
data_path = os.path.join(root, key+'.npy')
labels_path = os.path.join(root, 'labels.npy')
self.data = np.load(data_path)
self.targets = np.load(labels_path)
def __getitem__(self, index: int):
"""
Args:
index (int): Index
Returns:
tuple: (image, target) where target is index of the target class.
"""
img, target = self.data[index], self.targets[index]
img = Image.fromarray(img)
if self.transform is not None:
img = self.transform(img)
if self.target_transform is not None:
target = self.target_transform(target)
return img, target
if args.dataset == 'cifar10':
dataloader = datasets.CIFAR10
num_classes = 10
droot = './data/CIFAR-10-C' # 1 단계에서 압축 해제한 곳의 경로
else:
dataloader = datasets.CIFAR100
num_classes = 100
droot = './data/CIFAR-100-C' # 1 단계에서 압축 해제한 곳의 경로
trainset = dataloader(root='./data', train=True, download=True, transform=transform_train)
trainloader = data.DataLoader(trainset, batch_size=args.train_batch, shuffle=True, num_workers=args.workers)
testset = dataloader(root='./data', train=False, download=False, transform=transform_test)
testloader = data.DataLoader(testset, batch_size=args.test_batch, shuffle=False, num_workers=args.workers)
outkeys = ['gaussian_noise', 'shot_noise', 'impulse_noise', 'defocus_blur',
'glass_blur', 'motion_blur', 'zoom_blur', 'snow', 'frost', 'fog',
'brightness', 'contrast', 'elastic_transform', 'pixelate',
'jpeg_compression'] # 사용하고 싶은 corruption 종류 넣기
outloaders = dict()
for key in outkeys:
outset = CIFARC(root=droot, key=key, transform=transform_test)
outloader = data.DataLoader(outset, batch_size=args.test_batch, shuffle=False, num_workers=args.workers)
outloaders[key] = outloader
# accuracy 평가
if args.evaluate:
print('\nEvaluation only')
test_loss, test_acc = test(testloader, model, criterion, start_epoch, use_cuda)
print(' Test Loss: %.8f, Test Acc: %.2f, Test Error: %.2f' % (test_loss, test_acc, (100-test_acc)))
acc_res = []
for key in outkeys:
test_loss, test_acc = test(outloaders[key], model, criterion, start_epoch, use_cuda)
print('%s: Test Loss: %.8f, Test Acc: %.2f, Test Error: %.2f' % (key, test_loss, test_acc, (100-test_acc)))
acc_res.append(test_acc)
print('Mean ACC: %.2f' % np.mean(acc_res))
print('Mean Error: %.2f' % (100 - np.mean(acc_res)))
return