2.인공지능/MediaPipe

3.MediaPipe Image Classification 사용하기 : 이미지 분류

쿼드큐브 2025. 4. 24. 13:26
728x90

MediaPipe Image Classification의 주요 기능과 실행 모드별 차이를 자세히 설명합니다.

 

MediaPipe Image Classification 사용하기 : 이미지 분류

 

목차

1. 이미지 분류(Image Classification)란?

2. MediaPipe Image Classifier의 주요 기능과 옵션

3. Image Classifier 실행모드: IMAGE, VIDEO, LIVE_STREAM

4. 기본 제공 모델 성능 비교 (EfficientNet-Lite 시리즈)

5. 커스텀 모델 적용시 요구사항: TFLite + Metadata

6. MediaPipe Image Classifier Python 예시: IMAGE

관련 글 링크

 

 

1. 이미지 분류(Image Classification) 란?

이미지 분류는 이미지 내 콘텐츠가 어떤 클래스에 해당하는지를 예측하는 태스크입니다.
MediaPipe에서는 Flamingo, Dog, Tree와 같은 미리 학습된 클래스 중 해당 이미지를 자동으로 분류할 수 있습니다.

Mediapipe Image Classification
출처:https://www.superannotate.com/blog/image-classification-basics

 

분류 결과는 클래스의 이름과 함께 확률(Score) 형태로 제공되며, 신뢰도가 높은 순으로 정렬됩니다.

 

2. MediaPipe Image Classifier의 주요 기능과 옵션

MediaPipe Image Classifier는 모바일 및 엣지 디바이스에서도 고속 이미지 분류가 가능하도록 최적화된 태스크입니다.

MediaPipe의 Image Classifier는 전체 이미지를 대상으로 하나의 주된 클래스를 분류합니다.
즉, 이미지 속에 여러 객체가 있어도 그 중 가장 특징적으로 보이는 한 가지를 대표값으로 분류합니다.

 

◆ 주요 기능 요약

기능 설명
입력 이미지 처리 자동 회전, 크기 조절, 정규화, 색상 공간(BGR → RGB 등) 변환 지원
관심 영역 (Region of Interest) 이미지 전체가 아닌 특정 영역에 대해서만 분류 수행 가능
다국어 라벨 표시 메타데이터 기반 라벨 이름의 언어 선택 가능 (display_names_locale)
점수 기준 필터링 특정 신뢰도(score) 이상만 결과로 출력 (score_threshold)
Top-K 결과 제한 분류 결과 수를 제한하여 최상위 결과만 표시 (max_results)
카테고리 필터링 특정 클래스만 허용하거나 차단 가능 (allowlist, denylist)

 

◆ ImageClassifierOptions

옵션 설명 예시 기본값
running_mode 실행 모드 설정. IMAGE, VIDEO, LIVE_STREAM "VIDEO" "IMAGE"
display_names_locale 라벨 표시 언어. 모델 메타데이터 내 display name에 적용 "ko" "en"
max_results 출력할 분류 결과 수 제한. -1이면 전체 출력 3 -1
score_threshold 최소 신뢰도 점수 설정. 해당 점수 미만 결과는 제외 0.5 설정되지 않음
category_allowlist 결과에 포함할 라벨 이름 리스트. 지정된 라벨만 출력 ["Cat", "Dog"] 설정되지 않음
category_denylist 결과에서 제외할 라벨 이름 리스트. 지정된 라벨 제거 ["Background"] 설정되지 않음
result_callback 실시간(LIVE_STREAM) 처리 결과를 수신할 콜백 함수 lambda r, i: print(r) 설정되지 않음
  • category_allowlist와 category_denylist는 동시에 사용할 수 없습니다.
  • result_callback은 running_mode='LIVE_STREAM'일 때만 동작합니다.
  • display_names_locale은 TFLite 모델에 localized metadata가 포함되어 있어야 적용됩니다.

◆ score_threshold 설정 예시:

상황 설명
일반적인 분류 작업 0.5 50% 이상일 때만 결과 표시. 무난한 기준값으로 널리 사용됨
고정밀도 요구 (오탐 방지 중요) 0.7 ~ 0.9 잘못된 예측을 최소화하고 싶을 때 사용. 예: 의료/보안 분야
넓은 후보군을 보여주고 싶을 때 0.3 ~ 0.4 다양한 결과를 Top-K로 보여줘야 할 때 유용. 예: 추천 시스템
디버깅/모델 검증 목적 0.0 ~ 0.2 모든 결과를 확인하고 싶을 때. 낮은 신뢰도도 확인 가능
모델이 보수적으로 예측할 경우 0.4 ~ 0.6 예측 확률이 낮게 분포되는 모델에 적절한 값 설정 필요
  • 결과 수가 너무 적다면 threshold 값을 낮춰보세요.
  • 노이즈가 많다면 threshold 값을 높이면 도움이 됩니다.
  • score_threshold는 max_results와 함께 조합할 때 더욱 효과적입니다.

 

3. Image Classifier 실행모드: IMAGE, VIDEO, LIVE_STREAM

MediaPipe Image Classifier는 실행 환경에 따라 다음 세 가지 모드를 제공합니다.
각 모드는 입력 방식, 함수 호출, 결과 전달 방식이 다르며, 상황에 맞는 선택이 중요합니다.

◆ 실행모드 비교

모드 설명 함수
IMAGE 정지 이미지 1장을 한 번에 처리 classify(image, image_processing_options=None)
VIDEO 영상 프레임 단위로 순차 처리 classify_for_video(image, timestamp_ms, image_processing_options=None)
LIVE_STREAM 실시간 스트림 입력 처리 (웹캠 등) classify_async(image, timestamp_ms, image_processing_options=None)
  • VIDEO와 LIVE_STREAM은 timestamp_ms 필요

◆ 실행모드 상세 비교

항목 IMAGE / VIDEO VIDEOLIVE_STREAM
함수 호출 classify() / classify_for_video() classify_async()
실행 방식 동기(Sync): 결과가 반환될 때까지 대기 비동기(Async): 호출 즉시 반환, 결과는 콜백으로 전달
결과 전달 함수의 리턴값으로 반환 설정된 콜백 함수로 전달 (result_callback)
처리 특성 순차적 처리 병렬 처리 또는 일부 프레임 스킵 허용
프레임 시간 필요 VIDEO는 필수 필수 (timestamp_ms)

 

◆ ImageProcessingOptions 활용

Image Classifier에서도 회전 보정ROI 지정을 통해 정확도를 높일 수 있습니다.
이 옵션은 모든 실행 모드에서 image_processing_options 파라미터로 사용됩니다.

 

예시 1: 회전 각도 지정 (시계방향 90도)

  - 세로 촬영 이미지나 회전된 카메라 입력을 정확히 감지하려면 rotation_degrees를 반드시 설정해야 합니다.

from mediapipe.tasks.python.vision.core.image_processing_options import ImageProcessingOptions

image_processing_options = ImageProcessingOptions(rotation_degrees=90)

 

예시 2: ROI (관심 영역) 지정

  - 전체 이미지가 아닌 일부 영역(예: 화면 중앙 50%)만 분류 대상으로 지정하고 싶을 때 유용합니다.

from mediapipe.tasks.python.components.containers.rect import NormalizedRect

roi = NormalizedRect(x_center=0.5, y_center=0.5, width=0.5, height=0.5)
image_processing_options = ImageProcessingOptions(region_of_interest=roi)

 

 

4. 기본 제공 모델 성능 비교 (EfficientNet-Lite 시리즈)

MediaPipe는 EfficientNet-Lite0(권장)과 EfficientNet-Lite2 모델을 제공합니다.

EfficientNet 모델은 EfficientNet 아키텍처를 사용하며 ImageNet을 사용하여 나무, 동물, 음식, 차량, 사람 등 1,000개의 클래스를 인식하도록 학습되었습니다. 지원되는 라벨의 전체 목록을 참고하세요.
각 모델은 정확도와 속도에서 다음과 같은 차이가 있습니다:

모델명 입력크기 정밀도 평균지연시간(Pixel 6폰)
EfficientNet-Lite0 (float32) 224x224 ⭐⭐⭐ CPU: 23.5ms / GPU: 18.9ms
EfficientNet-Lite0 (int8) 224x224 ⭐⭐ CPU: 10.1ms
EfficientNet-Lite2 (float32) 224x224 ⭐⭐⭐⭐ CPU: 44.1ms / GPU: 22.2ms
EfficientNet-Lite2 (int8) 224x224 ⭐⭐⭐ CPU: 19.4ms

  - Lite0은 속도 우선, Lite2는 정확도 우선 용도에 적합합니다.

  - 모델명을 클릭하면 모델파일을 다운로드 받을 수 있습니다. 다운로드에 문제가 있으면

  -  https://ai.google.dev/edge/mediapipe/solutions/vision/image_classifier?hl=ko를 참고하세요

 

 

5. 커스텀 모델 적용시 요구사항: TFLite + Metadata

MediaPipe Image Classifier는 기본 제공 모델 외에도 사용자 정의 이미지 분류 모델을 사용할 수 있습니다.
단, 커스텀 모델은 반드시 다음과 같은 형식 및 메타데이터 요건을 충족해야 합니다.

항목 요구사항
파일 형식 .tflite (TensorFlow Lite 모델)
입력 텐서 [1, height, width, 3] / float32
출력 텐서 [1, num_classes] / float32
메타데이터 포함 라벨 이름(label name) 및 display name 포함 필수
라벨 파일 .txt 또는 메타데이터 내에 삽입되어야 함

 - TensorFlow Lite Metadata Writer API를 사용하면 사용자 모델에 라벨 및 언어 정보 메타데이터를 삽입할 수 있습니다.

 

 

6. MediaPipe Object Detector Python 예시: IMAGE

# 모델 파일 경로를 확인합니다.
model_path = './models/efficientnet_lite0.tflite'

# Image Classifier의 기본 옵션을 설정합니다.
# NotImplementedError: GPU Delegate is not yet supported for Windows
base_options = python.BaseOptions(model_asset_path=model_path, 
                                  delegate=python.BaseOptions.Delegate.CPU)

# ImageClassifier 옵션을 설정합니다.
options = vision.ImageClassifierOptions(
    base_options=base_options,
    running_mode=vision.RunningMode.IMAGE,
    max_results=5,  # 최대 결과 수
    score_threshold=0.3,  # 점수 임계값
)

# ImageClassifier 객체를 생성하고 이미지 분류를 수행합니다.
try:
    with vision.ImageClassifier.create_from_options(options) as classifier:
        for image_file in image_files:
            try:
                # MediaPipe 이미지 객체 생성
                mp_image = mp.Image.create_from_file(image_file)

                # 이미지를 분류합니다.
                classification_result = classifier.classify(mp_image)
                print(classification_result.classifications)  # 분류 결과 출력

                # 분류 결과를 이미지에 표시합니다.
                image_copy = np.copy(mp_image.numpy_view())
                result_image = draw_classification_results(image_copy, classification_result)
                rgb_result_image = cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB)

                # 결과 이미지 표시
                cv2.imshow('Annotated Image', rgb_result_image)
                cv2.waitKey(0)
            except Exception as e:
                print(f"Error processing image {image_file}: {e}")
            finally:
                # OpenCV 창 닫기
                cv2.destroyAllWindows()
except Exception as e:
    print(f"Error initializing the classifier: {e}")
finally:
    # 모든 OpenCV 창 닫기
    print("Closing OpenCV windows.")
    cv2.destroyAllWindows()

 

테스트 결과 예시

테스트는 score_threshold = 0.3 설정 하에 수행되었으며,
전체 이미지에서 가장 두드러진 특징을 가진 단일 객체만 인식하는 단일 클래스 분류 방식의 한계가 명확히 드러났습니다.
이로 인해 복수 객체가 존재하거나 인식 대상이 명확하지 않은 이미지에서 오분류 및 미검출이 자주 발생했습니다.

Mediapipe Image Classification

 

한계에 대한 원인 요약

원인  설명
단일 객체 가정 (Single-label Classification) MediaPipe Image Classifier는 멀티라벨(Multi-label) 방식이 아닌, 단일 클래스만 분류합니다.
가장 도드라진 객체 우선 프레임 내에서 크기가 크거나 중심에 위치한 객체를 우선적으로 인식합니다.
겹쳐있는 경우 피처 혼합 고양이와 개가 서로 가깝거나 겹쳐 있는 경우, 피처가 혼합되어 인식 오류 발생 가능
백본 모델의 한계 EfficientNet-Lite0과 같은 경량 모델은 여러 객체를 구분하는 능력이 상대적으로 제한적입니다.

 

해결 방안 및 대안

이미지를 여러 영역으로 나눈 뒤 각 영역에 대해 분류를 수행하면, 다중 객체 분류 정확도를 높일 수 있습니다.

MediaPipe Object Detection Task를 사용하면 이미지 내 개별 객체의 위치와 클래스를 동시에 탐지할 수 있습니다.

 

 


 

 

 

관련 글 링크

[2.인공지능/개념&이론] - 3. 이미지 분석 기술: Classification, Object Detection, Segmentation

 

3. 이미지 분석 기술: Classification, Object Detection, Segmentation

컴퓨터가 이미지를 '이해'하도록 만드는 기술을 컴퓨터 비전(Computer Vision)이라고 합니다.이미지를 이해하는 데 가장 많이 사용되는 기술은 분류(Classification), 객체 탐지(Object Detection), 세그멘테이

quadcube.tistory.com

[2.인공지능/MediaPipe] - 2.MediaPipe Object Detector 사용하기: 객체감지

 

2.MediaPipe Object Detector 사용하기: 객체감지

MediaPipe(ver 0.10.24)의 객체 감지기(Object Detector)를 활용하여 이미지 또는 동영상에서 고양이, 개, 사람, 차량 등 다양한 객체를 감지하는 방법을 소개합니다. MediaPipe Object Detector 사용하기 : 객체감

quadcube.tistory.com

 

[1.시스템&인프라/개발환경] - VSCode에서 Python 가상환경(.venv) 설정 및 여러 버전 관리하기

 

VSCode에서 Python 가상환경(.venv) 설정 및 여러 버전 관리하기

Python 프로젝트를 진행하다 보면, 프로젝트별로 다른 Python 버전과 패키지를 사용하는 경우가 많습니다. 이 글에서는 포터블 버전의 Python과 Visual Studio Code를 활용하여 여러 버전의 Python 가상환경(

quadcube.tistory.com

 

https://ai.google.dev/edge/mediapipe/solutions/vision/image_classifier/python?hl=ko

 

Python용 이미지 분류 가이드  |  Google AI Edge  |  Google AI for Developers

LiteRT 소개: 온디바이스 AI를 위한 Google의 고성능 런타임(이전 명칭: TensorFlow Lite)입니다. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 Python용 이미지 분류 가이드 MediaPipe 이

ai.google.dev

image_classifier_image.py
0.00MB

728x90