본문 바로가기

IT

OpenCV로 이미지 분류 모델의 결과를 시각화하는 방법

이미지 분류 모델은 입력된 이미지가 어떤 클래스에 속하는지를 예측해주는데, 

이 결과를 직관적으로 이해할 수 있도록 텍스트와 그래픽 요소로 시각화해주는 게 중요해요.

 

OpenCV로 이미지 분류 모델의 결과를 시각화


OpenCV의 기본적인 이미지 처리 기능과 함께, 

분류 확률 등을 화면에 함께 표현하면 훨씬 보기 쉬운 결과를 만들 수 있어요.

이미지 분류 모델의 결과를 왜 시각화하나요?

이미지 분류 모델은 보통 가장 가능성 높은 클래스의 인덱스와 확률(score)을 반환해요.
이 결과를 단순한 숫자로만 보는 것보다,

입력 이미지 위에 클래스 이름과 확률을 함께 표시하면 훨씬 직관적으로 이해할 수 있어요.


예를 들어 고양이 사진을 분류했을 때 “Cat (92%)” 같은 결과를 화면에 바로 띄워주는 방식이에요.
특히 분류 결과를 영상 스트림에 적용할 때는 실시간으로 어떤 객체인지 빠르게 알 수 있어서 매우 유용해요.
이런 시각화는 사용자의 신뢰도도 높이고, 디버깅 시에도 많은 도움을 줘요.

분류 결과 추론 후, 텍스트로 출력하기

분류 모델의 출력은 보통 각 클래스별 확률 값이 담긴 벡터예요.
이 중 가장 높은 확률을 가지는 인덱스를 찾아서 클래스 이름과 함께 출력해주는 방식으로 시각화할 수 있어요.
OpenCV에서는 putText() 함수를 사용해서 이미지 위에 텍스트를 간단히 그릴 수 있어요.

 

int classId;
double confidence;
cv::Point classIdPoint;
cv::minMaxLoc(output.reshape(1,1), 0, &confidence, 0, &classIdPoint);
classId = classIdPoint.x;
std::string label = classNames[classId] + " (" + std::to_string(confidence * 100).substr(0, 4) + "%)";
cv::putText(image, label, cv::Point(20, 40), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(0, 255, 0), 2);

이 코드는 이미지 좌측 상단에 분류 결과를 그려주는 기본 예제예요.

바 차트 형식으로 클래스별 확률 보여주기

텍스트 외에도 바 차트 형태로 여러 클래스의 확률 분포를 보여줄 수도 있어요.
Top-5 클래스를 뽑아서 각각의 확률을 가로 막대 형식으로 그려주면,

사람이 어느 정도 자신감을 가진 예측인지 시각적으로 파악할 수 있어요.
이때 막대의 길이를 확률에 비례하게 그리면 좋아요.

 

for (int i = 0; i < 5; ++i) {
    int idx = indices[i];
    float prob = scores[idx];
    cv::rectangle(image, cv::Rect(20, 60 + i * 30, int(prob * 200), 20), cv::Scalar(0, 128, 255), cv::FILLED);
    cv::putText(image, classNames[idx] + " " + std::to_string(prob * 100).substr(0, 4) + "%", cv::Point(230, 75 + i * 30), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255), 1);
}

이 코드는 이미지 한쪽에 Top-5 확률 막대를 시각화하는 예제예요.

영상 스트림에서 실시간 분류 결과 시각화

정지 이미지뿐만 아니라 실시간 영상에서도 이미지 분류 결과를 시각화할 수 있어요.
웹캠에서 프레임을 받아올 때마다 분류 모델을 적용하고, 결과를 실시간으로 화면에 보여주면 돼요.
이때 프레임 속도를 고려해서 너무 무거운 모델은 피하거나,

프레임당 추론 간격을 조절하는 것도 좋아요.

 

cv::VideoCapture cap(0);
while (true) {
    cap >> frame;
    preprocess(frame);  // 전처리
    net.setInput(blob);
    cv::Mat output = net.forward();
    // 위에서 설명한 방식으로 텍스트 표시
    cv::imshow("Live Classification", frame);
    if (cv::waitKey(1) == 27) break;
}

이 코드는 실시간으로 분류 결과를 웹캠 프레임에 출력하는 기본 흐름이예요.

사용자에게 친절한 시각화 디자인 팁

분류 결과를 효과적으로 시각화하려면 폰트 크기, 색상, 위치 등에도 신경 써야 해요.
텍스트가 잘 보이도록 그림자 효과나 배경 박스를 넣거나,

높은 신뢰도일수록 색이 진해지게 하는 방식도 유용해요.


클래스 이름이 긴 경우 잘림 방지, 오버레이 투명도 조절 등도 고려하면 훨씬 깔끔한 UI가 될 수 있어요.
또한 시각화 정보를 JSON이나 로그 파일로 저장해두면 추후 분석에도 활용할 수 있어요.
결과를 저장할 때는 imwrite() 함수나 VideoWriter로 결과 영상을 저장할 수도 있어요.

 

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

OpenCV로 이미지 분류 모델의 결과를 시각화하는 방법.mp3
4.09MB