YOLO는 실시간 객체 탐지(Object Detection) 분야에서 널리 쓰이는 모델로,
단일 프레임 내에서 여러 객체의 위치와 클래스를 빠르게 검출할 수 있어요.
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에서 최적화된 환경으로 사용할 수 있어요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~
'IT' 카테고리의 다른 글
OpenCV DNN 모듈로 딥러닝 모델 로딩하기 (0) | 2025.06.30 |
---|---|
OpenCV와 Haar Cascade를 이용한 얼굴 검출 (0) | 2025.06.29 |
OpenCV에서 프레임 단위 영상 처리 기법 (0) | 2025.06.28 |
OpenCV로 영상 저장하기: VideoWriter 사용법 (0) | 2025.06.28 |
OpenCV VideoCapture 클래스 이해 및 활용 (0) | 2025.06.28 |