3D-objektide tuvastamine (3D-piirdekastid) Pythonis koos MediaPipe Objectron PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

3D-objektide tuvastamine (3D-piirdekastid) Pythonis MediaPipe Objectroniga

Sissejuhatus

Objektide tuvastamine on kogunud hoogu ja selle lahendamiseks tehakse mitmeid täiustusi. Viimase paari aasta jooksul on YOLO-põhised meetodid täpsuse ja kiiruse poolest teistest paremad, näiteks YOLOv7 ja YOLOv6 (mis avaldati iseseisvalt pärast YOLOv7-d).

Siiski – kõik need on murettekitavad 2D objekti tuvastamine, mis on iseenesest raske ülesanne. Hiljuti oleme suutnud edukalt esineda 3D objekti tuvastamine, ja kuigi need detektorid on endiselt ebastabiilsemas staadiumis kui 2D-objektidetektorid, suureneb nende täpsus.

Selles juhendis teostame Pythonis 3D-objektide tuvastamise MediaPipe'i Objectroniga.

Märge: MediaPipe on Google'i avatud lähtekoodiga raamistik masinõppe torujuhtmete loomiseks piltide, videote ja helivoogude töötlemiseks, peamiselt mobiilseadmete jaoks. Seda kasutatakse nii sisemiselt kui ka väliselt ning see pakub eelkoolitatud mudeleid erinevate ülesannete jaoks, nagu näotuvastus, näo sidumine, käte ja poosi hindamine, juuste segmenteerimine, objektide tuvastamine, kasti jälgimine jne.

Kõiki neid saab ja kasutatakse järgnevateks ülesanneteks, nagu filtrite rakendamine nägudele, automaatne kaamera teravustamine, biomeetriline kinnitamine, käsitsi juhitav robootika jne. Enamik projekte on saadaval API-dega Androidi, iOS-i, C++, Pythoni ja JavaScripti jaoks. mõned on saadaval ainult teatud keeltes.

Selles juhendis töötame koos MediaPipe'i objektron, saadaval Androidi, C++, Pythoni ja JavaScripti jaoks.

MediaPipe'i ja 3D-objektide tuvastamine

. Objektron lahendust koolitati Objectron Dataset, mis sisaldab lühikesi objektikeskseid videoid. Andmekogum sisaldab ainult 9 objekti: jalgrattad, raamatud, pudelid, kaamerad, teraviljakarbid, toolid, tassid, sülearvutid ja kingad, seega pole tegemist väga üldise andmestikuga, kuid nende videote töötlemine ja hankimine on üsna kulukas (kaamerapoosid, hõre punktipilved, tasapinnaliste pindade iseloomustus jne iga video iga kaadri kohta), muutes andmestiku peaaegu 2 terrabaiti suuruseks.

Koolitatud Objectroni mudel (tuntud kui a lahendus MediaPipe projektide jaoks) on koolitatud neljas kategoorias – kingad, toolid, kruusid ja kaamerad.

2D objektide tuvastamine kasutab terminit "piiravad kastid", kuigi need on tegelikult ristkülikud. 3D objekti tuvastamine ennustab tegelikult karbid objektide ümber, millest saate järeldada nende orientatsiooni, suurust, ligikaudset mahtu jne. Seda on üsna raske ülesanne võtta, eriti arvestades sobivate andmekogumite puudumist ja nende loomise maksumust. Kuigi probleem on keeruline, on see paljude jaoks paljutõotav Liitreaalsus (AR) rakendused!

Objectroni lahendus võib töötada ühe- või kaheetapilises režiimis – kus üheastmeline režiim tuvastab paremini mitut objekti, kaheetapiline režiim aga stseeni ühe peamise objekti tuvastamiseks ja töötab oluliselt. kiiremini. Üheastmeline konveier kasutab MobileNetV2 magistraalvõrku, kaheetapiline torujuhe aga TensorFlow Object Detection API-t.

Kui videos tuvastatakse objekt, ei tehta selle kohta iga kaadri puhul täiendavaid ennustusi kahel põhjusel.

  • Pidevad ennustused põhjustavad suurt närvilisust (ennustustele omase stohhastilisuse tõttu)
  • Suurte mudelite käitamine igal raamil on kallis

Meeskond laadib rasked ennustused välja ainult esimestele kohtumistele ja jälgib seejärel kasti seni, kuni kõnealune objekt on endiselt sündmuskohal. Kui vaatejoon on katkenud ja objekt uuesti kasutusele võetud, tehakse ennustus uuesti. See võimaldab kasutada suuremaid mudeleid suurema täpsusega, hoides samal ajal arvutusnõuded madalana ja vähendab riistvaranõudeid reaalajas järelduste tegemiseks!

Installime MediaPipe'i, impordime Objectroni lahenduse ja rakendame seda otse kaamerast tulevatele staatilistele piltidele ja videovoogudele.

MediaPipe'i installimine

Installime esmalt MediaPipe'i ja valmistame ette abimeetodi antud URL-ilt piltide toomiseks:

! pip install mediapipe

Kui raamistik on installitud, impordime selle tavaliste teekide kõrvale:

import mediapipe as mp

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

Määratleme abimeetodi piltide toomiseks, millele on antud URL ja mis tagastab seda pilti esindava RGB-massiivi:

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)

Lõpuks tahame prognooside visualiseerimiseks importida nii Objectroni lahenduse kui ka joonistusutiliidid:

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

3D-objektide tuvastamine staatilistel piltidel MediaPipe'iga

. Objectron klass võimaldab mitut argumenti, sealhulgas:

  • static_image_mode: olenemata sellest, kas söödate pilti või pildivoogu (video)
  • max_num_objects: maksimaalne tuvastatav arv objekte
  • min_detection_confidence: tuvastamise usalduslävi (kui kindel peab võrk olema objekti klassifitseerimiseks antud klassi jaoks)
  • model_name: millist mudelit soovite vahepeal laadida 'Cup', 'Shoe', 'Camera' ja 'Chair'.

Neid silmas pidades – loome Objectroni eksemplari ja process() sisendpilt:


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 sisaldavad tuvastatud objekti(de) 2D- ja 3D-orientiire, samuti igaühe pööramist, translatsiooni ja skaalat. Saame tulemusi töödelda ja piirdekastid üsna lihtsalt joonistada, kasutades kaasasolevaid joonistusutiliite:

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

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

Selle tulemuseks on:

3D-objektide tuvastamine videost või veebikaamerast MediaPipe'i abil

Põnevam rakendus on videote peal! Videote mahutamiseks ei pea te koodi palju muutma, olenemata sellest, kas pakute seda veebikaamerast või olemasolevast videofailist. OpenCV sobib loomulikult videokaadrite lugemiseks, manipuleerimiseks ja objektimudelisse sisestamiseks:


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

Kujutise kirjutamiskõlbmatuks muutmine image.flags.writeable = False muudab protsessi mõnevõrra kiiremaks ja on valikuline muudatus. Finaal cv2.flip() Saadud pildil on samuti valikuline – ja see lihtsalt peegeldab väljundit, et muuta see veidi intuitiivsemaks.

Kui kasutate kaamerat ja ülemaailmselt levinud Ikea kruusi, on tulemused järgmised:

3D-objektide tuvastamine (3D-piirdekastid) Pythonis koos MediaPipe Objectron PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Väljund on kergelt värisev, kuid saab hästi hakkama pöörleva tõlkega isegi madala eraldusvõimega kaamerat väriseva käega. Mis juhtub, kui objekt kaadrist välja võetakse?

3D-objektide tuvastamine (3D-piirdekastid) Pythonis koos MediaPipe Objectron PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

Ennustused peatuvad objekti puhul esimesel tuvastamisel ja kasti jälgimine tuvastab selgelt, et objekt on kaadrist lahkunud, ning teostab ennustuse ja jälgimise uuesti niipea, kui objekt uuesti kaadrisse siseneb. Näib, et jälgimine toimib mõnevõrra paremini, kui mudel näeb kruusi käepide, kuna väljundid on närvilisemad, kui käepidet pole näha (arvatavasti seetõttu, et kruusi tegelikku suunda on raskem täpselt kindlaks teha).

Lisaks näib, et mõned nurgad annavad rasketes valgustingimustes oluliselt stabiilsema väljundi kui teised. Konkreetselt kruuside puhul aitab see, kui on võimalik näha kruusi serva, kuna see aitab näha perspektiivi, mitte näha objekti ortogonaalset projektsiooni.

Lisaks oli mudelil läbipaistval kruusil katsetamisel raskusi selle kruusi tuvastamisega. See on tõenäoliselt näide an levitamisest väljas kuna enamik kruuse on läbipaistmatud ja erinevat värvi.

Järeldus

3D-objektide tuvastamine on veel veidi noor ja MediaPipe'i Objectron on võimekas demonstratsioon! Kuigi Objectron on tundlik valgustingimuste, objektitüüpide (läbipaistvad vs läbipaistmatud kruusid jne) ja kergelt närvilise suhtes, on Objectron hea pilguheit sellele, mida on peagi võimalik teha suurema täpsuse ja ligipääsetavusega kui kunagi varem.

Ajatempel:

Veel alates Stackabus