2.인공지능/MediaPipe

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

쿼드큐브 2025. 4. 22. 14:48
728x90
반응형

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

 

MediaPipe Object Detector 사용하기 : 객체탐지

 

목차

1. 객체감지(Object Detection)란?

2. MediaPipe Object Detector 주요 기능 및 옵션

3. Object Detector 실행모드: IMAGE, VIDEO, LIVE_STREAM

4. Object Detector 모델 종류 및 비교

5. 사용자 정의 모델 요구사항 : TFLite

6. Python 환경 설정 및 기본 코드 작성

7. MediaPipe Object Detector Python 예시: IMAGE

8. MediaPipe Object Detector Python 예시: VIDEO

9. MediaPipe Object Detector Python 예시: LIVE_STREAM

관련 글 링크

 

 

1. 객체탐지(Object Detection)란?

객체 탐지(Object Detection)는 이미지나 영상 내에서 의미 있는 객체(예: 사람, 차량, 동물 등)를 찾아내고, 그 위치를 사각형 박스로 표시하는 기술입니다.
이 작업은 일반적인 이미지 분류보다 훨씬 더 정교하며, 객체의 ‘존재 여부’와 ‘위치 좌표’ 둘 다 파악해야 하기 때문에 고도화된 머신러닝 모델이 필요합니다.

예를 들어, 다음과 같은 작업이 가능합니다:

  • CCTV 영상에서 침입자(사람) 탐지
  • 차량 번호판 인식 전 단계에서 차량 위치 탐지
  • 이미지에서 고양이와 개 찾기

출처: https://ai.google.dev/edge/mediapipe/solutions/vision/object_detector?hl=ko

 

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

object_detector_image.py
0.00MB
object_detector_stream.py
0.00MB

 

object_detector_video.py
0.00MB

728x90
반응형