이미지 데이터 전처리 ?
딥러닝 학습을 위해서 이미지 데이터를 수집하다 보면, 이미지 각각의 크기도 다르고, 촬영 환경, 밝기, 각도 등 다른 형식의 이미지들이 많이 데이터로 들어오게 되는데, 이를 원시 데이터(Raw Data)라고 한다. 하지만 이미지 데이터에 대한 딥러닝 학습을 수행하게 되면 모델은 정해진 크기와 형식의 입력만 받을 수 있기 때문에, 학습을 시켜주기 전에 원시 데이터들을 정해진 크기/입력으로 변환할 필요가 있는데, 이를 수행하는 과정을 통틀어 데이터 전처리라고 부른다. 그렇다면, 이미지 데이터를 다룰 때 수행해야하는 전처리들은 어떤 것들이 있을까? 이 글에서는 Pytorch의 이미지 관련 라이브러리인 torchvision을 활용하게 되는데, 이미지 전처리를 위해 torchvision.trasforms를 활용하게 된다.
from torchvision import transforms
pip를 활용해 torchvision을 설치하고, 이후 위의 행을 통해 torchvision의 전처리 라이브러리를 활용할 수 있게 된다.
1. 표준 전처리
전처리는 학습 데이터와 평가 데이터에 모두 적용하는 표준 전처리, 학습 데이터를 학습시킬 때 데이터에 다양한 변형을 줘서 일반화 성능을 향상시키는 데이터 증강이 있다. 먼저 표준 전처리를 알아보자.
● Resize
일단 원시 데이터는 각각의 이미지가 다른 크기를 가지고 있기 때문에, 크기를 모두 동일하게 맞춰줄 필요가 있다. 이를 위해 사용되는 전처리가 Resize인데, 예를 들자면 transforms.Resize((224, 224))를 모든 이미지에 적용하여 이미지의 사이즈를 224 x 224로 맞춰주는 과정을 거치게 된다.
transforms.Resize((224, 224))

● 이미지 정규화(스케일링)
이미지의 픽셀값은 색상공간별로 0~255 값을 가지기 때문에, 픽셀값의 범위가 너무 크면 딥러닝 학습시에 기울기가 폭발하거나 학습이 느려지는 현상이 일어날 수 있어, 학습 안정화를 위해서 정규화를 통해 값의 범위를 0 ~ 1 사이로 줄여주는 작업을 하게 된다.
norm_img = img / 255.0 #간단하게 0~255값을 0~1로 줄이는 정규화
transforms.Normalize(mean=[0.485, 0.456, 0.406], #채널별 평균값, 표준편차 설정하여 정규화
std=[0.229, 0.224, 0.225]) # R, G, B 순
위의 코드처럼 간단하게 픽셀값을 255로 나누어 정규화하는 방법도 있고, trasforms.Normalize를 활용해 채널별 평균값과 표준편차를 설정해주어 정규화하는 방법도 있다.
● 이미지 색상변환
이미지 데이터를 읽어오게 되면 모델이 요구하는 색상공간과, 읽어온 색상공간이 다를 경우가 생기기도 하고, 굳이 색 정보가 필요하지 않고 흑백 정보만 경우도 있다.(문서, X-Ray 등) 이럴때는 색상공간을 변화시키는 방법을 이용한 데이터 전처리를 이용하는데, BGR 색상공간의 데이터를 RGB 색상공간으로 변환시킨다던지, RGB이미지로 본래 색이 있는 이미지를 grayscale로 변경시킨다던지의 전처리를 진행하게 된다.
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #opencv의 cvtColor 메소드를 활용해 gray공간으로 변환
img_rgb = img.convert('RGB') # grayscale 등일 때도 3채널 RGB로 변환(PIL의 라이브러리 활용) -> RGB 색상공간

위처럼 전처리 단계에서 색상을 변환하게 되면, 모델이 색깔에 현혹되지 않고, 사물의 형태, 질감을 더 잘 파악할 수 있게 된다.
● 텐서 변환
PIL이나 OpenCV로 이미지를 읽어오게 되면, 모델은 직접 그 이미지를 읽지는 못한다. 따라서 이미지를 모델이 읽을 수 있는 텐서 형태로 변환해주는 과정을 거쳐야 하는데, transforms 의 메소드 ToTensor()를 활용하면 간단하게 변환할 수 있다.
transforms.ToTensor()
2. 데이터 증강
데이터를 학습시키다보면, 모델이 학습하는 데이터에 대해서만 너무 잘 학습하게 되어 새로운 데이터를 예측하게 시켰을 때 올바르게 예측하지 못하는 과적합이 발생할 수 있다. 이를 방지하고 일반화 성능을 올리기 위해서 데이터 증강이라는 전처리를 진행하게 된다. 데이터 증강이란 학습시에 기존 데이터를 인위적으로 변형하여 새로운 학습 샘플을 만드는 것이다. 이는 훈련 데이터에 대해서만 데이터 증강을 진행하게 되고, 평가 데이터에 대해서는 진행하지 않는다. 데이터 증강을 적용하는 방식에는 랜덤하게 이미지를 변환(회전/자르기), 랜덤한 명암 변환 등등이 있다.
● 랜덤 회전
말 그대로 이미지를 랜덤하게 회전시켜서 학습시키는 전처리인데, transforms의 RandomRotation을 활용하면 사용 가능하다.
transforms.RandomRotation(degrees=45), # -45~45 랜덤 회전

● ColorJitter
ColorJitter는 이미지의 밝기, 채도, 명도, 색조를 임의로 변경하여 "색이 조금 변해도" 이미지를 잘 예측할 수 있게끔 학습을 도와주는 랜덤 변환이다. transforms의 ColorJitter 메소드를 사용해 이를 진행할 수 있다.
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.05)
위 코드대로 수행하게 되면, 랜덤으로 밝기는 +- 20%, 대비 +- 20%, 채도 +-20%, 색조 +- 0.05만큼 랜덤으로 변환한 이미지로 학습을 하게 된다.

3. 이미지 데이터 전처리 순서
일반적으로 위의 이미지 데이터 전처리의 순서는 :
색공간 변환 -> Resize -> 데이터 증강(학습 데이터에만) -> 텐서 변환 -> 정규화 순서로 수행하게 된다. 이를 한번의 함수로 넣을 수 있는데, transforms.Compose()를 활용하여 하나의 함수에 넣은 뒤, 한번에 불러오는 방식으로 주로 진행한다.
train_transforms = transforms.Compose([
transforms.Resize((224, 224)), # 이미지 사이즈 변환
transforms.RandomRotation(degrees=45), # -45~45 랜덤 회전
transforms.ColorJitter(brightness=0.2), # -0.2~0.2 명암 랜덤 변환
transforms.ToTensor(), # 텐서 변환
transforms.Normalize( # 정규화
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
'My IT > Article' 카테고리의 다른 글
| [MY IT : Article] 객체 인식 모델 : Single-Stage, Two-Stage (0) | 2026.04.07 |
|---|---|
| [My IT : Article] 전이학습 - 사전학습 모델, Feature Extraction, Fine-Tuning, Full-Fine Tuning (0) | 2026.04.01 |
| [My IT : Article] CNN Layer, AutoEncoder (0) | 2026.03.23 |
| [My IT : Article] PyTorch vs TensorFlow, Tensor(PyTorch) vs Array(Numpy) (1) | 2026.03.17 |
| [My IT : Article] 딥러닝 vs 머신러닝, 딥러닝 하이퍼파라미터 (0) | 2026.03.10 |