컴퓨터 비전과 이미지 데이터

학습 목표
  • 컴퓨터 비전이 무엇이며 어디에 쓰이는지 설명할 수 있다
  • 컴퓨터가 이미지를 픽셀 값의 행렬로 표현하는 원리를 안다
  • 흑백 이미지와 컬러(RGB) 이미지의 데이터 구조 차이를 설명할 수 있다
  • 이미지를 지금까지 배운 완전연결 신경망에 넣을 때 생기는 두 가지 문제를 설명하고, 파라미터 개수를 계산할 수 있다
  • 사람이 이미지를 인식하는 방식(특성)과, 컴퓨터가 특성을 자동으로 찾기 어려운 이유를 말할 수 있다

컴퓨터 비전이란

앞 장까지 신경망의 입력은 표로 정리된 숫자였다. 이 장부터는 이미지를 입력으로 받는다. 이미지에서 추출할 수 있는 정보는 사물의 종류, 위치, 색깔 등 다양하다.

컴퓨터 비전 (Computer Vision)

이미지로부터 유용한 정보를 추출하여 의사결정 및 예측에 사용하는 분야. 이미지를 보고 판단하던 사람의 작업을 컴퓨터가 대체할 수 있게 한다.

컴퓨터 비전의 응용

분야 대체되는 사람의 작업 예시
안면 인식 경비 얼굴을 이용한 보안 시스템, 스마트폰 잠금 해제
질병 진단 의사 X-ray 사진으로부터 병명 진단
자율 주행 운전자 실시간으로 들어오는 이미지를 처리하여 주행
불량 진단 공장 품질검사팀 육안 검사를 자동화 검사로 대체

네 가지의 공통점은 이미지를 입력으로 받아 판단을 출력한다는 것이다. 그렇다면 컴퓨터에게 이미지란 무엇인가?


컴퓨터가 인식하는 이미지

격자와 픽셀

컴퓨터의 비트맵 이미지를 크게 확대해 보면, 모든 이미지는 밝기가 다른 격자들로 구성되어 있다.

픽셀 (Pixel)

이미지를 구성하는 기본 단위인 격자 하나. 픽셀 하나는 밝기 값 하나를 가진다.

  • 픽셀 값은 0 ~ 255 사이의 정수다. 0이 흑색, 255가 백색이다
  • 255인 이유: 픽셀 하나를 1바이트(8비트)로 저장하고, 8비트로 표현할 수 있는 경우가 \(2^8 = 256\)가지이기 때문이다

흑백 이미지는 2차원 행렬이다

흑백 이미지는 픽셀 값으로 구성된 2차원 행렬로 표현된다. 왜 2차원인가? 가로 픽셀 수와 세로 픽셀 수, 두 축이 있기 때문이다. 세로 18, 가로 12인 이미지는 \(18 \times 12 = 216\)개의 숫자로 표현된다.

실제 이미지로 확인하자. 손글씨 숫자 데이터셋 MNIST의 이미지 한 장이다. 세로 28, 가로 28인 흑백 이미지이므로 \(28 \times 28 = 784\)개의 숫자다. 오른쪽이 우리가 보는 크기의 글씨이고, 왼쪽은 같은 이미지를 크게 확대해 격자마다 들어 있는 픽셀 값을 적은 것이다.

핵심: 컴퓨터에게 이미지란 숫자로 가득 찬 행렬이다. 우리가 “5”라고 보는 것은 784개 숫자의 배열이다.

이미지는 데이터다

이미지가 숫자로 이루어진 행렬이라면, 1장의 틀에 그대로 들어간다.

  • \(X\): 이미지의 픽셀 행렬. 사진 한 장이 데이터 포인트 하나, 픽셀 하나가 변수 하나다
  • \(y\): 그 이미지의 정답. 카테고리(고양이/강아지)이면 분류, 실수(사람의 나이)이면 회귀

즉 이미지를 입력 데이터로 삼아 회귀나 분류 모형을 만들 수 있다. 어떤 모형으로 만드는가는 잠시 뒤에 본다.

참고: 컬러 이미지의 표현

모든 색깔은 빨강(R), 초록(G), 파랑(B) 세 원색의 조합으로 표현할 수 있다. 따라서 컬러 이미지는 R, G, B 각각의 밝기를 담은 2차원 행렬 세 장을 겹친 것이다.

채널 (Channel)

겹쳐진 행렬 한 장 한 장을 채널이라 한다. 흑백 이미지는 채널이 1개, 컬러 이미지는 R, G, B 3개다. 컬러 이미지의 데이터 형태는 세로 × 가로 × 채널, 즉 \(H \times W \times 3\)의 3차원 배열이다.

실제 사진으로 확인하자. 오른쪽이 우리가 보는 꽃 사진이고, 왼쪽은 그것을 \(24 \times 24\)로 줄인 뒤 크게 확대한 격자다. 줄인 이미지는 \(24 \times 24 \times 3 = 1{,}728\)개의 숫자다. “컬러”에서는 세 채널을 합친 색이 보이고, R·G·B를 고르면 그 채널 한 장만 그 색으로 보인다. 칸 안의 숫자가 그 채널의 값이다.

우리가 보는 사진
원본 (24×24로 줄이기 전)

R, G, B 각 채널은 행렬 한 장이다. 세 장을 겹치면 컬러가 되고, 한 장씩 떼어 보면 그 색 빛이 어디에 얼마나 있는지가 보인다.

이미지 유형 데이터 형태 예시 (28×28)
흑백 \(H \times W\) \(28 \times 28 = 784\)개 숫자
컬러 \(H \times W \times 3\) \(28 \times 28 \times 3 = 2{,}352\)개 숫자

기존 방식의 문제점

지금까지 배운 인공신경망

이미지가 숫자 행렬이니, 2장에서 배운 인공신경망에 넣어 분류해 보자. 그 신경망에는 이름이 있다.

완전연결 신경망 (Fully Connected Neural Network, FC)

이웃한 두 층의 모든 노드 쌍이 아크로 연결된 인공신경망. 2장에서 만든 다층 퍼셉트론이 바로 이것이다. 아크마다 가중치가 하나씩 있으므로, 두 층 사이의 파라미터 수는 \(n_{\text{in}} \times n_{\text{out}} + n_{\text{out}}\)이었다.

행렬을 1차원으로 펼치기

완전연결 신경망의 입력층은 노드가 한 줄로 늘어선 1차원이다. 이미지는 2차원 행렬이다. 그대로는 넣을 수 없다.

펼치기 (Flatten)

2차원 행렬의 픽셀을 한 줄로 이어 붙여 1차원 벡터로 만드는 것. \([1,1]\) 픽셀이 첫 번째 입력노드, \([1,2]\) 픽셀이 두 번째 입력노드, … \([18,12]\) 픽셀이 216번째 입력노드가 된다.

18 × 12 행렬 2D 이미지 flatten 216개 노드 1D 벡터 ⋮ 입력층 은닉층 출력층 FC 신경망

\(18 \times 12\) 흑백 이미지라면 입력노드 216개다. 이렇게 하면 일반적인 인공신경망에 이미지를 입력시킬 수 있다. 그런데 이 방식에는 두 가지 문제가 있다.

  1. 2차원 데이터가 1차원으로 바뀌면서 공간적 정보가 손실된다
  2. 완전연결 구조에서 입력 노드가 많아지면 파라미터가 폭발한다

차례로 본다.

문제 1: 공간 정보의 손실

완전연결 신경망의 합은

\[z = w_0 + w_1 x_1 + w_2 x_2 + \cdots + w_{216} x_{216}\]

이다. 이 식에는 어떤 노드가 어떤 노드 옆에 있는지가 없다. 216개 픽셀의 순서를 뒤섞어 넣어도 신경망은 같은 것을 학습한다. 이미지에 있던 위치·이웃 정보를 신경망이 쓸 수 없다. 이것이 공간 정보의 손실이다.

무엇이 문제인지 보자. \(6 \times 6\) 이미지의 \(2 \times 2\) 밝은 무늬가 왼쪽 끝에 있는 이미지들로 학습을 마친 신경망이 있다. 무늬는 입력노드 #13, #14, #19, #20으로 들어가므로, 이 네 노드의 가중치가 “무늬가 있다”를 알아본다.

인터랙티브 — 같은 패턴, 다른 위치

무늬를 옮기면서, 밝은 값이 들어가는 노드(노랑)가 학습된 가중치가 붙은 노드(파란 테두리)와 같은 노드인지 보세요.

무늬를 두 칸 옮기면 학습된 네 노드 중 밝은 값을 받는 노드가 하나도 없다. 신경망이 학습한 것은 “무늬”가 아니라 “13, 14, 19, 20번 노드가 밝으면 무늬”다. 지식이 노드 번호, 즉 위치에 묶여 있다. 15, 16, 21, 22번이 밝은 것은 신경망에게 배운 적 없는 별개의 사건이다. “밝은 \(2 \times 2\) 덩어리면 어디 있어도 같은 무늬”라는 규칙이 신경망 안에 없기 때문이다. 그래서 같은 무늬를 어디서든 알아보려면 위치마다 따로 학습해야 하고, 학습 때 못 본 위치는 알아보지 못한다.

문제 2: 파라미터 폭발

신경망을 구체적으로 정하자. \(224 \times 224\) 컬러 이미지를 받아 10가지 물체 중 하나로 분류하는 완전연결 신경망이다. 층은 넷이다.

층 노드 수 어떻게 정해졌나
입력층 \(224 \times 224 \times 3 = 150{,}528\) 이미지를 펼친 길이. 컬러이므로 채널 3
은닉층 1 \(256\) 사람이 정함 (하이퍼파라미터)
은닉층 2 \(128\) 사람이 정함 (하이퍼파라미터)
출력층 \(10\) 클래스 수. Softmax
입력층 150,528 224×224×3 은닉층 1 256 은닉층 2 128 출력층 10 ① ② ③ 완전연결이므로 이웃한 층의 모든 노드 쌍이 아크로 연결된다 (①②③)

파라미터는 아크마다 가중치 하나, 퍼셉트론마다 편향 하나다. 2장의 규칙 \(n_{\text{in}} \times n_{\text{out}} + n_{\text{out}}\)을 세 연결에 각각 적용한다. 먼저 ①을 손으로 센다.

✍️ 손으로 따라 계산하기 — 첫 연결 ①

입력층 \(150{,}528\)개 노드가 은닉층 1의 \(256\)개 노드와 완전연결된다.

단계 1 — 펼친 입력 노드 수. 컬러이므로 채널 3을 빠뜨리면 안 된다.

\[224 \times 224 \times 3 = 150{,}528\]

단계 2 — 가중치 수.

\[150{,}528 \times 256 = 38{,}535{,}168\]

단계 3 — 편향을 더한다. 출력 노드 하나당 하나:

\[38{,}535{,}168 + 256 = \mathbf{38{,}535{,}424} \;\approx\; 3{,}850\text{만 개}\]

②와 ③도 같은 규칙으로 세어 전체를 더한다.

코드
from IPython.display import HTML, display
import pandas as pd

layers = [('① 입력층 → 은닉층 1', 224*224*3, 256), ('② 은닉층 1 → 은닉층 2', 256, 128), ('③ 은닉층 2 → 출력층', 128, 10)]
rows, total = [], 0
for name, n_in, n_out in layers:
    w, b = n_in * n_out, n_out
    total += w + b
    rows.append({'연결': name, '앞 층 노드': f'{n_in:,}', '뒤 층 노드': f'{n_out:,}',
                 '가중치': f'{n_in:,} × {n_out:,} = {w:,}', '편향': f'{b:,}', '소계': f'{w+b:,}'})
rows.append({'연결': '<b>합계</b>', '앞 층 노드': '', '뒤 층 노드': '', '가중치': '', '편향': '', '소계': f'<b>{total:,}</b>'})
display(HTML(pd.DataFrame(rows).to_html(index=False, border=0, escape=False)))
print(f'첫 층 ①의 비중: {(224*224*3*256+256)/total*100:.2f}%')
첫 층 ①의 비중: 99.91%
표 1: FC 신경망 (150,528 → 256 → 128 → 10)의 파라미터 개수
연결 앞 층 노드 뒤 층 노드 가중치 편향 소계
① 입력층 → 은닉층 1 150,528 256 150,528 × 256 = 38,535,168 256 38,535,424
② 은닉층 1 → 은닉층 2 256 128 256 × 128 = 32,768 128 32,896
③ 은닉층 2 → 출력층 128 10 128 × 10 = 1,280 10 1,290
합계 38,569,610

전체 약 3,857만 개 가운데 첫 연결 ①이 99.9%다. 문제는 펼친 입력이 너무 길다는 것, 즉 픽셀 수 × 첫 은닉층 노드 수다. 4장에서 본 대로 파라미터가 많을수록 학습 데이터를 암기할 용량이 커지고, 과적합을 막으려면 그만큼 많은 데이터가 필요하다.

\(64 \times 64\) 흑백 이미지를 은닉 \(128\) 노드에 연결하면 첫 연결의 파라미터는 몇 개인가? 정답을 보기 전에 손으로 먼저 계산하라.

입력 노드 \(= 64 \times 64 \times 1 = 4{,}096\)

파라미터 \(= 4{,}096 \times 128 + 128 = 524{,}288 + 128 = \mathbf{524{,}416}\)개. 아주 작은 이미지인데도 52만 개다.

인터랙티브 — 이미지 크기에 따른 첫 연결의 파라미터 수

이미지 크기와 은닉 노드 수를 조절하면 첫 연결의 가중치 수가 어떻게 변하는지 확인할 수 있습니다.

두 문제의 뿌리는 하나다. 완전연결 신경망은 픽셀이 어디에 있는지, 이웃이 무엇인지를 전혀 이용하지 않는다. 이미지에 맞는 다른 연산이 필요하다. 어떤 연산이어야 하는지는 사람이 이미지를 어떻게 보는지에서 실마리를 얻는다.


인간이 이미지를 인식하는 과정

사람은 이미지를 어떻게 분류할까

사람은 이미지를 볼 때 픽셀을 하나하나 보지 않는다. 세 단계로 본다.

사전 지식 “고양이는 귀가 뾰족하다” 특성 정의 눈, 코, 귀, 수염 … 분류를 위한 특성 포착 사람의 이미지 인식 과정: 사전 지식 → 특성 정의 → 비교·판단
특성 (Feature)

어떤 카테고리의 이미지가 공통으로 가지고 있는 핵심 부분. 사람 얼굴이라면 눈·코·입, 자동차라면 바퀴·헤드램프·번호판, 집이라면 문·창문·계단이다.

  1. 분류를 위한 사전 지식: 사람은 각 카테고리가 갖고 있는 핵심 특성들을 이미 알고 있다
  2. 특성 정의: 눈·코·입, 바퀴·헤드램프·번호판처럼 특성을 정한다
  3. 특성 포착: 주어진 이미지에서 그 특성들이 있는지를 포착하여 카테고리를 결정한다. 어디에 있는지가 아니라 있는지가 중요하다

컴퓨터 비전이 해결해야 하는 질문

사람의 방식을 컴퓨터에 옮기려면 특성이 필요하다. 그런데 특성을 사람이 일일이 정해 줄 수는 없다. 카테고리마다, 문제마다 특성이 다르기 때문이다.

사람의 개입 없이, 자동으로 이미지의 핵심 특성을 추출할 수 있을까?

이것이 컴퓨터 비전이 해결해야 하는 질문이다. 다음 장의 콘볼루션이 이 질문에 대한 답이다.

특성 파악을 어렵게 하는 요인들

직관적으로 특성을 잡아내는 사람과 달리, 컴퓨터가 특성을 자동으로 파악하는 데에는 어려움이 있다. 같은 대상이라도 촬영 조건에 따라 픽셀 값이 전혀 달라지기 때문이다.

요인 설명
변형 고양이가 웅크리거나 뛰는 등, 같은 대상의 형태가 바뀐다
명암·각도의 차이 조명과 그림자, 촬영 각도에 따라 같은 물체도 다르게 보인다
크기 가까이서 찍으면 크고 멀리서 찍으면 작다. 픽셀 분포가 달라진다
배경 물체와 배경의 색·질감이 비슷하면 구분이 어렵다
가려짐 물체의 일부가 다른 물체에 가려진다
클래스 내 변이 “의자”라 해도 소파, 안락의자, 접이식 등 생김새가 다양하다
이 표는 팀 프로젝트의 촬영 체크리스트다

프로젝트에서 직접 데이터를 수집할 때, 위 요인들은 여러분 모델의 성패가 된다. 같은 사물을 다양한 각도·거리·조명·배경에서 찍을수록 모델은 이 난관들에 강해진다. 반대로 같은 자리에서 같은 각도로만 찍은 200장은, 사실상 20장짜리 데이터다.

정리하면, 이미지 인식에는 위치가 달라도 같은 특성을 같은 방법으로 찾아내는 연산이 필요하다. 픽셀을 한 줄로 펼치는 완전연결 방식으로는 안 된다. 다음 장에서 그 연산, 콘볼루션(Convolution)을 배운다.


핵심 요약

개념 핵심 내용
컴퓨터 비전 이미지에서 정보를 추출해 판단하는 분야. 사람의 시각 작업을 대체
픽셀 이미지의 기본 단위. 0(흑)~255(백)의 정수. 8비트
흑백 / 컬러 흑백은 \(H \times W\) 행렬, 컬러는 R·G·B 세 채널을 겹친 \(H \times W \times 3\)
이미지는 데이터 픽셀 행렬이 \(X\), 정답이 \(y\). 회귀·분류 모형을 만들 수 있다
완전연결 신경망 + 펼치기 2차원 행렬을 1차원으로 펼쳐 입력. 두 가지 문제
문제 1: 공간 정보 손실 이웃 관계가 사라지고, 같은 무늬도 위치가 다르면 다른 노드가 받는다
문제 2: 파라미터 폭발 픽셀 수 × 첫 은닉층 노드 수. 224×224×3 → 256이면 3,850만 개
특성 카테고리가 공통으로 가진 핵심 부분. 사람은 특성을 정의하고 비교해 인식한다
핵심 질문 사람의 개입 없이 특성을 자동 추출할 수 있는가 → 다음 장 콘볼루션
어려운 이유 변형, 명암·각도, 크기, 배경 등으로 같은 대상의 픽셀 값이 달라진다