컴퓨터가 사물을 보는 방법, CNN 이론 - 1편

컴퓨터가 인간보다 잘 하는 몇 가지 분야가 있는데, 그 중 하나가 바로 이미지 인식입니다. 2012년 알렉스넷이 개발된 이후 컴퓨터 비전 분야는 급속도로 성장하여 우리 일상에 자연스럽게 스며들었습니다. 오늘 포스팅에서는 컴퓨터가 이미지를 어떻게 인식할 수 있는지 이론을 중심으로 살펴보도록 하겠습니다.

1. 컴퓨터 비전의 과거

우리가 모니터를 통해 바라보는 이미지의 구조부터 알아보겠습니다. <그림 1>은 고양이의 이미지가 모니터에 어떤 원리로 표시되는지 나타낸 그림입니다.

<그림 1> 이미지 구조

컬러 이미지는 같은 크기의 3개의 R,G,B 행렬로 구성되어 있습니다. 각 색상채널(R, G, B)의 강도는0부터 255까지의 값으로 표현됩니다. 각 픽셀은 세 가지 색의 조합으로 표현됩니다. 예를 들어 빨강 채널의 값이 255이고 나머지 두 채널의 값이 0이면 빨간색이 표현되고, 모든 채널의 값이 255이면 흰색이 됩니다.

<그림 2> 고전적인 이미지 분류 방식

Edge detection 수행

Corners detection 수행

Rule based classification 수행

1.1.  Rule based classification 수행 방법

딥러닝 이전의 이미지 분류는 Edge와 Corner를 찾아 이미지를 정제한 후 Rule을 이용해 분류하는 방식으로 수행되었습니다. 자세히 살펴보면 먼저 이미지에서 물체의 경계선을 찾아내는 작업인 Edge detection을 수행합니다. Edge란 픽셀의 밝기 값이 급격하게 변하는 부분을 의미합니다. 일반적으로 배경과 객체 또는 객체와 객체의 경계에서 이러한 현상이 일어납니다. 픽셀의 값을 함수로 가정하여 미분을 진행한 후 미분값이 기준치를 초과하는 부분을 Edge로 인식합니다. 다음으로 Corner detection은 Edge가 꺽이는 부분을 찾아내는 알고리즘입니다. Edge와 마찬가지로 픽셀의 값이 급격하게 변하는 부분을 탐지하는 방식을 이용합니다. Edge와 Corner는 이미지의 주요 참고점이 되기 때문에 분석을 할 때 매우 중요한 포인트입니다. 이제 이 값을 이용하여 인간이 사전에 정한 규칙에 의하여 이미지를 분류합니다. 예를 들어 “삼각형 2개(귀) 밑에 원 2개(눈)가 존재한다면 고양이라고 분류하여라” 등의 Rule을 사전 정의하는 작업이 필요합니다.

1.2.  고전적인 이미지 분류의 한계점

<그림 3> 이미지 분석시 고려해야할 점

Rule 정의는 고되고 힘든 작업입니다. 개발자의 판단으로 Rule을 설정해주어야 합니다. 100개의 카테고리를 분류하는 모델을 만들고자 한다면 Rule 설정 작업을 100번 수행해야 합니다. 힘들게 정의한 Rule의 성능이 좋다고 보장할 수도 없습니다. 예를 들어 그림3처럼 고양이가 서있는 경우, 누워있는 경우, 어둠 속에 있는 경우 등 모든 자세를 정의해야 하고 여러 종의 고양이를 모두 고양이로 인식시키기는 쉽지 않습니다. 그렇기 때문에 Rule 기반 모델은 강건(Robust)하지 않습니다.

2.     퍼셉트론

퍼셉트론은 인공신경망의 구성요소로서 다수의 값을 입력 받아 하나 또는 여러 값으로 출력하는 알고리즘입니다. 퍼셉트론은 Perception(지각)과 neuron(신경)의 합성어이며 인공 뉴런이라고도 불립니다. 퍼셉트론에 어떤 기법을 적용하는지에 따라 CNN(Convolution Neural Network), RNN(Recurrent Neural Networks), LSTM(Long Short-Term Memory models) 등으로 분류됩니다.

2.1.  단층 퍼셉트론

<그림 4> 단층 퍼셉트론

값을 보내는 단계와 값을 받아서 출력하는 두 단계로만 이루어진 퍼셉트론을 단층 퍼셉트론이라고 합니다. 이 때 두 개의 층을 입력층(input layer)과 출력층(output layer)이라고 합니다. 입력층은 입력 데이터가 주어지는 곳으로, 주로 실제 데이터나 특징 값들이 이 층으로 들어옵니다. 입력층의 노드 수는 입력 데이터의 차원에 따라 결정됩니다. 출력층은 최종 예측 값이 출력되는 곳입니다. 문제에 따라서 하나의 노드일 수도 있고, 다중 클래스 분류 문제인 경우 여러 개의 노드로 구성될 수 있습니다. 입력층과 출력층 사이의 가중치 부분을 은닉층(hidden layer)이라고도 합니다. 은닉층의 가중치는 학습에 의해 계산되는 하이퍼 파라미터입니다. 단층 퍼셉트론은 계산량은 적으나 모델 구조가 너무 단순하여 비선형적인 데이터에 적합하지 않은 단점이 있습니다.

2.2.  다층 퍼셉트론

<그림 5> 다층 퍼셉트론

위와 같이 은닉층이 여러 개인 퍼셉트론을 다층 퍼셉트론 혹은 심층 신경망(DNN)이라고 합니다. 결과값과 예측값을 비교하며 은닉층의 하이퍼 파라미터를 업데이트하는 과정이 이루어집니다. 회귀 혹은 이진분류의 경우 출력층에 1개의 노드를 가지고, 다중 분류의 경우 카테고리의 개수만큼 노드를 가집니다. 비선형적인 예측이 가능하고 복잡한 예측이 가능하다는 장점이 있지만 은닉층이 깊어질수록 많은 데이터와 계산 리소스를 요구하며 과적합(Overfitting) 등의 문제에 민감하다는 단점이 있습니다.

3. 합성곱층(Convolution layer)

CNN은 Convolutional Neural Network의 약자로, 합성곱(Convolution)을 이용하는 딥러닝 분야입니다. 그렇다면, 합성곱은 무엇이며 연산은 어떠한 방식으로 이루어지는것일까요? 이번에는 활용 사례에 대해 알아보겠습니다.

3.1. 합성곱의 구성요소

합성곱 연산은 주로 이미지 처리에 사용되며 이미지에서 특정한 패턴이나 특징을 감지하기 위해 필터를 이용하여 수행하는 연산입니다. 합성곱은 입력, 필터, 출력으로 구성되며 입력과 필터의 합성곱 결과가 출력으로 나타나는 형태입니다. 합성곱을 수행할 시 고려해야할 요소는 필터 크기와 stride입니다.

<그림 6> 합성곱의 구성요소

합성곱을 수행하게 되면 다음 그림 7처럼 이미지의 크기는 줄어들지만 특징은 뚜렷해집니다. 원의 경계선 픽셀과 배경 픽셀의 숫자 차이가 커진 것을 확인할 수 있습니다.

<그림 7> 합성곱 수행 전 후

3.2. 합성곱 연산

<그림 8> 합성곱 계산 방법

3x3의 Input 행렬이 있고 2x2 필터를 이용하여 합성곱을 수행한다고 할 때, 다음과 같은 순서로 연산이 이루어집니다.

<알고리즘> 합성곱 연산 수행

이 때 주의해야할 점은 행렬곱(Matrix Multiplication)이 아닌 원소 간 곱(Element-wise Multiplication)을 수행해야한다는 점입니다. 행렬곱은 행렬 A의 i번째 행과 행렬 B의 j번째 열을 순차적으로 곱하고 합한 값을 산출해내는 방법이고 원소 간 곱은 두 개의 동일한 크기를 가진 행렬에서 각 원소를 같은 위치에 대응하여 곱하는 연산입니다. 원소 간 곱을 마친 후에는 Stride만큼 건너뛰어 다른 입력 행렬로 다시 원소 간 곱을 진행합니다. Stride에 대해서 알아보도록 하겠습니다.

3.3. Stride

<그림 9> Stride별 출력 행렬 크기 차이

Stride를 직역하면 “보폭” 혹은 “발걸음”으로 해석할 수 있습니다. CNN에서 sride란 컨볼루션 연산을 할 때 필터가 입력 행렬 상에서 한 번에 얼마나 움직이는지를 나타내는 매개변수입니다. Stride 값은 필터가 한 번의 스텝으로 얼마나 이동할지를 결정하는데, 이는 출력 크기와 연산량에 영향을 줍니다. 보통 Stride는 다음과 같이 사용됩니다.

Stride 값이 1인 경우: 필터가 한 칸씩 이동하며 컨볼루션 연산을 수행합니다. 이는 가장 일반적인 방식이며, 일반적으로 많은 정보를 보존하는 데에 도움이 됩니다.

Stride 값이 2인 경우: 필터가 두 칸씩 이동하며 컨볼루션 연산을 수행합니다. Stride를 크게 하면 출력 크기가 작아지지만 계산량이 줄어들어 속도 향상이 가능합니다. 하지만 필터가 큰 특징을 놓칠 수 있습니다.

4. 정리

오늘 포스팅에서는 컴퓨터 비전의 과거와 CNN의 구성 요소, 퍼셉트론, 합성곱층에 대해 알아보았습니다. 과거에는 연구자가 규칙을 사전에 정의하여 이미지를 분류하는 방식이었지만 최근에는 다층 퍼셉트론을 이용한 인공신경망으로 이미지 분석을 수행합니다. 레이블된 데이터만 있으면 Rule을 지정해줄 필요 없이 모델이 스스로 학습한다는 장점이 있습니다. CNN이란 다층 퍼셉트론에서 은닉층 사이에 합성곱층을 추가한 구조를 의미합니다. 합성곱층으로 인해 이미지에서 특정한 패턴이나 특징을 감지하고 모델의 성능을 높일 수 있습니다. 합성곱 연산은 입력 행렬과 필터 행렬간의 원소곱 연산을 통해 이루어지며 입력행렬의 크기, 필터 행렬의 크기, Stride의 크기를 고려해야 합니다.

합성곱 신경망에는 합성곱 이외에 풀링, 활성화 함수, 드랍아웃 등 다양한 기법을 배치하여 모델의 성능을 향상킬 수 있습니다. 다음 포스팅에서는 이 기법들에 대해 다루어 보도록 하겠습니다. 감사합니다.