logo

이미지 로딩

Dog vs Cat 데이터셋

  • 캐글(데이터 사이언스 경진대회 플랫폼) 데이터
  • 고양이와 강아지를 사진으로 구분하는 문제
  • 대회 1등 정확도가 98.9%
  • https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip
  • cats_and_dogs_filtered
    • train
      • cats
      • dogs
    • validation
      • cats
      • dogs
  • 부품 불량을 분류하는 프로젝트를 하고 싶다면 cats, dogs 대신에 정상, 불량 폴더를 만들어 분류

전처리

from torchvision import transforms

IMAGE_SIZE = 224
transform = transforms.Compose([
    transforms.Resize((256, 256)),  # 이미지마다 크기가 다르므로 통일
    transforms.CenterCrop((IMAGE_SIZE, IMAGE_SIZE)),  # 가운데만 잘라냄
    transforms.ToTensor(), # PyTorch의 데이터 형식으로 변환
    transforms.Lambda(lambda x: (x / 127.5) - 1)
])
  • 이미지 데이터는 0~255로 밝기를 표현
  • 신경망에서 사용하는 시그모이드 등의 함수는 지나치게 큰 값이 들어오면 경사가 0에 가까워져서 학습이 잘 되지 않음
  • -1~+1 범위로 재조정

데이터 로딩

# 데이터셋
from torchvision.datasets import ImageFolder
train_dataset = ImageFolder(root='cats_and_dogs_filtered/train', transform=transform)
val_dataset = ImageFolder(root='cats_and_dogs_filtered/validation', transform=transform)

# 로딩
from torch.utils.data import DataLoader
BATCH_SIZE = 32
train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False)

모델 정의

model = keras.Sequential([
    keras.Input(shape=(3, IMAGE_SIZE, IMAGE_SIZE)), # (Channels, Height, Width)
    keras.layers.Conv2D(32, (3, 3), activation='relu', data_format='channels_first'),
    keras.layers.MaxPooling2D((2, 2), data_format='channels_first'),
    keras.layers.Flatten(),
    keras.layers.Dense(512, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid')
])
  • Keras는 기본적으로 Height, Width, Channels 순으로 입력
  • PyTorch는 Channels가 먼저 나오므로 데이터 포맷을 그에 맞춰줌

훈련

model.compile(
    optimizer=keras.optimizers.SGD(learning_rate=0.001),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

model.fit(
    train_loader,
    epochs=1,
    validation_data=val_loader
)

이미지 한 장 입력

  • 이미지 한 장 불러오기
from PIL import Image
image = Image.open('cats_and_dogs_filtered/validation/cats/cat.2000.jpg')
image # 이미지 보기
  • 변환
x = transform(image)
x.shape # 채널, 높이, 폭
  • 모델에 입력
batch = x.unsqueeze(0) # 차원을 추가 (expand_dims와 같음)
model.predict(batch)
Previous
합성곱 신경망의 구조