Εκτίμηση πόζας σε πραγματικό χρόνο από βίντεο σε Python με YOLOv7 PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Εκτίμηση πόζας σε πραγματικό χρόνο από βίντεο σε Python με YOLOv7

Εισαγωγή

Η ανίχνευση αντικειμένων είναι ένα μεγάλο πεδίο στην όραση υπολογιστή και μια από τις πιο σημαντικές εφαρμογές της όρασης υπολογιστή «στη φύση». Από αυτό, εξήχθη η ανίχνευση σημείων κλειδιού (συχνά χρησιμοποιείται για την εκτίμηση πόζας).

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

Η εκτίμηση πόζας είναι μια εκπληκτική, εξαιρετικά διασκεδαστική και πρακτική χρήση της όρασης υπολογιστή. Με αυτό, μπορούμε να καταργήσουμε το υλικό που χρησιμοποιείται για την εκτίμηση των στάσεων (κοστούμια λήψης κίνησης), τα οποία είναι δαπανηρά και δυσκίνητα. Επιπλέον, μπορούμε να χαρτογραφήσουμε την κίνηση των ανθρώπων με την κίνηση των ρομπότ στον Ευκλείδειο χώρο, επιτρέποντας την κίνηση του κινητήρα εξαιρετικής ακρίβειας χωρίς τη χρήση ελεγκτών, οι οποίοι συνήθως δεν επιτρέπουν υψηλότερα επίπεδα ακρίβειας. Η εκτίμηση σημείων κλειδιού μπορεί να χρησιμοποιηθεί για τη μετάφραση των κινήσεών μας σε τρισδιάστατα μοντέλα σε AR και VR, και χρησιμοποιείται όλο και περισσότερο για να το κάνει μόνο με μια κάμερα web. Τέλος – η εκτίμηση πόζας μπορεί να μας βοηθήσει στον αθλητισμό και την ασφάλεια.

Σε αυτόν τον οδηγό, θα εκτελούμε εκτίμηση πόζας σε πραγματικό χρόνο από ένα βίντεο στην Python, χρησιμοποιώντας το υπερσύγχρονο μοντέλο YOLOv7.

Συγκεκριμένα, θα δουλέψουμε με ένα βίντεο από τους χειμερινούς Ολυμπιακούς Αγώνες του 2018, που πραγματοποιήθηκαν στο PyeongChang της Νότιας Κορέας:

Η Aljona Savchenko και ο Bruno Massot έκαναν μια εκπληκτική ερμηνεία, συμπεριλαμβανομένης της αλληλεπικάλυψης των σωμάτων απέναντι στην κάμερα, της γρήγορης ροής κίνησης και του spinning στον αέρα. Θα είναι μια καταπληκτική ευκαιρία να δείτε πώς το μοντέλο χειρίζεται δύσκολες καταστάσεις!

YOLO και εκτίμηση πόζας

YOLO (Μόνο μια φορά κοιτάς) είναι μια μεθοδολογία, καθώς και μια οικογένεια μοντέλων που έχουν κατασκευαστεί για την ανίχνευση αντικειμένων. Από την αρχή το 2015, τα YOLOv1, YOLOv2 (YOLO9000) και YOLOv3 έχουν προταθεί από τους ίδιους συγγραφείς – και η κοινότητα βαθιάς μάθησης συνέχισε με προόδους ανοιχτού κώδικα τα επόμενα χρόνια.

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

Αυτό είναι το πώς YOLOR (Μαθαίνεις μόνο μία παράσταση) και το YOLOv7 που χτίστηκε πάνω από το YOLOR (ίδιος συγγραφέας) δημιουργήθηκαν επίσης!

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

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

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

Το ίδιο το μοντέλο δημιουργήθηκε μέσω αρχιτεκτονικών αλλαγών, καθώς και βελτιστοποίησης πτυχών της εκπαίδευσης, που ονομάστηκαν "bag-of-freebies", οι οποίες αύξησαν την ακρίβεια χωρίς να αυξάνουν το κόστος συμπερασμάτων.

Εγκατάσταση του YOLOv7

Ας ξεκινήσουμε κλωνοποιώντας το αποθετήριο για να κρατήσουμε τον πηγαίο κώδικα:

! git clone https://github.com/WongKinYiu/yolov7.git

Τώρα, ας προχωρήσουμε στο yolov7 κατάλογο, που περιέχει το έργο, και ρίξτε μια ματιά στα περιεχόμενα:

%cd yolov7
!ls
/content/yolov7
cfg	   figure      output.mp4	 test.py       
data	   hubconf.py  paper		 tools
deploy	   inference   README.md	 train_aux.py
detect.py  LICENSE.md  requirements.txt  train.py
export.py  models      scripts		 utils

Σημείωση: κλήση !cd dirname σας μεταφέρει σε έναν κατάλογο σε αυτό το κελί. Κλήση %cd dirname σας μεταφέρει σε έναν κατάλογο και στα επερχόμενα κελιά και σας κρατά εκεί.

Τώρα, το YOLO προορίζεται να είναι ένας ανιχνευτής αντικειμένων και δεν αποστέλλεται με βάρη εκτίμησης πόζας από προεπιλογή. Θα θελήσουμε να κατεβάσουμε τα βάρη και να φορτώσουμε ένα συγκεκριμένο παράδειγμα μοντέλου από αυτά. Τα βάρη είναι διαθέσιμα στο ίδιο αποθετήριο GitHub και μπορούν εύκολα να ληφθούν και μέσω του CLI:

! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  153M  100  153M    0     0  23.4M      0  0:00:06  0:00:06 --:--:-- 32.3M

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

import torch
from torchvision import transforms

from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts

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

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

Μεγάλος! Ας συνεχίσουμε με τη φόρτωση του μοντέλου και τη δημιουργία ενός σεναρίου που σας επιτρέπει να συμπεράνετε πόζες από βίντεο με YOLOv7 και OpenCV.

Εκτίμηση πόζας σε πραγματικό χρόνο με το YOLOv7

Ας δημιουργήσουμε πρώτα μια μέθοδο για τη φόρτωση του μοντέλου από τα βάρη που έχουν ληφθεί. Θα ελέγξουμε ποια συσκευή έχουμε διαθέσιμη (CPU ή GPU):

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def load_model():
    model = torch.load('yolov7-w6-pose.pt', map_location=device)['model']
    
    model.float().eval()

    if torch.cuda.is_available():
        
        
        model.half().to(device)
    return model

model = load_model()

Ανάλογα με το αν έχουμε GPU ή όχι, θα ενεργοποιήσουμε τη μισή ακρίβεια (χρησιμοποιώντας float16 αντί του float32 σε πράξεις), γεγονός που καθιστά το συμπέρασμα σημαντικά ταχύτερο. Λάβετε υπόψη ότι συνιστάται ιδιαίτερα να το κάνετε αυτό σε μια GPU για ταχύτητες σε πραγματικό χρόνο, καθώς οι CPU πιθανότατα δεν θα έχουν τη δυνατότητα να το κάνουν εκτός εάν εκτελούνται σε μικρά βίντεο.

Ας γράψουμε μια πειστική μέθοδο για την εκτέλεση συμπερασμάτων. Θα δεχόμαστε εικόνες ως πίνακες NumPy (καθώς αυτό θα τις περάσουμε αργότερα κατά την ανάγνωση του βίντεο). Πρώτον, χρησιμοποιώντας το letterbox() λειτουργία – θα αλλάξουμε το μέγεθος και θα προσθέσουμε το βίντεο σε ένα σχήμα με το οποίο μπορεί να λειτουργήσει το μοντέλο. Αυτό δεν χρειάζεται να είναι και δεν θα είναι το σχήμα (ανάλυση) του βίντεο που προκύπτει!

Στη συνέχεια, θα εφαρμόσουμε τους μετασχηματισμούς, θα μετατρέψουμε την εικόνα σε μισή ακρίβεια (εάν είναι διαθέσιμη μια GPU), θα τη δεσμεύσουμε και θα την εκτελέσουμε μέσω του μοντέλου:

def run_inference(image):
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    if torch.cuda.is_available():
      image = image.half().to(device)
    
    image = image.unsqueeze(0) 
    with torch.no_grad():
      output, _ = model(image)
    return output, image

Θα επιστρέψουμε τις προβλέψεις του μοντέλου, καθώς και την εικόνα ως τανυστήρα. Αυτές είναι «ακατέργαστες» προβλέψεις – περιέχουν πολλές ενεργοποιήσεις που επικαλύπτονται και θα θέλουμε να τις «καθαρίσουμε» χρησιμοποιώντας τη μη μέγιστη καταστολή και να σχεδιάσουμε τους προβλεπόμενους σκελετούς πάνω από την ίδια την εικόνα:

def draw_keypoints(output, image):
  output = non_max_suppression_kpt(output, 
                                     0.25, 
                                     0.65, 
                                     nc=model.yaml['nc'], 
                                     nkpt=model.yaml['nkpt'], 
                                     kpt_label=True)
  with torch.no_grad():
        output = output_to_keypoint(output)
  nimg = image[0].permute(1, 2, 0) * 255
  nimg = nimg.cpu().numpy().astype(np.uint8)
  nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
  for idx in range(output.shape[0]):
      plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)

  return nimg

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

img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)

Για να το μεταφράσουμε σε μια ρύθμιση βίντεο σε πραγματικό χρόνο – θα χρησιμοποιήσουμε το OpenCV για να διαβάσουμε ένα βίντεο και θα εκτελέσουμε αυτήν τη διαδικασία για κάθε καρέ. Σε κάθε καρέ, θα γράψουμε επίσης το πλαίσιο σε ένα νέο αρχείο, κωδικοποιημένο ως βίντεο. Αυτό αναγκαστικά θα επιβραδύνει τη διαδικασία καθώς εκτελούμε το συμπέρασμα, το εμφανίζουμε και γράφουμε – έτσι μπορείτε να επιταχύνετε το συμπέρασμα και την εμφάνιση αποφεύγοντας τη δημιουργία ενός νέου αρχείου και γράφοντας σε αυτό στον βρόχο:

def pose_estimation_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            output, frame = run_inference(frame)
            frame = draw_keypoints(output, frame)
            frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
            out.write(frame)
            cv2.imshow('Pose estimation', frame)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

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

Τώρα, μπορούμε να καλέσουμε τη μέθοδο σε οποιοδήποτε βίντεο εισόδου:

pose_estimation_video('../ice_skating.mp4')

Αυτό θα ανοίξει ένα παράθυρο OpenCV, εμφανίζοντας το συμπέρασμα σε πραγματικό χρόνο. Και επίσης, θα γράψει ένα αρχείο βίντεο στο yolov7 κατάλογο (αφού έχουμε cdτο έβλεπα):

Εκτίμηση πόζας σε πραγματικό χρόνο από βίντεο σε Python με YOLOv7 PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Σημείωση: Εάν η GPU σας δυσκολεύεται ή εάν θέλετε να ενσωματώσετε τα αποτελέσματα ενός μοντέλου όπως αυτό σε μια εφαρμογή που έχει λανθάνουσα κατάσταση ως κρίσιμη πτυχή της ροής εργασίας - κάντε το βίντεο μικρότερο και εργαστείτε σε μικρότερα καρέ. Αυτό είναι ένα βίντεο Full HD 1920×1080 και θα πρέπει να μπορεί να εκτελείται γρήγορα στα περισσότερα οικιακά συστήματα, αλλά αν δεν λειτουργεί το ίδιο καλά στο σύστημά σας, κάντε τις εικόνες μικρότερες.

Συμπέρασμα

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

Τέλος, ανοίξαμε ένα βίντεο χρησιμοποιώντας το OpenCV, τρέξαμε το συμπέρασμα με το YOLOv7 και δημιουργήσαμε μια συνάρτηση για την εκτέλεση εκτίμησης πόζας σε πραγματικό χρόνο, αποθηκεύοντας το βίντεο που προκύπτει σε πλήρη ανάλυση και 30 FPS στον τοπικό σας δίσκο.

Going Further – Πρακτική βαθιά μάθηση για το Computer Vision

Η περιπετειώδης φύση σας σας κάνει να θέλετε να πάτε παραπέρα; Σας προτείνουμε να ελέγξετε το δικό μας Πορεία: "Πρακτική βαθιά μάθηση για την όραση υπολογιστή με Python".

Εκτίμηση πόζας σε πραγματικό χρόνο από βίντεο σε Python με YOLOv7 PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ένα άλλο μάθημα Computer Vision;

Δεν θα κάνουμε ταξινόμηση ψηφίων MNIST ή μόδας MNIST. Υπηρέτησαν το μέρος τους εδώ και πολύ καιρό. Πάρα πολλοί πόροι εκμάθησης εστιάζουν σε βασικά σύνολα δεδομένων και βασικές αρχιτεκτονικές πριν αφήσουν τις προηγμένες αρχιτεκτονικές μαύρου κουτιού να επωμιστούν το βάρος της απόδοσης.

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

Τι είναι μέσα?

  • Οι πρώτες αρχές της όρασης και πώς οι υπολογιστές μπορούν να διδαχθούν να «βλέπουν»
  • Διαφορετικές εργασίες και εφαρμογές της όρασης υπολογιστή
  • Τα εργαλεία του εμπορίου που θα κάνουν τη δουλειά σας πιο εύκολη
  • Εύρεση, δημιουργία και χρήση συνόλων δεδομένων για την όραση υπολογιστή
  • Η θεωρία και η εφαρμογή των συνελικτικών νευρωνικών δικτύων
  • Χειρισμός μετατόπισης τομέα, συνεμφάνισης και άλλων προκαταλήψεων στα σύνολα δεδομένων
  • Μεταφέρετε τη μάθηση και χρησιμοποιείτε τον χρόνο εκπαίδευσης και τους υπολογιστικούς πόρους άλλων προς όφελός σας
  • Κατασκευή και εκπαίδευση ενός υπερσύγχρονου ταξινομητή καρκίνου του μαστού
  • Πώς να εφαρμόσετε μια υγιή δόση σκεπτικισμού στις επικρατούσες ιδέες και να κατανοήσετε τις επιπτώσεις των ευρέως υιοθετημένων τεχνικών
  • Οπτικοποίηση του «εννοιολογικού χώρου» ενός ConvNet χρησιμοποιώντας t-SNE και PCA
  • Μελέτες περίπτωσης για το πώς οι εταιρείες χρησιμοποιούν τεχνικές όρασης υπολογιστή για να επιτύχουν καλύτερα αποτελέσματα
  • Σωστή αξιολόγηση μοντέλου, οπτικοποίηση λανθάνοντος χώρου και αναγνώριση της προσοχής του μοντέλου
  • Εκτέλεση έρευνας τομέα, επεξεργασία των δικών σας συνόλων δεδομένων και δημιουργία δοκιμών μοντέλων
  • Αρχιτεκτονικές αιχμής, η εξέλιξη των ιδεών, τι τις κάνει μοναδικές και πώς να τις εφαρμόσετε
  • KerasCV – μια βιβλιοθήκη WIP για τη δημιουργία αγωγών και μοντέλων τελευταίας τεχνολογίας
  • Πώς να αναλύετε και να διαβάζετε έγγραφα και να τα εφαρμόζετε μόνοι σας
  • Επιλογή μοντέλων ανάλογα με την εφαρμογή σας
  • Δημιουργία ενός αγωγού μηχανικής εκμάθησης από άκρο σε άκρο
  • Τοπίο και διαίσθηση για την ανίχνευση αντικειμένων με ταχύτερα R-CNN, RetinaNets, SSD και YOLO
  • Παρουσίαση και σημασιολογική κατάτμηση
  • Αναγνώριση αντικειμένων σε πραγματικό χρόνο με το YOLOv5
  • Εκπαίδευση ανιχνευτών αντικειμένων YOLOv5
  • Εργασία με μετασχηματιστές χρησιμοποιώντας KerasNLP (βιβλιοθήκη WIP με αντοχή στη βιομηχανία)
  • Ενσωμάτωση Transformers με ConvNets για τη δημιουργία λεζάντων εικόνων
  • DeepDream
  • Βελτιστοποίηση μοντέλου Deep Learning για όραση υπολογιστή

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

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