Cifar-C (Cifar-Corrupted) 데이터셋

Chloe·2024년 10월 21일

Deep Learning

목록 보기
1/4
post-thumbnail

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 데이터셋을 불러오는 방법

  1. 다운로드 받은 파일을 압축 해제한다.
  1. 데이터를 불러오는 파이썬 파일에서 아래 코드를 main 문 밖에 붙여 넣는다.
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
  1. 데이터를 불러오는 코드를 아래를 참고하여 변경한다.
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

0개의 댓글