Wykrywanie obiektów 3D (obramowania 3D) w Pythonie za pomocą MediaPipe Objectron PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Wykrywanie obiektów 3D (3D Bounding Boxes) w Pythonie z MediaPipe Objectron

Wprowadzenie

Wykrywanie obiektów nabiera rozpędu i wprowadzane są ulepszenia w kilku podejściach do jego rozwiązania. W ciągu ostatnich kilku lat metody oparte na YOLO przewyższały inne pod względem dokładności i szybkości, dzięki niedawnym ulepszeniom, takim jak YOLOv7 i YOLOv6 (które zostały wydane niezależnie, po YOLOv7).

Jednak – wszystko to dotyczy Wykrywanie obiektów 2D, co samo w sobie jest trudnym zadaniem. Ostatnio udało nam się z powodzeniem występować Wykrywanie obiektów 3D, i chociaż te detektory są nadal na bardziej niestabilnym etapie niż detektory obiektów 2D, ich dokładność rośnie.

W tym przewodniku będziemy wykonywać wykrywanie obiektów 3D w Pythonie za pomocą Objectron MediaPipe.

Uwaga: MediaPipe to platforma Google typu open source do tworzenia potoków uczenia maszynowego do przetwarzania obrazów, filmów i strumieni audio, głównie na urządzenia mobilne. Jest używany zarówno wewnętrznie, jak i zewnętrznie i zapewnia wstępnie wytrenowane modele do różnych zadań, takich jak wykrywanie twarzy, tworzenie siatki twarzy, szacowanie dłoni i pozycji, segmentacja włosów, wykrywanie obiektów, śledzenie pudełek itp.

Wszystko to może i jest używane do dalszych zadań – takich jak nakładanie filtrów na twarze, automatyczne ustawianie ostrości kamery, weryfikacja biometryczna, robotyka sterowana ręcznie itp. Większość projektów jest dostępna z interfejsami API dla Androida, iOS, C++, Python i JavaScript, podczas gdy niektóre są dostępne tylko w niektórych językach.

W tym przewodniku będziemy pracować Objectron MediaPipe, dostępny dla Androida, C++, Pythona i JavaScript.

MediaPipe i wykrywanie obiektów 3D

Połączenia obiekt rozwiązanie zostało przeszkolone na Zbiór danych Objectron, który zawiera krótkie filmy zorientowane na obiekt. Zbiór danych zawiera tylko 9 obiektów: rowery, książki, butelki, aparaty fotograficzne, pudełka na płatki śniadaniowe, krzesła, kubki, laptopy i buty, więc nie jest to bardzo ogólny zbiór danych, ale przetwarzanie i zakup tych filmów jest dość drogie (pozy aparatu, rzadkie chmury punktów, charakterystyka powierzchni planarnych itp. dla każdej klatki każdego filmu), dzięki czemu zestaw danych ma rozmiar prawie 2 terabajtów.

Wytrenowany model Objectron (znany jako rozwiązanie dla projektów MediaPipe) jest szkolony w czterech kategoriach – buty, krzesła, kubki i aparaty fotograficzne.

Wykrywanie obiektów 2D wykorzystuje termin „obramowania”, podczas gdy w rzeczywistości są to prostokąty. Wykrywanie obiektów 3D faktycznie przewiduje Skrzynki wokół obiektów, z których można wywnioskować ich orientację, wielkość, przybliżoną objętość itp. Jest to dość trudne zadanie do podjęcia, zwłaszcza biorąc pod uwagę brak odpowiednich zbiorów danych i koszt ich stworzenia. Choć trudny, problem obiecuje wiele Augmented Reality (AR) Aplikacje!

Rozwiązanie Objectron może działać w trybie jednoetapowym lub dwuetapowym – w którym tryb jednoetapowy lepiej wykrywa wiele obiektów, podczas gdy tryb dwuetapowy lepiej wykrywa pojedynczy główny obiekt w scenie i działa znacząco szybciej. Jednoetapowy potok używa szkieletu MobileNetV2, podczas gdy dwuetapowy potok korzysta z interfejsu API wykrywania obiektów TensorFlow.

Gdy obiekt zostanie wykryty w filmie, dalsze przewidywania nie są dla niego wykonywane w każdej klatce z dwóch powodów:

  • Prognozy ciągłe wprowadzają duże drżenie (ze względu na nieodłączną stochastyczność w przewidywaniach)
  • Uruchamianie dużych modeli na każdej klatce jest drogie

Zespół przenosi ciężkie prognozy tylko na pierwsze spotkania, a następnie śledzi to pudełko, dopóki przedmiotowy obiekt nadal znajduje się na scenie. Po przerwaniu linii wzroku i ponownym wprowadzeniu obiektu następuje ponowne przewidywanie. Umożliwia to używanie większych modeli z większą dokładnością, przy zachowaniu niskich wymagań obliczeniowych i obniża wymagania sprzętowe do wnioskowania w czasie rzeczywistym!

Przejdźmy dalej i zainstalujmy MediaPipe, zaimportujmy rozwiązanie Objectron i zastosujmy je do statycznych obrazów i przekazu wideo prosto z kamery.

Instalowanie MediaPipe

Najpierw zainstalujmy MediaPipe i przygotujmy metodę pomocniczą do pobierania obrazów z podanego adresu URL:

! pip install mediapipe

Po zainstalowaniu frameworka zaimportujmy go wraz z popularnymi bibliotekami:

import mediapipe as mp

import cv2
import numpy as np
import matplotlib.pyplot as plt

Zdefiniujmy metodę pomocniczą do pobierania obrazów o podanym adresie URL, która zwraca tablicę RGB reprezentującą ten obraz:

import PIL
import urllib

def url_to_array(url):
    req = urllib.request.urlopen(url)
    arr = np.array(bytearray(req.read()), dtype=np.int8)
    arr = cv2.imdecode(arr, -1)
    arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
    return arr

mug = 'https://goodstock.photos/wp-content/uploads/2018/01/Laptop-Coffee-Mug-on-Table.jpg'
mug = url_to_array(mug)

Na koniec będziemy chcieli zaimportować zarówno rozwiązanie Objectron, jak i narzędzia do rysowania, aby zwizualizować prognozy:

mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils

Wykrywanie obiektów 3D na statycznych obrazach za pomocą MediaPipe

Połączenia Objectron klasa pozwala na kilka argumentów, w tym:

  • static_image_mode: Niezależnie od tego, czy wprowadzasz obraz, czy strumień obrazów (wideo)
  • max_num_objects: Maksymalna możliwa do zidentyfikowania liczba obiektów
  • min_detection_confidence: próg ufności wykrywania (jak pewna musi być sieć, aby zaklasyfikować obiekt do danej klasy)
  • model_name: Który model chcesz załadować pomiędzy 'Cup', 'Shoe', 'Camera' i 'Chair'.

Mając to na uwadze – stwórzmy instancję Objectron i process() obraz wejściowy:


objectron = mp_objectron.Objectron(
    static_image_mode=True,
    max_num_objects=5,
    min_detection_confidence=0.2,
    model_name='Cup')


results = objectron.process(mug)

Połączenia results zawierają punkty orientacyjne 2D i 3D wykrytego obiektu (obiektów), a także obrót, translację i skalę dla każdego z nich. Możemy przetworzyć wyniki i narysować obwiednie dość łatwo, korzystając z dostarczonych narzędzi do rysowania:

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

if not results.detected_objects:
    print(f'No box landmarks detected.')


annotated_image = mug.copy()
for detected_object in results.detected_objects:
    
    mp_drawing.draw_landmarks(annotated_image, 
                              detected_object.landmarks_2d, 
                              mp_objectron.BOX_CONNECTIONS)

    
    mp_drawing.draw_axis(annotated_image, 
                         detected_object.rotation, 
                         detected_object.translation)
  

fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(annotated_image)
ax.axis('off')
plt.show()

To skutkuje:

Wykrywanie obiektów 3D z wideo lub kamery internetowej za pomocą MediaPipe

Bardziej ekscytująca aplikacja jest na filmach! Nie musisz zbytnio zmieniać kodu, aby pomieścić filmy, niezależnie od tego, czy dostarczasz je z kamery internetowej, czy z istniejącego pliku wideo. OpenCV w naturalny sposób nadaje się do czytania, manipulowania i wprowadzania ramek wideo do modelu objectron:


cap = cv2.VideoCapture(0)



objectron = mp_objectron.Objectron(static_image_mode=False,
                            max_num_objects=5,
                            min_detection_confidence=0.4,
                            min_tracking_confidence=0.70,
                            model_name='Cup')
                            

while cap.isOpened():
    success, image = cap.read()

    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = objectron.process(image)

    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    if results.detected_objects:
        for detected_object in results.detected_objects:
            
            mp_drawing.draw_landmarks(image, 
                                      detected_object.landmarks_2d, 
                                      mp_objectron.BOX_CONNECTIONS)
            
            mp_drawing.draw_axis(image, 
                                 detected_object.rotation,
                                 detected_object.translation)

    cv2.imshow('MediaPipe Objectron', cv2.flip(image, 1))
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Uczynienie obrazu niemożliwym do zapisania za pomocą image.flags.writeable = False sprawia, że ​​proces przebiega nieco szybciej i jest opcjonalną zmianą. Finał cv2.flip() wynikowy obraz jest również opcjonalny – i po prostu tworzy lustrzane odbicie, aby było nieco bardziej intuicyjne.

Po uruchomieniu na aparacie i powszechnie używanym na całym świecie kubku Ikea są to wyniki:

Wykrywanie obiektów 3D (obramowania 3D) w Pythonie za pomocą MediaPipe Objectron PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Wyjście jest nieco roztrzęsione, ale dobrze radzi sobie z translacją obrotową, nawet drżącą ręką trzymającą aparat o niskiej rozdzielczości. Co się dzieje, gdy przedmiot zostanie wyjęty z ramy?

Wykrywanie obiektów 3D (obramowania 3D) w Pythonie za pomocą MediaPipe Objectron PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Prognozy zatrzymują się dla obiektu przy pierwszym wykryciu, a śledzenie pola wyraźnie wykrywa, że ​​obiekt opuścił ramkę, i przeprowadza predykcję i śledzenie ponownie, gdy tylko obiekt ponownie wejdzie w ramkę. Wydaje się, że śledzenie działa nieco lepiej, gdy model widzi uchwyt na kubek, ponieważ wyjścia są bardziej roztrzęsione, gdy uchwyt nie jest widoczny (prawdopodobnie dlatego, że trudniej jest dokładnie ustalić prawdziwą orientację kubka).

Dodatkowo, niektóre kąty wydają się dawać znacznie stabilniejsze wyjścia niż inne, w trudnych warunkach oświetleniowych. W przypadku kubków pomaga widzieć wargę kubka, ponieważ pomaga to w perspektywie, a nie rzut prostopadły obiektu.

Dodatkowo podczas testów na przezroczystym kubku model miał trudności z ustaleniem, że jest kubkiem. Jest to prawdopodobnie przykład brak dystrybucji obiekt, ponieważ większość kubków jest nieprzezroczysta i ma różne kolory.

Wnioski

Wykrywanie obiektów 3D jest wciąż dość młode, a Objectron firmy MediaPipe jest zdolną demonstracją! Choć jest wrażliwy na warunki oświetleniowe, rodzaje obiektów (kubki przezroczyste lub nieprzezroczyste itp.) i lekko roztrzęsiony – Objectron jest dobrym wglądem w to, co wkrótce będzie możliwe do zrobienia z większą dokładnością i dostępnością niż kiedykolwiek wcześniej.

Znak czasu:

Więcej z Nadużycie stosu