Attention please

[딥러닝] 이미지와 텐서의 관계, 전치(transpose) - CHW, HWC 본문

딥러닝/CNN

[딥러닝] 이미지와 텐서의 관계, 전치(transpose) - CHW, HWC

Seongmin.C 2022. 12. 9. 21:38

CNN(합성곱 신경망)

앞으로 다룰 CNN - Convolution Neural Network 은 컴퓨터 비전 즉 이미지를 처리하는데 특화되어있다.

 

즉, 이미지를 학습을 한다는 것인데 컴퓨터에 학습시키기 위해서는 데이터를 수치화할 필요가 있다.

 

글과 같이 자연어를 처리할 때는 언어를 벡터로 바꾸는 등 전처리 과정이 필요하지만 이미지나 영상은 애초에 텐서의 형태를 가지고 있다.

 

예를 들어 흑백 사진은 행렬 즉 2차원 텐서이며, 여러 이미지들을 배치로 묶게 되면 3차원 텐서가 된다.

 

 

 

컬러 이미지같은 경우는 R, G, B 3개의 행렬이 합쳐져 있는 형태로 3차원 텐서이며, 컬러 이미지 여러장을 배치로 묶게 되면 4차원 텐서가 된다.

 

 

2차원 텐서까지는 평면에 표현하기 어렵지 않다. 하지만 3차원 이상부터는 입체적이기 때문에 표현할 때 번거로움이 존재한다.

 

이를 위해 3차원 텐서는 행렬을 원소로 가지는 벡터로 표현할 수 있으며,

 

 

4차원 텐서는 행렬을 원소로 가지는 행렬로 표현한다.

 

 

 

 

 

 

 

(C x H x W) vs (H x W x C)

위에서 컬러 이미지는 R, G, B 3개의 행렬이 합쳐진 것이라고 하였다. 이때 3차원 텐서를 구성할 수 있는 방법이 2가지가 있는데 CHWHWC로 표현한다. 둘 모두 컴퓨터는 컬러 이미지로 인식하지만 자신의 환경에 맞게 텐서를 처리해야 한다.

 

즉, 학습하기 전 이미지를 전처리 할 때 사용하는 프레임 워크나 패키지에 맞게 행렬을 전치(transpose)할 필요가 있다.

 

예를 들어 프레임워크 중 하나인 파이토치(PyTorch)의 경우 CHW 형식을 따르고 있으며, 대표적인 파이썬 영상 처리 패키지인 OpenCVHWC 형식을 따르고 있다.

  • C : Channels(채널)
  • H : Height(높이)
  • W : Width(너비)

 

 

 

CHW는 RGB에 해당하는 3개의 행렬을 겹쳐놓은 형태이다.

 

 

HWC는 각 픽셀에 대한 값을 원소로 가지는 행렬을 구성한다.

픽셀은 이미지 데이터의 최소 단위로 픽셀 자체를 RGB값을 가지는 3차원 벡터로 표현할 수 있다.

 

각 RGB의 값은 0 ~ 255의 값으로 구성되며, 이 3개의 값이 모여 하나의 색을 표현한다.

 

 

 

 

 

전치(Transpose)를 왜 해주어야 하는가?

위에서 언급했다시피 이미지를 전처리할 때 텐서를 전치해주어야 하는 일이 빈번하게 일어난다. 만약 OpenCV패키지를 사용하여 이미지를 불러오고 전처리를 한 후 PyTorch를 사용하고 싶다면 이미지의 축을 HWC에서 CHW로 바꾸어 주어야 한다. 이런 상황이 왔을 때 transpose 함수를 사용하여 텐서의 축의 순서를 바꾸어 주면 된다.

 

예를 들어 transpose(2,0,1)을 적용시켜보자.

이 함수가 의미하는 것은 원래 축의 순서인 (0,1,2) 를 (2,0,1) 로 바꾸어 주라는 의미이다.

 

위 함수를 사용하였을 때 다음과 같이 텐서의 원소들의 위치가 바뀌게 된다.

 

 

X(211) 원소를 살펴보자. (211)의 위치는 transpose(2,0,1) 에 의해 (2,1,1) → (1,2,1) 으로 바뀌게 된다.

즉, 해당 원소가 (1, 2, 1)의 위치로 옮겨진 것을 확인할 수 있다.

 

이와 같이 전치를 해주게 되면 해당 축을 기준으로 텐서 속 모든 원소들의 위치가 옮겨진다.

 

 

Comments