딥러닝 CV&LLM

[딥러닝 컴퓨터비전] 컴퓨터의 이미지 표현법과 합성곱 신경망(CNN)을 활용한 이미지 분류기

컴퓨터비전 LCK 2024. 3. 26. 16:19

(딥러닝에 대한 사전지식이 없으신 분들은 딥러닝 기초이론 편을 마치고 오시면 좋을것 같습니다!)

 

이번 포스팅에서는 컴퓨터가 이미지를 해석하는 방법과 합성곱 연산에 대해 알아보겠습니다.

예시 이미지

위 사진을 볼까요?

 

저는 이 사진을 보라색 장식의 모자를 쓴 여자정도로 표현할 수 있을 것 같은데요, 컴퓨터는 과연 이 사진을 어떻게 해석할 까요?

 

 

딥러닝 프레임워크 pytorch를 이용한 이미지 표현입니다. 512 x 512 의 RGB이미지가 각각 세 장이 겹쳐 있는 형태라고 볼 수 있겠네요.

 

컴퓨터의 이미지 해석법

 

컴퓨터는 각각의 RGB 이미지에 한 픽셀당 0~255의 정수값을 부여하여 해당 픽셀의 밝기를 조절하고, 이렇게 표현된 이미지 파일이 우리에게 보여지게 됩니다.

 

이제 위와 같은 컴퓨터의 이미지 해석법을 활용하여 이미지를 넣어주었을 때 이 이미지에 담긴 객체가 강아지인지, 고양이인지, 혹은 말인지 분류하는 딥러닝 분류기를 만들어보겠습니다.

 

위 사진은 딥러닝 이미지 분류기의 전체적인 개요입니다. 크게 특징 추출(feature extractor)부와 분류기(classifier)로 나눌 수 있습니다.

 

먼저 Convolution이라는 합성곱 연산을 거쳐 특성 맵(feature map)을 얻게 되구요, 그 다음으로 해당 특성 맵을 1차원 벡터로 평탄화(flatten)해준 뒤 소프트맥스 선형 분류기를 거쳐 최종 예측 결과를 출력하게 됩니다.(만약 이진분류기라면 마지막에 소프트맥스가 아닌 시그모이드 함수를 거치게 되겠죠?)

 

그렇다면 분류기는 딥러닝 기초이론에서 배우고 왔는데, 이미지의 특징은 어떻게 추출하는 것일까요?

 

합성곱 연산(convolution operation)풀링(pooling) 과정을 반복하여 분류기에 들어갈 최종 특성맵을 얻습니다.

 

먼저 합성곱 연산(convolution operation)에 대해 알아보겠습니다.

 

필터(filter)가 입력 텐서(input tensor)를 스캔합니다. 스캔 중 겹치네 픽셀들 끼리 곱하고 더해 출력 텐서를 만들어냅니다. 이를 합성곱 연산(convolution operation)이라고 합니다.

 

출력 텐서의 왼쪽 위의 값(370)을 살펴보면 (1*10+2*20+4*30+5*40)의 연산결과임을 알 수 있죠. 바로 이 연산을 합성곱 연산이라고 부릅니다.

 

필터가 어떤 역할을 하는지 보다 쉽게 이해하기 위한 사진을 첨부하겠습니다.

수직 필터(vertical filter)를 사용하여 합성곱 연산을 한 결과로 얻은 특성 맵은 수직 성분(중간의 선)을 검출하였고, 수평 필터(horizontal filter)를 사용한 합성곱 연산 결과는 수평 성분(가로줄 픽셀 정보는 모두 같음)을 검출하였네요.

 

이외에도 많은 종류의 필터들이 있으나, 딥러닝을 활용한 이미지 특징 추출기에서는 이러한 수작업 필터를 쓰지 않고 필터에 들어가는 수들을 파라미터로 하여 역전파 학습을 통해 얻은 숫자를 필터들로 사용하게 되고, 이 필터들은 아주 다양한 엣지(edge)들을 검출해낼 수 있게 해줍니다.

 

선형회귀모델에서의 weight 값을 학습하는 방법과 합성곱 연산에서 필터값들을 학습하는 방법이 같습니다.

 

정답값을 주고 컨볼루션 레이어를 거치면서 학습하며 필터의 정수값을 알아서 학습하고, 학습이 완료된 후 그 필터를 이용하여 인풋 이미지의 특징을 추출하는 거죠.

여러가지 필터로 추출한 특성 맵

 

합성곱 연산 후, 풀링(pooling)이라는 과정을 거치게 됩니다.

 

합성곱 연산으로 얻은 특성 맵을 압축하는 과정이라고 보시면 됩니다.

풀링(pooling)

 

지정된 커널 사이즈 안에서의 대표값을 추출하는 것이죠.

 

max pooling은 가장 큰 값을 대표값으로, average pooling은 평균값을 추출해냅니다.

 

이 풀링 과정을 통해 연산량을 줄일 수 있습니다.

 

 

잠시 합성곱 연산과 풀링 시에 고려할 점 3가지를 짚고 넣어가도록 하겠습니다.

 

1. Stride는 보폭을 의미합니다. 필터(혹은 커널)가 스캔을 할 때 다음 컨볼루션 연산이나 풀링을 위해 얼마나 움직여야할 지를 의미합니다.

stride 가 2일때 합성곱 연산

 

2. 패딩(padding) 기법을 사용해 합성곱 연산 후 텐서의 크기가 작아지는 것을 방지합니다.

padding 유무에 따른 출력 텐서의 크기 차이

 

3. 필터의 깊이(depth)는 인풋 텐서의 깊이와 같습니다. 한개의 필터는 한개의 특성 맵을 만듭니다.

 

이제 합성곱 연산과 풀링을 통한 특징 추출에 대한 설명이 끝났습니다.

 

이 과정들을 반복하여 이미지의 특징을 수집하게 되고 최종 특성 맵을 1차원 벡터로 평탄화 하여 softmax 분류기에 넣어주기만 하면 이미지를 보고 객체가 무엇인지 예측하는 예측 모델을 만들 수 있습니다.

 

vgg16의 구조

 

위는 딥러닝 이미지 분류기로 유명한 vgg16 모델의 구조입니다. 보시면 convolution과 pooling을 5번 반복하고 classifier로 넘겨주는 것을 확인 할 수 있습니다. 풀링 레이어를 거칠 때마다 픽셀들이 한 축 당 1/2이 되는 것 역시 확인하실 수 있으실 겁니다.

 

넘겨받은 특성 맵은 평탄화 되어 분류기(classifier)를 거치게 되고 최종 출력으로 분류 결과를 예측합니다.

 

이렇게 합성곱 연산을 기반으로 하여 특징을 추출하는 딥러닝 신경망을 CNN(Convolution Neural Network)이라고 부릅니다.