이미지 로딩
Dog vs Cat 데이터셋
- 캐글(데이터 사이언스 경진대회 플랫폼) 데이터
- 고양이와 강아지를 사진으로 구분하는 문제
- 대회 1등 정확도가 98.9%
- cats_and_dogs_filtered
- train
- cats
- dogs
- validation
- cats
- dogs
- train
- 부품 불량을 분류하는 프로젝트를 하고 싶다면 cats, dogs 대신에 정상, 불량 폴더를 만들어 분류
전처리
- 일반적인 8비트 RGB 이미지의 픽셀값은
0~255 Resize(256)은 가로세로 비율을 유지하며 짧은 변을 256픽셀로 조정CenterCrop(IMAGE_SIZE)는 가운데에서 224×224 영역을 추출ToTensor()는(Height, Width, Channels)이미지를float32(Channels, Height, Width)텐서로 바꾸고 픽셀값을0~1로 조정Normalize()는 각 RGB 채널에 평균0.5, 표준편차0.5를 적용해0~1을-1~1로 조정
from torchvision import transforms
IMAGE_SIZE = 224
transform = transforms.Compose([
transforms.Resize(256), # 짧은 변을 256픽셀로 조정
transforms.CenterCrop(IMAGE_SIZE), # 가운데 224×224 영역 추출
transforms.ToTensor(), # 0~255 이미지를 0~1 텐서로 변환
transforms.Normalize(
mean=(0.5, 0.5, 0.5), # RGB 채널별 중심
std=(0.5, 0.5, 0.5), # 0~1을 -1~1로 조정
),
])
Normalize()가 채널별로 적용하는 계산은 다음과 같음.
ToTensor()출력0.0은-1.0으로 변환0.5는0.0으로 변환1.0은1.0으로 변환- 입력 규모를 일정하게 맞추면 최적화가 안정되고 학습률을 조정하기 쉬움
데이터 로딩
# 데이터셋
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)
모델 정의
import os
os.environ["KERAS_BACKEND"] = "torch" # Keras에서 PyTorch 사용
import keras
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'
).convert('RGB') # 항상 RGB 3채널로 변환
image # 이미지 보기
- 변환
x = transform(image)
x.dtype # 자료형
x.shape # 채널, 높이, 너비
x.amin().item() # 픽셀값 최솟값
x.amax().item() # 픽셀값 최댓값
shape은(3, 224, 224)dtype은torch.float32- 픽셀값은
-1~1범위 안에 위치하며 이미지에 따라 실제 최솟값과 최댓값은 달라짐
- 모델에 입력
batch = x.unsqueeze(0) # 차원을 추가 (expand_dims와 같음)
model.predict(batch)