CNN 이미지 분석: ResNet·VGG와 YOLO·Faster R-CNN 선택
CNN 이미지 분석에서 VGG·ResNet 분류 모델과 YOLO·Faster R-CNN 객체 탐지 모델의 구조, 성능, 배포 운영 기준을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
분류와 탐지는 출력부터 다르다
CNN 기반 분류는 합성곱 계층과 풀링 계층을 반복하면서 계층적 특징 맵을 만들고, 마지막 완전연결층에서 클래스 확률을 낸다. VGG는 3×3 컨볼루션을 반복하는 단순한 구조이고, ResNet은 잔차 연결(residual connection)로 기울기 소실을 완화해 깊은 네트워크의 학습을 안정화한다.
객체 탐지는 이미지 안의 객체 위치를 바운딩 박스로 찾는 동시에 클래스를 예측한다. 분류가 이미지 전체에 단일 레이블을 붙인다면, 탐지는 여러 객체의 위치와 클래스를 다룬다. 탐지 결과에서는 NMS(Non-Max Suppression)로 겹치는 박스를 제거하고 신뢰도 임계값으로 결과를 거른다.
탐지 모델은 처리 방식에 따라 나뉜다. YOLO 같은 원스테이지 모델은 백본이 뽑은 특징으로부터 박스와 클래스를 직접 회귀해 빠른 추론에 맞는다. Faster R-CNN 같은 투스테이지 모델은 RPN으로 후보 영역을 만들고 RoI 특징을 정렬한 뒤 분류와 회귀를 수행하므로, 정밀도에서 우위인 경향이 있다.
백본에서 결과까지 이어지는 경로
백본은 VGG, ResNet, CSPDarknet처럼 특징을 추출하는 네트워크다. FPN 또는 PAFPN 같은 넥은 여러 해상도의 특징을 합쳐 작은 객체 탐지를 보완한다. 헤드는 분류 모델에서는 클래스 로지트를, 탐지 모델에서는 클래스와 박스 회귀 결과를 산출한다.
VGG는 동일한 3×3 커널을 쌓는 구조라 구현과 해석이 쉽다. 반면 파라미터와 연산량이 크고 메모리 사용량도 높아 경량 배포에는 불리하다.
ResNet은 skip connection으로 정보와 그라디언트 경로를 확보한다. 50/101/152층 등 깊은 모델의 학습을 안정화하며, 파라미터 효율과 일반화 성능 덕분에 백본으로 널리 쓰인다.
YOLO는 단일 추론 패스에서 박스와 클래스를 함께 예측한다. 앵커 기반과 앵커프리 변형을 지원하며, NMS와 디코딩 최적화를 통해 실시간 애플리케이션에 적합하다. Faster R-CNN은 RPN과 RoIAlign을 거쳐 정교하게 분류·회귀한다. 속도는 느리지만 복잡한 배경이나 밀집 객체 환경에서 안정적인 정밀도를 확보한다.
학습 단계에서는 데이터 증강, 백본 사전학습(transfer), 헤드 미세조정, 하이퍼파라미터 스케줄링이 이어진다. 추론 단계는 전처리, 백본·넥·헤드 실행, NMS·후처리, 임계값 기반 결과 산출과 로깅으로 구성한다.
모델별 성능과 운영 성격
| 모델 | 유형 | 성능(정확도) | 지연/속도 | 확장성 | 안정성/일관성 | 운영 편의 |
|---|---|---|---|---|---|---|
| VGG16 | 분류 | ImageNet Top-1 약 71~73% | 느림, 메모리 사용 높음 | 낮음(모바일 부적합) | 높음(단순 구조) | 보통 |
| ResNet50 | 분류 | ImageNet Top-1 약 76~78% | 중간 | 높음(전이학습 용이) | 높음 | 높음 |
| YOLO(v5/v8, n/s) | 탐지(1-stage) | COCO mAP50-95 약 0.35~0.50 | 매우 빠름(엣지 실시간) | 높음(스케일 다양) | 보통 | 높음 |
| Faster R-CNN(R50-FPN) | 탐지(2-stage) | COCO mAP50-95 약 0.40~0.45 | 느림(서버 지향) | 중간 | 높음 | 보통 |
주: 수치는 하드웨어·버전·데이터셋 의존, 최신 정보 확인 필요.
현장 조건에 맞춘 적용
제조 결함 검출에서는 라인 카메라 입력을 YOLO로 처리해 결함 박스를 실시간으로 표시하고, 임계 이하 결과를 불량 아웃소팅으로 연결할 수 있다. 반사와 조명 변화에는 도메인 증강을 적용하고 Confidence/IoU 임계값을 조정한다.
리테일 매대 분석은 ResNet 분류로 상품 카테고리를 라벨링한 뒤 YOLO 또는 Faster R-CNN으로 위치와 재고를 파악하는 흐름으로 구성할 수 있다. 엣지 단말에서 추론하고 중앙 서버에서 집계하면 지연을 낮추고 프라이버시를 보호할 수 있다.
교통 분석에서는 YOLO로 차량과 보행자를 탐지한 뒤 DeepSORT 등의 트래킹으로 연결해 속도와 밀집도 지표를 산출한다. 야간과 우천 조건을 고려한다면 노출·노이즈 증강이 필요하다.
의료 영상은 ResNet으로 영상 질을 판별하거나 뷰를 정규화한 뒤, 투스테이지 탐지로 병변 후보를 제시하는 방식이 가능하다. 이 경우 민감 데이터 비식별화와 온프렘 배치를 갖춰야 한다.
PyTorch와 YOLO 추론 예시
전제조건은 다음과 같다.
- Python 3.9~3.11, PyTorch 2.2+ / torchvision 0.17+, CUDA 옵션 선택
- Ultralytics 8.x(옵션, YOLO 계열)
- 최신 가중치·성능 수치는 환경 의존, 최신 정보 확인 필요
설치는 다음과 같다.
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # CUDA 12.1 예시
pip install ultralytics
ResNet50과 VGG16을 이용한 분류 추론 코드는 다음과 같다.
import torch
from torchvision import models, transforms
from PIL import Image
device = 'cuda' if torch.cuda.is_available() else 'cpu'
# 사전학습 가중치 로드
resnet = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2).to(device).eval()
vgg = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1).to(device).eval()
preprocess = transforms.Compose([
transforms.Resize(256), transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=models.ResNet50_Weights.IMAGENET1K_V2.meta['mean'],
std=models.ResNet50_Weights.IMAGENET1K_V2.meta['std']),
])
img = Image.open('sample.jpg').convert('RGB')
x = preprocess(img).unsqueeze(0).to(device)
with torch.inference_mode():
logits = resnet(x)
prob = torch.softmax(logits, dim=1)
top5 = prob.topk(5)
idx_to_label = models.ResNet50_Weights.IMAGENET1K_V2.meta['categories']
for p, idx in zip(top5.values[0].tolist(), top5.indices[0].tolist()):
print(f'{idx_to_label[idx]}: {p:.4f}')
YOLO(v8) 추론은 다음처럼 실행한다.
from ultralytics import YOLO
model = YOLO('yolov8n.pt') # 경량 모델 예시
results = model.predict(source='sample.jpg', imgsz=640, conf=0.25, iou=0.6, device=0)
for r in results:
print(r.boxes.xyxy, r.boxes.cls, r.boxes.conf)
r.save(filename='pred_yolo.jpg')
Faster R-CNN 추론 코드는 다음과 같다.
import torch
from torchvision.models.detection import fasterrcnn_resnet50_fpn, FasterRCNN_ResNet50_FPN_Weights
from torchvision import transforms
from PIL import Image
device = 'cuda' if torch.cuda.is_available() else 'cpu'
weights = FasterRCNN_ResNet50_FPN_Weights.COCO_V1
model = fasterrcnn_resnet50_fpn(weights=weights).to(device).eval()
preprocess = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=weights.meta['mean'], std=weights.meta['std'])
])
img = Image.open('sample.jpg').convert('RGB')
x = preprocess(img).unsqueeze(0).to(device)
with torch.inference_mode():
outputs = model(x)[0]
# NMS/임계는 내부 적용, 후처리 임계 재필터 가능
keep = outputs['scores'] > 0.5
boxes = outputs['boxes'][keep].cpu().numpy()
labels = outputs['labels'][keep].cpu().numpy()
scores = outputs['scores'][keep].cpu().numpy()
print(list(zip(boxes, labels, scores)))
지연, 정밀도, 배포 제약을 함께 다루기
Mixed Precision(TensorRT/AMP)은 지연을 30~60% 줄이면서 mAP 영향은 경미하다. 작은 객체가 중심인 과제라면 입력 해상도 증가와 FPN 튜닝을 함께 검토해야 한다. GPU 활용을 높이려면 배치 처리를 사용하고, 실시간 요구에서는 마이크로배치 또는 동시 스트림 처리로 균형을 잡는다.
지연 한계가 엄격하면 YOLO 계열을 먼저 검토하고, 복잡한 장면에서 정밀도가 우선이면 Faster R-CNN을 고려한다. 앵커·앵커프리 방식, IoU/NMS 임계값, CutMix/Mosaic/HSV 데이터 증강 파라미터는 그리드 서치 대상으로 둘 수 있다.
개인정보나 대역폭 제약이 큰 환경에서는 엣지 배포가 우선이고, 대규모 집계와 학습 재사용이 중심이면 서버 배포가 맞는다. 입력 분포 드리프트와 성능 저하를 모니터링하고, 주기적 재학습 파이프라인을 운영한다. 민감 데이터에는 비식별화와 접근 통제를 적용한다.
분류에서 VGG16을 ResNet50으로 전환하면 ImageNet 기준 Top-1 약 +46%p 향상될 수 있으며, 환경 의존적이다. 탐지에서는 Faster R-CNN이 YOLO 최신 계열보다 정밀도에서 근소한 우위를 보이는 사례가 있고, YOLO는 지연을 510배 단축하는 경향이 있다. 이 역시 하드웨어 의존적이다.
AMP/양자화(TensorRT INT8)를 적용하면 추론 비용을 3070% 절감하고 지연을 25배 개선할 수 있다. 엣지 오프로딩은 전송량을 줄이고 응답시간을 100ms에서 20~30ms 수준으로 단축한 사례가 있다. 전처리·후처리·임계값을 표준화하면 재현성과 A/B 테스트가 쉬워지며, 모델과 데이터의 버전 관리는 규제·감사 대응력을 높인다.