딥러닝 이야기 / Convolutional Neural Network (CNN) & Residual Network (ResNet) / 1. Convolutional Neural Network (CNN)
작성일: 2022.07.24
시작하기 앞서 틀린 부분이 있을 수 있으니, 틀린 부분이 있다면 지적해주시면 감사하겠습니다.
딥러닝 이야기의 다섯 번째 주제는 Convolutional Neural Network (CNN) 입니다.
CNN은 현재 가장 많이 사용되는 모델 중 하나입니다. 특히 이미지에서 그 성능이 우수하여 비전 관련 연구에서 많이 사용되는 모델입니다.
또한 이미지 뿐 아니라 1D CNN 같은 경우 자연어 처리에 쓰이기도 합니다.
이 글에서는 CNN의 원리와 종류, 그리고 CNN이 작동하기 위해 필요한 stride, pooling 등에 대해 알아보도록 하겠습니다.
그리고 CNN이 어디에 사용되는지, 유명한 모델이 무엇이 있는지도 간단하게 살펴보겠습니다.
마지막으로 CNN의 한계에 대해서도 언급하도록 하겠습니다.
오늘의 컨텐츠입니다.
- CNN의 원리
- CNN의 종류
- 컴퓨터 비전에 있어서 CNN의 사용
- CNN의 한계
Convolutional Neural Network (CNN)
”
딥러닝의 가장 기초가 되는 레이어는 바로 linear layer 입니다. Linear layer를 이용하는 방법은 매우 간단합니다. 데이터에 행렬 계산을 진행하고 non-linear activation function을 거쳐, 비선형 변환으로 데이터를 변형시켜 우리가 하고자하는 task를 수행합니다. 따라서 대부분의 데이터는 (batch size * hidden size)의 2차원의 크기를 가진 데이터가 대부분입니다. 그리고 이 글에서는 batch를 제외하고 생각하여 이 데이터들을 1차원의 크기를 가진 데이터라고 생각하겠습니다.
Linear layer를 이용한 학습
하지만 CNN은 linear layer를 이용한 단순한 행렬 계산이 아닌, convolution이라는 합성곱을 데이터에 적용합니다.
그럼 합성곱 방법은 무엇일까요?
합성곱의 방법은 아래의 그림을 보면 단번에 이해가 됩니다.
합성곱을 이용한 학습 (input: 파랑, output: 초록),
출처: vdumoulin github (https://github.com/vdumoulin/conv_arithmetic)
위 그림을 보면 4*4 크기의 데이터에 3*3의 영역이 가로 세로로 한 칸씩 움직여서 2*2의 크기를 가진 결과를 내어주는 것을 확인할 수 있습니다.
그리고 위 그림을 보면서 우리는 한 가지 사항을 예측해볼 수 있습니다.
바로 기존의 한 줄로 연결한 데이터가 아닌 batch를 제외하고 가로, 세로의 2차원 데이터에 대해 특정 영역 범위(위에서는 3*3 범위)에 있는 값들로 계산한다는 것입니다.
그리고 왜 CNN이 2차원의 데이터 계산을 위해 만들어졌는지 아래 그림을 보면 이해가 됩니다.
우리는 2차원의 이미지 데이터를 1차원으로 변형시켰을 때 그 특징을 바로 알아차리기 쉽지 않습니다.
이는 컴퓨터도 마찬가지이며, 이러한 문제점을 해결하고 2차원 이미지를 있는 그대로 보아 특징을 파악하기 위해 만들어진 것입니다.
1D, 2D 이미지 예시
이로써 우리는 CNN이 왜 가로, 세로의 크기를 가지는 2차원 데이터인 이미지에 많이 적용되는지 알 수 있습니다.
바로 2차원 데이터에 CNN을 사용하여 특정 영역에, 즉 국소 영역에 대해 연산을 진행하기 때문에 이미지의 특징을 잘 파악할 수 있는 것입니다.
아래 그림의 사람 이미지를 예로 들어 눈 주위의 영역에 대해 합성곱을 계산하고, 코 주위의 영역에 대해 합성곱을 계산하는 식의 방법으로 데이터를 바라보기 때문에 이미지에 많이 사용되고 효과적인 것입니다.
즉 3*3의 영역이 왼쪽 위부터 시작해서 한 칸씩 움직이면서 오른쪽으로 한 줄 계산 후, 한 줄로 아래로 내려와서 그 줄에 대해 또 계산하고, 또 한 줄 아래로 내려오는 방식으로 오른쪽 아래 까지 계산하게 되는 것이죠.
합성곱을 이용한 학습 예시
그럼 CNN에 대해 아래와 같은 의문이 생깁니다.
- 합성곱(convolution)은 어떻게 계산하는가?
- CNN을 계산하기 위해 필요한 것은 무엇인가?
- CNN의 파라미터 수와 특정 데이터에 CNN을 수행한 결과의 크기는 어떻게 바뀌는가? (공식)
- CNN 계산이 가능한 데이터는 가로, 세로의 크기만 가진 이미지 데이터 뿐인가?
합성곱(convolution)은 어떻게 계산하는가?
합성곱의 과정은 덧셈과 곱셈으로 이루어진 아주 간단한 연산이기 때문에 아래 그림을 보면 바로 이해가 됩니다. 커널 혹은 필터라고 하는 것과 데이터간의 곱한 값들을 더한 값으로 결과를 내어주는 과정이 바로 합성곱 과정입니다.
합성곱 연산 예시
CNN을 계산하기 위해 필요한 것은 무엇인가?
이제 합성곱 연산의 원리를 알았으니 본격적으로 CNN을 학습하기 위해 필요한 것과, 파라미터로써 사용되는 것 그리고 파라미터 수는 어떻게 계산하는지 알아보겠습니다.
- 데이터 먼저 CNN 연산을 할 데이터가 필요하겠죠. 위에서 이미지 데이터를 가로, 세로로 이루어진 2차원 데이터라고 하였는데 사실은 총 3차원입니다. 그 이유는 가로, 세로 그리고 이미지를 이루고 있는 RGB 칼라 데이터인 채널(channel, 혹은 깊이)이 존재하기 때문입니다. 따라서 최종적으로 batch 까지 포함하면 총 4차원의 크기를 가진 데이터가 CNN 연산이 가능한 것이지요. 즉 데이터는 (batch size * channel * height * width) 이렇게 이루어져있으며, 칼라 이미지 같은 경우에 channel은 RGB 값이 있으므로 3, 흑백인 경우에는 1로 설정 됩니다.
- 커널(필터), Kernel(Filter) 위의 그림에서 보면, 커널에 있는 값을 기준으로 데이터의 합성곱 연산을 수행합니다. 이 커널은 기본적으로 정사각형 모양을 가지며, 사용자가 커널의 가로와 세로의 크기를 정할 수 있습니다. 위의 그림에서는 3*3 크기의 커널을 가지며, 사용자가 마음대로 3*5 이런식으로 커널의 크기를 정할 수 있는 것이지요. 그리고 CNN이 학습하면서 업데이트 되는 파라미터가 바로 이 커널에 해당하는 값들이 바뀌게 되는 것입니다. 당연히 학습을 하며서 데이터의 값을 바꿀 수 없으니, 학습이 진행되기 위해서 이 커널의 값이 바뀌게 되는 것입니다. 그리고 커널은 학습 데이터와 같은 깊이의 channel을 가져야 합니다. 즉 커널의 차원은 (channel * kernel height * kerel width)가 되는 것이지요. 커널의 가로, 세로의 크기를 4*5라고 정해줬다고 가정하면, 커널은 칼라 이미지라면 3*4*5, 흑백 이미지라면 1*4*5의 크기를 가집니다.
데이터 칼라 유무에 따른 커널의 채널 차원 변화
- 스트라이드(Stride) 스트라이드는 커널이 데이터 위에서 움직이는 간격을 의미합니다. 위의 움직이는 이미지와 합성곱 방법에 대해 설명할 때 사용했던 이미지에서는 가로, 세로로 한 칸 씩 커널이 움직이는 것을 볼 수 있습니다. 이 경우에는 스트라이드가 1이라고 볼 수 있습니다. 만약에 스트라이드가 2라면 가로, 세로로 2칸씩 옮겨가면서 계산을 하게 될 것입니다.
좌: stride 1, 우: stride 2 (input: 파랑, output: 초록),
출처: vdumoulin github (https://github.com/vdumoulin/conv_arithmetic)
- 패딩 (Padding) 이때까지 살펴봤던 내용을 보면, 합성곱 연산을 수행하면 당연히 input 데이터에 비해 output 데이터의 가로, 세로 크기는 줄어들 수밖에 없을 것입니다. 따라서 몇 번 안되는 합성곱 연산을 거쳤더니 결과가 더이상 합성곱 연산을 못할 정도로 작아지게 되면 깊은 CNN을 구성하기가 힘들 것입니다. 이를 방지하기 위해 패딩이라는 것이 등장합니다. 즉 input 데이터에 대해 합성곱을 진행했을 때, 크기가 줄어드는 것을 방지하거나 덜 줄어들게끔 해주는 것이 바로 패딩이죠. 패딩을 함으로써 데이터에 변형을 주면 안되므로 보통 패딩 값을 0으로 설정합니다. 혹은 패딩 값을 바로 옆 값과 복제를 하기도 합니다.
아래 그림을 예시로 들자면, 패딩이 없는 상태의 합성곱의 결과 크기보다 패딩을 씌운 후 합성곱의 결과 크기가 더 큰 것을 확인할 수 있습니다. 만약 패딩을 더 두껍게 씌운다면, input 크기와 동일한 output 크기가 나올 수도 있고, 혹은 더 큰 크기의 output의 결과가 나올 수도 있을 것입니다.
패딩 유무에 따른 output 크기 차이 (input: 파랑, output: 초록),
출처: vdumoulin github (https://github.com/vdumoulin/conv_arithmetic)
- 풀링 (Pooling) 만약 input 데이터의 크기가 너무 커서 아무리 CNN 레이어를 통과시켜도 여전히 output 데이터가 큰 경우가 있을 것입니다. 이런 경우 보통 커널이 움직이는 stride를 크게하여 output 데이터를 크게 줄이는 방법이 있을 수 있지만, 이러한 해결 방법은 세세하게 이미지를 보지 않는 문제점이 존재합니다. 이렇게 데이터의 크기를 줄이고 싶을 때, 모델의 사이즈를 좀 작게 만들고 싶을 때 사용하는 것이 바로 풀링입니다.
아래 그림의 풀링은 2의 kernel크기를 가진 2 stride의 풀링의 예시입니다. 아래 그림을 보면 바로 이해할 수 있듯이 데이터의 크기를 줄이는 역할을 하는 것입니다. 그리고 당연히 어떤 범위에 대해서 얼마나 움직일건가에 대한 kernel 크기와 stride를 정해주어야 합니다. 그리고 pooling은 max pooling과 average pooling이 많이 사용되는데, 전자는 kernel 범위에 있는 최대값을, 후자는 평균값으로 데이터를 퉁쳐버리는 것입니다.
Max pooling과 average pooling
그럼 풀링을 함으로써 얻는 이득은 무엇이 있을까요?
- 데이터의 크기가 줄어들고, 모델이 가벼워짐으로써 메모리 등 source 절약이 된다.
- 풀링을 함으로써 데이터의 크기 및 모델의 파라미터의 수가 줄어어들게 되고, overfitting (과적합)을 방지한다.
CNN의 파라미터 수와 특정 데이터에 CNN을 수행한 결과의 크기는 어떻게 바뀌는가? (공식)
위에서 첫 번째와 두 번째 의문을 살펴보았습니다. 그럼 이제 세 번째 의문인 CNN의 파라미터 수와 input, output의 결과 크기를 어떻게 계산할 수 있는지 보겠습니다.
- CNN 파라미터 개수 계산 위에서 CNN의 파라미터는 바로 커널이라고 했습니다. 그럼 우리는 파라미터의 개수를 계산하기 위해서 커널만 보면 되는 것입니다. 그럼 아래의 경우 파라미터 개수는 이렇게 계산됩니다.
- 인풋 아웃풋 크기 변환 공식 하나의 레이어를 통과했을 때 input 데이터의 크기가 어떻게 변하는지 계산하는 것은 매우 중요합니다. 왜냐하면 그 결과를 바탕으로 다음 레이어의 필터와 stride를 정해줘야하기 때문이죠. 참고로 크기를 계산할 때는 데이터의 채널 수는 상관 없습니다. 채널 수는 사용한 커널의 개수대로 정해지기 때문입니다. 예를 들어 위에서 파라미터 구하는 문제의 경우 10개의 커널을 사용했으므로 3개의 채널의 가진 input 데이터에 대한 output 데이터의 채널 수는 10이 되는 것이지요. 각설하고 크기 변환 공식은 아래와 같습니다.
Input: 3 * 32 * 32, Kernel: 5 * 5 크기 10개
결과: (3 * 5 * 5 + 1) * 10 = 760
해설: Input 데이터의 채널이 3이므로 커널의 채널도 3이어야함. 그리고 bias term을 1 더해주고, 이러한 커널이 10개가 존재하므로 760의 파라미터를 가짐.
Input: 3 * 7 * 7, Kernel: 3 * 3 크기 10개, Stride: 1, Padding: 1
결과: (7 - 3 + 2*1) / 1 + 1 = 7, ouptut size: 10 * 7 * 7
해설: 위의 공식을 대입한 결과이며, output 데이터의 채널 수 10은 필터 개수를 의미.
Input: 3 * 21 * 21, Kernel: 4 * 4 크기 5개, Stride: 2, Padding: 0
결과: (21 - 4 + 2*0) / 2 + 1 = 9.5, ouptut size: 5 * 9 * 9
해설: 위의 공식을 대입했을 때 결과가 나누어 떨어 지지 않는 경우, 소수점 아래는 버림.
Input: 3 * 10 * 21, Kernel: 2 * 3 크기 5개, Stride: (1, 2), Padding: 1
결과: 세로: (10 - 2 + 2*1) / 1 + 1 = 11, 가로: (21 - 3 + 2*1) / 2 + 1 = 11, ouptut size: 5 * 11 * 11
해설: 가로, 세로의 길이가 다른 데이터에 대해 직사각형의 kernel과 방향마다 움직이는 stride가 다를 경우 따로 계산.
CNN 계산이 가능한 데이터는 가로, 세로의 크기만 가진 이미지 데이터 뿐인가?
이제 마지막 의문입니다.
이 부분은 설명할 내용이 많기 때문에 아래의 "CNN의 종류"에서 이어서 설명하도록 하겠습니다.
2D CNN
우리가 위에서 주야장천 예를 들었던 경우는 바로 2D CNN 입니다.
바로 (batch * channel * height * width)의 크기를 가진, batch 포함 4차원의 데이터인 것이죠.
- Input 데이터 크기: 4차원 (batch * channel * height * width)
- 예시: 이미지 데이터 등
1D CNN
하지만 우리가 이미지와 같은 데이터만 CNN을 적용할 수 있는 것이 아닙니다. 바로 자연어와 같은 데이터에도 바로 CNN을 적용할 수 있습니다. 다만 달라지는 것은 가로, 세로 크기 대신 문장의 길이만 나타내는 크기가 있으며, 이미지에서 채널이라고 불리는 것이 바로 각 토큰의 임베딩 된 값인 hidden size가 되는 것이지요.
- Input 데이터 크기: 3차원 (batch * hidden * length)
- 예시: 자연어 데이터 등
1D CNN 예시, 출처: Convolutional Neural Networks for Sentence Classification paper
3D CNN
CNN을 1D, 2D뿐 아니라 3D에 대해서도 적용할 수 있습니다.
이것은 이미지 데이터의 가로, 세로에 새로운 차원이 더 추가되는 데이터에 적용 가능합니다.
예를 들어 이미지 데이터에 sequence가 더해지는 비디오나, CT scan 같은 예시가 이러한 경우 입니다.
- Input 데이터 크기: 5차원 (batch * channel * height * width * sequence)
- 예시: 비디오 데이터, CT scan 등
3D CNN 예시, 출처: https://towardsdatascience.com/understanding-1d-and-3d-convolution-neural-network-keras-9d8f76e29610
2D Transposed CNN
이번에는 transposed CNN에 대해 알아보도록 하겠습니다.
그중에서도 우리가 가장 개념적으로 이해하기가 쉬운 2D에 대해서 한 번 개념을 살펴보고 1D, 3D에 대해서 알아가보도록 하겠습니다.
Transposed CNN은 CNN의 반대의 연산이라고 개념적으로 이해할 수 있습니다. 다만, 오직 개념적으로 역연산일 뿐이지 절대로 수학적으로 역연산이 아닙니다.
예를 들어 (input * 3)의 연산의 역연산은 바로 (input / 3) 입니다.
이처럼 CNN의 수학적인 역연산을 deconvolutional 이라 부르고, transposed CNN은 절대로 deconvolutional 연산이 아닙니다.
다시 한 번 강조하지만, 개념적으로 역연산처럼 동작한다는 것입니다.
각설하고 기본적으로 transposed CNN은 input 데이터의 크기를 늘려줄 수 있습니다.
CNN을 통해서 input 데이터의 크기를 늘리는 방법은 패딩을 무지하게 넣은 후 output 결과를 크게 만드는 것이지만 이는 결코 CNN의 성능이 좋아질 수 없습니다.
하지만 transposed CNN은 패딩 없이도 기본적으로 input 데이터의 크기를 늘려주는 역할을 합니다.
아래 그림을 보면 input 데이터 숫자에 대해 커널 값을 곱한 결과를 사용하는 점은 CNN과 동일합니다.
하지만 stride를 옮겨가면서 계산된 결과가 이전 결과와 겹쳐진 부분은 더한다는 연산이 추가 됩니다.
이것이 바로 transposed CNN의 계산 방법입니다.
2D transposed CNN 연산 방법
여기서 주의할 점이 있습니다.
아래 그림의 CNN 부분의 padding은 input 데이터에 적용시켜 그 결과를 냈다면, transposed CNN은 개념적으로 CNN의 반대의 연산이기 때문에 input 데이터에 padding을 씌우지 않습니다.
다만 output의 결과가 padding을 씌운 크기의 결과값이 나올 것이라고 가정하고 연산을 진행합니다. 그리고 실제로 ouptut에 가정한 padding을 생략한 결과가 최종 결과가 되는 것이지요.
즉 transposed CNN 부분에 보면 output에 padding을 씌운 결과의 크기가 나올 것이라고 예상을 하여 연산을 한 후, 최종적으로 3 * 3의 padding을 제외한 값이 output이 되는 것입니다.
2D CNN과 2D transposed CNN의 비교
그리고 CNN처럼 transposed CNN도 input에 대한 output의 예측 결과를 계산하는 공식이 있습니다. 또한 CNN과 마찬가지로 크기를 계산할 때는 데이터의 채널 수는 상관 없습니다. 채널 수는 사용한 커널의 개수대로 정해지기 때문입니다.
Input: 3 * 7 * 7, Kernel: 3 * 3 크기 10개, Stride: 1, Padding: 1
결과: (7 - 1)*1 - 2*1 + 3 = 7, ouptut size: 10 * 7 * 7
해설: 위의 공식을 대입한 결과이며, output 데이터의 채널 수 10은 필터 개수를 의미.
Input: 3 * 21 * 21, Kernel: 4 * 4 크기 5개, Stride: 2, Padding: 0
결과: (21 - 1)*2 - 2*0 + 4 = 44, ouptut size: 5 * 44 * 44
해설: 데이터의 크기가 커짐.
Input: 3 * 10 * 21, Kernel: 2 * 3 크기 5개, Stride: (1, 2), Padding: 1
결과: 세로: (10 - 1)*1 - 2*1 + 2 = 9, 가로: (21 - 1)*2 - 2*1 + 3 = 41, ouptut size: 5 * 9 * 41
해설: 가로, 세로의 길이가 다른 데이터에 대해 직사각형의 kernel과 방향마다 움직이는 stride가 다를 경우 따로 계산.
- Input 데이터 크기: 4차원 (batch * channel * height * width)
- 예시: Upsampling이 필요한 이미지 데이터, DCGAN 등
1D Transposed CNN
1D transposed CNN은 1D CNN처럼 자연어에 사용될 수 있습니다. 1D에서의 연산 또한 2D에서의 연산과 마찬가지로 겹치는 부분은 더해주는 연산이 추가됩니다.
- Input 데이터 크기: 3차원 (batch * hidden * length)
- 예시: 자연어 데이터 등
1D transposed CNN
3D Transposed CNN
3D transposed CNN은 3D CNN처럼 sequence의 정보가 추가된 데이터에 적용할 수 있습니다.
- Input 데이터 크기: 5차원 (batch * channel * height * width * sequence)
- 예시: Upsampling이 필요한 비디오 데이터 등
ImageNet
ImageNet은 1,000만개 이상의 이미지 데이터가 있는 대용량 benchmark 데이터셋 입니다(ImageNet 데이터를 사람이 직접 라벨링 하는 데 22년이 소요되었으며, 이러한 소모성 노동을 막기 위해 self-supervised learning (SSL), semi-supervised learning 등 다양한 학습 기법 개발의 초석이 되었습니다).
한창 CNN 모델을 바탕으로 이미지 정확도를 높이기 위한 vision 대회가 유행일 때 이 데이터를 바탕으로 많은 모델들이 등장했습니다.
그중 몇 가지를 소개하려 합니다.
- AlexNet (2012): ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 대회의 우승을 차지한 CNN 구조이며, CNN 연구가 활발히 이루어진 계기가 된 연구. 두 개의 CNN 파이프라인이 병렬로 이루어짐.
- GoogLeNet (2014): ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 대회의 우승을 차지한 CNN 구조이며, 1 * 1 convolutional 연산이 등장하고, 22층 깊이의 레이어로 구성.
- VGGNet (2014): ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 대회의 준우승을 차지한 CNN 구조이며, 그 깊이에 따라 여러 종류의 모델이 있음. 준우승 모델임에도 불구하고 사용하기 쉽다는 장점 덕분에 GoogLeNet보다 많이 사용되는 모델.
- ResNet (2015): ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 대회의 우승을 차지한 CNN 구조이며, residual connection이라는 개념을 이용하여 혁신적으로 gradient vanishing 현상을 해결하여 성능 개선을 이루어낸 모델. 사람보다 더 좋은 결과를 낸 모델. ResNet 글 참고.
- Inception V3 (2015): GoogLeNet을 응용한 CNN 구조이며, Inception 모델 중 가장 유명한 버전. GAN 모델 평가를 위해 사용되는 Inception score (IS) 지표에 사용되는 모델.
Deep Convolutional GAN (DCGAN)
DCGAN에서는 작은 차원의 노이즈로부터 높은 차원의 이미지를 생성하는 데 2D transposed CNN이 사용됩니다. 즉 upsampling을 하는 데 CNN이 사용 되는 것이지요. DCGAN에 관한 설명은 DCGAN 글을 참고하시기 바랍니다.
Convolutional Autoencoder (CAE)
Autoencoder는 데이터의 특징을 추출하는 manifold learning의 일종입니다. Vanilla autoencoder 같은 경우는 linear layer로 구성되어 있지만, 좀 더 복잡한 데이터에 대한 특징을 추출하기 위해서 linear layer 대신 convolutional layer을 이용하기도 합니다. 즉 encoder 부분에서는 CNN, decoder 부분에서는 transposed CNN을 사용하는 것이지요. Autoencoder에 관한 설명은 manifold learning 글을 참고하시기 바랍니다.
Semantic Segmentation
Semantic segmentation은 각 이미지 별로 미리 지정된 클래스 개수에 맞춰 이미지를 픽셀 단위로 쪼개어 각 픽셀의 클래스를 예측하는 것입니다. Semantic segmentation은 컴퓨터 비전 분야에서 가장 핵심적인 기술이며, 이미지의 모습을 완벽하게 이해하고 있어야하기 때문에 최근 자율주행에서도 자주 쓰는 기술이기도 합니다. 또한 이를 위해서 만들어진 MS COCO, PASCAL VOC 등의 많은 데이터가 존재합니다. Sematic segmentation 분야도 CNN의 딥러닝 기법을 활용하여 빠르게 발전하였습니다.
- Fully Convolutional Network (FCN) (2015): 기존 이미지 분류 모델은 pooling과 같이 이미지 차원을 줄이는 레이어가 존재하여 segmentation을 위한 모델로써 적합하지 않음. 하지만 이미지의 차원을 줄이지 않으면 메모리 초과 문제가 발생. 이러한 문제점의 합의점으로써 인코더, 디코더 기반으로 제작된 모델임.
- U-Net (2015): FCN을 확장한 개념으로, down-sampling 부분과 up-sampling 부분이 대칭으로 U의 형태를 띠고 있음. 그리고 down-sampling 할 때 결과를 up-sampling 할 때 그대로 concatenate 한다는 특징이 있음.
- ReSeg (2015): CNN과 pooling을 RNN을 통해 구현한 ReNet에서 파생되어 나온 segmentation 모델. CNN과 RNN을 결합하여 사용하였으며, up-sampling 과정에서 transposed CNN을 사용.
- DeepLab V3+ (2018): FCN도 down-sampling 등을 진행하면서 데이터 정보의 손실이 발생함. 이를 해결하기 위해서 ResNet을 적용하고, 확장 비율이라는 새로운 변수를 도입하여 정보 손실의 문제를 해결.
Semantic segmentation 예시, 출처: DeepLab V3+ paper
Image Colorization
이미지에 있어서 색은 매우 중요한 요소입니다.
CNN은 색의 특징을 통해 그 물체가 무엇인지 파악하거나, 알맞는 특징을 추출합니다.
그만큼 색은 이미지의 정보를 많이 내포하고 있습니다.
특히 colorization 분야는 흑백 이미지를 칼라 이미지로 바꾸는 데 많이 활용되며, 영상에도 적용이 가능해서 흑백 영화의 색 복원에 사용됩니다.
- Colorful Image Colorization (2016): 이 모델은 ground truth와 동일한 이미지를 만드는 것이 아니라 그럴듯한 칼라로 흑백 이미지를 복원하는 것이 목적임.
Colorization 예시, 출처: Colorful Image Colorization paper
Image Captioning
Image captioning은 이미지에 캡션을 다는 알고리즘입니다.
이 기법은 이미지를 해석하는 CNN, 캡션 문장을 생성하는 RNN, 성능을 높이기 위한 attention mechanism으로 구성되어 있습니다.
이를 위해 사용되는 데이터는 Flickr 8k, Flickr 30k, COCO 등이 사용됩니다.
자세한 내용은 Image Captioning 글을 참고하시기 바랍니다.
Object Detection
Object detection은 현재 컴퓨터 비전 분야에 있어서 가장 중요한 기술이며, 지금까지도 계속 발전하고 있는 분야입니다.
또한 물체 탐지에 걸리는 시간과 정확성의 trade-off 성격을 지닌 특성 때문에 빠르고 정확하게 물체 탐지가 필요한 object detection 기법의 특성상 아직 발전할 부분이 많은 분야이기도 합니다.
- Region based CNN (R-CNN) (2014): 이 모델은 인풋 이미지에 대해 물체가 있을 법한 영역에 region proposal를 하고, 각각 제안된 영역 모두를 CNN을 거쳐야하므로 연산량이 많아져서 병목현상이 생김. 따라서 한 이미지당 물체 탐지 시간이 50초가 걸린다는 문제가 있음.
- Fast R-CNN (2015): R-CNN을 보완하고자 나온 모델. Fast R-CNN은 한 이미지를 CNN에 한 번만 거치고 나온 feature map에서 region of interest (RoI)을 바로 projection하기 때문에 병목현상의 문제를 해결. 하지만 region proposal 하는 것이 neural net으로 이루어 지지 않고 외부 알고리즘에 의해 수행되므로 시간 한 이미지당 2초 물체 탐지하는 데 2초 정도 소요되며, 여전히 실생활에 적용하기에는 어려움.
- Faster R-CNN (2016): Fast R-CNN의 속력을 향상 시키고자 등장. 이 기법은 region proposal network (RPN)이라는 물체가 있을 법한 영역 제안을 NN을 통해 하기 때문에 기존에 불가능했던 end-to-end 모델의 구현이 가능. 또한 RPN에 GPU 연산이 가능해짐 따라 그 한 이미지당 물체 탐지 시간이 0.2초로 속도가 Fast R-CNN에 비해 대폭 증가했다는 의의가 있음.
- You Only Look Once (YOLO) (2016): YOLO는 Faster R-CNN 보다 10배나 빠르게 작동하는 알고리즘. 이는 이미지를 그리드로 나누고 확률을 통해 물체를 탐지. YOLO는 빠른 속도를 지녔지만 작은 물체에 대해 Faster RCNN에 비해 정확성이 떨어진다는 단점이 존재.
3D Perception
3D 인지 기술은 2D 이미지 속의 3D 정보를 찾아내는 기술입니다. 멀리 있는 물체와 가까이 있는 물체를 구분하고 그 거리를 기반으로 segmentation 하거나 disparity map을 그리는 기법입니다. 이러한 딥러닝 모델을 학습하기 위해서는 이미지의 모습의 위치가 살짝 다른 두 가지의 인풋 이미지가 필요합니다. 또한 이 기법을 통해 이미지의 일부의 모습만 주어졌을 때 그 전체의 모습을 재현할 수 있으며, 다른 각도에서 본 모습을 예측할 수 있습니다. 추가로 자율주행에 있어서 특정 물체와의 거리를 파악하는 것은 중요하기 때문에 자율주행에 사용되는 기법이기도 합니다.
Motion
3D Perception에서 설명한 이미지의 깊이 파악에서 더 나아가 영상의 속도(차량 블랙 박스 영상 등)까지 파악하여 움직인 거리와 속도를 계산하는 인공지능도 존재합니다. 이는 영상의 물체 이동 속력과 그 방향을 탐지하고 움직인 거리, 방향 및 경로를 계산하는 알고리즘입니다.
Others
- Dehazing: 흐린 이미지를 선명하게 복구하는 기법. 자율주행 차량의 연구가 활발히 이루어지면서 각광받는 분야. 흐린날 이미지는 object detection의 성능이 급락하므로 dehazing 기술이 필수.
- Visual Question Answering (VQA): 주어진 사진에 대해 자연어로 주어진 문장을 해석하여 알맞는 답을 내어주는 기법. Multimodal learning의 일종.
- Deep Fake: 다른 사람의 얼굴을 합성하는 기법.
- Cycle GAN (2020): 이미지의 스타일을 바꾸는 기법.
- StyleGAN (2019): PGGAN의 구조를 사용하였으며, 점진적으로 합성하는 이미지의 크기를 키워가는 기법. 두 가지 이상의 이미지를 섞어 새로운 높은 해상도의 이미지를 생성하는 기법. 성능 향상에 따라 StyleGAN2, 3이 존재.
Cycle GAN 예시, 출처: Cycle GAN paper
StyleGAN 예시, 출처: StyleGAN paper
CNN 모델과 딥러닝을 바탕으로 컴퓨터 비전은 비약적인 발전이 일어났으며, 지금도 계속 연구되는 분야입니다.
하지만 CNN 모델 역시 여전히 해결하기 어려운 문제가 존재합니다.
이미지는 3D를 2D로 projection 한 결과물
이미지는 3D 세상을 2D로 projection 한 데이터입니다. 따라서 딥러닝 모델이 깊이, 3D의 맥락을 완벽히 이해하는 데 한계가 존재합니다.
착시 효과
인간은 뇌를 통해 이미지를 해석하지만, 딥러닝 모델은 이미지를 있는 그대로의 모습으로 해석하기 때문에 발생하는 문제점입니다. 아래 예시를 보겠습니다.
왼쪽 그림의 A 영역과 B의 영역의 색은 우리가 보기에 다른 색으로 보입니다. 하지만 실제로 픽셀 값으로 따져보았을 때는 이 둘은 완전히 같은 색입니다.
즉 컴퓨터는 픽셀 데이터로써 그림을 바라보기에 이 둘의 차이를 파악할 수 없게 됩니다.
오른쪽 그림의 두 괴물의 크기는 우리가 보기에 다른 다르게 보이지만 실제로는 같은 크기의 그림입니다. 이 또한 컴퓨터는 정학히 그림의 문맥을 파악할 수 없고, 같은 크기의 괴물로만 보게 되는 것이죠.
착시 예시
이미지 데이터의 문제
마지막으로 이미지 데이터 자체의 문제가 있습니다.
이미지는 데이터 양도 많지만 그 형태가 매우 다양합니다.
하지만 대부분의 딥러닝 모델은 일정한 크기의 벡터를 input으로 받기때문에 이미지의 형태 변형이 불가피합니다.
하지만 이미지의 형태를 변형하게 되면 이미지 내의 물체 위치 정보, 형태 정보 등이 손실되기 때문에 딥러닝 모델이 부정확한 정보를 습득하게 되고 모델의 강건성이 떨어지게 된다는 문제점이 있습니다.
다음에는 기본 CNN의 구조를 이용하여 MNIST 데이터를 분류하는 실험을 해보도록 하겠습니다.