본문 바로가기

IT

OpenCV에서 YOLO 모델 사용해보기

YOLO는 실시간 객체 탐지(Object Detection) 분야에서 널리 쓰이는 모델로, 
단일 프레임 내에서 여러 객체의 위치와 클래스를 빠르게 검출할 수 있어요.

OpenCV에서 YOLO 모델


OpenCV DNN 모듈을 이용하면 복잡한 프레임워크 없이도 YOLO 모델을 불러오고 추론까지 가능해요.

YOLO 모델의 개요와 장점

YOLO는 이미지를 여러 그리드로 나눈 후,

각 그리드에서 객체의 위치와 클래스 확률을 한 번에 예측하는 방식이예요.


기존의 R-CNN 계열보다 훨씬 빠르며, 실시간 처리에 적합하다는 장점이 있어요.
YOLOv3, v4, v5, v8 등 다양한 버전이 있으며,

OpenCV에서는 ONNX 또는 Darknet 포맷을 사용할 수 있어요.


ONNX 포맷은 특히 DNN 모듈과의 호환성이 좋고,

파이썬뿐 아니라 C++에서도 쉽게 활용 가능해요.
YOLO는 객체 감지 정확도와 속도 모두를 고려한 모델로,

영상 기반 인식 시스템에 많이 쓰여요.

YOLO 모델 불러오기: 모델과 클래스 이름 준비

YOLO를 OpenCV에서 사용하려면

모델 파일(.onnx 또는 .weights + .cfg)과 클래스 이름(.names 또는 .txt)이 필요해요.


ONNX 기반 YOLOv5, YOLOv8 모델은 공식 사이트 또는 ultralytics에서 다운로드할 수 있어요.
클래스 이름은 탐지된 객체의 레이블을 붙이기 위해 사용되며,

보통 COCO 데이터셋 기준으로 80개 정도예요.

 

cv::dnn::Net net = cv::dnn::readNet("yolov5s.onnx");
std::vector<std::string> classNames;
std::ifstream ifs("coco.names");
std::string line;
while (std::getline(ifs, line)) classNames.push_back(line);

이 코드는 모델과 클래스 이름을 불러오는 기본 구조예요.

이미지 또는 영상에서 객체 탐지 수행하기

YOLO 모델에 이미지를 입력하려면,

먼저 blobFromImage()로 전처리한 뒤 forward()로 추론을 실행해요.
YOLO 모델은 각 객체에 대한 박스 좌표(x, y, w, h), 신뢰도, 클래스별 확률을 출력해요.
후처리를 통해 임계값 이하 박스 제거, NMS(비최대 억제) 등의 과정을 거쳐 최종 탐지 결과를 그려야 해요.

 

cv::Mat blob = cv::dnn::blobFromImage(image, 1/255.0, cv::Size(640, 640), cv::Scalar(), true, false);
net.setInput(blob);
std::vector<cv::Mat> outputs;
net.forward(outputs, net.getUnconnectedOutLayersNames());

여기까지가 YOLO 추론의 핵심 처리 흐름입니다.

YOLO 출력 결과 해석 및 박스 시각화

YOLO의 출력은 복잡할 수 있지만,

보통 각 객체마다 [x, y, w, h, conf, class1, class2, ...] 형식이예요.
conf와 클래스 확률을 곱해서 최종 점수를 계산하고,

cv::NMSBoxes()로 중복 박스를 제거해줘야 해요.


시각화 단계에선 rectangle()로 박스를 그리고,

클래스명을 텍스트로 표시해주면 사용자에게 직관적으로 보여줄 수 있어요.

 

for (int i = 0; i < detections.rows; ++i) {
    float confidence = detections.at<float>(i, 4);
    if (confidence > 0.4) {
        cv::Rect box = ...;  // x, y, w, h에서 계산
        cv::rectangle(image, box, cv::Scalar(0,255,0), 2);
        cv::putText(image, classNames[class_id], box.tl(), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255,255,255));
    }
}

이 코드는 일정 신뢰도 이상의 박스를 그려주는 기본 예제입니다.

실시간 YOLO 감지: 웹캠 연동과 성능 팁

YOLO는 고속 추론이 가능한 모델이라 실시간 영상에서도 사용할 수 있어요.
VideoCapture로 웹캠 스트림을 받고,

각 프레임마다 YOLO 추론을 수행하면 바로 객체를 추적할 수 있어요.


단, 추론 속도 향상을 위해 GPU 백엔드 설정 또는

이미지 크기를 640x640 등으로 고정하는 것이 좋아요.
또한, 클래스 수가 많으면 결과 해석이 느려질 수 있으니 class filter 등을 도입해도 좋아요.

 

net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
// 또는 CUDA 가속 가능 시
// net.setPreferableBackend(DNN_BACKEND_CUDA);
// net.setPreferableTarget(DNN_TARGET_CUDA);

이 설정으로 YOLO 모델을 OpenCV DNN에서 최적화된 환경으로 사용할 수 있어요.

 

 

이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~

OpenCV에서 YOLO 모델 사용해보기.mp3
4.72MB