[17주차] GAN

2023. 7. 21. 11:54BOOTCAMP/프로그래머스 인공지능 데브코스

실전 프로젝트 - CNN 기반 이미지 분류 모델의 강건성 평가

 

  • 다양한 딥러닝 분류 모델이 자율 주행 자동차, 얼굴 인식 등 보안(security)이 중요한 분야에서 활용되고 있습니다.
  • 본 프로젝트에서는 공격자 입장에서 딥러닝 모델을 평가하는 적대적 공격 기법에 대하여 공부하게 됩니다.
  • GPU 가속기를 이용하기 위해 [런타임] - [런타임 유형 변경] - [GPU]를 선택합니다.
  • 본 프로젝트를 잘 수행하기 위해 다음의 YouTube 학습 자료를 참고하세요.
  • 본 프로젝트에서는 다음의 두 가지 대표적인 공격 기법을 실습합니다.
  • 본 프로젝트는 총 5개의 문제로 구성됩니다.
  • Problem 5에서 최대한 높은 공격력(낮은 모델 정확도)을 내는 것이 여러분의 최종 목표입니다.
  • 최종적으로 팀 단위로 제출할 파일은 다음과 같습니다.

Problem 1. 데이터셋 다운로드

 

  • 실습을 위해 Small ImageNet Validation 데이터셋을 불러옵니다.
  • 본 데이터셋은 5,000개의 ImageNet 평가 이미지로 구성됩니다.
  • PyTorch에서 곧바로 불러와 사용할 수 있도록 구성된 데이터셋입니다.
  • 다음의 명령어를 이용해 데이터셋을 다운로드할 수 있습니다.

# 깃허브에서 데이터셋 다운로드하기

! git clone https://github.com/ndb796/Small-ImageNet-Validation-Dataset-1000-Classes

# 폴더 안으로 이동

% cd Small-ImageNet-Validation-Dataset-1000-Classes

 

# 깃허브에서 데이터셋 다운로드하기
!git clone https://github.com/ndb796/Small-ImageNet-Validation-Dataset-1000-Classes
# 폴더 안으로 이동
%cd Small-ImageNet-Validation-Dataset-1000-Classes

 

(알아보기) 필요한 라이브러리 불러오기

  • 실습을 위한 PyTorch 라이브러리를 불러옵니다.
import os
import time
import json
import numpy as np
import matplotlib.pyplot as plt
import PIL
from IPython.display import display

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from torchvision import datasets

# GPU 장치 사용 설정
use_cuda = True
device = torch.device("cuda" if use_cuda else "cpu")

 데이터셋 불러오기

 

  • PyTorch의 ImageFolder 라이브러리를 이용하여 자신만의 데이터셋을 불러올 수 있습니다.
  • ImageFolder 라이브러리는 다음과 같이 계층적인 폴더 구조에서 데이터셋을 불러올 때 사용할 수 있습니다.
dataset/
    class 0/
        0.jpg
        1.jpg
        ...
    class 1/
        0.jpg
        1.jpg
        ...
    ...
    class 999/
        0.jpg
        1.jpg
        ...
  • 본 프로젝트에서는 평가 목적의 데이터셋만을 사용하므로, 데이터 증진(data augmentation)을 적용하지 않습니다.
imsize = 224

preprocess = transforms.Compose([
    transforms.Resize((imsize, imsize)), # 이미지 사이즈 변경
    transforms.ToTensor(), # [0, 255] → [0, 1] torch.Tensor
])

data_dir = './ILSVRC2012_img_val_subset'

val_dataset = datasets.ImageFolder(os.path.join(data_dir), preprocess)
val_dataloader = torch.utils.data.DataLoader(val_dataset, batch_size=16, shuffle=True, num_workers=2)
print('전체 이미지 개수:', len(val_dataset))

class_names = val_dataset.classes
print('클래스의 개수:', len(class_names))

# ImageNet 설정 파일에서 1,000개의 레이블을 불러오기
with open('./imagenet.json') as f:
    imagenet_labels = json.load(f)
전체 이미지 개수: 5000 클래스의 개수: 1000

이미지 시각화하기

  • PyTorch로 불러온 데이터(torch.Tensor 객체)를 시각화해 봅시다.
  • Google Colab에 출력하기 위해서 NumPy 형태로 변형한 뒤에 Matplotlib을 이용합니다.
  • torch.Tensor는 (Channel, Height, Width) 형식을 가집니다.
  • numpy 객체는 (Height, Width, Channel) 형식을 가집니다.
# 화면에 출력되는 이미지 크기를 적절하게 조절하기
plt.rcParams['figure.figsize'] = [12, 8]
plt.rcParams['figure.dpi'] = 60
plt.rcParams.update({'font.size': 20})


def imshow_batch(image, title):
    # torch.Tensor => numpy 변환하기
    image = image.numpy().transpose((1, 2, 0))
    # 화면에 이미지 출력하기
    plt.imshow(image)
    plt.title(title)
    plt.show()


# 검증 데이터셋에서 하나의 배치를 불러와 보기
iterator = iter(val_dataloader)

# 현재 배치에 포함된 이미지를 출력하기
inputs, classes = next(iterator)
out = torchvision.utils.make_grid(inputs[:4])
imshow_batch(out, title='original labels:' + str([int(class_names[x]) for x in classes[:4]]))

print('Original labels >>>>>>>>>>>>>>>>>>>>>>>>>')
for i, x in enumerate(classes[:4]):
    imagenet_index = int(class_names[x])
    label = imagenet_labels[imagenet_index]
    print(f'Image #{i + 1}: {label} ({imagenet_index})')

'BOOTCAMP > 프로그래머스 인공지능 데브코스' 카테고리의 다른 글

[18주차] 추천시스템 구현  (0) 2023.07.21
[16주차] NLP II와 Visual Recognition  (0) 2023.07.21
[15주차] NLP  (0) 2023.06.28
[14주차] Spark  (0) 2023.06.28
[13주차] monthly project3  (0) 2023.06.28