🌟 CNN(Convolution Neural Network, 합성곱 신경망)은 이미지 처리에 널리 사용되는 딥러닝 모델이다. Convolution Layer와 Pooling Layer를 반복적으로 거치며 이미지의 특징을 추출한 뒤, 이 특징들을 가지고 Fully Connected Layer에서 Classification을 수행한다.
▶︎ CNN의 등장 배경 : FCN이 이미지 처리에 적합하지 않음
기존 Fully Connected Layer로만 이루어진 Neural Network는 단일 1차원 벡터를 input으로 받고, hidden layer를 거쳐 output을 내놓는다. 하지만 정형데이터화 된 이미지는 'width * height * channel'의 배열이므로 기존 Neural Network에 이미지를 입력하기 위해서는 3차원의 이미지 텐서를 1차원으로 평면화(Flatten)시켜야 한다. 이 과정에서 3차원 이미지의 공간적인 구조가 소실된다.
또한 이미지의 크기가 커짐에 따라 매개변수의 양은 quadratic하게 증가한다. 32*32*3의 이미지를 3072*1으로 stretch하여 FC 신경망에 입력한다고 해보자. 첫 번째 은닉층의 각 뉴런은 입력데이터의 모든 픽셀과 연결되므로 3072개의 가중치가 필요하다. 그런데 200*200*3 크기로 이미지가 더 커지면, 각 뉴런은 200*200*3 = 120,000개의 가중치를 학습해야 한다. 게다가 많은 뉴런을 사용할 것이므로 가중치의 개수는 매우 빠르게 증가한다. 이렇게 학습해야 하는 가중치의 수가 너무 많아지면 비효율적이고 오버피팅의 위험도 높아진다.
이러한 배경 속에서 Convolution Neural Network가 등장했다.

▶︎ CNN 구조

CNN의 구조는 [ CONV + RELU & POLL ] X N ➡︎ Flatten ➡︎ FC ➡︎ Softmax 이다.
이 전체 구조는 기능에 따라 특징을 추출하는 Feature Learning, 추출한 특징을 통해 이미지를 특정 클래스로 분류하는 Classification으로 나눌 수 있다.
먼저 특징 추출(Feature Learning)을 위한 구조를 보자.
Convolution Layer에서는 입력 데이터에 필터를 적용하여 특징(feature)을 추출한다. 그리고 ReLU 활성화 함수를 적용하여 비선형성을 추가한다. 이후 이미지의 크기를 줄여 연산량을 줄이고, 더 중요한 feature를 강조하기 위해 Pooling layer를 거친다. CNN에서는 주로 Max Pooling을 사용한다고 한다.
이러한 과정을 거쳐 특징을 추출했다면, 추출한 이미지의 특징이 무엇인지를 분류하는 Classification이다. Conv와 Pooling Layer를 거친 결과(Feature Map)를 Flatten(1차원 벡터로 변환)한다. 이 벡터는 FC Layer에 전달하여 각 특징이 특정 클래스를 나타낼 확률을 학습한다. 마지막으로 Softmax 함수를 적용하여 각 클래스에 대한 확률을 계산한다.
▶︎ CNN의 장점
CNN은 기존 FCN의 문제점을 해결한다.
(1) 공간적 구조(Spatial structure) 보존 가능
FCN은 입력데이터를 1차원 벡터로 펼쳐 사용함으로 인해 공간 정보가 소실되었다. 하지만 CNN의 Conv 연산은 Filter를 사용하기 때문에 한 번에 전체 이미지를 보는 것이 아니라 작은 영역을 바라보고, 이는 이미지의 공간 구조를 유지하면서 특징을 추출할 수 있게 만들어준다.
(2) 가중치 공유(Weight Sharing)를 통해 학습해야 할 파라미터 개수 감소
FCN에서는 이미지의 모든 픽셀이 모든 뉴런과 연결되므로 가중치의 개수가 엄청나게 많아졌다. 하지만 CNN의 Conv Layer에서 Filter는 이미지 전체에서 동일한 가중치를 공유하므로 훨씬 적은 수의 가중치만 학습하면 된다.
(3) 계층적 특징 학습이 가능 (Hierarchical Feature Learning)
CNN은 여러 Layer를 거치며 입력 이미지를 단계적으로 학습, 점점 더 복잡한 특징을 인식한다. 예를 들어 첫 번째 Conv Layer에서는 가장 기초적인 엣지(수평선, 수직선)의 특징을 학습하고, 두 번째 Conv Layer에서는 텍스처 패턴(곡선, 점)을 감지하고, 세 번째 Conv Layer에서는 더 구체적인 형태(눈, 타이어, 숫자)를 감지할 수 있다. 그리고 마지막 FC Layer에서 전체 객체를 분류하게 된다.

여기서 핵심은 Pooling Layer이다. Pooling Layer는 Feature Map의 크기를 줄여주는데 이는 모델이 점점 더 넓은 영역을 학습하도록 한다. 똑같은 3*3 필터라도, 처음에 3*3 필터로 작은 픽셀 단위의 엣지만 감지했다면 Pooling을 거친 후에는 같은 3*3 크기의 필터가 픽셀 단위로는 더 넓은 영역의 패턴을 감지하는 것이다. Pooling을 거치면서 개별적인 픽셀보다 더 큰 구조적인 패턴을 이해하게 되고, 또 점점 가장 강한 특징만 남기므로 더 중요한 특징만 남겨서 학습하게 된다.
(4) 위치 변화에도 일관된 특징 학습/추론이 가능 (공간 불변성)
필터는 이미지 전체에서 같은 방식으로 적용되기 때문에 한 필터가 특정 패턴을 감지했다면, 해당 패턴이 이미지의 어느 위치에 있든 감지할 수 있다. 다양한 시각적 변형에 강하다.
▶︎ CNN 모델 아키텍처
- VGGNET ( 필터 크기를 작게 하면서 깊게 층을 쌓기)
- RESNET (네트워크 layer를 깊게 쌓을수록 optimize가 어려워지므로 short connection을 추가함. 각 block에서 잔차만 학습하면 될 수 있게끔)
- ResNet-50 : 2048차원의 Embedding
+ Computer Vision Task
1. Classification
2. Segmentation - 픽셀 단위, 출력값의 형식이 이미지 가로세로 차원수와 동일해야 함
3. Object Detection - Localization + Classification
4. Instance Segmentation
참고 자료
https://wikidocs.net/263755
https://cs231n.github.io/convolutional-networks/
https://rubber-tree.tistory.com/116
멀티모달인공지능 수업 Unimodal Representation: Image를 복습하며 CNN에 대해 대략적으로 정리해보았다.