안녕하세요 :)
이미지의 의미적 분할에 활용되는 Fully Convolutional Network (FCN), U-Net과 같은 딥러닝 모델들을 다루기에 앞서 이들을 구성하고 있는 합성곱 신경망(Convolutional Neural Network; CNN)의 개념을 짚고 넘어가려고 합니다. 아래의 내용들은 《밑바닥부터 시작하는 딥러닝》 책을 참고해서 작성했습니다.
목차
- 합성곱 연산
- 패딩
- 스트라이드
- 출력 크기
- 풀링
합성곱 신경망 (CNN)
합성곱 신경망은 컴퓨터 비전(예시), 자연어 처리(예시) 등 다양한 분야에서 사용되고 있습니다. 특히, 컴퓨터 비전 분야에 사용되는 딥러닝 모델들은 합성곱 신경망의 개념을 적극적으로 활용하고 있습니다. 그런 이유는 이미지가 '형상'이라는 중요한 공간적 정보를 가지며, 합성곱 신경망이 이 정보들을 학습을 통해 이해할 수 있기 때문입니다. 그럼 어떻게 형상이라는 것을 학습할 수 있는지 살펴보겠습니다.
합성곱 연산
합성곱 신경망은 이름 그대로 합성곱 연산을 처리하는 신경망입니다. 합성곱 연산 방법은 아래 그림과 같습니다.
여기서 입력 데이터는 (높이, 너비)의 2차원 형태를 갖는 흑백 이미지라고 생각하시면 됩니다. 필터도 마찬가지로 (높이, 너비)의 2차원 형태로 합성곱 연산을 하기 위해 필요합니다. 필터는 커널(kernel)이라고 불리기도 합니다. 입력 데이터와 필터의 합성곱 연산을 통해 어떻게 화살표 오른쪽과 같은 결과가 계산되는지 설명하겠습니다.
식 (1) : 1*2 + 2*0 + 3*1 + 0*0 + 1*1 + 2*2 + 3*1 + 0*0 + 1*2 = 15
식 (2) : 2*2 + 3*0 + 0*1 + 1*0 + 2*1 + 3*2 + 0*1 + 1*0 + 2*2 = 16
합성곱 연산은 필터를 일정한 간격으로 이동하며 입력 데이터와 대응되는 원소끼리 곱하고 총합을 구합니다. 먼저, 빨간색으로 박스 친 부분에 대해서 필터를 적용하면 식 (1)과 같이 계산됩니다. 그 결과를 해당하는 위치에 저장하고, 이 과정을 모든 위치에서 수행하면 화살표 오른쪽과 같은 합성곱 연산의 출력을 얻을 수 있습니다.
만약, 여기에 편향까지 포함하면 아래와 같습니다. 편향은 하나의 값을 모든 원소에 더하게 됩니다.
3차원 합성곱 연산
앞에서는 2차원 입력 데이터를 다루는 합성곱 연산을 살펴봤습니다. 하지만 우리가 평소에 접하는 이미지는 높이 * 너비 * 채널(RGB)로 구성된 3차원 데이터 입니다. 여기서는 3차원 입력 데이터를 다루는 합성곱 연산을 살펴보겠습니다.
(1*2 + 2*0 + 3*1 + 0*0 + 1*1 + 2*2 + 3*1 + 0*0 + 1*2) + (3*0 + 0*1 + 6*3 + ... ) + (4*4 + 2*0 + 1*2 + ... ) = 63
2차원일 때와 비교하면, 채널 방향으로 입력 데이터가 늘어났습니다. 따라서 채널마다 입력 데이터와 필터의 합성곱 연산을 수행하고 그 결과를 더해서 하나의 출력을 얻습니다. 이러한 연산을 하기 위해서는 입력 데이터의 채널 수와 필터의 채널 수가 같아야 합니다.
3차원 합성곱 연산을 단순화하면 아래와 같은 그림처럼 나타낼 수 있습니다.
위 그림의 출력 데이터는 하나의 채널을 갖습니다. 출력 데이터를 다수의 채널로 내보내기 위해서는 다수의 필터를 사용해야 합니다. 아래 그림과 같이 Nf개의 필터를 적용하면 출력 데이터도 Nf개의 채널이 생성됩니다.
패딩 (Padding)
합성곱 연산을 수행하기 전, 입력 데이터 모서리 외곽 부분을 특정 값 또는 어떠한 규칙에 따라 채우기도 합니다. 패딩을 사용하는 목적은 합성곱 연산을 거치면서 출력 데이터의 크기(높이, 너비)가 작아지는 것을 막고 크기를 유지하기 위함입니다. 만약 합성곱 연산을 거칠 때마다 크기가 계속 작아지면 결국엔 크기가 1이 되어 합성곱 연산을 적용할 수 없습니다. 합성곱 신경망을 여러 층으로 깊게 구성하는 경우 패딩을 사용해서 이러한 문제를 방지할 수 있습니다.
예를 들어, (4, 4) 크기의 입력 데이터에 (3, 3) 필터를 합성곱 연산한다고 가정하겠습니다. 패딩을 적용하지 않는 경우에는 출력 데이터의 크기가 (2, 2)로 줄어들지만, 패딩을 적용하면 출력 데이터의 크기가 (4, 4)로 입력 데이터의 크기로 유지되는 것을 볼 수 있습니다.
패딩의 종류
- Zero padding : 패딩을 모두 0으로 채웁니다. 일반적으로 많이 사용합니다.
- Replicate padding : 패딩을 끝단의 값으로 채웁니다.
- Reflect padding : 패딩을 끝단을 중심으로 입력 데이터 내부 값과 대칭이 되도록 채웁니다.
- Circular padding : 패딩을 입력 데이터 내부 값이 순환되도록 채웁니다.
스트라이드 (Stride)
스트라이드를 한국어로 번역하면 '보폭'이라고 합니다. 즉, 필터를 적용하는 위치의 간격을 가리키며 스트라이드를 2로 설정하면 필터를 적용하는 윈도우가 두 칸씩 이동합니다. 여기서 윈도우(window)란 입력 데이터 중 필터와 연산이 되는 영역을 가리킵니다. 아래 그림에서 스트라이드가 1일 때와 2일 때 합성곱 연산이 다른 영역에 적용되는 것을 볼 수 있습니다.
출력 크기
지금까지 다룬 필터, 패딩, 스트라이드 크기를 사용하면 출력 크기를 수식화하여 계산할 수 있습니다. 입력 데이터 크기를 ($H_i$, $W_i$), 필터 크기를 ($H_f$, $W_f$), 출력 데이터 크기를 ($H_o$, $W_o$), 패딩을 $P$, 스트라이드를 $S$라 하면, 출력 크기는 다음과 같습니다.
$$ H_o = {{ H_i + 2P - H_f } \over S } + 1 $$
$$ W_o = {{ W_i + 2P - H_f } \over S } + 1 $$
여기서 $ { H_i + 2P - H_f } \over S $와 $ { W_i + 2P - H_f } \over S $가 정수로 나눠떨어져야 합니다. 만약 이 부분이 정수가 아니면 예상과 다른 출력 데이터를 얻을 수도 있으므로 주의해야 합니다.
풀링 (Pooling)
풀링은 높이, 너비 방향의 크기를 줄이는 연산입니다. 줄이는 방법으로 최대 풀링(Max Pooling), 평균 풀링(Average Pooling)이 주로 사용됩니다. 우선 그림을 통해 풀링 연산이 어떻게 이뤄지는지 살펴보겠습니다. 아래 그림은 2 * 2 최대 풀링을 스트라이드 2로 처리한 결과입니다. 일반적으로 풀링의 크기와 스트라이드는 같은 값으로 설정합니다 (여기서는 2 입니다).
마지막으로 풀링의 몇 가지 특성을 살펴보고 마치도록 하겠습니다.
- 학습해야 할 파라미터가 없음 : 최대값 또는 평균을 취하는 처리이므로 경사하강법 등 반복 학습 시 학습될 파라미터가 없습니다.
- 입력과 출력의 채널 수가 유지 됨 : 채널마다 독립적으로 풀링 연산을 취하기 때문에 채널 수 그대로 내보냅니다.
- 강건함 : 입력 데이터에 약간의 변화가 있어도 풀링 출력 데이터는 최대값 또는 평균이기 때문에 크게 변하지 않습니다.
이것으로 합성곱 신경망(CNN)에 대한 개념을 다뤘습니다. 다음 포스팅에서는 합성곱 신경망 개념을 활용해 이미지의 의미적 분할에 사용되는 딥러닝 모델 논문을 리뷰하도록 하겠습니다. 읽어주셔서 감사합니다 :)
'인공지능 > 컴퓨터 비전' 카테고리의 다른 글
OpenCV를 사용한 이미지 이진화 (cv2.threshold, cv2.adaptiveThreshold) (0) | 2023.02.14 |
---|---|
Fully Convolutional Networks (FCN) (0) | 2023.01.11 |
OpenCV를 사용한 이미지 처리 - 블러링 (cv2.blur, cv2.GaussianBlur) (0) | 2022.11.21 |
OpenCV를 사용한 이미지 처리 (설치, 읽기, 시각화) (2) | 2022.11.19 |
Semantic Segmentation (의미적 분할) (0) | 2022.08.28 |