CNN 완전 정복: 합성곱 신경망이 이미지를 이해하는 원리
CNN(Convolutional Neural Network, 합성곱 신경망)은 이미지의 가까운 픽셀들이 서로 관련되어 있다는 구조적 특성을 이용해, 작은 필터를 이미지 전체에 반복 적용하며 특징을 학습하는 신경망이다.
사람은 사진을 보는 순간 고양이의 귀, 눈, 털과 전체 형태를 한꺼번에 인식한다. 컴퓨터가 처음 받는 것은 이런 의미가 아니라 높이 × 너비 × 색상 채널로 정리된 숫자 배열이다.
CNN은 이 숫자 배열에서 다음과 같은 계층적 특징을 스스로 찾아낸다.
픽셀 밝기와 색상
→ 엣지와 방향
→ 모서리와 질감
→ 눈·귀·바퀴 같은 부분
→ 얼굴·자동차 같은 객체
CNN의 핵심은 단순히 “이미지에 강한 신경망”이라는 데 있지 않다. 지역적 연결, 가중치 공유, 계층적 특징 추출이라는 세 가지 설계 원리를 통해 이미지의 공간 구조를 보존하면서도 파라미터 수를 크게 줄인다는 데 있다.
이 글에서는 합성곱 연산의 실제 계산부터 커널, 채널, 패딩, 스트라이드, 풀링, 수용 영역, 배치 정규화, Residual 연결, 전이학습, CNN과 Vision Transformer의 차이까지 순서대로 살펴본다.
핵심 요약
- CNN은 작은 커널을 이미지 전체에 공유해 적용하므로 완전연결 신경망보다 훨씬 적은 파라미터로 공간 특징을 학습한다.
- 합성곱층의 출력은 하나의 숫자가 아니라 여러 개의 특징 맵이다.
- 초기 층은 엣지와 색 변화, 중간 층은 질감과 부분 형태, 깊은 층은 객체 수준의 표현을 학습한다.
- 풀링은 필수 규칙이 아니다. 현대 CNN은 스트라이드 합성곱이나 Global Average Pooling으로 대체하기도 한다.
- 깊은 CNN에서는 Batch Normalization, Residual Connection, 적절한 초기화와 데이터 증강이 중요하다.
- 데이터가 많지 않은 실무 문제에서는 처음부터 학습하기보다 사전학습 모델을 미세조정하는 편이 일반적으로 유리하다.
- CNN은 ViT가 등장한 뒤에도 모바일·엣지·실시간 처리와 제한된 데이터 환경에서 여전히 중요한 선택지다.
1. CNN이 필요한 이유: 이미지를 1차원으로 펴면 무엇을 잃을까?
일반적인 완전연결 신경망, 즉 MLP는 입력값을 1차원 벡터로 받는다. 예를 들어 224×224 RGB 이미지는 다음 크기의 벡터로 펼쳐진다.
224 × 224 × 3 = 150,528개 입력값
이 입력을 1,000개의 은닉 뉴런에 완전연결하면 가중치만 약 1억 5천만 개가 필요하다.
150,528 × 1,000 = 150,528,000
문제는 파라미터 수만이 아니다. 이미지를 펼치는 순간 다음 정보가 모델 구조에서 사라진다.
- 어떤 픽셀끼리 가까이 있는가
- 위아래와 좌우 방향은 무엇인가
- 같은 패턴이 이미지의 다른 위치에도 나타나는가
- 작은 부분이 모여 어떤 전체 형태를 이루는가
CNN은 이 문제를 두 가지 방법으로 해결한다.
1.1 지역적 연결
한 뉴런이 이미지 전체를 한꺼번에 보는 대신, 예를 들어 3×3처럼 작은 영역만 본다.

가까운 픽셀끼리 강한 관련이 있다는 이미지의 특성을 모델 구조에 반영한 것이다.
1.2 가중치 공유
같은 필터를 이미지의 모든 위치에 반복 적용한다. 왼쪽 위에서 수직선을 찾는 필터와 오른쪽 아래에서 수직선을 찾는 필터를 따로 만들 필요가 없다.
이 덕분에 CNN은 특정 패턴이 어디에 있는지보다 존재하는지를 효율적으로 학습할 수 있다.
2. 이미지는 CNN에서 어떤 텐서로 표현될까?
RGB 이미지는 보통 세 개의 색상 채널을 가진다.
높이 H × 너비 W × 채널 C
예를 들어 224×224 RGB 이미지는 다음과 같다.
224 × 224 × 3
다만 프레임워크마다 차원 순서가 다를 수 있다.
| 환경 | 일반적인 배열 순서 |
|---|---|
| 이미지 파일·NumPy | H × W × C |
| PyTorch | N × C × H × W |
| TensorFlow/Keras 기본 | N × H × W × C |
여기서 N은 배치 크기다.
# PyTorch 예시
images.shape
# torch.Size([32, 3, 224, 224])
# 배치 32장, RGB 3채널, 높이 224, 너비 224
CNN을 구현할 때 축 순서를 혼동하면 채널 수 오류나 잘못된 학습으로 이어질 수 있다.
3. 합성곱 연산: 작은 필터가 이미지를 훑는 과정
합성곱층은 작은 행렬인 커널(Kernel) 또는 필터(Filter)를 입력 위에서 이동시키며 각 위치의 값을 계산한다.
입력이 \(X\), 커널이 \(K\), 출력 특징 맵이 \(Y\)라면 개념적으로 다음과 같이 쓸 수 있다.
Y(i, j) = Σm Σn X(i+m, j+n) · K(m, n)
딥러닝 프레임워크의 Conv2D는 수학적으로 커널을 뒤집지 않는 교차상관 연산을 사용하는 경우가 일반적이지만, 딥러닝에서는 관례적으로 이를 합성곱이라고 부른다. 커널 자체가 학습되므로 실제 모델 사용에서는 이 명칭 차이가 성능에 영향을 주지 않는다.
3.1 한 위치의 계산
다음 입력 영역과 커널을 생각해보자.
입력 영역 커널
[1 2 3] [ 1 0 -1]
[4 5 6] × [ 1 0 -1]
[7 8 9] [ 1 0 -1]
원소별로 곱한 뒤 모두 더한다.
1×1 + 2×0 + 3×(-1)
+ 4×1 + 5×0 + 6×(-1)
+ 7×1 + 8×0 + 9×(-1)
= -6
커널을 한 칸 옮겨 같은 계산을 반복하면 하나의 특징 맵이 만들어진다.
3.2 커널은 사람이 정하는가?
고전 영상처리에서는 사람이 Sobel, Laplacian, Sharpen 같은 필터를 직접 설계했다. CNN에서는 커널 값을 무작위로 초기화한 뒤 학습 데이터와 손실함수를 이용해 자동으로 갱신한다.
무작위 커널
→ 순전파
→ 예측 오차 계산
→ 역전파
→ 커널 가중치 수정
→ 반복
따라서 학습이 진행되면 일부 필터는 수직 경계, 일부는 곡선, 일부는 특정 질감이나 색 조합에 반응하게 된다.
필터가 어떻게 역전파로 학습되는지는 모델 학습과 최적화와 손실함수 완전 정복에서 더 자세히 볼 수 있다.
4. 입력 채널과 출력 채널: 커널 하나는 사실 3차원이다
RGB 입력에 3×3 필터를 적용한다고 할 때 실제 커널 크기는 3×3×3이다. 세 색상 채널을 모두 동시에 본다.
입력: 224 × 224 × 3
커널 1개: 3 × 3 × 3
출력 특징 맵: 1개
출력 채널을 64개 만들고 싶다면 서로 다른 커널 64개를 학습한다.
커널 집합: 64 × 3 × 3 × 3
출력: 높이 × 너비 × 64
편향을 포함한 합성곱층의 파라미터 수는 다음과 같다.
파라미터 수
= (커널 높이 × 커널 너비 × 입력 채널 + 편향 1개)
× 출력 채널
예를 들어 입력 채널 3개, 출력 채널 64개, 커널 3×3이라면:
(3 × 3 × 3 + 1) × 64
= 1,792개
이미지가 224×224이든 1024×1024이든 이 레이어의 학습 파라미터 수는 같다. 이미지가 커지면 연산량과 메모리는 늘지만 커널 가중치 수 자체는 변하지 않는다.
5. 출력 크기를 결정하는 패딩, 스트라이드, 팽창
합성곱 출력 크기는 입력 크기뿐 아니라 커널, 패딩, 스트라이드, 팽창 계수에 의해 결정된다.
한 축에 대한 일반식은 다음과 같다.
출력 크기
= floor((입력 + 2×패딩 - 팽창×(커널-1) - 1) / 스트라이드 + 1)
기호로 쓰면 다음과 같다.
O = floor((N + 2P - D(K - 1) - 1) / S + 1)
N: 입력 크기K: 커널 크기P: 패딩 크기S: 스트라이드D: 팽창 계수O: 출력 크기
5.1 Stride: 필터가 이동하는 간격
stride=1이면 한 칸씩 이동하고, stride=2이면 두 칸씩 이동한다.
입력 32, 커널 3, 패딩 1
stride 1 → 출력 32
stride 2 → 출력 16
스트라이드가 커지면 특징 맵 크기가 줄어 계산량이 감소하지만 세밀한 위치 정보도 줄어든다.
5.2 Padding: 경계 주변에 값을 추가
패딩이 없으면 합성곱을 거칠 때마다 가로와 세로가 작아진다. 3×3, stride=1, padding=1을 사용하면 입력과 출력의 공간 크기를 동일하게 유지할 수 있다.
import torch.nn as nn
conv = nn.Conv2d(
in_channels=3,
out_channels=64,
kernel_size=3,
stride=1,
padding=1,
)
5.3 Dilation: 커널 사이를 벌려 더 넓게 보기
팽창 합성곱은 커널 원소 사이에 간격을 둔다.
일반 3×3 커널: 인접한 3×3 영역
dilation=2: 실질적으로 5×5 범위를 관찰
파라미터 수를 크게 늘리지 않고 수용 영역을 넓힐 수 있어 이미지 분할, 음성, 시계열 등에서 활용된다.
6. 특징 맵은 무엇을 담고 있을까?
CNN의 각 출력 채널은 서로 다른 패턴에 반응하는 특징 맵이다.
초기 층은 비교적 단순한 특징을 학습한다.
- 밝기 변화
- 수평·수직·대각선 경계
- 특정 색 조합
- 작은 모서리
중간 층에서는 앞선 특징을 조합한다.
- 반복되는 질감
- 원형과 곡선
- 눈, 귀, 창문, 바퀴
- 특정 재질 패턴
깊은 층에서는 더 추상적인 표현을 형성한다.
- 얼굴 구조
- 동물의 몸통
- 자동차 전면부
- 특정 객체 또는 장면과 관련된 조합
다만 “CNN은 모양을 이해한다”는 설명은 지나치게 단순할 수 있다. 연구에 따르면 ImageNet으로 학습한 CNN은 사람보다 질감 단서에 더 크게 의존하는 경향을 보이기도 한다. 즉, 높은 정확도를 냈다고 해서 사람이 보는 방식과 동일하게 객체를 이해한다고 단정할 수 없다.
7. 활성화 함수: 합성곱만 쌓으면 왜 부족할까?
합성곱은 가중합이므로 선형 연산이다. 선형 연산만 여러 번 이어 붙이면 전체도 결국 하나의 선형 변환으로 합쳐질 수 있다.
CNN이 복잡한 패턴을 학습하려면 합성곱 뒤에 비선형 활성화 함수가 필요하다.
가장 널리 사용되는 기본 함수는 ReLU다.
ReLU(x) = max(0, x)
block = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=3, padding=1),
nn.ReLU(),
)
현대 모델에서는 ReLU 외에도 GELU, SiLU, Leaky ReLU 등이 사용된다. 활성화 함수 선택에 따른 차이는 활성화 함수 완전 정복에서 자세히 다룬다.
8. 풀링은 무엇을 남기고 무엇을 버릴까?
풀링은 특징 맵의 공간 크기를 줄이는 다운샘플링 연산이다.
8.1 Max Pooling
영역 안에서 가장 큰 값을 선택한다.
입력
[1 3]
[5 2]
Max Pooling → 5
강하게 반응한 특징을 보존하는 효과가 있다.
8.2 Average Pooling
영역의 평균을 계산한다.
(1 + 3 + 5 + 2) / 4 = 2.75
특징을 부드럽게 요약하지만 강한 반응이 희석될 수 있다.
8.3 Global Average Pooling
각 채널의 공간 전체를 평균 내 하나의 값으로 만든다.
H × W × C
→ 1 × 1 × C
→ C차원 벡터
초기 CNN은 마지막 특징 맵을 펼쳐 큰 완전연결층에 넣는 경우가 많았다. 현대 이미지 분류 CNN은 파라미터와 과적합을 줄이기 위해 Global Average Pooling을 자주 사용한다.
8.4 풀링은 반드시 필요한가?
아니다. 최근 CNN에서는 다음 방식으로 풀링을 줄이거나 대체하기도 한다.
stride=2합성곱- Global Average Pooling
- 학습 가능한 다운샘플링 블록
- 안티앨리어싱 다운샘플링
따라서 “CNN은 항상 Conv → ReLU → Pooling 순서”라고 외우기보다, 특징 추출과 공간 축소를 어떤 방식으로 설계하는가로 이해하는 편이 정확하다.
9. 수용 영역: 깊은 층은 이미지의 얼마나 넓은 범위를 볼까?
수용 영역(Receptive Field)은 특징 맵의 한 값이 원본 입력의 어느 범위에 영향을 받는지를 뜻한다.
3×3 합성곱 한 층은 주변 3×3을 본다. 같은 합성곱을 두 층 쌓으면 두 번째 층의 한 값은 원본 기준으로 5×5 범위의 영향을 받는다.
3×3 합성곱 1층 → 수용 영역 3×3
3×3 합성곱 2층 → 수용 영역 5×5
3×3 합성곱 3층 → 수용 영역 7×7
작은 커널을 여러 층 쌓으면 다음 장점이 있다.
- 넓은 범위를 단계적으로 관찰
- 중간마다 비선형성 추가
- 큰 커널 하나보다 파라미터를 절약할 수 있음
- 저수준 특징에서 고수준 특징으로 계층적 조합 가능
하지만 이론적 수용 영역 전체가 실제 예측에 동일하게 기여하는 것은 아니다. 중심부의 영향이 더 크고 주변부 영향은 약한 유효 수용 영역 문제가 존재한다.
10. 정규화와 Residual Connection이 깊은 CNN을 가능하게 한 이유
초기 CNN보다 현대 CNN은 훨씬 깊다. 단순히 합성곱층을 많이 쌓는 것만으로는 안정적으로 학습되지 않는다.
10.1 Batch Normalization
Batch Normalization은 미니배치 통계를 이용해 중간 활성값의 분포를 정규화하고 학습을 안정화한다.
block = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1, bias=False),
nn.BatchNorm2d(32),
nn.ReLU(),
)
배치가 매우 작을 때는 통계가 불안정해질 수 있어 Group Normalization이나 Layer Normalization을 고려하기도 한다.
10.2 Residual Connection
ResNet은 블록의 변환 결과에 입력을 더한다.
출력 = F(x) + x
def forward(self, x):
identity = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = out + identity
return self.relu(out)
이 지름길 연결은 깊은 네트워크의 최적화를 쉽게 만들고 기울기가 전달될 경로를 제공한다. ResNet 논문은 최대 152층 네트워크를 ImageNet에서 평가했고, ILSVRC 2015 분류 과제에서 우승한 결과를 보고했다.
11. 대표 CNN 아키텍처의 진화
| 모델 | 등장 시기 | 핵심 아이디어 |
|---|---|---|
| LeNet-5 | 1998 | 손글씨 인식을 위한 초기 CNN 구조 |
| AlexNet | 2012 | GPU 학습, ReLU, Dropout으로 대규모 이미지 분류의 전환점 형성 |
| VGG | 2014 | 작은 3×3 합성곱을 깊게 반복 |
| GoogLeNet | 2014 | 여러 크기 연산을 병렬로 결합하는 Inception 구조 |
| ResNet | 2015 | Skip Connection으로 매우 깊은 네트워크 학습 |
| DenseNet | 2016 | 이전 층의 특징을 후속 층에 밀집 연결 |
| MobileNet | 2017 | Depthwise Separable Convolution으로 모바일 효율 개선 |
| EfficientNet | 2019 | 깊이·너비·해상도의 균형 있는 스케일링 |
| ConvNeXt | 2022 | Transformer 시대의 설계 요소를 반영해 CNN 현대화 |
AlexNet은 CNN을 최초로 만든 모델은 아니다. 그러나 2012년 대규모 ImageNet 분류에서 이전 방식보다 큰 폭으로 오류를 줄이며, GPU 기반 심층 CNN의 가능성을 널리 입증한 전환점이었다.
12. 연산량을 줄이는 Depthwise Separable Convolution
표준 합성곱은 모든 입력 채널과 출력 채널을 연결한다. 모바일 환경에서는 이 연산량이 부담이 된다.
Depthwise Separable Convolution은 연산을 두 단계로 나눈다.
1. Depthwise Convolution
각 입력 채널에 공간 필터 적용
2. Pointwise Convolution
1×1 합성곱으로 채널 정보 결합
입력 채널이 Cin, 출력 채널이 Cout, 커널이 K×K일 때 대략적인 연산 구조는 다음과 같다.
표준 합성곱:
K² × Cin × Cout
Depthwise Separable:
K² × Cin + Cin × Cout
이 방식은 MobileNet 계열처럼 스마트폰, 임베디드 장치, 실시간 애플리케이션을 목표로 하는 모델에서 널리 사용된다.
13. CNN이 수행하는 주요 컴퓨터 비전 작업
CNN은 이미지 분류에만 쓰이지 않는다.
13.1 이미지 분류
이미지 전체에 하나의 클래스를 예측한다.
입력: 고양이 사진
출력: 고양이 0.94, 개 0.04, 여우 0.02
13.2 객체 탐지
이미지 안에 무엇이 어디에 있는지 예측한다.
클래스 + 신뢰도 + 바운딩 박스
YOLO, Faster R-CNN, RetinaNet 등이 대표적이다. 객체 탐지 흐름은 YOLO v1 완벽 분석에서 자세히 설명한다.
13.3 이미지 분할
각 픽셀의 클래스를 예측한다.
- Semantic Segmentation: 같은 클래스의 객체를 하나로 취급
- Instance Segmentation: 같은 클래스라도 객체별로 분리
- Panoptic Segmentation: 배경 영역과 개별 객체를 함께 표현
13.4 키포인트와 자세 추정
사람의 관절, 얼굴 랜드마크, 손가락 위치처럼 특정 지점을 예측한다.
13.5 영상과 시계열
- 3D CNN: 시간축까지 함께 합성곱
- CNN + RNN/LSTM: 공간 특징과 시간 변화를 분리해 처리
- 1D CNN: 센서, 음성 파형, 심전도, 시계열 특징 추출
영상 분류의 결합 구조는 CNN과 RNN의 결합에서 이어서 볼 수 있다.
14. 실전 PyTorch CNN: CIFAR-10 분류 모델 만들기
아래 예제는 구조를 이해하기 위한 작은 CNN이다. 실제 서비스에서는 사전학습 모델을 사용하는 경우가 많지만, 직접 모델을 구성해보면 채널과 공간 크기의 변화를 이해하는 데 도움이 된다.
from __future__ import annotations
import torch
from torch import nn
class SmallCNN(nn.Module):
def __init__(self, num_classes: int = 10) -> None:
super().__init__()
self.features = nn.Sequential(
# 입력: N × 3 × 32 × 32
nn.Conv2d(3, 32, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
nn.Conv2d(32, 32, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),
# N × 32 × 16 × 16
nn.Conv2d(32, 64, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),
# N × 64 × 8 × 8
)
self.classifier = nn.Sequential(
nn.AdaptiveAvgPool2d((1, 1)),
nn.Flatten(),
nn.Dropout(p=0.3),
nn.Linear(64, num_classes),
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
x = self.features(x)
return self.classifier(x)
def count_parameters(model: nn.Module) -> int:
return sum(p.numel() for p in model.parameters() if p.requires_grad)
if __name__ == "__main__":
model = SmallCNN(num_classes=10)
sample = torch.randn(8, 3, 32, 32)
logits = model(sample)
print(model)
print("출력 크기:", logits.shape)
print("학습 파라미터:", f"{count_parameters(model):,}")
출력층에서는 Softmax를 직접 넣지 않았다. PyTorch의 CrossEntropyLoss가 내부적으로 로그 소프트맥스와 음의 로그우도를 결합해 계산하기 때문이다.
criterion = nn.CrossEntropyLoss()
logits = model(images)
loss = criterion(logits, labels)
추론 시 확률이 필요할 때만 Softmax를 적용한다.
probabilities = torch.softmax(logits, dim=1)
15. 작은 데이터셋에서는 전이학습이 기본 전략인 이유
CNN을 처음부터 학습하려면 충분히 다양하고 정확하게 라벨링된 데이터가 필요하다. 실무에서는 데이터가 수백 장에서 수만 장에 그치는 경우가 많다.
전이학습은 대규모 데이터로 미리 학습된 모델의 특징 추출 능력을 가져와 새 문제에 적용한다.
ImageNet 사전학습 모델
→ 기존 분류 헤드 제거
→ 내 클래스 수에 맞는 헤드 추가
→ 일부 또는 전체 층 미세조정
15.1 PyTorch 전이학습 예제
from __future__ import annotations
import torch
from torch import nn
from torchvision.models import ResNet18_Weights, resnet18
num_classes = 5
weights = ResNet18_Weights.DEFAULT
model = resnet18(weights=weights)
# 1단계: 특징 추출부 동결
for parameter in model.parameters():
parameter.requires_grad = False
# 마지막 분류층 교체
in_features = model.fc.in_features
model.fc = nn.Linear(in_features, num_classes)
optimizer = torch.optim.AdamW(
model.fc.parameters(),
lr=1e-3,
weight_decay=1e-4,
)
criterion = nn.CrossEntropyLoss()
# 사전학습 가중치에 맞는 전처리
preprocess = weights.transforms()
먼저 새 분류층만 학습한 뒤, 필요하면 뒤쪽 블록의 동결을 풀어 작은 학습률로 미세조정한다.
for parameter in model.layer4.parameters():
parameter.requires_grad = True
optimizer = torch.optim.AdamW(
[
{"params": model.layer4.parameters(), "lr": 1e-5},
{"params": model.fc.parameters(), "lr": 1e-4},
],
weight_decay=1e-4,
)
15.2 전이학습에서 자주 하는 실수
- 사전학습 모델이 기대하는 정규화 값을 사용하지 않음
- 클래스 수만 바꾸고 출력 손실함수를 잘못 선택함
- 처음부터 전체 모델에 큰 학습률을 적용함
- 학습·검증 데이터에 같은 객체나 연속 프레임이 섞임
- 검증 데이터에도 무작위 증강을 적용함
- 불균형 데이터에서 정확도만 확인함
단순히 “이미지가 1만 장 이상이면 처음부터 학습한다”처럼 고정된 기준을 적용해서는 안 된다. 필요한 데이터 규모는 문제 난이도, 클래스 수, 데이터 다양성, 도메인 차이, 라벨 품질, 모델 크기에 따라 달라진다.
16. 데이터 증강: 많아 보이게 만드는 것이 아니라 불변성을 가르치는 것
데이터 증강은 학습 이미지를 무작위로 변형해 모델이 우연한 배경이나 위치에 과도하게 의존하지 않도록 돕는다.
from torchvision import transforms
train_transform = transforms.Compose([
transforms.RandomResizedCrop(224, scale=(0.7, 1.0)),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(
brightness=0.2,
contrast=0.2,
saturation=0.2,
),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225],
),
])
그러나 모든 증강이 정답을 보존하는 것은 아니다.
| 작업 | 주의할 증강 |
|---|---|
| 숫자 인식 | 6과 9가 뒤집힐 수 있는 회전 |
| 한글·문자 인식 | 좌우 반전 |
| 의료 영상 | 실제 촬영 조건에 없는 방향 변환 |
| 차선·교통 표지 | 과도한 원근 왜곡 |
| 결함 탐지 | 결함 크기를 지워버리는 강한 크롭 |
좋은 증강은 이미지를 단순히 다양하게 만드는 것이 아니라, 업무에서 허용되는 변화에 대해 모델이 안정적으로 예측하도록 가르치는 것이다.
17. 학습 결과를 Accuracy 하나로 판단하면 안 되는 이유
이미지 분류에서 정확도는 가장 이해하기 쉬운 지표지만 클래스 불균형이 있으면 오해를 만들 수 있다.
예를 들어 정상 제품 990장, 불량 제품 10장인 데이터에서 모든 이미지를 정상으로 예측해도 정확도는 99%다.
따라서 목적에 따라 다음 지표를 함께 확인해야 한다.
- Precision
- Recall
- F1-score
- Confusion Matrix
- ROC-AUC 또는 PR-AUC
- 클래스별 정확도
- 객체 탐지의 IoU와 mAP
- 분할의 Dice와 IoU
자세한 지표 선택법은 AI 모델 성능 평가 지표 완전 정복에서 확인할 수 있다.
18. CNN이 실패하는 대표적인 이유
18.1 훈련 환경과 실제 환경이 다르다
학습 이미지는 밝고 정면인데 실제 입력은 어둡고 기울어져 있다면 성능이 크게 떨어질 수 있다. 이를 도메인 이동이라고 한다.
18.2 배경을 정답의 지름길로 학습한다
늑대 사진에는 눈이 많고 개 사진에는 실내 배경이 많다면 모델은 동물보다 배경을 학습할 수 있다.
18.3 작은 객체가 다운샘플링 과정에서 사라진다
풀링과 스트라이드가 반복되면 작은 결함, 먼 거리 보행자, 미세 병변의 특징이 소실될 수 있다.
18.4 라벨 품질이 낮다
잘못된 클래스, 누락된 바운딩 박스, 일관되지 않은 기준은 모델의 성능 상한을 낮춘다.
18.5 데이터 누수가 있다
같은 영상의 연속 프레임, 같은 환자, 같은 제품의 거의 동일한 이미지가 훈련과 검증에 나뉘면 실제보다 성능이 높아 보인다.
18.6 모델이 과도하게 확신한다
Softmax 확률이 0.99라고 해서 실제 정답 확률이 반드시 99%인 것은 아니다. 운영 환경에서는 Calibration, 불확실성, 임계값, 사람 검토 절차를 함께 고려해야 한다.
과적합과 일반화 문제는 과적합과 과소적합 완전 정복에서 더 자세히 설명한다.
19. CNN과 Vision Transformer는 무엇이 다를까?
Vision Transformer(ViT)는 이미지를 작은 패치로 나누고 패치 간 관계를 Self-Attention으로 학습한다.
| 항목 | CNN | Vision Transformer |
|---|---|---|
| 기본 단위 | 지역 커널 | 이미지 패치 |
| 핵심 연산 | 합성곱 | Self-Attention |
| 지역성 | 구조에 내장 | 데이터로 학습 |
| 위치 이동 대응 | 가중치 공유로 강한 편 | 위치 표현과 학습에 의존 |
| 소규모 데이터 | 상대적으로 유리 | 사전학습·규제가 중요 |
| 전역 관계 | 깊은 층을 거쳐 확보 | 초기부터 직접 모델링 가능 |
| 엣지·모바일 | 효율적인 모델이 많음 | 경량화 설계가 필요 |
| 병렬 처리 | 우수 | 우수하지만 해상도에 따른 비용 증가 가능 |
ViT가 등장했다고 CNN이 사라진 것은 아니다. 실무에서는 다음 선택이 현실적이다.
CNN이 유리한 경우
- 데이터셋이 크지 않음
- 모바일·NPU·엣지 장치에 배포
- 낮은 지연시간이 중요
- 검증된 백본과 도구가 필요
- 이미지의 지역적 패턴이 핵심
ViT 또는 하이브리드가 유리할 수 있는 경우
- 대규모 사전학습 모델을 활용
- 이미지 전체의 장거리 관계가 중요
- 멀티모달 모델과 결합
- 충분한 연산 자원과 데이터가 있음
최종 선택은 모델 이름이 아니라 실제 데이터에서의 정확도, 지연시간, 메모리, 전력, 유지보수 비용을 함께 측정해 결정해야 한다.
20. 실무용 CNN 모델 선택 가이드
| 목적 | 우선 검토할 모델 |
|---|---|
| 빠른 기준선 | ResNet-18, ResNet-50 |
| 모바일·엣지 | MobileNetV3, EfficientNet-Lite |
| 높은 분류 성능 | EfficientNet, ConvNeXt |
| 객체 탐지 | YOLO 계열, Faster R-CNN, RetinaNet |
| 의미 분할 | U-Net, DeepLab 계열 |
| 인스턴스 분할 | Mask R-CNN, YOLO Segmentation 계열 |
| 작은 데이터 | 사전학습 CNN + 전이학습 |
| 영상 분류 | 3D CNN, CNN-RNN, Video Transformer |
모델을 선택할 때는 정확도 순위만 보지 말고 다음을 확인해야 한다.
성능
+ 추론 지연시간
+ GPU/CPU/NPU 메모리
+ 입력 해상도
+ 배치 크기
+ 전력 소비
+ 라이선스
+ 배포 도구 지원
21. CNN 프로젝트 체크리스트
데이터
- 클래스 정의가 서로 겹치지 않는가?
- 라벨 기준이 작업자마다 동일한가?
- 훈련·검증·테스트 분할에 데이터 누수가 없는가?
- 실제 운영 환경의 조명, 각도, 해상도가 포함되어 있는가?
- 클래스 불균형과 희귀 사례를 확인했는가?
모델
- 처음부터 학습할 이유가 명확한가?
- 사전학습 가중치의 입력 전처리를 그대로 사용했는가?
- 입력 해상도가 작은 객체를 보존하기에 충분한가?
- 모델 크기가 배포 장치에 적합한가?
- 손실함수와 출력층 구성이 일치하는가?
평가
- Accuracy 외에 클래스별 Precision·Recall·F1을 확인했는가?
- 실제 운영 임계값에서 오탐과 미탐을 비교했는가?
- 데이터 하위 그룹별 성능을 점검했는가?
- 실패 사례를 직접 시각적으로 검토했는가?
- 추론 속도를 실제 배포 장치에서 측정했는가?
운영
- 입력 분포 변화와 성능 저하를 모니터링하는가?
- 사람이 재검토할 조건이 정의되어 있는가?
- 잘못된 예측을 다시 학습 데이터로 수집하는가?
- 모델 버전과 학습 데이터 버전을 기록하는가?
FAQ
CNN의 필터는 사람이 직접 설정하나요?
일반적으로는 아니다. 필터 값은 무작위 또는 특정 초기화 방식으로 시작하고 손실함수의 기울기를 이용해 학습된다. 다만 입력 전처리나 특정 영상처리 파이프라인에서는 고정 필터를 함께 사용할 수도 있다.
커널과 필터는 같은 뜻인가요?
문맥에 따라 비슷하게 쓰인다. 엄밀히는 하나의 출력 채널을 만드는 필터가 입력 채널 수만큼의 2차원 커널을 포함한다고 설명할 수 있다. 실무 문서에서는 두 용어가 혼용되는 경우가 많다.
CNN은 이미지 위치 변화에 완전히 불변한가요?
완전히 불변하지는 않다. 가중치 공유는 이동에 대해 등변적인 특성을 제공하고, 풀링과 다운샘플링은 작은 이동에 대한 민감도를 낮출 수 있다. 하지만 큰 이동, 회전, 크기 변화, 시점 변화에 자동으로 완전 불변이 되는 것은 아니다.
풀링을 많이 사용할수록 좋은가요?
아니다. 공간 크기를 빠르게 줄이면 계산량은 감소하지만 작은 객체와 위치 정보가 사라질 수 있다. 특히 탐지와 분할에서는 고해상도 특징을 유지하거나 여러 해상도의 특징을 결합하는 설계가 중요하다.
이미지가 적으면 CNN을 사용할 수 없나요?
사용할 수 있다. 대규모 데이터로 사전학습된 CNN을 가져와 분류층을 교체하고 미세조정하면 적은 데이터에서도 좋은 기준선을 만들 수 있다. 다만 데이터가 지나치게 적거나 운영 환경과 크게 다르면 교차검증, 강건한 증강, 추가 데이터 수집이 필요하다.
CNN과 YOLO는 같은 것인가요?
CNN은 특징을 추출하는 신경망 구조의 한 종류이고, YOLO는 이미지에서 객체의 위치와 클래스를 예측하는 객체 탐지 모델 계열이다. YOLO의 여러 버전은 CNN 기반 백본과 다양한 탐지 구조를 사용해왔다.
CNN은 이미지 외 데이터에도 사용할 수 있나요?
가능하다. 1D CNN은 시계열과 음성 파형, 2D CNN은 스펙트로그램, 3D CNN은 영상과 CT·MRI 볼륨 처리에 사용할 수 있다.
정리
CNN이 이미지를 이해하는 핵심은 거대한 이미지를 한 번에 외우는 것이 아니다.
작은 영역을 본다
→ 같은 필터를 모든 위치에 공유한다
→ 여러 특징 맵을 만든다
→ 깊은 층에서 특징을 조합한다
→ 분류·탐지·분할 결과로 변환한다
합성곱층은 이미지의 공간 구조를 보존하면서 파라미터를 효율적으로 사용한다. 활성화 함수는 복잡한 비선형 패턴을 학습하게 하고, 다운샘플링은 계산량을 줄인다. Batch Normalization과 Residual Connection은 깊은 네트워크의 학습을 안정화하며, 전이학습은 적은 데이터에서도 실용적인 성능을 얻을 수 있게 한다.
Vision Transformer와 멀티모달 모델이 확산된 지금도 CNN은 컴퓨터 비전의 기본 문법이다. 특히 실시간 처리, 엣지 배포, 제한된 데이터, 검증된 산업용 파이프라인에서는 여전히 강력한 선택지다.
같이 보기
컴퓨터 비전 – AI가 세상을 보는 방법
이미지 분류, 객체 탐지, 이미지 분할 등 컴퓨터 비전의 전체 지도를 먼저 살펴볼 수 있다.YOLO v1 완벽 분석: 실시간 객체 탐지 혁명의 시작
CNN 특징을 이용해 이미지 속 객체의 위치와 클래스를 한 번에 예측하는 원리를 설명한다.CNN과 RNN의 결합 – 영상 분류와 복합 모델
CNN이 추출한 공간 특징을 RNN·LSTM으로 시간 순서에 따라 처리하는 방법을 다룬다.손실함수 완전 정복
CNN 필터를 학습시키는 Cross-Entropy, Focal Loss, Dice Loss 등의 역할을 이해할 수 있다.활성화 함수 완전 정복
ReLU, GELU, SiLU 등 CNN 내부의 비선형성을 만드는 활성화 함수를 비교한다.AI 모델 성능 평가 지표 완전 정복
Accuracy, Precision, Recall, F1, IoU, mAP 등 이미지 모델 평가 지표를 정리한다.과적합과 과소적합 완전 정복
데이터 증강, Dropout, 정규화, 조기 종료를 통해 일반화 성능을 높이는 방법을 설명한다.AI가 데이터를 이해하는 방법
이미지와 같은 비정형 데이터의 특성, 데이터 편향과 품질 문제를 함께 살펴볼 수 있다.
참고 자료
- ImageNet Classification with Deep Convolutional Neural Networks – AlexNet 논문
- Deep Residual Learning for Image Recognition – ResNet 논문
- PyTorch Transfer Learning for Computer Vision Tutorial
- PyTorch TorchVision Object Detection Finetuning Tutorial
- Keras Image Classification from Scratch
- Keras Image Classification with Vision Transformer
- ImageNet-trained CNNs are biased towards texture
