Przewodnik po wykrywaniu obiektów w Pythonie

Zadanie MediaPipe Object Detector umożliwia wykrywanie obecności i lokalizacji wielu klas obiektów. Te instrukcje pokazują, jak korzystać z narzędzia do wykrywania obiektów w Pythonie. Przykładowy kod opisany w tych instrukcjach jest dostępny na GitHub

Aby zobaczyć, jak to zadanie działa, możesz obejrzeć wersję demonstracyjną w przeglądarce. Więcej informacji o możliwościach, modelach i modelach dotyczących opcji konfiguracji tego zadania, zobacz Omówienie.

Przykładowy kod

Przykładowy kod Detektora obiektów zapewnia pełną implementację w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać rozpoczął tworzenie własnej aplikacji do klasyfikacji tekstu. Możesz wyświetlać, uruchamiać zmień przykładowy kod wykrywania obiektów. tylko za pomocą przeglądarki.

Jeśli wdrażasz Wykrywacz obiektów dla Raspberry Pi, zapoznaj się z Przykład Raspberry Pi

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których będą używane detektor obiektów. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy, patrz Przewodnik po konfiguracji Pythona

Pakiety

Zadanie Wykrywacz obiektów wymaga pakietu mediapipe pip. Możesz zainstalować wymagane pakiety za pomocą tych poleceń:

$ python -m pip install mediapipe

Importy

Aby uzyskać dostęp do funkcji zadań Wykrywacz obiektów, zaimportuj te klasy:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Model

Zadanie wykrywania obiektów MediaPipe wymaga wytrenowanego modelu, który jest z nim zgodny zadanie. Więcej informacji o dostępnych wytrenowanych modelach z wykrywaniem obiektów znajdziesz w artykule zapoznaj się z omówieniem zadania sekcją Modele.

Wybierz i pobierz model, a następnie zapisz go w katalogu lokalnym:

model_path = '/absolute/path/to/lite-model_efficientdet_lite0_detection_metadata_1.tflite'

Aby określić ścieżkę, użyj parametru model_asset_path obiektu BaseOptions wybranego modelu. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Utwórz zadanie za pomocą funkcji create_from_options. Funkcja create_from_options akceptuje opcje konfiguracji, w tym uruchomione tryb, język wyświetlanych nazw, maksymalna liczba wyników, próg ufności, listy dozwolonych kategorii i odrzuconych. Jeśli nie ustawisz opcji konfiguracji, zadanie używa wartości domyślnej. Więcej informacji o opcjach konfiguracji znajdziesz Więcej informacji znajdziesz w sekcji Opcje konfiguracji.

Zadanie Wykrywacz obiektów obsługuje kilka typów danych wejściowych: nieruchome obrazy, filmy plików i transmisji wideo na żywo. Wybierz kartę odpowiadającą danym wejściowym. , aby zobaczyć, jak utworzyć zadanie i uruchomić wnioskowanie.

Obraz

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ObjectDetector = mp.tasks.vision.ObjectDetector
ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ObjectDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.IMAGE)

with ObjectDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Wideo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ObjectDetector = mp.tasks.vision.ObjectDetector
ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ObjectDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.VIDEO)

with ObjectDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Transmisja na żywo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
DetectionResult = mp.tasks.components.containers.detections.DetectionResult
ObjectDetector = mp.tasks.vision.ObjectDetector
ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: DetectionResult, output_image: mp.Image, timestamp_ms: int):
    print('detection result: {}'.format(result))

options = ObjectDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    max_results=5,
    result_callback=print_result)

with ObjectDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

Pełny przykład tworzenia wzorca do wykrywania obiektów przeznaczonego do użycia ze zdjęciem znajdziesz w przykładowego kodu.

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji w Pythonie:

Nazwa opcji Opis Zakres wartości Wartość domyślna
running_mode Ustawia tryb działania zadania. Są trzy tryby:

IMAGE: tryb wprowadzania pojedynczego obrazu.

WIDEO: tryb zdekodowanych klatek filmu.

LIVE_STREAM: tryb transmisji danych wejściowych na przykład z kamery. W tym trybie detektor wyników musi mieć wartość wywołano, aby skonfigurować detektor i otrzymywać wyniki asynchronicznie.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names Ustawia język etykiet, które mają być używane w przypadku nazw wyświetlanych w kolumnie metadane modelu zadania, jeśli są dostępne. Wartość domyślna to en dla Angielski. Do metadanych modelu niestandardowego możesz dodać zlokalizowane etykiety za pomocą interfejsu TensorFlow Lite Metadata Writer API. Kod języka en
max_results Ustawia opcjonalną maksymalną liczbę wyników wykrywania na . Dowolne liczby dodatnie -1 (zostaną zwrócone wszystkie wyniki)
score_threshold Ustawia próg wyniku prognozy, który zastępuje próg podany w polu metadane modelu (jeśli występują). Wyniki poniżej tej wartości zostały odrzucone. Dowolna liczba zmiennoprzecinkowa Nie ustawiono
category_allowlist Ustawia opcjonalną listę dozwolonych nazw kategorii. Jeśli pole nie jest puste, wyniki wykrywania, których nazwa kategorii nie znajduje się w tym zestawie, zostaną zostały odfiltrowane. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja nie działa z usługą category_denylist i korzysta z funkcji skutkuje to błędem. Dowolne ciągi Nie ustawiono
category_denylist Ustawia opcjonalną listę nazw kategorii, które nie są dozwolone. Jeśli niepuste, wyniki wykrywania, których nazwa kategorii znajduje się w tym zbiorze, zostaną odfiltrowane na zewnątrz. Zduplikowane lub nieznane nazwy kategorii są ignorowane. Ta opcja jest wzajemna tylko w polu category_allowlist, co spowoduje błąd. Dowolne ciągi Nie ustawiono

Przygotuj dane

Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a potem przekonwertować go na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmitowania na żywo z kamery internetowej, możesz użyć biblioteki zewnętrznej, OpenCV, który wczytuje klatki wejściowe w formacie numpy tablice.

Poniższe przykłady wyjaśniają i pokazują, jak przygotować dane do przetwarzania dla każdego z dostępnych typów danych:

Obraz

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

Wideo

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Transmisja na żywo

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Uruchamianie zadania

Możesz wywołać jedną z funkcji wykrywania, aby aktywować wnioskowanie. Obiekt Zadanie detektora zwróci obiekty wykryte na obrazie lub w ramce wejściowej.

Obraz

# Perform object detection on the provided single image.
detection_result = detector.detect(mp_image)
    

Wideo

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform object detection on the video frame.
detection_result = detector.detect_for_video(mp_image, frame_timestamp_ms)
    

Transmisja na żywo

# Send the latest frame to perform object detection.
# Results are sent to the `result_callback` provided in the `ObjectDetectorOptions`.
detector.detect_async(mp_image, frame_timestamp_ms)
    

Pełny przykład uruchamiania wykrywania obiektów na zdjęciu znajdziesz w przykładowego kodu.

Pamiętaj:

  • Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, musisz też dla zadania Wykrywacz obiektów podaj sygnaturę czasową ramki wejściowej.
  • Podczas wykonywania działania na obrazie lub w modelu wideo zadanie Wykrywacz obiektów zablokuj bieżący wątek do czasu zakończenia przetwarzania obrazu wejściowego lub ramki.
  • W trybie transmisji na żywo zadanie Wykrywacz obiektów nie jest blokowane. w bieżącym wątku, ale wraca natychmiast. Wywoła swój wynik detektor z wynikiem wykrywania za każdym razem, gdy zakończy przetwarzanie ramki wejściowej. Jeśli funkcja wykrywania jest wywoływana, gdy zadanie Wykrywacz obiektów jest zajęty przetwarzaniem kolejnej klatki, nowa ramka wejściowa zostanie zignorowana.

Obsługa i wyświetlanie wyników

Po uruchomieniu wnioskowania zadanie Wykrywacz obiektów zwraca błąd ObjectDetectionResult obiekt opisujący znalezione obiekty obrazu wejściowego.

Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

Ten obraz przedstawia wizualizację danych wyjściowych zadania:

Przykładowy kod wykrywania obiektów pokazuje, jak wyświetlić wykrywanie wyników zwróconych przez zadanie, patrz przykładowy kod .