Ανίχνευση αντικειμένων 3D (3D Bounding Boxes) σε Python με MediaPipe Objectron PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ανίχνευση αντικειμένων 3D (3D Bounding Boxes) σε Python με MediaPipe Objectron

Εισαγωγή

Η ανίχνευση αντικειμένων έχει αποκτήσει ατμό και γίνονται βελτιώσεις σε διάφορες προσεγγίσεις για την επίλυσή της. Τα τελευταία δύο χρόνια, οι μέθοδοι που βασίζονται στο YOLO ξεπερνούν τις άλλες ως προς την ακρίβεια και την ταχύτητα, με πρόσφατες εξελίξεις όπως το YOLOv7 και το YOLOv6 (το οποίο κυκλοφόρησε ανεξάρτητα, μετά το YOLOv7).

Ωστόσο - όλα αυτά είναι ανησυχητικά 2D ανίχνευση αντικειμένων, το οποίο είναι ένα δύσκολο εγχείρημα από μόνο του. Πρόσφατα, μπορέσαμε να παίξουμε με επιτυχία 3D ανίχνευση αντικειμένων, και ενώ αυτοί οι ανιχνευτές εξακολουθούν να βρίσκονται σε πιο ασταθές στάδιο από τους ανιχνευτές αντικειμένων 2D, η ακρίβειά τους αυξάνεται.

Σε αυτόν τον οδηγό, θα εκτελέσουμε ανίχνευση αντικειμένων 3D στην Python με το Objectron του MediaPipe.

Σημείωση: Το MediaPipe είναι το πλαίσιο ανοιχτού κώδικα της Google για τη δημιουργία αγωγών μηχανικής εκμάθησης για την επεξεργασία εικόνων, βίντεο και ροών ήχου, κυρίως για κινητές συσκευές. Χρησιμοποιείται τόσο εσωτερικά όσο και εξωτερικά και παρέχει προεκπαιδευμένα μοντέλα για διάφορες εργασίες, όπως ανίχνευση προσώπου, πλέγμα προσώπου, εκτίμηση χεριών και στάσης, τμηματοποίηση μαλλιών, ανίχνευση αντικειμένων, παρακολούθηση κουτιού κ.λπ.

Όλα αυτά μπορούν και χρησιμοποιούνται για μεταγενέστερες εργασίες – όπως η εφαρμογή φίλτρων σε πρόσωπα, η αυτοματοποιημένη εστίαση κάμερας, η βιομετρική επαλήθευση, η χειροκίνητη ρομποτική κ.λπ. Τα περισσότερα έργα είναι διαθέσιμα με API για Android, iOS, C++, Python και JavaScript, ενώ μερικά είναι διαθέσιμα μόνο για συγκεκριμένες γλώσσες.

Σε αυτόν τον οδηγό, θα συνεργαστούμε MediaPipe's Objectron, διαθέσιμο για Android, C++, Python και JavaScript.

MediaPipe και 3D Object Detection

Η Objectron λύση εκπαιδεύτηκε για το Σύνολο δεδομένων αντικειμένων, το οποίο περιέχει σύντομα αντικειμενοκεντρικά βίντεο. Το σύνολο δεδομένων περιέχει μόνο 9 αντικείμενα: ποδήλατα, βιβλία, μπουκάλια, κάμερες, κουτιά δημητριακών, καρέκλες, φλιτζάνια, φορητούς υπολογιστές και παπούτσια, επομένως δεν είναι ένα πολύ γενικό σύνολο δεδομένων, αλλά η επεξεργασία και η προμήθεια αυτών των βίντεο είναι αρκετά ακριβή (πόζες κάμερας, αραιή σημεία-σύννεφα, χαρακτηρισμός των επίπεδων επιφανειών, κ.λπ. για κάθε καρέ κάθε βίντεο), καθιστώντας το σύνολο δεδομένων σε μέγεθος σχεδόν 2 terrabyte.

Το εκπαιδευμένο μοντέλο Objectron (γνωστό ως α λύση για έργα MediaPipe) εκπαιδεύεται σε τέσσερις κατηγορίες – παπούτσια, καρέκλες, κούπες και κάμερες.

Η ανίχνευση αντικειμένων 2D χρησιμοποιεί τον όρο "περιορίζοντας κουτιά", ενώ στην πραγματικότητα είναι ορθογώνια. Η ανίχνευση αντικειμένων 3D στην πραγματικότητα προβλέπει κουτιά γύρω από αντικείμενα, από τα οποία μπορείτε να συμπεράνετε τον προσανατολισμό, το μέγεθος, τον πρόχειρο όγκο τους, κ.λπ. Αυτό είναι ένα αρκετά δύσκολο έργο, ειδικά δεδομένης της έλλειψης κατάλληλων συνόλων δεδομένων και του κόστους δημιουργίας τους. Αν και είναι δύσκολο, το πρόβλημα υπόσχεται για διάφορους Αυξημένη πραγματικότητα (AR) εφαρμογές!

Η λύση Objectron μπορεί να εκτελεστεί σε λειτουργία ενός σταδίου ή δύο σταδίων – όπου η λειτουργία ενός σταδίου είναι καλύτερη στον εντοπισμό πολλαπλών αντικειμένων, ενώ η λειτουργία δύο σταδίων είναι καλύτερη στην ανίχνευση ενός μόνο κύριου αντικειμένου στη σκηνή και εκτελείται σημαντικά γρηγορότερα. Η σωλήνωση ενός σταδίου χρησιμοποιεί μια ραχοκοκαλιά MobileNetV2, ενώ η διοχέτευση δύο σταδίων χρησιμοποιεί το API ανίχνευσης αντικειμένων TensorFlow.

Όταν ανιχνεύεται ένα αντικείμενο σε ένα βίντεο, δεν γίνονται περαιτέρω προβλέψεις για αυτό σε κάθε καρέ για δύο λόγους:

  • Οι συνεχείς προβλέψεις εισάγουν υψηλή νευρικότητα (λόγω της εγγενούς στοχαστικότητας στις προβλέψεις)
  • Είναι ακριβό να τρέχετε μεγάλα μοντέλα σε κάθε πλαίσιο

Η ομάδα εκφορτώνει τις βαριές προβλέψεις στις πρώτες μόνο συναντήσεις και στη συνέχεια παρακολουθεί αυτό το κουτί όσο το εν λόγω αντικείμενο βρίσκεται ακόμα στη σκηνή. Μόλις σπάσει η οπτική γωνία και επανεισαχθεί το αντικείμενο, γίνεται ξανά μια πρόβλεψη. Αυτό καθιστά δυνατή τη χρήση μεγαλύτερων μοντέλων με υψηλότερη ακρίβεια, διατηρώντας παράλληλα τις υπολογιστικές απαιτήσεις χαμηλές και μειώνει τις απαιτήσεις hardware για συμπέρασμα σε πραγματικό χρόνο!

Ας προχωρήσουμε και να εγκαταστήσουμε το MediaPipe, να εισαγάγουμε τη λύση Objectron και να την εφαρμόσουμε σε στατικές εικόνες και σε μια τροφοδοσία βίντεο που προέρχεται απευθείας από μια κάμερα.

Εγκατάσταση MediaPipe

Ας εγκαταστήσουμε πρώτα το MediaPipe και ας προετοιμάσουμε μια βοηθητική μέθοδο για τη λήψη εικόνων από μια δεδομένη διεύθυνση URL:

! pip install mediapipe

Με εγκατεστημένο το πλαίσιο, ας το εισαγάγουμε μαζί με κοινές βιβλιοθήκες:

import mediapipe as mp

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

Ας ορίσουμε μια βοηθητική μέθοδο για τη λήψη εικόνων στις οποίες δίνεται μια διεύθυνση URL και η οποία επιστρέφει έναν πίνακα RGB που αντιπροσωπεύει αυτήν την εικόνα:

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)

Τέλος, θα θελήσουμε να εισαγάγουμε τόσο τη λύση Objectron όσο και τα βοηθητικά προγράμματα σχεδίασης για να οπτικοποιήσουμε τις προβλέψεις:

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

Ανίχνευση αντικειμένων 3D σε στατικές εικόνες με MediaPipe

Η Objectron Η κλάση επιτρέπει πολλά ορίσματα, όπως:

  • static_image_mode: Είτε τροφοδοτείτε μια εικόνα είτε μια ροή εικόνων (βίντεο)
  • max_num_objects: Ο μέγιστος αναγνωρίσιμος αριθμός αντικειμένων
  • min_detection_confidence: Το όριο εμπιστοσύνης ανίχνευσης (πόσο σίγουρο πρέπει να είναι το δίκτυο για να ταξινομήσει ένα αντικείμενο για τη δεδομένη κλάση)
  • model_name: Ποιο μοντέλο θα θέλατε να φορτώσετε ενδιάμεσα 'Cup', 'Shoe', 'Camera' και 'Chair'.

Έχοντας αυτά κατά νου – ας δημιουργήσουμε ένα στιγμιότυπο Objectron και process() η εικόνα εισόδου:


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 περιέχει τα δισδιάστατα και τρισδιάστατα ορόσημα των αντικειμένων που έχουν εντοπιστεί, καθώς και την περιστροφή, τη μετάφραση και την κλίμακα για το καθένα. Μπορούμε να επεξεργαστούμε τα αποτελέσματα και να σχεδιάσουμε τα πλαίσια οριοθέτησης αρκετά εύκολα χρησιμοποιώντας τα παρεχόμενα εργαλεία σχεδίασης:

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

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

Αυτο εχει ως αποτελεσμα:

Ανίχνευση αντικειμένων 3D από βίντεο ή webcam με MediaPipe

Μια πιο συναρπαστική εφαρμογή είναι στα βίντεο! Δεν χρειάζεται να αλλάξετε πολύ τον κωδικό για να χωρέσετε βίντεο, είτε παρέχετε ένα από την κάμερα web είτε από ένα υπάρχον αρχείο βίντεο. Το OpenCV είναι μια φυσική εφαρμογή για ανάγνωση, χειρισμό και τροφοδοσία πλαισίων βίντεο στο μοντέλο 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()

Καθιστώντας την εικόνα μη εγγράψιμη με image.flags.writeable = False κάνει τη διαδικασία να εκτελείται κάπως πιο γρήγορα και είναι μια προαιρετική αλλαγή. Ο τελικός cv2.flip() στην εικόνα που προκύπτει είναι επίσης προαιρετική – και απλώς καθρεφτίζει την έξοδο για να την κάνει λίγο πιο διαισθητική.

Όταν τρέχετε σε μια κάμερα και μια παγκοσμίως κοινή κούπα Ikea, αυτά είναι τα αποτελέσματα:

Ανίχνευση αντικειμένων 3D (3D Bounding Boxes) σε Python με MediaPipe Objectron PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Η έξοδος είναι ελαφρώς νευρική, αλλά χειρίζεται καλά την περιστροφική μετάφραση, ακόμη και με ένα τρεμάμενο χέρι που κρατά την κάμερα χαμηλής ανάλυσης. Τι συμβαίνει όταν ένα αντικείμενο βγαίνει από το πλαίσιο;

Ανίχνευση αντικειμένων 3D (3D Bounding Boxes) σε Python με MediaPipe Objectron PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Οι προβλέψεις σταματούν για το αντικείμενο κατά την πρώτη ανίχνευση και η παρακολούθηση πλαισίου διαπιστώνει ξεκάθαρα ότι το αντικείμενο έχει φύγει από το πλαίσιο και εκτελεί την πρόβλεψη και την παρακολούθηση για άλλη μια φορά μόλις το αντικείμενο εισέλθει ξανά στο πλαίσιο. Φαίνεται ότι η παρακολούθηση λειτουργεί κάπως καλύτερα όταν το μοντέλο μπορεί να το δει λαβή κούπας, καθώς οι έξοδοι είναι πιο νευρικές όταν η λαβή δεν είναι ορατή (πιθανότατα επειδή είναι πιο δύσκολο να εξακριβωθεί με ακρίβεια ο πραγματικός προσανατολισμός της κούπας).

Επιπλέον, ορισμένες γωνίες φαίνεται να παράγουν σημαντικά πιο σταθερές εξόδους από άλλες, σε δύσκολες συνθήκες φωτός. Ειδικά για τις κούπες, βοηθά να μπορείτε να δείτε το χείλος της κούπας καθώς βοηθά στην προοπτική, αντί να βλέπετε μια ορθογώνια προβολή του αντικειμένου.

Επιπλέον, όταν δοκιμάστηκε σε μια διαφανή κούπα, το μοντέλο δυσκολεύτηκε να το διαπιστώσει ως κούπα. Αυτό είναι πιθανότατα ένα παράδειγμα ενός εκτός διανομής αντικείμενο, καθώς οι περισσότερες κούπες είναι αδιαφανείς και έχουν διάφορα χρώματα.

Συμπέρασμα

Η ανίχνευση αντικειμένων 3D είναι ακόμα κάπως νεαρή και το Objectron της MediaPipe είναι μια ικανή επίδειξη! Αν και είναι ευαίσθητο στις συνθήκες φωτισμού, στους τύπους αντικειμένων (διαφανείς έναντι αδιαφανείς κούπες, κ.λπ.) και ελαφρώς νευρικό – το Objectron είναι μια καλή ματιά στο τι θα είναι σύντομα δυνατό να γίνει με μεγαλύτερη ακρίβεια και προσβασιμότητα από ποτέ.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse