Back to Blog

Blog Post

[2 - 1 CNN] 인공지능이 사물을 알아보는 법: 이미지 필터와 특징 추출

Published on May 11, 2026

안녕하세요, MiTornAve입니다.

지난 시간 우리는 수조 개의 가중치를 미분이라는 정교한 칼날로 깎아내는 역전파(Backpropagation)의 마법을 보았습니다. 다층 퍼셉트론(MLP)은 확실히 강력한 논리 기계입니다. 하지만 이 뛰어난 기계에게 "고양이 사진을 보고 고양이인지 맞춰봐"라고 명령하는 순간, 아주 처참한 실패를 맛보게 됩니다.

왜일까요? 그것은 MLP가 세상을 오직 '1차원의 좁은 틈'으로만 바라보기 때문입니다.

1. 평면의 파괴: 왜 퍼셉트론은 이미지를 보지 못하는가?

컴퓨터에게 이미지는 가로, 세로 픽셀들이 격자 모양으로 배열된 숫자의 행렬(2D)입니다. 인간의 눈은 이 2차원 평면에서 픽셀과 픽셀 사이의 '거리'와 '위치 관계'를 직관적으로 파악합니다. 고양이의 두 귀가 머리 위쪽 양옆에 위치하고, 그 아래 눈과 코가 삼각형을 이룬다는 '공간적 맥락(Spatial Context)'을 이해하는 것이죠.

하지만 다층 퍼셉트론(MLP)은 입력층이 1차원의 긴 선으로만 구성되어 있습니다. 만약 28x28 픽셀의 작은 고양이 사진을 MLP에 넣으려면, 이 평면을 무참히 찢어 784(28x28)개의 숫자가 한 줄로 늘어선 형태로 강제 변환(Flatten)해야 합니다.

이 과정에서 코를 구성하던 픽셀과 눈을 구성하던 픽셀은 1차원 배열 상에서 수백 칸 이상 멀어지게 됩니다. 위, 아래, 양옆이라는 소중한 2차원적 공간 정보가 완전히 박살 나는 것이죠. 공간이 파괴된 데이터에서 사물의 형태를 찾아내라는 것은, 다진 고기를 보고 원래 소의 생김새를 유추하라는 것과 같은 가혹한 요구입니다.

이 한계를 극복하기 위해 과학자들은 1950년대 데이비드 허블(David Hubel)과 토르스텐 위셀(Torsten Wiesel)의 고양이 시각 피질 실험에서 영감을 얻습니다. 고양이의 뇌세포가 시야 전체를 한 번에 처리하는 것이 아니라, 특정 방향의 '선'이나 '모서리' 같은 국소적(Local) 영역에만 반응하는 세포들이 계층적으로 연결되어 있다는 사실을 인공지능에 적용한 것입니다.

이것이 바로 합성곱 신경망(Convolutional Neural Network, CNN)의 탄생입니다.

2. 컨볼루션(Convolution): 세상을 훑는 수학적 돋보기

CNN은 이미지를 강제로 한 줄로 펴지 않습니다. 2차원 구조를 그대로 유지한 채, '필터(Filter)' 또는 '커널(Kernel)'이라 부르는 아주 작은 돋보기를 이미지 위에 올려놓고 조금씩 이동시키며(Sliding) 관찰합니다.

필터의 작동 원리: 합성곱 연산

이 돋보기(필터)는 단순한 유리가 아니라, 보통 3x3이나 5x5 크기를 가진 '가중치의 행렬'입니다.

필터가 원본 이미지의 특정 픽셀 구역 위에 안착하면, 두 행렬의 같은 위치에 있는 숫자(픽셀 값과 가중치)끼리 곱한 뒤 그 결과를 모두 더합니다.

수식으로 보면 다소 복잡해 보이지만, 본질은 단순합니다.

S(i, j) = \sum_{m} \sum_{n} I(i+m, j+n)K(m, n)


(여기서, I는 이미지 행렬, K는 필터 행렬을 의미합니다.)

이 연산의 의미가 무엇일까요? 만약 우리가 '세로선'을 찾는 필터(예: 왼쪽 열은 1, 오른쪽 열은 -1)를 이미지 위에 얹었다고 가정해 봅시다.

  1. 필터가 이미지의 밋밋한 하늘 부분을 지나갈 때는 픽셀 값의 변화가 없어 연산 결과가 0(반응 없음)에 가깝게 나옵니다.

  2. 하지만 필터가 건물 외벽이나 나무 기둥 같은 '강렬한 세로 경계선'을 훑는 순간, 극적으로 큰 양수나 음수 값(강한 반응)이 튀어나옵니다.

필터가 이미지 전체를 훑고 지나간 궤적에는 원본 이미지 대신, 특정 특징(이 경우엔 세로선)만이 밝게 빛나는 형태의 새로운 지도가 그려집니다. 우리는 이 요약된 지도를 특징 맵(Feature Map)이라고 부릅니다.

3. 특징의 계층 구조: 점에서 선으로, 선에서 사물로

CNN은 단 하나의 필터만 사용하지 않습니다. 하나의 층(Layer)에 수십, 수백 개의 다양한 필터를 두어 가로선, 대각선, 특정 색상, 질감 등 수많은 종류의 특징 맵을 쏟아냅니다. 그리고 이 신경망이 깊어질수록(Deep), 놀라운 일이 벌어집니다.

  • 초기 층(Early Layers): 아직 이미지의 극히 좁은 수용장(Receptive Field)만을 봅니다. 시각화해 보면 수직선, 수평선, 그라데이션 같은 단순하고 원초적인 기하학적 특징들만 추출됩니다.

  • 중간 층(Intermediate Layers): 이전 층에서 찾아낸 '선'들의 정보를 넘겨받아 조합합니다. 선과 선이 만나 모서리가 되고, 동그라미, 질감(Texture) 같은 복잡한 패턴을 인식하기 시작합니다. (예: 강아지의 털 질감, 눈동자의 둥근 형태)

  • 깊은 층(Deep Layers): 신경망의 끝단에 다다르면 수용장이 넓어져 이미지 전체의 맥락을 파악합니다. 이제는 점이나 선이 아니라 "강아지의 주둥이", "자동차의 바퀴"라는 추상적이고 고차원적인 객체 단위의 특징을 추출해 냅니다.

4. 왜 CNN은 압도적인가? (수학적 우위성)

CNN이 이미지 처리의 패권을 쥔 이유는 단순히 2차원을 유지해서만이 아닙니다. 결정적인 두 가지 구조적 묘수가 숨어 있습니다.

  1. 가중치 공유(Weight Sharing): 기적의 다이어트

    만약 1000x1000 픽셀의 거대한 해상도 이미지를 다루는 MLP가 있다고 상상해 보세요. 첫 번째 은닉층의 뉴런 하나를 위해 무려 백만(1,000,000) 개의 가중치가 필요합니다. 컴퓨터 메모리는 터져버릴 것이고 학습은 불가능에 가깝습니다.

    하지만 CNN은 동일한 3x3 필터(고작 9개의 가중치)를 이미지 전체에 재사용(공유)하며 슬라이딩합니다. 돋보기를 옮긴다고 돋보기 유리가 바뀌지 않는 것과 같습니다. 이는 모델의 파라미터(가중치) 수를 수만 배 이상 획기적으로 줄여, 깊고 거대한 신경망도 가볍고 빠르게 학습할 수 있게 만듭니다.

  2. 평행 이동 불변성(Translation Invariance): "어디에 있든 찾아낸다"

    사진 속 강아지가 정중앙에 있든, 우측 하단 구석에 있든 강아지는 강아지입니다. MLP는 위치가 달라지면 입력 숫자의 순서가 완전히 뒤바뀌어 새로운 데이터로 인식합니다. 하지만 CNN은 필터가 전체 이미지를 훑으며 지나가기 때문에, 특징이 어느 위치에서 등장하든 무조건 낚아챌 수 있습니다. 위치의 변화에 흔들리지 않는 견고한 시야를 얻게 된 것입니다.

[실습 섹션] 구글 코랩(Colab)에서 직접 필터 씌워보기

수학 공식과 이론만으로는 이 경이로운 과정을 온전히 느끼기 어렵습니다. 지금 바로 여러분의 브라우저에서 새 탭을 열고 Google Colab에 접속해 보세요.

단 몇 줄의 파이썬(Python)과 파이토치(PyTorch) 코드로, 실제로 이미지가 숫자로 변환되고 3x3 필터를 거쳐 '특징 맵'으로 재탄생하는 과정을 두 눈으로 확인할 수 있습니다.

아래 코드를 빈 셀에 복사해서 붙여넣고 실행(Shift + Enter)해 보세요.

Python

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from skimage import data

# 1. 테스트용 흑백 이미지 불러오기 (카메라맨 사진)
image = data.camera()
# PyTorch가 처리할 수 있도록 텐서(Tensor) 형태로 변환 (배치 1, 채널 1, 높이 512, 너비 512)
image_tensor = torch.tensor(image, dtype=torch.float32).unsqueeze(0).unsqueeze(0)

# 2. '세로 경계선'을 추출하는 3x3 필터 직접 깎기 (가중치 설정)
# 좌측은 밝고(1), 가운데는 무시(0), 우측은 어두운(-1) 패턴을 찾습니다.
vertical_edge_filter = torch.tensor([[[[ 1.,  0., -1.],
                                       [ 1.,  0., -1.],
                                       [ 1.,  0., -1.]]]])

# 3. CNN의 핵심인 합성곱(Conv2d) 계층 생성
conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, bias=False)
# 우리가 만든 수제 필터를 모델의 가중치로 덮어씌웁니다.
conv.weight.data = vertical_edge_filter

# 4. 이미지에 필터 적용 (슬라이딩!)
feature_map = conv(image_tensor)

# 5. 결과 시각화
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(image, cmap='gray')
axes[0].set_title("Original Image")

# 연산 결과에서 특징 맵만 빼내어 그립니다.
axes[1].imshow(feature_map.squeeze().detach().numpy(), cmap='gray')
axes[1].set_title("Feature Map (Vertical Edges)")

for ax in axes:
    ax.axis('off')
plt.show()

코드를 실행하시면, 원본 사진 옆에 윤곽선(세로 방향의 경계선)만 하얗게 도드라진 새로운 이미지(특징 맵)가 나타날 것입니다. 우리는 방금 인공지능이 저수준 특징을 추출하는 신경망의 첫 번째 층을 내 손으로 구현해 낸 것입니다!


[인터랙티브 시뮬레이션] 내 손으로 직접 돌려보는 컨볼루션 연산

코드가 조금 어렵게 느껴지시나요? 그렇다면 아래의 대화형 위젯을 통해 합성곱 연산($3 \times 3$ 필터 곱셈)이 실제로 어떻게 숫자를 변화시키는지 직관적으로 체험해 보세요. 필터 안의 숫자를 바꾸면 결과가 어떻게 변하는지 관찰하는 것이 핵심입니다.

5. 정리하며: 거대한 망막의 탄생

오늘 우리는 인공지능이 1차원의 한계를 벗어나, 돋보기(필터)로 2차원 공간을 훑으며 핵심 특징을 뽑아내는 CNN의 시각적 메커니즘을 알아보았습니다. 특징 맵은 인공지능이 사물을 이해하기 위해 정제한 고도의 시각 정보입니다.

하지만 세상의 데이터는 고정된 이미지로만 존재하지 않습니다. 우리가 하는 말, 주가 그래프, 혹은 센서에서 들어오는 신호처럼 '시간의 흐름'에 따라 의미가 변하는 연속적인 데이터들이 있죠.

다음 시간에는 고정된 시야를 넘어, 과거의 기억을 현재의 판단에 투영하는 인공지능의 기억 장치, RNN과 LSTM에 대해 알아보겠습니다. 드디어 인공지능이 '시간'이라는 차원을 이해하기 시작합니다.

Written by MiTornAve

Previous / Next

Previous: [1 - 4 최척화(Optimization)] 깊이의 저주를 푸는 열쇠Next: [2 - 2 RNN/LSTM] 어제의 데이터가 오늘의 정답을 만든다: 시계열 데이터와 기억력