MediaPipe(ver 0.10.24)의 객체 탐지기(Object Detector)를 활용하여 이미지 또는 동영상에서 고양이, 개, 사람, 차량 등 다양한 객체를 감지하는 방법을 소개합니다.
MediaPipe Object Detector 사용하기 : 객체탐지
목차2. MediaPipe Object Detector 주요 기능 및 옵션
3. Object Detector 실행모드: IMAGE, VIDEO, LIVE_STREAM
7. MediaPipe Object Detector Python 예시: IMAGE
8. MediaPipe Object Detector Python 예시: VIDEO
1. 객체탐지(Object Detection)란?
객체 탐지(Object Detection)는 이미지나 영상 내에서 의미 있는 객체(예: 사람, 차량, 동물 등)를 찾아내고, 그 위치를 사각형 박스로 표시하는 기술입니다.
이 작업은 일반적인 이미지 분류보다 훨씬 더 정교하며, 객체의 ‘존재 여부’와 ‘위치 좌표’ 둘 다 파악해야 하기 때문에 고도화된 머신러닝 모델이 필요합니다.
예를 들어, 다음과 같은 작업이 가능합니다:
- CCTV 영상에서 침입자(사람) 탐지
- 차량 번호판 인식 전 단계에서 차량 위치 탐지
- 이미지에서 고양이와 개 찾기
2. MediaPipe Object Detector 주요 기능 및 옵션
◆ 주요 기능
MediaPipe 객체 탐지기는 단순히 이미지를 분석하는 것 이상으로, 아래와 같은 전처리 및 필터링 기능을 함께 제공합니다
주요 기능 | 설명 | 예시 |
1. 입력 이미지 처리 (Preprocessing) | 모델이 이해할 수 있도록 이미지를 전처리합니다. | - 이미지 회전 - 크기 조절 (예: 320x320) - 픽셀 정규화 (0~1) - 색상 공간 변환 (BGR → RGB) |
2. 라벨 표시 언어 설정 (Label Localization) |
감지 결과에 표시될 객체 이름의 언어를 설정합니다. | display_names="ko" → 한국어 라벨 사용 |
3. 신뢰도 기준점 설정 (Score Threshold) |
예측된 객체 중 신뢰도 점수가 기준 이하일 경우 결과에서 제외합니다. | score_threshold=0.6 → 60% 미만은 제외 |
4. 결과 개수 제한 (Top-K Filter) |
감지된 객체 중 상위 K개만 결과로 출력합니다. | max_results=3 → 상위 3개 결과만 표시 |
5. 라벨 필터링 (Allowlist / Denylist) |
감지할 객체 클래스 또는 제외할 클래스를 지정합니다. | category_allowlist=["cat", "dog"] category_denylist=["person"] → 둘은 동시에 사용 불가 |
◆ Task Inputs
MediaPipe Object Detector는 다음과 같은 형식의 데이터를 입력으로 받을 수 있습니다
VIDEO 또는 LIVE_STREAM 모드를 사용할 경우, 각 프레임에 대해 timestamp_ms를 반드시 제공해야 합니다.
Task Inputs | 설명 |
정지 이미지 | .jpg, .png 등의 단일 이미지 파일 |
디코딩된 동영상 프레임 | 영상에서 추출한 이미지 프레임 (예: OpenCV로 추출한 numpy 배열) |
라이브 동영상 피드 | 웹캠 등 실시간 스트리밍 입력 |
◆ Task Outputs
MediaPipe Object Dector는 다음과 같은 결과 정보를 출력합니다
Task Outputs | 설명 |
객체 카테고리 (Class Name) | 감지된 객체의 이름 (예: dog, cat, person) |
확률 점수 (Score) | 감지된 객체가 해당 클래스일 확률 (0.0 ~ 1.0 사이) |
경계 상자 좌표 (Bounding Box) | 객체가 위치한 사각형의 위치와 크기 (x, y, 너비, 높이) |
◆ ObjectDectorOptions 옵션
옵션 | 설명 | 예시 | 기본값 |
running_mode | 객체 감지기의 실행 모드를 설정합니다. 3가지 모드 중 하나를 선택합니다. - IMAGE: 단일 이미지에 대해 동기식 실행 - VIDEO: 동영상 프레임에 대해 동기식 실행 - LIVE_STREAM: 실시간 영상 스트림 입력 (비동기 실행) |
"IMAGE" "VIDEO" "LIVE_STREAM" |
"IMAGE" |
display_names | 감지된 객체의 라벨을 어떤 언어로 출력할지 설정합니다. 모델의 메타데이터가 다국어를 지원할 경우 사용됩니다. |
"en" (영어) "ko" (한국어) 등 |
"en" |
max_results | 감지 결과 중 최대 몇 개를 출력할지 설정합니다. 높은 점수 순으로 필터링됩니다. |
5 → 상위 5개만 출력 -1 → 전부 출력 |
-1 (모든 결과) |
score_threshold | 감지 결과 중 신뢰도 점수가 이 값보다 낮은 결과는 제외합니다. 예: score_threshold=0.6 → 60% 미만은 제외 |
0.5, 0.8 등 | 설정되지 않음 |
category_allowlist | 감지하고자 하는 객체의 클래스 이름 리스트입니다. 이 리스트에 포함되지 않은 객체는 무시됩니다. →category_denylist와 동시에 사용할 수 없음 |
["cat", "dog"] | 설정되지 않음 |
category_denylist | 감지에서 제외할 객체 클래스 이름 리스트입니다. 예: ["person"] → 사람은 무시하고 감지 |
["person"] | 설정되지 않음 |
- score_threshold 설정 예시
상황 | 설정 예시 |
일반적인 객체 감지 (사람, 차) | 0.3 ~ 0.4, 보통의 경우 권장 값, recall vs precision 균형 |
실시간 웹캠 감지 | 0.4 이상 (노이즈 최소화) |
군중 속 많은 객체 탐지 | 0.2 ~ 0.3 (감지율 ↑, 오탐↑), 작은 사람, 멀리 있는 차량도 감지됨 |
정밀 감시 시스템 (오탐 허용 X) | 0.6 이상, 아주 선명한 객체만 감지, 작은 객체는 무시됨, 오탐을 최소화 |
3. Object Detector 실행모드: IMAGE, VIDEO, LIVE_STREAM
모드 | 설명 | 함수 |
IMAGE | 정지 이미지 1장 처리 | detect(image, image_processing_options=None) |
VIDEO | 동영상 프레임 단위 감지 | detect_for_video(image, timestamp_ms, image_processing_options=None) |
LIVE_STREAM | 실시간 스트림 감지 | detect_async(image, timestamp_ms, image_processing_options=None) |
- VIDEO와 LIVE_STREAM은 timestamp_ms 필요
◆ IMAGE vs VIDEO vs LIVE_STREAM
항목 | IMAGE/VIDEO | LIVE_STREAM |
함수 호출 | detect() / detect_for_video() | detect_async() |
실행 방식 | 호출 → 처리 완료 후 결과 반환 (동기 방식) | 호출 → 즉시 반환, 결과는 콜백에서 나중에 전달 (비동기) |
결과 전달 | 함수 리턴값 | 콜백 함수의 인자로 전달 |
처리 방식 | 순차 처리 | 병렬(비동기) 또는 일부 프레임 드롭 허용 |
◆ image_processing_options :
객체 감지 이전에 ROI(관심 영역) 지정, 이미지 회전 처리 등을 할 수 있도록 도와줍니다.
- rotation_degrees (회전 각도)
from mediapipe.tasks.python.vision.core.image_processing_options import ImageProcessingOptions
#입력 이미지가 감지 전에 시계방향으로 90도 회전된 후 처리됩니다.
ImageProcessingOptions(rotation_degrees=90)
#이미지가 세로로 찍혔거나, 카메라가 회전된 상태라면 회전을 보정해야 감지가 정확히 됨
#90도 단위로 지정 (0 / 90 / 180 / 270)
- region_of_interest (ROI 지정)
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)
#객체 감지를 전체 이미지가 아니라 특정 영역에만 적용하고 싶을 때 사용
#예: 화면 가운데 50%만 분석하고 싶을 때
4. Object Detector 모델 종류 및 비교
MediaPipe의 객체 감지 태스크를 사용하기 위해서는 TFLite 형식의 모델을 다운로드하거나 직접 준비해야 합니다.
MediaPipe는 COCO 데이터셋을 기반으로 사전 학습된 3가지 계열의 모델을 제공합니다.
모델병 | 입력크기 | 정확도 | 속도 | 용도 |
EfficientDet-Lite0 | 320x320 | ⭐⭐⭐ | ⭐⭐⭐⭐ | 가장 균형 잡힌 기본 모델 (추천) |
EfficientDet-Lite2 | 448x448 | ⭐⭐⭐⭐ | ⭐⭐ | 정확도 우선 작업 (속도는 느림) |
SSD MobileNetV2 | 256x256 | ⭐⭐ | ⭐⭐⭐⭐⭐ | 속도 최우선, 저사양 디바이스에 적합 |
- 각 모델은 int8, float16, float32 세 가지 양자화 방식 중 선택 가능
- float32 > float16 > int8 순으로 정확도가 높고, int8이 가장 빠릅니다.
- 지원되는라벨의전체 목록
- 모델 다운로드: "관련 글 링크 참고"
모델이름 | input shape | 유형 | 비고 |
EfficientDet-Lite0(int8) | 320×320 | int8 | 빠름, 경량화, 정확도는 낮음 |
EfficientDet-Lite0 (float16) | 320×320 | float16 | 속도-정확도 균형 (권장) |
EfficientDet-Lite0 (float32) | 320×320 | float32 | 가장 정확, 가장 느림 |
EfficientDet-Lite2 (int8) | 448×448 | int8 | 빠르지만 메모리 소모 적음 |
EfficientDet-Lite2 (float16) | 448×448 | float16 | 정확도 우선, 속도 느림 |
EfficientDet-Lite2 (float32) | 448×448 | float32 | 고정밀 분석용 |
SSD MobileNetV2 (int8) | 256×256 | int8 | 매우 빠름, 정확도 낮음 |
SSD MobileNetV2 (float32) | 256×256 | float32 | 빠르고 실용적 (초경량 디바이스용) |
- 입력 이미지 → 자동으로 320×320 사이즈로 리사이즈(비율 유지 전처리 수행: Aspect-ratio preserving)→ 모델에 입력됨
- 모델이 "320픽셀 너비 × 320픽셀 높이"의 정사각형 이미지만 처리함
- 아무리 큰 이미지라도, 내부적으로는 320×320으로 축소되어 감지 진행
- 리사이즈되면서 작은 객체(멀리 있는 사람, 고양이 등)가 너무 작아져서 감지 누락될 수 있음
MediaPipe에서 제공하는객체 감지 모델들의 벤치마크(평균 지연 시간)정보를 CPU와 GPU 기준으로 정리한 표입니다.
테스트 환경은Google Pixel 6 스마트폰 기준이며, 각 모델의속도와 성능 비교에 유용하게 참고하실 수 있습니다.
모델이름 | CPU 지연 | GPU 지연 |
EfficientDet-Lite0 float32 모델 | 61.30ms | 27.83ms |
EfficientDet-Lite0 float16 모델 | 53.97ms | 27.97ms |
EfficientDet-Lite0 int8 모델 | 29.31ms | - |
EfficientDet-Lite2 float32 모델 | 197.98ms | 41.15ms |
EfficientDet-Lite2 float16 모델 | 198.77ms | 47.31ms |
EfficientDet-Lite2 int8 모델 | 70.91ms | - |
SSD MobileNetV2 float32 모델 | 36.30ms | 24.01ms |
SSD MobileNetV2 float16 모델 | 37.35ms | 28.16ms |
출처:https://ai.google.dev/edge/mediapipe/solutions/vision/object_detector?hl=ko
5. 사용자 정의 모델 요구사항: TFLite
사용자 커스텀 모델을 사용하려면 다음 요건을 충족해야 합니다:
맞춤 모델은TensorFlow Lite형식이어야 하며 모델의 작동 매개변수를 설명하는metadata를 포함해야 합니다.
◆ 설계 요구사항 (입출력 텐서 구조)
항목 | 텐서형태 | 설명 |
입력 이미지 | [1, height, width, 3] (Float32) |
RGB 3채널 이미지. 정규화되어야 함 (예: 0~1 범위). |
detection_boxes | [1, num_boxes, 4] (Float32) |
감지된 각 객체의 경계 상자 (x, y, width, height 또는 xmin, ymin, xmax, ymax 형식). |
detection_classes | [1, num_boxes] (Float32) |
감지된 각 객체의 클래스 인덱스 (0부터 시작하는 숫자 ID). |
detection_scores | [1, num_boxes] (Float32) |
예측된 클래스의 확률 (신뢰도 점수). |
num_boxes | [1] (Float32) |
현재 감지된 객체(상자)의 총 개수. |
◆ 메타데이터 요구사항 (필수 포함 정보)
매개변수 | 설명 |
input_norm_mean | 입력 이미지 정규화를 위한 평균값. 예: [127.5] |
input_norm_std | 입력 이미지 정규화를 위한 표준편차. 예: [127.5] |
label_file_paths | 클래스 라벨(카테고리명)이 담긴 .txt 파일 경로. 예: ["labels.txt"] → 각 줄마다 cat, dog, person 등 라벨명을 포함 |
score_calibration_md | 예측 점수를 보정하는 방법에 대한 메타데이터 (선택 사항). → 사용하지 않으면 생략 가능 |
- label_file_paths를 지정하지 않으면 감지 결과에서 클래스명이 출력되지 않습니다 (index만 나옴)
6. Python 환경 설정 및 기본 코드 작성
1. VSCode에 Python 가상환경을 설정(Python 버전: 3.12) 합니다.
VSCode에서 Python 가상환경(.venv) 설정 및 여러 버전 관리하기
Python 프로젝트를 진행하다 보면, 프로젝트별로 다른 Python 버전과 패키지를 사용하는 경우가 많습니다. 이 글에서는 포터블 버전의 Python과 Visual Studio Code를 활용하여 여러 버전의 Python 가상환경(
quadcube.tistory.com
2. 2025년 04원 현재 mediapipe는 python 버전:3.9 - 3.12를 지원하며, 지원하지 않는 버전에서는 설치가 불가능합니다.
참고:https://ai.google.dev/edge/mediapipe/solutions/setup_python?hl=ko
Python 설정 가이드 | Google AI Edge | Google AI for Developers
LiteRT 소개: 온디바이스 AI를 위한 Google의 고성능 런타임(이전 명칭: TensorFlow Lite)입니다. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 Python 설정 가이드 이 페이지에서는 Medi
ai.google.dev
지원하지 않는 Python 환경에서 mediapipe 설치를 시도할 경우 아래와 같은 오류를 출력합니다.
ERROR: Could not find a version that satisfies the requirement mediapipe (from versions: none)
ERROR: No matching distribution found for mediapipe
3. MediaPipe 버전 확인
pip show mediapipe
4. 라이브러리 import 및 시각화 함수 작성
# 필요한 라이브러리와 모듈을 가져옵니다.
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
import cv2
import numpy as np
import os
# 감지된 카테고리에 따라 바운딩 박스 색상을 정의합니다.
PERSON_COLOR = (255, 0, 0) # 빨간색 (사람)
CAR_COLOR = (0, 255, 0) # 초록색 (자동차)
# 감지 결과를 이미지에 시각화하는 함수입니다.
def visualize(image, detection_result):
try:
print(f"Number of detections: {len(detection_result.detections)}") # 감지된 객체 수 출력
for idx, detection in enumerate(detection_result.detections):
# 바운딩 박스 정보를 추출합니다.
bbox = detection.bounding_box
start_point = bbox.origin_x, bbox.origin_y
end_point = bbox.origin_x + bbox.width, bbox.origin_y + bbox.height
# 카테고리에 따라 바운딩 박스 색상을 결정합니다.
if detection.categories[0].category_name == "person":
COLOR = PERSON_COLOR
elif detection.categories[0].category_name == "car":
COLOR = CAR_COLOR
else:
COLOR = (255, 255, 255) # 기본 색상 (흰색)
# 이미지에 바운딩 박스를 그립니다.
cv2.rectangle(image, start_point, end_point, COLOR, 3)
# 레이블과 신뢰도 점수를 출력합니다.
category = detection.categories[0]
category_name = category.category_name
probability = round(category.score, 2)
print(f"Detection {idx + 1}:")
print(f" - Bounding Box: Start({start_point}), End({end_point})")
print(f" - Category: {category_name}")
print(f" - Score: {probability}")
except Exception as e:
print(f"Error during visualization: {e}")
return image # 시각화된 이미지를 반환합니다.
7. MediaPipe Object Detector Python 예시: IMAGE
모델 파일은 직접 다운로드하여 모델 위치를 절대경로로 지정해야 합니다.
모델 파일 다운로드 방법은 "3. MediaPipe Objector Detector 모델 종류" 를 참고합니다.
# 모델 파일 경로를 확인합니다.
model_path = './models/efficientdet_lite0.tflite'
# ObjectDetector의 기본 옵션을 설정합니다.
base_options = python.BaseOptions(model_asset_path=model_path, delegate="CPU")
# ObjectDetector 옵션을 설정합니다.
options = vision.ObjectDetectorOptions(
base_options=base_options, # 기본 옵션
running_mode=vision.RunningMode.IMAGE, # 실행 모드 (이미지)
display_names_locale='en', # 레이블 언어 설정
max_results=-1, # 최대 감지 결과 수 (-1은 제한 없음)
score_threshold=0.2, # 신뢰도 점수 임계값
category_allowlist=["person", "car"] # 감지할 카테고리 목록
)
# 이미지 디렉터리 경로를 확인합니다.
image_dir = './images/'
# 이미지 파일 확장자와 디렉터리를 정의합니다.
image_extensions = ('.png', '.jpg', '.jpeg') # 지원되는 이미지 확장자
all_files = os.listdir(image_dir)
# 이미지 파일만 필터링합니다.
image_files = [
os.path.join(image_dir, file_name)
for file_name in all_files
if file_name.lower().endswith(image_extensions)
]
# ObjectDetector 객체를 생성하고 처리합니다.
try:
# ObjectDetector를 컨텍스트 매니저로 생성합니다.
with vision.ObjectDetector.create_from_options(options) as detector:
# 각 이미지 파일을 처리합니다.
for image_file in image_files:
try:
print(f"Processing image: {image_file}") # 처리 중인 이미지 파일 경로 출력
image = mp.Image.create_from_file(image_file) # MediaPipe Image 객체 생성
detection_result = detector.detect(image) # 객체 감지 수행
image_copy = np.copy(image.numpy_view()) # NumPy 배열로 이미지 복사
annotated_image = visualize(image_copy, detection_result) # 감지 결과 시각화
rgb_annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB) # BGR -> RGB 변환
cv2.imshow('Annotated Image', rgb_annotated_image) # 결과 이미지 표시
cv2.waitKey(0) # 키 입력 대기
except Exception as e:
print(f"Error processing image {image_file}: {e}")
finally:
# OpenCV 창을 닫습니다.
cv2.destroyAllWindows()
1. score_threshold=0.3,category_allowlist=["person","car"]
임계값을 0.3으로 설정했을 때, 어깨동무를 하거나 군중 속에서 인물이 겹쳐 있는 경우에는 인식 오류가 발생하는 것을 확인할 수 있었습니다.
또한, 차량의 경우에도 멀리 있거나 흐릿한 경우에는 인식률이 낮았습니다.
2. score_threshold=0.2,category_allowlist=["person","car"]
임계값을 0.2로 조정하여 다시 테스트한 결과, 군중 속의 사람이나 원거리의 차량도 어느 정도 인식되는 것을 확인할 수 있었습니다. 다만, 어깨동무처럼 인물이 밀접하게 붙어 있는 경우는 여전히 인식하지 못했습니다.
8. MediaPipe Object Detector Python 예시: VIDEO
모델 파일은 직접 다운로드하여 모델 위치를 절대경로로 지정해야 합니다.
모델 파일 다운로드 방법은 "3. MediaPipe Objector Detector 모델 종류" 를 참고합니다.
# 모델 파일 경로를 확인합니다.
model_path = './models/efficientdet_lite0.tflite'
# ObjectDetector의 기본 옵션을 설정합니다.
base_options = python.BaseOptions(model_asset_path=model_path, delegate="CPU")
# ObjectDetector 옵션을 설정합니다.
options = vision.ObjectDetectorOptions(
base_options=base_options, # 기본 옵션
running_mode=vision.RunningMode.VIDEO, # 실행 모드 (VIDEO)
display_names_locale='en', # 레이블 언어 설정
max_results=-1, # 최대 감지 결과 수 (-1은 제한 없음)
score_threshold=0.2, # 신뢰도 점수 임계값
category_allowlist=["person", "car"] # 감지할 카테고리 목록
)
# ObjectDetector를 초기화합니다.
with vision.ObjectDetector.create_from_options(options) as detector:
# 비디오 캡처 객체를 생성합니다.
video_path = './video/rose.mp4' # 테스트할 비디오 파일 경로
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print("Error: Unable to open video file.")
exit()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("End of video stream.")
break
# Mediapipe 이미지 형식으로 변환합니다.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
#현재 비디오 프레임의 타임스탬프(밀리초 단위)를 가져옵니다.
timestamp_ms=int(cap.get(cv2.CAP_PROP_POS_MSEC))
# 객체 감지를 수행합니다.
detection_result = detector.detect_for_video(mp_image, timestamp_ms)
# 감지 결과를 시각화합니다.
visualized_frame = visualize(frame, detection_result)
# 결과를 화면에 표시합니다.
cv2.imshow('Object Detection', visualized_frame)
# 'q' 키를 누르면 종료합니다.
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 비디오 캡처 객체와 모든 창을 닫습니다.
cap.release()
cv2.destroyAllWindows()
◆ mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
- image_format=mp.ImageFormat.SRGB: 색상 공간을 지정합니다.
- OpenCV는 기본적으로 BGR이므로, SRGB (RGB 순서)로 바꿔줘야 모델과 맞습니다
- data=frame: 실제 프레임 데이터 입력 (NumPy 배열)
◆ timestamp_ms = int(cap.get(cv2.CAP_PROP_POS_MSEC))
- cv2.CAP_PROP_POS_MSEC은 현재 영상 프레임의 재생 시간(밀리초 단위)를 반환합니다
- timestamp_ms는 동영상 내 시간 정보로, 감지 결과가 언제 발생했는지를 알려주는 기준입니다
- MediaPipe의 detect_for_video()는 모든 프레임에 고유한 타임스탬프가 있어야 작동합니다
9. MediaPipe Object Detector Python 예시: LIVE_STREAM
모델 파일은 직접 다운로드하여 모델 위치를 절대경로로 지정해야 합니다.
모델 파일 다운로드 방법은 "3. MediaPipe Objector Detector 모델 종류" 를 참고합니다.
# 모델 파일 경로를 확인합니다.
model_path = './models/efficientdet_lite0.tflite'
# ObjectDetector의 기본 옵션을 설정합니다.
base_options = python.BaseOptions(model_asset_path=model_path, delegate="CPU")
# 결과를 저장할 큐를 생성합니다.
frame_queue = []
# 콜백 함수 정의
def detection_callback(result, output_image, timestamp_ms):
"""비동기 감지 결과를 처리하는 콜백 함수"""
try:
# 감지 결과를 시각화합니다.
visualized_frame = visualize(output_image.numpy_view(), result)
# 시각화된 프레임을 큐에 저장합니다.
frame_queue.append(visualized_frame)
except Exception as e:
print(f"Error in detection_callback: {e}")
# ObjectDetector 옵션을 설정합니다.
options = vision.ObjectDetectorOptions(
base_options=base_options, # 기본 옵션
running_mode=vision.RunningMode.LIVE_STREAM, # 실행 모드 (LIVE_STREAM)
display_names_locale='en', # 레이블 언어 설정
max_results=-1, # 최대 감지 결과 수 (-1은 제한 없음)
score_threshold=0.2, # 신뢰도 점수 임계값
category_allowlist=["person", "car"], # 감지할 카테고리 목록
result_callback=detection_callback # 콜백 함수 전달
)
# 메인 루프에서 OpenCV 창을 업데이트합니다.
with vision.ObjectDetector.create_from_options(options) as detector:
# 웹캡 캡처 객체를 생성합니다.
cap = cv2.VideoCapture(0) # 0번 카메라 (기본 웹캠)
if not cap.isOpened():
print("Error: Unable to access webcam.")
exit()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Error: Unable to read frame from webcam.")
break
# Mediapipe 이미지 형식으로 변환합니다.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
# 현재 비디오 프레임의 타임스탬프(밀리초 단위)를 가져옵니다.
timestamp_ms = int(cap.get(cv2.CAP_PROP_POS_MSEC))
# 비동기 객체 감지를 수행합니다.
detector.detect_async(mp_image, timestamp_ms)
# 큐에서 시각화된 프레임을 가져와 화면에 표시합니다.
if frame_queue:
visualized_frame = frame_queue[0]
cv2.imshow('Object Detection', visualized_frame)
frame_queue.clear()
else:
cv2.imshow('Object Detection', frame)
# 'q' 키를 누르면 종료합니다.
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 웹캡 캡처 객체와 모든 창을 닫습니다.
cap.release()
cv2.destroyAllWindows()
관련 글 링크
https://ai.google.dev/edge/mediapipe/solutions/vision/object_detector?hl=ko
객체 감지 태스크 가이드 | Google AI Edge | Google AI for Developers
LiteRT 소개: 온디바이스 AI를 위한 Google의 고성능 런타임(이전 명칭: TensorFlow Lite)입니다. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 객체 감지 태스크 가이드 MediaPipe 객체
ai.google.dev
https://github.com/google-ai-edge/mediapipe-samples/tree/main/examples/object_detection/python
mediapipe-samples/examples/object_detection/python at main · google-ai-edge/mediapipe-samples
Contribute to google-ai-edge/mediapipe-samples development by creating an account on GitHub.
github.com
'2.인공지능 > MediaPipe' 카테고리의 다른 글
5.MediaPipe Hair Segmenter로 머리카락 염색 효과 테스트 (0) | 2025.05.08 |
---|---|
4.MediaPipe Image Segmentation 사용하기 : 이미지 분할 (0) | 2025.04.28 |
3.MediaPipe Image Classification 사용하기 : 이미지 분류 (0) | 2025.04.24 |
1.Google MediaPipe 솔루션 이해하기 (0) | 2025.04.15 |