3D-Objekterkennung (3D-Begrenzungsrahmen) in Python mit MediaPipe Objectron PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

3D-Objekterkennung (3D-Begrenzungsboxen) in Python mit MediaPipe Objectron

Einleitung

Die Objekterkennung hat an Fahrt gewonnen, und es werden Verbesserungen an mehreren Lösungsansätzen vorgenommen. In den letzten Jahren haben YOLO-basierte Methoden andere in Bezug auf Genauigkeit und Geschwindigkeit übertroffen, mit jüngsten Fortschritten wie YOLOv7 und YOLOv6 (das unabhängig nach YOLOv7 veröffentlicht wurde).

Allerdings – all dies ist besorgniserregend 2D-Objekterkennung, was an und für sich schon eine schwierige Aufgabe ist. Kürzlich konnten wir erfolgreich auftreten 3D-Objekterkennung, und obwohl sich diese Detektoren noch in einem instabileren Stadium als 2D-Objektdetektoren befinden, steigt ihre Genauigkeit.

In diesem Handbuch führen wir die 3D-Objekterkennung in Python mit Objectron von MediaPipe durch.

Hinweis: MediaPipe ist das Open-Source-Framework von Google zum Erstellen von Pipelines für maschinelles Lernen zur Verarbeitung von Bildern, Videos und Audiostreams, hauptsächlich für mobile Geräte. Es wird sowohl intern als auch extern verwendet und bietet vortrainierte Modelle für verschiedene Aufgaben, wie z. B. Gesichtserkennung, Gesichtsvernetzung, Hand- und Posenschätzung, Haarsegmentierung, Objekterkennung, Box-Tracking usw.

All dies kann und wird für nachgelagerte Aufgaben verwendet – wie das Anwenden von Filtern auf Gesichter, automatische Kamerafokussierung, biometrische Verifizierung, handgesteuerte Robotik usw. Die meisten Projekte sind mit APIs für Android, iOS, C++, Python und JavaScript verfügbar einige sind nur für bestimmte Sprachen verfügbar.

In diesem Leitfaden arbeiten wir mit Objectron von MediaPipe, verfügbar für Android, C++, Python und JavaScript.

MediaPipe und 3D-Objekterkennung

Das Objektron Lösung wurde auf der trainiert Objectron-Datensatz, das kurze objektzentrierte Videos enthält. Der Datensatz enthält nur 9 Objekte: Fahrräder, Bücher, Flaschen, Kameras, Müslischachteln, Stühle, Tassen, Laptops und Schuhe, also kein sehr allgemeiner Datensatz, aber die Verarbeitung und Beschaffung dieser Videos ist ziemlich teuer (Kameraposen, spärlich Punktwolken, Charakterisierung der planaren Oberflächen usw. für jeden Frame jedes Videos), wodurch der Datensatz fast 2 Terrabyte groß wird.

Das trainierte Objectron-Modell (bekannt als a Lösung für MediaPipe-Projekte) wird in vier Kategorien geschult – Schuhe, Stühle, Tassen und Kameras.

Die 2D-Objekterkennung verwendet den Begriff „Bounding Boxes“, obwohl es sich eigentlich um Rechtecke handelt. Die 3D-Objekterkennung sagt tatsächlich voraus Boxen um Objekte herum, aus denen Sie deren Ausrichtung, Größe, ungefähres Volumen usw. ableiten können. Dies ist eine ziemlich schwierige Aufgabe, insbesondere angesichts des Mangels an geeigneten Datensätzen und der Kosten für deren Erstellung. Das Problem ist zwar schwierig, aber für viele vielversprechend Augmented Reality (AR) Anwendungen!

Die Objectron-Lösung kann in einem einstufigen oder zweistufigen Modus ausgeführt werden – wobei der einstufige Modus besser bei der Erkennung mehrerer Objekte ist, während der zweistufige Modus besser bei der Erkennung eines einzelnen Hauptobjekts in der Szene ist und deutlich läuft Schneller. Die einstufige Pipeline verwendet ein MobileNetV2-Backbone, während die zweistufige Pipeline die TensorFlow-Objekterkennungs-API verwendet.

Wenn ein Objekt in einem Video erkannt wird, werden aus zwei Gründen nicht in jedem Frame weitere Vorhersagen dafür getroffen:

  • Kontinuierliche Vorhersagen führen zu hoher Nervosität (aufgrund der inhärenten Stochastik in den Vorhersagen)
  • Es ist teuer, große Modelle auf jedem Rahmen laufen zu lassen

Das Team verlagert die schweren Vorhersagen nur auf die ersten Begegnungen und verfolgt dann diese Box, solange sich das fragliche Objekt noch in der Szene befindet. Sobald die Sichtlinie unterbrochen und das Objekt wieder eingeführt wird, wird erneut eine Vorhersage getroffen. Dies macht es möglich, größere Modelle mit höherer Genauigkeit zu verwenden, während die Rechenanforderungen gering gehalten werden, und senkt die Hardware-Anforderungen für Echtzeit-Inferenz!

Lassen Sie uns weitermachen und MediaPipe installieren, die Objectron-Lösung importieren und sie auf statische Bilder und einen Video-Feed anwenden, der direkt von einer Kamera kommt.

Installieren von MediaPipe

Lassen Sie uns zuerst MediaPipe installieren und eine Hilfsmethode vorbereiten, um Bilder von einer bestimmten URL abzurufen:

! pip install mediapipe

Wenn das Framework installiert ist, importieren wir es zusammen mit gängigen Bibliotheken:

import mediapipe as mp

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

Definieren wir eine Hilfsmethode zum Abrufen von Bildern mit einer URL, die ein RGB-Array zurückgibt, das dieses Bild darstellt:

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)

Schließlich möchten wir sowohl die Objectron-Lösung als auch die Zeichendienstprogramme importieren, um Vorhersagen zu visualisieren:

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

3D-Objekterkennung auf statischen Bildern mit MediaPipe

Das Objectron Die Klasse lässt mehrere Argumente zu, darunter:

  • static_image_mode: Ob Sie ein Bild oder einen Stream von Bildern (Video) einspeisen
  • max_num_objects: Die maximal identifizierbare Anzahl von Objekten
  • min_detection_confidence: Die Erkennungskonfidenzschwelle (wie sicher das Netzwerk sein muss, um ein Objekt für die angegebene Klasse zu klassifizieren)
  • model_name: Welches Modell möchten Sie zwischendurch laden 'Cup', 'Shoe', 'Camera' und 'Chair'.

In diesem Sinne – lassen Sie uns eine Objectron-Instanz instanziieren und process() das Eingangsbild:


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


results = objectron.process(mug)

Das results enthalten die 2D- und 3D-Markierungen der erkannten Objekte sowie die Rotation, Translation und Skalierung für jedes. Wir können die Ergebnisse verarbeiten und die Begrenzungsrahmen mit den bereitgestellten Zeichenwerkzeugen ziemlich einfach zeichnen:

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

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()

Das führt zu:

3D-Objekterkennung von Video oder Webcam mit MediaPipe

Eine aufregendere Anwendung sind Videos! Sie müssen den Code nicht viel ändern, um Videos aufzunehmen, unabhängig davon, ob Sie eines von der Webcam oder eine vorhandene Videodatei bereitstellen. OpenCV eignet sich hervorragend zum Lesen, Bearbeiten und Einspeisen von Videoframes in das Objectron-Modell:


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()

Bild nicht beschreibbar machen mit image.flags.writeable = False beschleunigt den Prozess etwas und ist eine optionale Änderung. Der endgültige cv2.flip() auf dem resultierenden Bild ist ebenfalls optional – und macht die Ausgabe einfach gespiegelt, um sie etwas intuitiver zu machen.

Wenn Sie mit einer Kamera und einem weltweit verbreiteten Ikea-Becher laufen, sind dies die Ergebnisse:

3D-Objekterkennung (3D-Begrenzungsrahmen) in Python mit MediaPipe Objectron PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Die Ausgabe ist leicht zittrig, verarbeitet aber die Rotationstranslation gut, selbst wenn eine zitternde Hand die niedrig auflösende Kamera hält. Was passiert, wenn ein Objekt aus dem Rahmen genommen wird?

3D-Objekterkennung (3D-Begrenzungsrahmen) in Python mit MediaPipe Objectron PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Die Vorhersagen für das Objekt stoppen bei der ersten Erkennung, und die Boxverfolgung erkennt deutlich, dass das Objekt den Rahmen verlassen hat, und führt die Vorhersage und Verfolgung erneut durch, sobald das Objekt wieder in den Rahmen eintritt. Es scheint, dass das Tracking etwas besser funktioniert, wenn das Modell das sehen kann Tassengriff, da die Ausgaben nervöser sind, wenn der Griff nicht sichtbar ist (vermutlich, weil es schwieriger ist, die wahre Ausrichtung des Bechers genau festzustellen).

Darüber hinaus scheinen einige Winkel bei schwierigen Lichtverhältnissen deutlich stabilere Ausgänge zu erzeugen als andere. Speziell für Tassen ist es hilfreich, den Rand der Tasse sehen zu können, da dies bei der Perspektive hilft, anstatt eine orthogonale Projektion des Objekts zu sehen.

Außerdem hatte das Modell beim Test auf einem durchsichtigen Becher Schwierigkeiten, ihn als Becher zu erkennen. Dies ist wahrscheinlich ein Beispiel für eine aus dem Vertrieb Objekt, da die meisten Tassen undurchsichtig sind und verschiedene Farben haben.

Zusammenfassung

Die 3D-Objekterkennung ist noch etwas jung, und MediaPipe's Objectron ist eine fähige Demonstration! Objectron ist zwar empfindlich gegenüber Lichtverhältnissen, Objekttypen (transparente vs. undurchsichtige Tassen usw.) und leicht nervös – aber Objectron gibt einen guten Einblick in das, was bald mit höherer Genauigkeit und Zugänglichkeit als je zuvor möglich sein wird.

Zeitstempel:

Mehr von Stapelmissbrauch