08.4 딥러닝의 활용
지금까지 딥러닝을 활용한 예를 손글씨 숫자 인식이라는 이미지 분류를 중심으로 살펴보았습니다. 이는 ‘사물 인식’의 한 분야죠. 그러나 딥러닝은 사물 인식뿐 아니라 온갖 문제에 적용할 수 있습니다. 이미지, 음성, 자연어 등 수많은 분야에서 딥러닝은 뛰어난 성능을 발휘합니다. 이번 절에서는 딥러닝이 할 수 있는 것을 컴퓨터 비전 분야를 중심으로 몇 가지 소개하겠습니다.
8.4.1 사물 검출
사물 검출은 [그림 8-17]과 같이 이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 기술입니다.
그림 8-17 사물 검출의 예[34]

이 그림에서 보듯 사물 검출은 사물 인식보다 어려운 문제입니다. 지금까지 본 사물 인식은 이미지 전체를 대상으로 했는데, 사물 검출에서는 이미지 어딘가에 있을 사물의 위치까지 알아내야 합니다. 게다가 한 이미지에 여러 사물이 존재할 수도 있습니다.
이런 사물 검출 문제에 CNN을 기반으로 한 기법이 몇 가지 제안되었습니다. 이들 기법이 발군의 성능을 보여 사물 검출에도 딥러닝이 효과적임을 시사하고 있습니다.
지니가 마법 돋보기 안경을 통해 이미지 속 지나가는 고양이, 자동차, 사람의 위치마다 형형색색의 네모 상자(Bounding Box)를 치고 정확하게 라벨을 붙여 검출해 내는 장면을 도로시가 감탄하며 바라보고 있어요.
지니의 객체 검출(Object Detection) 특강
- 지니: “도로시, 이미지 전체가 뭔지 맞추는 사물 인식보다 어려운 게 바로 사물 검출(Object Detection)이야. 이미지 내에 사물이 어디(좌표)에 있는지 바운딩 박스를 찾아내면서 동시에 분류해야 하거든. 최근에는 Faster R-CNN이나 YOLO처럼 하나의 CNN으로 초고속 검출을 끝내는 기법들이 대세란다.”
- 도로시: “와! 사진 한 장에 개와 고양이가 동시에 들어있어도 위치까지 각각 쏙쏙 골라내는 게 정말 신기해!”
자, CNN을 이용하여 사물 검출을 수행하는 방식은 몇 가지가 있는데, 그중에서도 R-CNNRegions with Convolutional Neural Network[35]이 유명합니다. [그림 8-18]은 R-CNN의 처리 흐름입니다.
그림 8-18 R-CNN의 처리 흐름[35]

R-CNN 그림에서 주목할 곳은 ‘2. 후보 영역 추출’과 ‘3. CNN 특징 계산’입니다. 먼저 사물이 위치한 영역을 (어떤 방법으로) 찾아내고, 추출한 각 영역에 CNN을 적용하여 클래스를 분류하는 것이죠. 여기서 이미지를 사각형으로 변형하거나 분류할 때 서포트 벡터 머신SVM을 사용하는 등 실제 처리 흐름은 다소 복잡하지만, 큰 틀에서는 이들 두 처리(후보 영역 추출과 CNN 특징 계산)로 구성됩니다.
후보 영역 추출(사물처럼 보이는 물체를 찾아 처리)에는 컴퓨터 비전 분야에서 발전해온 다양한 기법을 사용할 수 있고, R-CNN 논문에서는 Selective Search 기법을 사용했습니다. 최근에는 이 후보 영역 추출까지 CNN으로 처리하는 Faster R-CNN[36] 기법도 등장했습니다. Faster R-CNN은 모든 일을 하나의 CNN에서 처리하기 때문에 아주 빠릅니다.
8.4.2 분할
분할segmentation이란 이미지를 픽셀 수준에서 분류하는 문제입니다. [그림 8-19]와 같이 픽셀 단위로 객체마다 채색된 지도supervised 데이터를 사용해 학습합니다. 그리고 추론할 때 입력 이미지의 모든 픽셀을 분류합니다.
그림 8-19 분할의 예 : 왼쪽이 입력 이미지, 오른쪽이 지도용 이미지[34]

지금까지 구현한 신경망은 분류를 이미지 전체를 대상으로 해왔습니다. 이를 픽셀 수준에 적용하려면 어떻게 하면 될까요?
도로시가 스텐실 붓으로 도로 위의 아스팔트, 인도, 보행자, 표지판의 경계를 픽셀 단위로 정확하게 구분하여 색깔별로 채색(Segmentation)하고 있어요.
도로시의 픽셀 단위 채색 (Segmentation)
- 도로시: “지니! 이미지 안의 객체를 사각형 상자로 감싸는 걸 넘어, 물체의 외곽 형태 그대로 픽셀 하나하나의 범주를 맞추는 게 세그멘테이션(Segmentation)이구나! 마치 미술 시간에 선을 따라 정교하게 칠하는 것 같아!”
- 지니: “정답이야! FCN(Fully Convolutional Network) 기법은 완전연결 계층을 없애고 전부 합성곱 계층으로만 구성하여, 단 한 번의 연산으로 이미지 모든 픽셀의 범주를 초고속 분류해 낸단다.”
신경망을 이용해 분할하는 가장 단순한 방법은 모든 픽셀 각각을 추론하는 것입니다. 예를 들어 어떤 직사각형 영역의 중심 픽셀의 클래스를 분류하는 신경망을 만들어서, 모든 픽셀을 대상으로 하나씩 추론 작업을 실행합니다. 짐작한 대로 이런 식으로는 픽셀의 수만큼 forward 처리를 해야 하여 긴 시간이 걸리게 됩니다(정확히는 합성곱 연산에서 많은 영역을 쓸데없이 다시 계산하는 것이 문제가 됩니다). 이러한 낭비를 줄여주는 기법으로 FCNFully Convolutional Network[37]이 고안되었습니다. 이는 단 한 번의 forward 처리로 모든 픽셀의 클래스를 분류해주는 놀라운 기법입니다([그림 8-20]).
그림 8-20 FCN의 전체 그림[37]
Fully Convolutional Network를 직역하면 ‘합성곱 계층만으로 구성된 네트워크’가 됩니다. 일반적인 CNN이 완전연결 계층을 이용하는 반면, FCN은 이 완전연결 계층을 ‘같은 기능을 하는 합성곱 계층’으로 바꿉니다. 사물 인식에서 사용한 신경망의 완전연결 계층에서는 중간 데이터의 공간 볼륨(다차원 형태)을 1차원으로 변환하여 한 줄로 늘어선 노드들이 처리했으나, FCN에서는 공간 볼륨을 유지한 채 마지막 출력까지 처리할 수 있습니다.
FCN은 [그림 8-20]에서 보듯 마지막에 공간 크기를 확대하는 처리를 도입했다는 것도 특징입니다. 이 확대 처리로 인해 줄어든 중간 데이터를 입력 이미지와 같은 크기까지 단번에 확대할 수 있습니다. FCN의 마지막에 수행하는 확대는 이중 선형 보간bilinear interpolation에 의한 선형 확대입니다. FCN에서는 이 선형 확대를 역합성곱deconvolution 연산으로 구현해내고 있습니다(자세한 내용은 FCN 논문[37]을 참고하세요).
NOTE_ 완전연결 계층에서는 출력이 모든 입력과 연결됩니다. 이와 같은 구성을 합성곱 계층으로도 구현할 수 있습니다. 가령 입력 크기가 $32 \times 10 \times 10$(채널 32개, 높이 10, 너비 10)인 데이터에 대한 완전연결 계층은 필터 크기가 $32 \times 10 \times 10$인 합성곱 계층으로 대체할 수 있습니다. 만약, 완전연결 계층의 출력 노드가 100개라면 합성곱 계층에서는 기존의 $32 \times 10 \times 10$ 필터를 100개 준비하면 완전히 같은 처리를 할 수 있습니다. 이처럼 완전연결 계층은 같은 일을 수행하는 합성곱 계층으로 대체할 수 있습니다.
8.4.3 사진 캡션 생성
컴퓨터 비전과 자연어를 융합한 재미있는 연구가 있습니다. [그림 8-21]과 같은 사진을 주면, 그 사진을 설명하는 글(사진 캡션)을 자동으로 생성하는 연구입니다.
그림 8-21 딥러닝으로 사진 캡션을 생성하는 예[38]

예를 들어 [그림 8-21]의 첫 번째는 사진만 보고 “비포장도로에서 오토바이를 타는 사람(A person riding a motorcycle on a dirt road)”이라는 문장을 자동으로 생성했습니다. 설명과 사진이 정확히 일치합니다. 오토바이를 타고 있다는 것뿐만이 아니고 거친 비포장도로라는 것도 ‘이해’하고 있다니 놀랍지 않습니까?
딥러닝으로 사진 캡션을 생성하는 방법으로는 NICNeural Image Caption 모델이 대표적입니다. NIC는 [그림 8-22]와 같이 심층 CNN과 자연어를 다루는 순환 신경망Recurrent Neural Network, RNN으로 구성됩니다.* RNN은 순환적 관계를 갖는 신경망으로 자연어나 시계열 데이터 등의 연속된 데이터를 다룰 때 많이 활용합니다.
그림 8-22 NIC의 전체 구성[38]

* 옮긴이_ 재귀 신경망으로 쓰기도 합니다.
NIC는 CNN으로 사진에서 특징을 추출하고, 그 특징을 RNN에 넘깁니다. RNN은 CNN이 추출한 특징을 초깃값으로 해서 텍스트를 ‘순환적’으로 생성합니다. 여기에서는 더 이상의 상세 기술은 설명하지 않지만, 기본적으로 NIC는 2개의 신경망(CNN과 RNN)을 조합한 간단한 구성입니다. 그래서 놀라울 정도로 정확한 사진 캡션을 만들어내는 것입니다. 또한, 사진이나 자연어와 같은 여러 종류의 정보를 조합하고 처리하는 것을 멀티모달 처리multimodal processing라고 하여, 최근 주목받는 분야 중 하나입니다.
NOTE_ RNN의 R은 Recurrent(순환적)를 뜻합니다. 여기에서 순환은 신경망의 순환적 네트워크 구조를 말합니다. 이 순환적인 구조로 인해 이전에 생성한 정보에 영향을 받는(바꾸어 말하면, 과거의 정보를 기억하는) 점이 RNN의 특징입니다. 예를 들어 ‘나’라는 단어를 생성한 뒤 ‘잤다’라는 단어를 생성하면 먼저 만든 ‘나’의 영향을 받아 ‘는’이라는 조사가 자동으로 생성되어, 최종적으로 ‘나는 잤다’라는 문장이 완성되는 식입니다. 이처럼 자연어와 시계열 데이터 등 연속성 있는 데이터를 다룰 때 RNN은 과거의 정보를 기억하면서 동작합니다.
지니가 사진을 한 장 띄우자, 문장 작문기(NIC)의 CNN과 RNN 기어가 맞물려 돌아가며 ‘들판을 힘차게 뛰노는 갈색 강아지 토토’라는 한글 꼬리표 문장을 자동으로 인쇄해 내고 있어요.
도로시의 캡션 작문기(NIC) 감탄
- 도로시: “대박! 이미지를 보고 스스로 의미를 파악해서 어울리는 설명 문장까지 작문하다니! 시각 데이터(CNN)와 언어 데이터(RNN)가 한 몸처럼 연동되어 움직이는 게 정말 매끄러워!”
- 지니: “이처럼 서로 다른 종류의 정보들을 함께 처리해 내는 지능을 멀티모달(Multimodal) 처리라고 한단다. 인간이 눈으로 보고 말로 표현하는 것과 정확히 같은 원리지!”
- 토토: “왈왈! (작문된 쪽지를 보며) 설명이 딱 맞다 멍!”