본문 바로가기

개발 공부/딥러닝

[Deep Learning] 이미지 Normalize와 PIL·OpenCV 전처리 | RGB부터 영상 Frame까지

앞에서는 ImageFolder와 Transform을 이용해 실제 이미지 파일을 Dataset과 DataLoader로 연결했다.

이번에는 이미지가 결국 숫자로 이루어진 데이터라는 점을 바탕으로 RGB Channel의 평균과 표준편차를 계산해 Normalize하는 과정을 확인했다.

추가로 PIL과 OpenCV를 이용해 이미지와 영상을 직접 처리하는 방법도 살펴봤다.

⠀

1. 이미지는 결국 숫자 데이터다

우리 눈에는 사진으로 보이지만 컴퓨터에서 이미지는 숫자 데이터다.

컬러 이미지는 크게

Red
Green
Blue

세 개의 Channel로 구성된다.

PyTorch에서는 일반적으로

(Channel, Height, Width)

형태이므로 RGB 이미지 하나는

(3, H, W)

형태의 Tensor라고 볼 수 있다.

⠀

2. RGB 각각의 평균을 구할 수 있다

이미지를 NumPy 형태로 변환한 뒤

img_map = img_tensor.numpy()

각 Channel을 따로 가져올 수 있다.

img_map[0]   # Red
img_map[1]   # Green
img_map[2]   # Blue

각각 평균도 계산할 수 있다.

하지만 하나씩 계산하지 않고

를 사용하면

[Red 평균, Green 평균, Blue 평균]

을 한 번에 구할 수 있다.

왜냐하면

axis=1 → Row
axis=2 → Column

방향의 평균을 구하고 Channel 축은 남겨두기 때문이다.

⠀

3. Normalize에는 학습 데이터의 통계값을 사용한다

이번 실습에서는 전체 Train 이미지의 RGB 평균과 표준편차를 계산했다.

각 이미지의 Channel별 평균을 계산한다.

그리고 전체 이미지에 대해 다시 평균을 낸다.

map_means.mean(axis=0)

표준편차도 같은 방식이다.

최종적으로

RGB 평균 3개
RGB 표준편차 3개

가 만들어진다.

⠀

4. 왜 Test 데이터까지 같이 계산하면 안 될까?

평균과 표준편차를 계산할 때는 Train 데이터만 사용했다.

Test 데이터는 모델이 학습할 때 알 수 없는 데이터이기 때문이다.

따라서 전처리 기준도 Train 데이터에서 만들고, 그 기준을 Test 데이터에 그대로 적용한다.

즉

Train Data
↓
평균 / 표준편차 계산
↓
Normalize 기준 생성
↓
Train에 적용
↓
동일한 기준을 Test에도 적용

하는 구조다.

⠀

5. Normalize 적용하기

계산한 평균과 표준편차는 Transform에 넣을 수 있다.

T.Normalize(
    mean=color_means,
    std=color_stds
)

따라서 전체 Transform은 예를 들어

처럼 구성할 수 있다.

📌 기억할 점

Normalize 역시 독립적인 전처리 과정이기 때문에 Compose() 안에서 다른 Transform과 함께 사용할 수 있다.

⠀

6. PIL로 이미지 처리하기

이번에는 torchvision뿐만 아니라 PIL을 이용한 이미지 처리도 확인했다.

이미지는 다음과 같이 불러온다.

이미지를 저장할 수도 있다.

⠀

7. PIL에서 Color Channel 확인하기

를 이용하면 이미지가 가지고 있는 Channel 정보를 확인할 수 있다.

RGB 이미지라면

R
G
B

가 존재한다.

RGBA 이미지라면

R
G
B
A

처럼 Alpha Channel이 추가될 수도 있다.

⠀

8. PIL로 회전과 흑백 변환

이미지를 회전할 수 있다.

그리고 흑백 이미지로 바꿀 수도 있다.

즉 PIL을 이용하면 비교적 간단한 방식으로 이미지 자체를 조작할 수 있다.

⠀

9. OpenCV에서 이미지는 BGR로 읽힌다

OpenCV에서는 다음과 같이 이미지를 읽었다.

여기서 중요한 차이가 있다.

PIL이나 matplotlib에서 일반적으로 사용하는 색상 순서는

RGB

이지만 OpenCV는 기본적으로

BGR

순서다.

따라서 OpenCV 이미지를 그대로 matplotlib으로 출력하면 색상이 이상하게 보일 수 있다.

⠀

10. BGR을 RGB로 바꾸기

이번에는 Channel의 순서를 거꾸로 뒤집었다.

즉

B G R

↓

역순

↓

R G B

가 된다.

그리고

로 출력하면 원래 색상으로 볼 수 있다.

📌 이번 실습에서 기억할 점

OpenCV → BGR
matplotlib → RGB

이 차이를 기억해야 한다.

⠀

11. OpenCV에서 흑백 이미지로 읽기

OpenCV에서는 처음부터 흑백 이미지로 읽을 수도 있다.

컬러 이미지에서는 세 개의 Channel이 필요하지만 흑백 이미지에서는 색상 정보가 줄어든다.

를 이용하면 흑백 이미지로 확인할 수 있다.

⠀

12. OpenCV에서 Resize

OpenCV에서도 이미지 크기를 변경할 수 있다.

고정된

200 × 200

같은 값을 넣을 수도 있지만 현재 이미지 크기를 이용해 일정 비율로 줄이는 것도 가능하다.

⠀

13. 영상도 결국 이미지의 연속이다

OpenCV에서는 영상도 처리할 수 있다.

정상적인 영상인지 확인한다.

그리고 전체 Frame 수를 확인할 수 있다.

영상은 결국 수많은 이미지 Frame이 연속해서 연결된 데이터라고 볼 수 있다.

⠀

14. 특정 Frame으로 이동하기

예를 들어 100번째 Frame으로 이동하려면

을 사용한다.

그리고 해당 Frame을 읽는다.

success가 True라면 정상적으로 Frame을 읽었다는 의미다.

Video
↓
Frame 1
Frame 2
Frame 3
...
Frame 100
↓
하나의 이미지

즉 영상 처리도 결국 이미지 처리의 연장선으로 볼 수 있다.

⠀

15. 핵심 정리

개념기억할 내용

RGB 컬러 이미지의 Red, Green, Blue Channel
mean 각 Channel의 평균
std 각 Channel의 표준편차
Normalize Train 데이터의 평균·표준편차를 이용
PIL 이미지 불러오기·회전·흑백 변환 등
OpenCV 이미지와 영상 처리
OpenCV Color 기본 BGR
matplotlib Color RGB
Video 여러 Image Frame의 연속
VideoCapture OpenCV에서 영상 읽기
Frame 영상의 특정 시점 이미지

이번 실습을 통해 이미지 역시 결국 숫자로 이루어진 데이터이고, RGB Channel마다 통계값을 계산하거나 크기와 색상 정보를 변경하는 것도 결국 숫자 데이터를 바꾸는 과정이라는 점을 확인할 수 있었다.

또 영상 역시 완전히 다른 데이터라기보다 여러 이미지 Frame이 시간 순서대로 이어져 있는 구조라고 연결해서 이해할 수 있었다.

반응형