일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 인공지능
- 딥러닝
- 파이썬
- 알고리즘
- 논문
- object detection
- Segmentation
- 논문 리뷰
- pytorch
- optimizer
- transformer
- Python
- Convolution
- 논문리뷰
- Computer Vision
- opencv
- Ai
- programmers
- 머신러닝
- 코딩테스트
- 프로그래머스
- Paper Review
- 옵티마이저
- cnn
- 파이토치
- Semantic Segmentation
- ViT
- 논문구현
- Self-supervised
- 코드구현
- Today
- Total
Attention please
[딥러닝] 이미지와 텐서의 관계, 전치(transpose) - CHW, HWC 본문
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가지가 있는데 CHW 와 HWC로 표현한다. 둘 모두 컴퓨터는 컬러 이미지로 인식하지만 자신의 환경에 맞게 텐서를 처리해야 한다.
즉, 학습하기 전 이미지를 전처리 할 때 사용하는 프레임 워크나 패키지에 맞게 행렬을 전치(transpose)할 필요가 있다.
예를 들어 프레임워크 중 하나인 파이토치(PyTorch)의 경우 CHW 형식을 따르고 있으며, 대표적인 파이썬 영상 처리 패키지인 OpenCV는 HWC 형식을 따르고 있다.
- 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)의 위치로 옮겨진 것을 확인할 수 있다.
이와 같이 전치를 해주게 되면 해당 축을 기준으로 텐서 속 모든 원소들의 위치가 옮겨진다.
'딥러닝 > CNN' 카테고리의 다른 글
Transposed Convolution 원리 및 Pytorch 구현 (0) | 2022.12.30 |
---|---|
Dilated Convolution(Atrous convolution) 원리 및 Pytorch 구현 (0) | 2022.12.30 |
[딥러닝] im2col의 원리, im2col을 이용한 합성곱 (0) | 2022.12.10 |
[딥러닝] Max Pooling의 원리, 합성곱층과 max pooling층의 차이 (0) | 2022.12.10 |
[딥러닝] 텐서의 합성곱의 원리, CNN - 합성곱신경망 (0) | 2022.12.09 |