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
1. 이미지 분류(Image Classification) 란?
이미지 분류는 이미지 내 콘텐츠가 어떤 클래스에 해당하는지를 예측하는 태스크입니다.
MediaPipe에서는 Flamingo, Dog, Tree와 같은 미리 학습된 클래스 중 해당 이미지를 자동으로 분류할 수 있습니다.
분류 결과는 클래스의 이름과 함께 확률(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 설정 하에 수행되었으며,
전체 이미지에서 가장 두드러진 특징을 가진 단일 객체만 인식하는 단일 클래스 분류 방식의 한계가 명확히 드러났습니다.
이로 인해 복수 객체가 존재하거나 인식 대상이 명확하지 않은 이미지에서 오분류 및 미검출이 자주 발생했습니다.
◆ 한계에 대한 원인 요약
원인 | 설명 |
단일 객체 가정 (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
'2.인공지능 > MediaPipe' 카테고리의 다른 글
6.MediaPipe Interactive Image Segmenter 사용 : 코드 예시 (0) | 2025.05.13 |
---|---|
5.MediaPipe Hair Segmenter로 머리카락 염색 효과 테스트 (0) | 2025.05.08 |
4.MediaPipe Image Segmentation 사용하기 : 이미지 분할 (0) | 2025.04.28 |
2.MediaPipe Object Detector 사용하기: 객체탐지 (0) | 2025.04.22 |
1.Google MediaPipe 솔루션 이해하기 (0) | 2025.04.15 |