3D-objektien tunnistus (3D-rajoituslaatikot) Pythonissa MediaPipe Objectronin PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

3D-objektien tunnistus (3D-rajoituslaatikot) Pythonissa MediaPipe Objectronin kanssa

esittely

Esineiden havaitseminen on yleistynyt, ja sen ratkaisemiseksi tehdään parannuksia useisiin lähestymistapoihin. Viimeisten parin vuoden aikana YOLO-pohjaiset menetelmät ovat olleet muita parempia tarkkuuden ja nopeuden suhteen viimeaikaisilla edistyksillä, kuten YOLOv7 ja YOLOv6 (jotka julkaistiin itsenäisesti, YOLOv7:n jälkeen).

Kuitenkin – kaikki nämä ovat huolestuttavia 2D-kohteen tunnistus, joka on sinänsä vaikea tehtävä. Viime aikoina olemme onnistuneet esiintymään 3D-kohteen tunnistus, ja vaikka nämä ilmaisimet ovat edelleen epävakaammassa vaiheessa kuin 2D-objektien ilmaisimet, niiden tarkkuus kasvaa.

Tässä oppaassa suoritamme 3D-objektien tunnistuksen Pythonissa MediaPipen Objectronin avulla.

Huomautus: MediaPipe on Googlen avoimen lähdekoodin kehys koneoppimisputkien rakentamiseen kuvien, videoiden ja äänistriimien käsittelemiseksi ensisijaisesti mobiililaitteisiin. Sitä käytetään sekä sisäisesti että ulkoisesti, ja se tarjoaa valmiiksi koulutettuja malleja erilaisiin tehtäviin, kuten kasvojentunnistus, kasvojen yhdistäminen, käsien ja asennon arviointi, hiusten segmentointi, esineiden tunnistus, laatikon seuranta jne.

Kaikkia näitä voidaan ja käytetään loppupään tehtäviin – kuten suodattimien asettamiseen kasvoihin, automaattiseen kameran tarkennukseen, biometriseen todentamiseen, käsin ohjattuun robotiikkaan jne. Useimmat projektit ovat saatavilla Android-, iOS-, C++-, Python- ja JavaScript-sovellusliittymillä. jotkut ovat saatavilla vain tietyillä kielillä.

Tässä oppaassa työskentelemme MediaPipen Objectron, saatavana Androidille, C++:lle, Pythonille ja JavaScriptille.

MediaPipe ja 3D-objektien tunnistus

- Objectron ratkaisua koulutettiin Objectron Dataset, joka sisältää lyhyitä objektikeskeisiä videoita. Aineisto sisältää vain 9 kohdetta: polkupyöriä, kirjoja, pulloja, kameroita, murolaatikoita, tuoleja, kuppeja, läppäreitä ja kenkiä, joten se ei ole kovin yleinen tietojoukko, mutta näiden videoiden käsittely ja hankinta on melko kallista (kameraasennot, harvat pistepilvet, tasomaisten pintojen karakterisointi jne. kunkin videon jokaisen kehyksen osalta), mikä tekee tietojoukosta lähes 2 teratavun koon.

Koulutettu Objectron-malli (tunnetaan nimellä a ratkaisu MediaPipe-projekteihin) on koulutettu neljässä kategoriassa – kengät, tuolit, mukit ja kamerat.

2D-objektien tunnistuksessa käytetään termiä "rajoituslaatikot", vaikka ne ovatkin todellisuudessa suorakulmioita. 3D-kohteen tunnistus todella ennustaa laatikot objektien ympärillä, josta voit päätellä niiden suunnan, koon, karkean tilavuuden jne. Tämä on melko vaikea tehtävä, varsinkin kun otetaan huomioon sopivien tietojoukkojen puute ja niiden luomiskustannukset. Vaikka ongelma on vaikea, se lupaa monia Lisätty todellisuus (AR) sovellukset!

Objectron-ratkaisu voi toimia yksivaiheisessa tai kaksivaiheisessa tilassa – jossa yksivaiheinen tila havaitsee paremmin useita kohteita, kun taas kaksivaiheinen tila havaitsee paremmin yksittäisen kohtauksen pääkohteen ja toimii huomattavasti. nopeammin. Yksivaiheinen liukuhihna käyttää MobileNetV2-runkoverkkoa, kun taas kaksivaiheinen putki käyttää TensorFlow Object Detection API -sovellusliittymää.

Kun videossa havaitaan esine, sille ei tehdä lisäennusteita jokaisessa kehyksessä kahdesta syystä:

  • Jatkuvat ennusteet aiheuttavat suurta hermostuneisuutta (ennusteiden luontaisen stokastisuuden vuoksi)
  • On kallista käyttää suuria malleja jokaisessa kehyksessä

Tiimi siirtää raskaat ennusteet vain ensimmäisiin kohtaamisiin ja seuraa sitten laatikkoa niin kauan kuin kyseinen esine on vielä paikalla. Kun näkölinja katkeaa ja kohde tuodaan uudelleen, ennustus tehdään uudelleen. Tämä mahdollistaa suurempien mallien käytön suuremmalla tarkkuudella pitäen samalla laskennalliset vaatimukset alhaisina ja alentaa laitteistovaatimuksia reaaliaikaista päättelyä varten!

Asenna MediaPipe, tuo Objectron-ratkaisu ja käytä sitä staattisissa kuvissa ja videosyötteessä, joka tulee suoraan kamerasta.

MediaPipen asentaminen

Asennataan ensin MediaPipe ja valmistetaan apumenetelmä kuvien hakemiseksi tietystä URL-osoitteesta:

! pip install mediapipe

Kun kehys on asennettu, tuodaan se yleisten kirjastojen rinnalle:

import mediapipe as mp

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

Määritetään apumenetelmä kuvien hakemiseksi, joille on annettu URL ja joka palauttaa tätä kuvaa edustavan RGB-taulukon:

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)

Lopuksi haluamme tuoda sekä Objectron-ratkaisun että piirustusapuohjelmat ennusteiden visualisoimiseksi:

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

3D-objektien tunnistus staattisissa kuvissa MediaPipen avulla

- Objectron luokka sallii useita argumentteja, mukaan lukien:

  • static_image_mode: syötätkö kuvaa tai kuvavirtaa (video)
  • max_num_objects: Objektien suurin tunnistettavissa oleva määrä
  • min_detection_confidence: Havaitsemisluottamuksellinen kynnys (kuinka varma verkon on oltava luokitellakseen objektin annettuun luokkaan)
  • model_name: Minkä mallin haluat ladata välissä 'Cup', 'Shoe', 'Camera' ja 'Chair'.

Nämä mielessä – instantioidaan Objectron-instanssi ja process() syöttökuva:


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


results = objectron.process(mug)

- results sisältävät havaitun kohteen (kohteiden) 2D- ja 3D-maamerkit sekä kunkin kierron, muunnoksen ja mittakaavan. Voimme prosessoida tulokset ja piirtää rajoitusruudut melko helposti mukana tulevilla piirustustyökaluilla:

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

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

Tämä johtaa:

3D-objektien tunnistus videosta tai verkkokamerasta MediaPipen avulla

Jännittävämpi sovellus on videoissa! Sinun ei tarvitse muuttaa koodia paljon videoiden mukauttamiseksi riippumatta siitä, toimitatko koodin verkkokamerasta tai olemassa olevasta videotiedostosta. OpenCV sopii luonnollisesti videokehysten lukemiseen, käsittelyyn ja syöttämiseen Objectron-malliin:


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

Kuvan tekeminen kirjoituskelvottomaksi image.flags.writeable = False nopeuttaa prosessia jonkin verran ja on valinnainen muutos. Viimeinen cv2.flip() tuloksena oleva kuva on myös valinnainen – ja se yksinkertaisesti peilauttaa tulosteen, jotta se olisi hieman intuitiivisempi.

Kun ajetaan kameralla ja maailmanlaajuisesti yleisellä Ikea-mukilla, tulokset ovat seuraavat:

3D-objektien tunnistus (3D-rajoituslaatikot) Pythonissa MediaPipe Objectronin PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Tulos on hieman tärisevä, mutta käsittelee pyörivää käännöstä hyvin, vaikka pieniresoluutioinen kamera täriseekin. Mitä tapahtuu, kun esine otetaan pois kehyksestä?

3D-objektien tunnistus (3D-rajoituslaatikot) Pythonissa MediaPipe Objectronin PlatoBlockchain Data Intelligencen kanssa. Pystysuuntainen haku. Ai.

Ennusteet pysähtyvät kohteelle ensimmäisellä havainnolla, ja laatikon seuranta havaitsee selvästi, että kohde on poistunut kehyksestä, ja suorittaa ennusteen ja seurannan uudelleen heti, kun objekti palaa kehykseen. Näyttää siltä, ​​​​että seuranta toimii jonkin verran paremmin, kun malli näkee mukin kahva, koska ulostulot ovat tärisevämpiä, kun kahva ei ole näkyvissä (oletettavasti siksi, että mukin todellista suuntaa on vaikeampi määrittää tarkasti).

Lisäksi jotkin kulmat näyttävät tuottavan huomattavasti vakaampia tuloksia kuin toiset haastavissa valaistusolosuhteissa. Erityisesti mukeille auttaa näkemään mukin huulen, koska se auttaa perspektiivissä sen sijaan, että näkisit kohteen ortogonaalisen projektion.

Lisäksi läpinäkyvällä mukilla testattaessa mallilla oli vaikeuksia todeta sitä mukina. Tämä on todennäköisesti esimerkki an pois jakelusta esine, koska useimmat mukit ovat läpinäkymättömiä ja niissä on eri värejä.

Yhteenveto

3D-objektien tunnistus on vielä melko nuori, ja MediaPipen Objectron on pätevä esittely! Vaikka Objectron on herkkä valaistusolosuhteille, esinetyypeille (läpinäkyvät vs. läpinäkymättömät mukit) ja hieman tärisevälle, Objectron on hyvä kurkistus siihen, mitä on pian mahdollista tehdä paremmalla tarkkuudella ja saavutettavuudella kuin koskaan ennen.

Aikaleima:

Lisää aiheesta Stackabus