OpenCV에서 DNN 모듈을 활용한 이미지 분류
1. 개요
딥러닝을 활용한 이미지 분류는 다양한 분야에서 널리 사용되고 있습니다. OpenCV는 cv2.dnn
모듈을 제공하여 딥러닝 기반의 이미지 분류 작업을 간단하게 수행할 수 있도록 지원합니다. 이 글에서는 OpenCV의 DNN 모듈을 활용하여 사전 훈련된 모델을 로드하고, 이미지 분류를 수행하는 방법을 설명하겠습니다.
2. OpenCV DNN 모듈 소개
OpenCV의 cv2.dnn
모듈은 딥러닝 모델을 로드하고 추론을 수행할 수 있는 기능을 제공합니다. Caffe, TensorFlow, ONNX, Darknet 등 여러 프레임워크에서 학습된 모델을 지원하며, 추가적인 딥러닝 프레임워크 없이도 빠르고 가벼운 실행이 가능합니다.
2.1 지원되는 모델 형식
- Caffe (
.prototxt
,.caffemodel
) - TensorFlow (
.pb
) - ONNX (
.onnx
) - Darknet (
.cfg
,.weights
)
3. 사전 훈련된 모델을 이용한 이미지 분류
이번 실습에서는 OpenCV의 DNN 모듈을 활용하여 ImageNet 데이터셋으로 훈련된 ResNet-50
모델을 사용하여 이미지 분류를 수행하겠습니다.
3.1 필요한 라이브러리 설치
pip install opencv-python numpy
4. 예제 코드: OpenCV DNN을 활용한 이미지 분류
4.1 모델 다운로드 및 클래스 레이블 로드
먼저, ResNet-50 모델과 ImageNet 클래스 레이블을 다운로드합니다.
import cv2
import numpy as np
# 모델 및 클래스 레이블 파일 경로
MODEL_PATH = "resnet50.caffemodel"
PROTO_PATH = "resnet50.prototxt"
LABELS_PATH = "synset_words.txt"
# ImageNet 클래스 레이블 로드
with open(LABELS_PATH, "r") as f:
class_labels = [line.strip().split(" ", 1)[1] for line in f.readlines()]
# DNN 모델 로드
net = cv2.dnn.readNetFromCaffe(PROTO_PATH, MODEL_PATH)
4.2 이미지 로드 및 전처리
이미지를 불러와 DNN 모듈에 입력할 수 있도록 변환합니다.
# 이미지 로드
image = cv2.imread("input.jpg")
(h, w) = image.shape[:2]
# 이미지 전처리
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size=(224, 224), mean=(104, 117, 123))
# 모델 입력 설정
net.setInput(blob)
4.3 이미지 분류 수행
모델에 이미지를 입력하고 예측 결과를 확인합니다.
# 모델 실행 (추론)
out = net.forward()
# 상위 5개 클래스 예측 결과 출력
top_indices = out[0].argsort()[-5:][::-1]
for i in top_indices:
print(f"{class_labels[i]}: {out[0][i] * 100:.2f}%")
5. 결과 및 분석
위 코드를 실행하면 입력된 이미지에 대한 상위 5개 예측 결과가 출력됩니다. 모델은 ImageNet 데이터셋에서 학습되었으므로 일반적인 사물 분류에 강점을 가지지만, 특정한 도메인(예: 의료, 교통)에서는 추가적인 미세 조정(Fine-tuning)이 필요할 수 있습니다.
6. 결론
OpenCV의 DNN 모듈을 활용하면 추가적인 딥러닝 프레임워크 없이도 사전 훈련된 모델을 쉽게 로드하고 이미지 분류를 수행할 수 있습니다. 다양한 모델을 OpenCV에서 사용할 수 있도록 변환하여 활용할 수도 있으며, 실시간 추론 성능을 높이기 위해 OpenVINO와 같은 최적화 기술과 함께 사용할 수도 있습니다.
'Python OpenCV' 카테고리의 다른 글
OpenCV를 활용한 얼굴 인식 (Haar Cascade, Dlib) (0) | 2025.03.15 |
---|---|
OpenCV에서 YOLO를 활용한 객체 탐지 (0) | 2025.03.14 |
OpenCV YOLO 및 Haar Cascade를 활용한 객체 검출 (0) | 2025.03.12 |
객체 추적 (MeanShift, CamShift) - OpenCV 활용 (0) | 2025.03.11 |
배경 제거 (배경 차분, cv2.absdiff()) (0) | 2025.03.10 |