1. 커널 (Kernel, 필터)
- 정의: CNN에서 특징(feature)을 추출하기 위해 사용하는 작은 가중치 행렬.
- 크기 예시: YOLO v1에서는 주로 3×3 커널을 사용했어요.
- 계산 방식: 입력 이미지 위를 커널이 슬라이딩하면서 합성곱(convolution)을 수행해 새로운 출력(feature map)을 만듭니다.
- 예: 입력이 7×7, 커널이 3×3, stride=1, padding=0 → 출력은 5×5
공식:
O=S(I−K+2P)+1
- II: 입력 크기
- KK: 커널 크기
- PP: 패딩 크기
- SS: 스트라이드
2. 스트라이드 (Stride)
- 정의: 커널이 입력 위를 이동할 때의 보폭.
- 예시: stride=1 → 한 칸씩 이동 / stride=2 → 두 칸씩 이동
- 효과: stride가 크면 출력 feature map 크기가 작아져, 다운샘플링 효과를 가져옵니다.
예: 입력 7×7, 커널 3×3, stride=2, padding=0
O=2(7−3+0)+1=3
즉, 출력은 3×3이 됩니다.
3. 채널 (Channel)
- 정의: 입력 이미지의 깊이(dimension).
- 컬러 이미지(RGB)는 채널=3 (Red, Green, Blue).
- 합성곱 연산에서는 각 채널별로 커널이 적용되고, 결과가 합쳐져 출력 feature map을 만듭니다.
예:
입력: 224×224×3 (RGB 이미지)
커널: 3×3×3, 필터 수=64개
출력: 224×224×64
즉, 채널은 “특징을 담는 깊이”라고 이해하면 됩니다.
4. MaxPooling
- 정의: 일정 영역(예: 2×2)에서 최댓값을 뽑아내는 다운샘플링 방법.
- 효과:
- 크기 축소 (downsampling)
- 연산량 감소
- 중요한 특징만 남기고 불필요한 값 제거 → translation invariance(위치 변화에 덜 민감)
예:
- 입력: 4×4
- MaxPool 2×2, stride=2 → 출력: 2×2
입력:
입력: 1 3 2 1
4 6 5 2
7 8 9 1
2 3 4 0
출력: 6 5
8 9
5. 다운샘플링 (Downsampling)
- 정의: 입력 크기를 줄여 더 작은 feature map으로 만드는 과정.
- 방법:
- Stride > 1 합성곱
- Pooling (MaxPool, AvgPool)
- YOLO v1: Conv stride=2, MaxPooling을 반복적으로 사용해
- 입력 448×448 → 마지막 feature map 7×7로 축소
6. YOLO v1 예시 계산 과정
YOLO v1의 입력은 .
네트워크 구조를 따라가면 이렇게 다운샘플링됩니다.

✅ 정리
- 커널: 특징 추출을 위한 작은 가중치 행렬
- 스트라이드: 커널 이동 보폭 → 클수록 출력 작아짐
- 채널: 특징의 깊이, 필터 수만큼 출력 채널 생성
- MaxPooling: 일정 영역에서 대표 값만 추출해 크기 축소
- 다운샘플링: Conv(stride>1), Pooling으로 입력을 점점 줄여나감
- YOLO v1: 입력이 최종적으로 7×7 feature map으로 변환
YOLO v1 Darknet 참조 버전 레이어별 출력 크기 (입력: 448×448×3)
| # | Layer | Kernel / Stride / Pad | Filters | Input → Output |
| 1 | Conv | 7×7 / s2 / p3 | 64 | 448×448×3 → 224×224×64 |
| 2 | MaxPool | 2×2 / s2 | — | 224×224×64 → 112×112×64 |
| 3 | Conv | 3×3 / s1 / p1 | 192 | 112×112×64 → 112×112×192 |
| 4 | MaxPool | 2×2 / s2 | — | 112×112×192 → 56×56×192 |
| 5 | Conv | 1×1 / s1 / p0 | 128 | 56×56×192 → 56×56×128 |
| 6 | Conv | 3×3 / s1 / p1 | 256 | 56×56×128 → 56×56×256 |
| 7 | Conv | 1×1 / s1 / p0 | 256 | 56×56×256 → 56×56×256 |
| 8 | Conv | 3×3 / s1 / p1 | 512 | 56×56×256 → 56×56×512 |
| 9 | MaxPool | 2×2 / s2 | — | 56×56×512 → 28×28×512 |
| 10 | Conv | 1×1 / s1 / p0 | 256 | 28×28×512 → 28×28×256 |
| 11 | Conv | 3×3 / s1 / p1 | 512 | 28×28×256 → 28×28×512 |
| 12 | Conv | 1×1 / s1 / p0 | 256 | 28×28×512 → 28×28×256 |
| 13 | Conv | 3×3 / s1 / p1 | 512 | 28×28×256 → 28×28×512 |
| 14 | Conv | 1×1 / s1 / p0 | 256 | 28×28×512 → 28×28×256 |
| 15 | Conv | 3×3 / s1 / p1 | 512 | 28×28×256 → 28×28×512 |
| 16 | Conv | 1×1 / s1 / p0 | 256 | 28×28×512 → 28×28×256 |
| 17 | Conv | 3×3 / s1 / p1 | 512 | 28×28×256 → 28×28×512 |
| 18 | Conv | 1×1 / s1 / p0 | 512 | 28×28×512 → 28×28×512 |
| 19 | Conv | 3×3 / s1 / p1 | 1024 | 28×28×512 → 28×28×1024 |
| 20 | MaxPool | 2×2 / s2 | — | 28×28×1024 → 14×14×1024 |
| 21 | Conv | 1×1 / s1 / p0 | 512 | 14×14×1024 → 14×14×512 |
| 22 | Conv | 3×3 / s1 / p1 | 1024 | 14×14×512 → 14×14×1024 |
| 23 | Conv | 1×1 / s1 / p0 | 512 | 14×14×1024 → 14×14×512 |
| 24 | Conv | 3×3 / s1 / p1 | 1024 | 14×14×512 → 14×14×1024 |
| 25 | Conv | 3×3 / s2 / p1 | 1024 | 14×14×1024 → 7×7×1024 |
| 26 | Conv | 3×3 / s1 / p1 | 1024 | 7×7×1024 → 7×7×1024 |
| 27 | Conv | 3×3 / s1 / p1 | 1024 | 7×7×1024 → 7×7×1024 |
| 28 | FC | — | 4096 | 7×7×1024 → 4096 |
| 29 | FC (output) | — | 7×7×30 | 4096 → 7×7×30 (=1470) |
1. Fully Connected Layer (FC)의 정의
- 완전연결층은 말 그대로 앞 층의 모든 뉴런이 현재 층의 모든 뉴런과 연결된 구조예요.
- 합성곱층(conv layer)이나 풀링층(pooling layer)에서는 공간적(local) 연결만 존재하지만, FC층에서는 전역(global) 연결이 이루어집니다.
- 수식으로 표현하면, FC층은 **행렬 곱(matrix multiplication)**을 하는 것과 같아요.
y=W⋅x+by = W \cdot x + b
- xx: 입력 벡터 (flatten된 feature map)
- WW: 가중치(weight) 행렬
- bb: 편향(bias)
- yy: 출력 벡터
2. YOLO v1에서의 FC 동작
YOLO v1은 마지막 합성곱 층의 출력이 7×7×1024입니다.
- Flatten 과정
- 7×7×1024=501767 \times 7 \times 1024 = 50176개의 값을 1차원 벡터로 변환합니다.
- FC Layer 1 (4096 units)
- 50176차원 입력 → 4096차원 출력
- 이 단계에서 CNN이 학습한 공간적 특징을 압축해서, 최종 탐지에 필요한 **고수준 표현(high-level representation)**을 만듭니다.
- FC Layer 2 (7×7×30 = 1470 units)
- 4096차원 입력 → 1470차원 출력
- 이 1470차원 벡터를 다시 7×7×30 텐서로 reshape
- 각 grid cell마다 30개의 값:
- 2개의 bounding box × 5 값(x, y, w, h, confidence) = 10
- 클래스 확률 20개 = 20
- → 총 30
즉, FC층이 하는 일은 **“CNN이 뽑아낸 특징을 YOLO의 최종 예측 구조(7×7×30)에 맞춰 변환하는 것”**입니다.
3. FC Layer의 특징
- 장점: 이미지 전체의 특징을 종합하여 최종 의사결정(분류, 탐지)을 수행
- 단점:
- 파라미터 수가 매우 많음 (가중치 행렬 크기가 엄청남)
- 연산량 증가
- 그래서 최근(YOLOv2 이후)에는 FC 대신 **Global Average Pooling (GAP)**을 쓰는 추세
4. YOLO v1 예시
- 입력: 7×7×1024 = 50176
- FC(4096): 가중치 크기 = 50176×4096 ≈ 2억 개 (매우 많음)
- FC(1470): 가중치 크기 = 4096×1470 ≈ 600만 개
→ YOLO v1이 무겁고 GPU 메모리를 많이 먹었던 이유 중 하나가 바로 이 FC 구조 때문이에요.
✅ 정리
- FC층은 합성곱 특징맵 → 최종 예측값으로 매핑하는 “전역 의사결정 층”
- YOLO v1에서는 FC 덕분에 7×7 grid마다 bounding box + 클래스 확률을 출력할 수 있었음
- 하지만 파라미터 수가 너무 많아서, 이후 YOLOv2부터는 FC를 없애고 Fully Convolutional Network (FCN) 구조로 바뀜
YOLO v1은 마지막에 FC 레이어(4096 → 1470)를 붙여서 출력했는데, 이후 YOLO v2부터는 FCN (Fully Convolutional Network) 구조로 바뀌었고, 마지막에 **Global Average Pooling (GAP)**이나 작은 conv layer로 출력을 뽑는 방식을 씁니다.
1. YOLO v1 (FC 사용)의 문제점
YOLO v1 마지막 구조:
- 마지막 conv 출력: 7×7×1024=501767 \times 7 \times 1024 = 50176
- FC1: 50176 → 4096
- 가중치 수 = 50176×4096≈2.05억50176 \times 4096 ≈ 2.05억
- FC2: 4096 → 1470
- 가중치 수 = 4096×1470≈600만4096 \times 1470 ≈ 600만
- 총 파라미터 ≈ 2.11억 개 (메모리 수 GB 단위 소모)
👉 단점
- 매우 많은 파라미터 → GPU 메모리, 학습 시간 부담
- 위치 특화(Locality) 손실 → flatten 후 전역 연결이라, 공간 구조가 사라짐
- 과적합 위험 → 데이터가 부족하면 쉽게 오버피팅
2. FCN(Global Average Pooling) 방식
YOLO v2~ 이후는 FC 대신 Conv + GAP을 사용:
- 마지막 conv 출력: 7×7×10247 \times 7 \times 1024
- Conv (1×1, out=30): 7×7×1024→7×7×307 \times 7 \times 1024 → 7 \times 7 \times 30
- 가중치 수 = 1×1×1024×30=307201 \times 1 \times 1024 \times 30 = 30720 (3만 개 수준)
- 그대로 7×7×30을 출력
👉 장점
- 파라미터 수 대폭 감소: 2억 → 3만 (약 7000배 감소)
- 속도 향상: 학습/추론 모두 가벼움
- 공간 정보 보존: conv라서 위치 구조가 유지됨
- 과적합 방지: 불필요한 거대 파라미터가 없어 안정적
3. 계산량 비교 (대략적)
- YOLO v1 FC 구조:
- 연산량 = 2억 × forward/backprop → 매우 무거움
- YOLO v2 FCN 구조:
- 연산량 = 3만 × forward/backprop → 훨씬 가벼움
즉, 계산량/메모리 모두 수천 배 감소합니다.
4. 왜 GAP가 좋은가?
- GAP는 feature map의 각 채널을 평균값 1개로 줄이는 방식 → 파라미터 0개
- 최종적으로 conv filter만 조정해서 클래스 수나 bbox 수에 맞추면 끝
- 따라서 네트워크를 End-to-End Convolutional 구조로 바꾸고, 공간성을 유지한 채 예측 가능
✅ 정리
- YOLO v1 (FC): 파라미터 ≈ 2억, 무겁고 오버피팅 위험
- YOLO v2 이후 (FCN+GAP): 파라미터 ≈ 3만, 훨씬 가볍고 일반화 잘됨
- 장점: 연산량 감소, 메모리 효율, 공간 정보 보존, 학습 안정성
'AI 활용 소프트웨어 개발 > AI, 머신러닝, 딥러닝' 카테고리의 다른 글
| ONNX (Open Neural Network Exchange) (0) | 2025.09.15 |
|---|---|
| 백본 특징 추출기, GAP, Attension Pooling , ContrastiveLoss (0) | 2025.09.04 |
| Local GPU (Vscode) 환경 설정 및 사용하기 (0) | 2025.08.13 |
| YOLO 하이퍼파라미터 조정하기 (yaml 파일) (3) | 2025.08.11 |
| Resnet(Deep Residual Learning for Image Recognition)논문 요약 및 구현 (2) | 2025.08.05 |