Rilevamento di oggetti 3D (riquadri di delimitazione 3D) in Python con MediaPipe Objectron PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Rilevamento di oggetti 3D (riquadri di delimitazione 3D) in Python con MediaPipe Objectron

Introduzione

Il rilevamento degli oggetti sta prendendo piede e sono stati apportati miglioramenti a diversi approcci per risolverlo. Negli ultimi due anni, i metodi basati su YOLO hanno superato gli altri in termini di precisione e velocità, con recenti progressi come YOLOv7 e YOLOv6 (che è stato rilasciato indipendentemente, dopo YOLOv7).

Tuttavia, tutti questi sono preoccupanti Rilevamento di oggetti 2D, che è un compito difficile in sé e per sé. Di recente, siamo stati in grado di esibirci con successo Rilevamento di oggetti 3De sebbene questi rilevatori siano ancora in uno stadio più instabile rispetto ai rilevatori di oggetti 2D, la loro precisione è in aumento.

In questa guida, eseguiremo il rilevamento di oggetti 3D in Python con Objectron di MediaPipe.

Nota: MediaPipe è il framework open source di Google per la creazione di pipeline di machine learning per elaborare immagini, video e flussi audio, principalmente per dispositivi mobili. Viene utilizzato sia internamente che esternamente e fornisce modelli pre-addestrati per varie attività, come rilevamento dei volti, mesh dei volti, stima delle mani e delle pose, segmentazione dei capelli, rilevamento di oggetti, rilevamento delle scatole, ecc.

Tutti questi possono e sono utilizzati per attività a valle, come l'applicazione di filtri ai volti, la messa a fuoco automatica della fotocamera, la verifica biometrica, la robotica controllata manualmente, ecc. La maggior parte dei progetti è disponibile con API per Android, iOS, C++, Python e JavaScript, mentre alcuni sono disponibili solo per determinate lingue.

In questa guida lavoreremo con Objectron di MediaPipe, disponibile per Android, C++, Python e JavaScript.

MediaPipe e rilevamento di oggetti 3D

I Objectron soluzione è stata addestrata sul Set di dati Objectron, che contiene brevi video incentrati sugli oggetti. Il set di dati contiene solo 9 oggetti: biciclette, libri, bottiglie, fotocamere, scatole di cereali, sedie, tazze, laptop e scarpe, quindi non è un set di dati molto generico, ma l'elaborazione e l'approvvigionamento di questi video è piuttosto costoso (pose della fotocamera, scarse nuvole di punti, caratterizzazione delle superfici planari, ecc. per ogni fotogramma di ogni video), rendendo il dataset di quasi 2 terrabyte di dimensione.

Il modello Objectron addestrato (noto come a soluzione per i progetti MediaPipe) è formato su quattro categorie: scarpe, sedie, tazze e macchine fotografiche.

Il rilevamento di oggetti 2D utilizza il termine "riquadri di delimitazione", mentre in realtà sono rettangoli. Il rilevamento di oggetti 3D prevede effettivamente scatole intorno agli oggetti, da cui puoi dedurre il loro orientamento, dimensione, volume approssimativo, ecc. Questo è un compito abbastanza difficile da affrontare, soprattutto data la mancanza di set di dati appropriati e il costo della loro creazione. Sebbene difficile, il problema è promettente per vari Augmented Reality (AR) applicazioni!

La soluzione Objectron può essere eseguita in una modalità a uno o due stadi, in cui la modalità a uno stadio è migliore nel rilevare più oggetti, mentre la modalità a due stadi è più efficace nel rilevare un singolo oggetto principale nella scena e funziona in modo significativo Più veloce. La pipeline a stadio singolo utilizza un backbone MobileNetV2, mentre la pipeline a due stadi utilizza l'API TensorFlow Object Detection.

Quando un oggetto viene rilevato in un video, non vengono effettuate ulteriori previsioni su ciascun fotogramma per due motivi:

  • Le previsioni continue introducono un elevato nervosismo (a causa della stocasticità intrinseca nelle previsioni)
  • È costoso eseguire modelli di grandi dimensioni su ogni telaio

La squadra scarica le pesanti previsioni solo per i primi incontri e quindi tiene traccia di quella scatola finché l'oggetto in questione è ancora sulla scena. Una volta che la linea di vista è rotta e l'oggetto è stato reintrodotto, viene fatta di nuovo una previsione. Ciò consente di utilizzare modelli più grandi con maggiore precisione, mantenendo bassi i requisiti di calcolo e abbassa i requisiti hardware per l'inferenza in tempo reale!

Andiamo avanti e installiamo MediaPipe, importiamo la soluzione Objectron e la applichiamo a immagini statiche e feed video provenienti direttamente da una telecamera.

Installazione di MediaPipe

Installiamo prima MediaPipe e prepariamo un metodo di supporto per recuperare le immagini da un determinato URL:

! pip install mediapipe

Con il framework installato, importiamolo insieme alle librerie comuni:

import mediapipe as mp

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

Definiamo un metodo di supporto per recuperare le immagini dato un URL e che restituisce un array RGB che rappresenta quell'immagine:

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)

Infine, vorremo importare sia la soluzione Objectron che le utilità di disegno per visualizzare le previsioni:

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

Rilevamento di oggetti 3D su immagini statiche con MediaPipe

I Objectron class consente diversi argomenti, tra cui:

  • static_image_mode: Se stai alimentando un'immagine o un flusso di immagini (video)
  • max_num_objects: Il numero massimo identificabile di oggetti
  • min_detection_confidence: La soglia di affidabilità del rilevamento (quanto deve essere sicura la rete per classificare un oggetto per la classe data)
  • model_name: Quale modello vorresti caricare in mezzo 'Cup', 'Shoe', 'Camera' ed 'Chair'.

Con questi in mente, istanziamo un'istanza Objectron e process() l'immagine di input:


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


results = objectron.process(mug)

I results contengono i punti di riferimento 2D e 3D degli oggetti rilevati, nonché la rotazione, la traslazione e la scala per ciascuno. Possiamo elaborare i risultati e disegnare i riquadri di delimitazione abbastanza facilmente utilizzando le utilità di disegno fornite:

Dai un'occhiata alla nostra guida pratica e pratica per l'apprendimento di Git, con le migliori pratiche, gli standard accettati dal settore e il cheat sheet incluso. Smetti di cercare su Google i comandi Git e in realtà imparare esso!

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

Questo risulta in:

Rilevamento di oggetti 3D da video o webcam con MediaPipe

Un'applicazione più eccitante è sui video! Non devi modificare molto il codice per adattare i video, sia che tu ne fornisca uno dalla webcam o un file video esistente. OpenCV è un adattamento naturale per leggere, manipolare e inserire fotogrammi video nel modello 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()

Rendere l'immagine non scrivibile con image.flags.writeable = False rende il processo un po' più veloce ed è una modifica facoltativa. Il finale cv2.flip() sull'immagine risultante è anche opzionale e rende semplicemente l'output speculare per renderlo un po' più intuitivo.

Quando viene eseguito su una fotocamera e una tazza Ikea comune a livello mondiale, questi sono i risultati:

Rilevamento di oggetti 3D (riquadri di delimitazione 3D) in Python con MediaPipe Objectron PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

L'output è leggermente nervoso, ma gestisce bene la traslazione rotazionale, anche con una mano tremante che regge la fotocamera a bassa risoluzione. Cosa succede quando un oggetto viene tolto dalla cornice?

Rilevamento di oggetti 3D (riquadri di delimitazione 3D) in Python con MediaPipe Objectron PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Le previsioni per l'oggetto si fermano al primo rilevamento e il rilevamento della casella rileva chiaramente che l'oggetto ha lasciato il frame ed esegue nuovamente la previsione e il rilevamento non appena l'oggetto rientra nel frame. Sembra che il tracciamento funzioni un po' meglio quando il modello può vedere il manico della tazza, poiché le uscite sono più nervose quando il manico non è visibile (presumibilmente perché è più difficile accertare con precisione il vero orientamento della tazza).

Inoltre, alcuni angoli sembrano produrre risultati significativamente più stabili rispetto ad altri, in condizioni di luce difficili. Per le tazze in particolare, aiuta essere in grado di vedere il bordo della tazza in quanto aiuta con la prospettiva, piuttosto che vedere una proiezione ortogonale dell'oggetto.

Inoltre, quando testato su una tazza trasparente, il modello ha avuto difficoltà ad accertarlo come una tazza. Questo è probabilmente un esempio di un fuori distribuzione oggetto, poiché la maggior parte delle tazze sono opache e hanno vari colori.

Conclusione

Il rilevamento di oggetti 3D è ancora piuttosto giovane e Objectron di MediaPipe ne è una valida dimostrazione! Sebbene sensibile alle condizioni di illuminazione, ai tipi di oggetti (tazze trasparenti o opache, ecc.) e leggermente instabile, Objectron offre un buon assaggio di ciò che sarà presto possibile fare con maggiore precisione e accessibilità che mai.

Timestamp:

Di più da Impilamento