Ανάλυση σφαλμάτων ανίχνευσης κράνους σε ποδοσφαιρικά βίντεο χρησιμοποιώντας το Amazon SageMaker

Κόμβος πηγής: 768385

Το National Football League (NFL) είναι το πιο δημοφιλές αθλητικό πρωτάθλημα της Αμερικής. Ιδρύθηκε το 1920, το NFL ανέπτυξε το μοντέλο του επιτυχημένου σύγχρονου αθλητικού πρωταθλήματος και δεσμεύεται να προωθήσει την πρόοδο στη διάγνωση, την πρόληψη και τη θεραπεία αθλητικών τραυματισμών. Οι προσπάθειες υγείας και ασφάλειας περιλαμβάνουν υποστήριξη για ανεξάρτητες ιατρικές έρευνες και εξελίξεις στον τομέα της μηχανικής, καθώς και τη δέσμευση για καλύτερη προστασία των παικτών και να καταστήσουν το παιχνίδι πιο ασφαλές. Αυτό περιλαμβάνει βελτιώσεις στα ιατρικά πρωτόκολλα και βελτιώσεις στον τρόπο με τον οποίο διδάσκεται και παίζεται το παιχνίδι μας. Για περισσότερες πληροφορίες σχετικά με τις προσπάθειες υγείας και ασφάλειας του NFL, δείτε NFL Player Υγεία και Ασφάλεια.

Έχουμε συνεργαστεί με την AWS για την ανάπτυξη του προγράμματος Digital Athlete, όπου χρησιμοποιούμε υπηρεσίες μηχανικής μάθησης AWS (ML) για να εντοπίσουμε πιθανούς κινδύνους που προέρχονται από κράνος-κράνος, κράνος-ώμο και άλλα μέρη του σώματος και κράνος-προς-έδαφος συγκρούσεις. Από αυτό το γράψιμο, δεν υπάρχει αυτοματοποιημένος τρόπος αναγνώρισης αυτών των συγκρούσεων. Ένας εμπειρογνώμονας πρέπει να ελέγξει τις ώρες του πλάνα του παιχνιδιού για να εντοπίσει οπτικά τις επιπτώσεις και να το συγκρίνει με τις πραγματικές συγκρούσεις που αναφέρθηκαν κατά τη διάρκεια του παιχνιδιού. Η ομάδα μας, σε συνεργασία με Επαγγελματικές υπηρεσίες AWS και η BioCore, αναπτύσσει αλγόριθμους όρασης υπολογιστή για την ανάλυση των βίντεο All-22 χρησιμοποιώντας Amazon Sage Maker για να διαμορφώσουμε το μέλλον του αμερικανικού ποδοσφαίρου και των παικτών του.

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

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

Πρόκληση ανίχνευσης

Οι προκλήσεις ενός μοντέλου ανιχνευτή κράνους σε σχέση με το ομαδικό παιχνίδι είναι τρεις φορές:

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

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

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

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

Σύνολο δεδομένων και μοντελοποίηση

Πρόσφατα ανακοινώσαμε έναν διαγωνισμό Kaggle (NFL 1st and Future - Ανίχνευση επιπτώσεων) για εμπειρογνώμονες ML σε όλο τον κόσμο να συμβάλουν στην έρευνα NFL, αντιμετωπίζοντας την ανάγκη για ένα σύστημα όρασης υπολογιστή για τον εντοπισμό επιπτώσεων κράνους στο πεδίο ως μέρος της πλατφόρμας Digital Athlete Σε αυτήν την ανάρτηση, χρησιμοποιούμε στατικές εικόνες από το δεδομένα ανταγωνισμού ως παράδειγμα για την κατασκευή ενός μοντέλου ανίχνευσης κράνους. Συνηθίζαμε Amazon SageMaker Ground Αλήθεια για να δημιουργήσετε το σύνολο δεδομένων όρασης υπολογιστή που είναι όσο το δυνατόν ακριβέστερη για τη δημιουργία μιας σταθερής πλατφόρμας.

Χρησιμοποιήσαμε το API Kaggle για να κατεβάσετε τα δεδομένα στο Παρουσίαση σημειωματάριου SageMaker. Για οδηγίες σχετικά με τη δημιουργία παρουσίας σημειωματάριου, δείτε Δημιουργία παρουσίας φορητού υπολογιστή. Χρησιμοποιήσαμε μια παρουσία ml.P3.2xlarge με μία ένταση GPU και 50 GB EBS για καλύτερο χειρισμό και εκπαίδευση δεδομένων. Για περισσότερες πληροφορίες σχετικά με τους τύπους παρουσιών, δείτε Διαθέσιμοι τύποι παρουσίας.

Ξεκινήσαμε με κάποιο βασικό EDA για να διερευνήσουμε τις στατικές εικόνες και τους αντίστοιχους σχολιασμούς. Το σύνολο δεδομένων με ετικέτα αποτελείται από 9,947 εικόνες με ετικέτα (με 4,958 πλευρική γραμμή και 4,989 τελική ζώνη) και ένα αρχείο CSV με όνομα image_labels.csv που περιέχει τα επισημασμένα κουτιά οριοθέτησης για όλες τις εικόνες. Το αρχείο με ετικέτα περιέχει 193,736 κράνη (114,986 πλευρική γραμμή και 78,750 τελική ζώνη) με 9,825 μοναδικά παιχνίδια.

Υπάρχουν πέντε διαφορετικές ετικέτες κράνους, συμπεριλαμβανομένων Blurred, Sideline, Partial, να Difficult. Ο παρακάτω πίνακας συνοψίζει το ποσοστό εμφάνισης κάθε ετικέτας.

Τύπος ετικέτας κράνους Ποσοστό εμφάνισης
Κράνος 66.98%
Κράνος-Θολή 17.31%
Κράνος-πλευρική γραμμή 7.76%
Κράνος-Μερικό 4.55%
Κράνος-Δύσκολο 3.39%

Θεωρήσαμε όλα Helmet τύποι να είναι οι ίδιοι για απλότητα και έκανε 80/20 διαίρεση για εκπαίδευση και δοκιμή στη φάση μοντελοποίησης.

Στη συνέχεια, χρησιμοποιήσαμε το FasterRCNN με το ResNet50 FPN ως μοντέλο ανίχνευσης κράνους και χρησιμοποιήσαμε ένα προπαρασκευασμένο μοντέλο βασισμένο σε δεδομένα COCO σε ένα πλαίσιο PyTorch. Για περισσότερες πληροφορίες σχετικά με την ανίχνευση αντικειμένων στο TorchVision, δείτε Οδηγός Finetuning Ανίχνευσης Αντικειμένων TorchVision. ο δίκτυο φαινόταν σαν μια ιδανική επιλογή επειδή ανιχνεύει αντικείμενα σχετικά μικρότερου μεγέθους και έχει αποδώσει πολύ καλά σε πολλούς τυπικούς διαγωνισμούς ανίχνευσης αντικειμένων. Ο στόχος δεν ήταν να οικοδομήσουμε ένα βραβευμένο μοντέλο ανίχνευσης κράνους, αλλά να εντοπίσουμε λάθη σε συγκεκριμένες εικόνες σε ένα ολόκληρο παιχνίδι με ένα μοντέλο με υψηλή απόδοση. 

Μετρήσεις απόδοσης μοντέλου

Εκπαιδεύσαμε το μοντέλο χρησιμοποιώντας το προεπιλεγμένο περιβάλλον PyTorch Conda pytorch_p36 σε μια παρουσία σημειωματάριου SageMaker. Η μέση ακρίβεια (AP) @ [IoU = 0.50: 0.95] για το σετ δοκιμών στο τέλος των 10 εποχών ήταν 0.498 και η μέση ανάκληση @@ [IoU = 0.50: 0.95] ήταν 0.56 και θεωρήθηκε εξαιρετική ως ανιχνευτής αντικειμένων.

Πήραμε το αποθηκευμένο μοντέλο και αξιολογήσαμε καρέ σε καρέ σε ένα ολόκληρο παιχνίδι (για παράδειγμα, 57583_000082_Endzone). Χρησιμοποιήσαμε ετικέτες σχολιασμού για ολόκληρο το παιχνίδι για να αξιολογήσουμε καρέ προς καρέ. Το ακόλουθο γράφημα είναι μια γραφική παράσταση ακρίβειας έναντι ανάκλησης για όλα τα καρέ με χρήση χάρτη 93.12% μετρήσεις ανίχνευσης αντικειμένων πακέτο.
Το παρακάτω γράφημα είναι μια γραφική παράσταση ακρίβειας έναντι ανάκλησης για όλα τα καρέ με χάρτη 93.12% χρησιμοποιώντας μετρήσεις ανίχνευσης αντικειμένων.
Όπως προκύπτει από την πλοκή, αυτό είναι ένα εξαιρετικό μοντέλο και αποτυγχάνει μόνο εάν το κράνος είναι είτε θολό ή πολύ δύσκολο να ανιχνευθεί ακόμη και με έμπειρα μάτια.

Στη συνέχεια, υπολογίσαμε τον αριθμό των πραγματικών θετικών, των ψευδών θετικών και των ψευδών αρνητικών για κάθε πλαίσιο του 57583_000082_Endzone παίζω. Για να ταιριάξουμε την προβλεπόμενη ανίχνευση με σχολιασμούς αλήθειας εδάφους, εξετάσαμε μόνο προβλέψεις με βαθμολογία υψηλότερο από το όριο 0.9 και 0.25 IoU μεταξύ της αλήθειας εδάφους και των προβλεπόμενων κουτιών οριοθέτησης. Οι συγκρούσεις μεταξύ πολλαπλών ανιχνεύσεων για τα ίδια πλαίσια οριοθέτησης αλήθειας εδάφους επιλύθηκαν χρησιμοποιώντας βαθμολογία εμπιστοσύνης. Ουσιαστικά, θεωρήσαμε μόνο τις υψηλότερες ανιχνεύσεις εμπιστοσύνης για πολλές ανιχνεύσεις.

Ο αριθμός των κρανών αλήθειας εδάφους σε κάθε πλαίσιο μπορεί να κυμαίνεται μεταξύ 18 και 22 για 57583_000082_Endzone, ενώ το μοντέλο μας προέβλεπε οπουδήποτε μεταξύ 15-23 κράνη. Επομένως, παρόλο που το μοντέλο μας είναι εξαιρετικό, έχασε μερικά κράνη και έκανε λανθασμένες προβλέψεις. Επειδή τα ψεύτικα αρνητικά ή οι χαμένες ανιχνεύσεις είναι πιο σημαντικά για τη σωστή παρακολούθηση των παικτών, εξετάσαμε τα πλαίσια όπου έχουμε πάρα πολλά ψεύτικα αρνητικά.

The following image shows an example where the model predicted every helmet correctly (depicted by the cyan boxes).

This next image shows where the model missed a few helmets (depicted by red boxes) and made wrong predictions (depicted by blue boxes).

Για να προσδιορίσετε πού και γιατί ένα μοντέλο έχει χαμηλή απόδοση, είναι επιτακτική ανάγκη να υπολογίσετε την ακρίβεια, την ανάκληση και τη βαθμολογία F1 για κάθε καρέ και για το συνολικό παιχνίδι. Έχουμε ακρίβεια 0.97, ανάκληση 0.93 και βαθμολογία F1 0.95 για το συνολικό παιχνίδι, το οποίο σίγουρα δεν παρέχει την πλήρη εικόνα των σφαλμάτων σε ένα ομαδικό παιχνίδι. Η ακόλουθη γραφική παράσταση δείχνει πολλά ψευδώς θετικά, ψευδώς αρνητικά στον δεξιό άξονα y και ακρίβεια, ανάκληση στον αριστερό άξονα y έναντι του μεμονωμένου αριθμού καρέ. Είναι σαφές ότι το μοντέλο μας έκανε μια εξαιρετική δουλειά συνολικά εκτός από τα πλαίσια μεταξύ περίπου 100-300, όπου συνήθως η αντιμετώπιση γίνεται σε ποδοσφαιρικούς αγώνες. Δυστυχώς, οι περισσότερες επιπτώσεις ή συγκρούσεις συμβαίνουν σε αυτές τις περιοχές πλαισίων, και ως εκ τούτου ερευνήσαμε βαθύτερα τις περιπτώσεις σφάλματος.
Δυστυχώς, οι περισσότερες επιπτώσεις ή συγκρούσεις συμβαίνουν σε αυτές τις περιοχές πλαισίων, και ως εκ τούτου ερευνήσαμε βαθύτερα τις περιπτώσεις σφάλματος.
Η ακόλουθη γραφική παράσταση είναι μια αναπαράσταση στοιβασμένης γραμμής των πραγματικών θετικών (πράσινη περιοχή), ψευδών αρνητικών (κόκκινη περιοχή) και ψευδών θετικών (μπλε περιοχή) έναντι μεμονωμένων αριθμών καρέ. Η μαύρη έντονη γραμμή αντιπροσωπεύει τον συνολικό αριθμό κρανών αλήθειας εδάφους σε κάθε πλαίσιο. Η διακεκομμένη κατακόρυφη μαύρη γραμμή αντιπροσωπεύει το snap πλαίσιο. Ένας ιδανικός ανιχνευτής κράνους θα πρέπει να ανιχνεύει κάθε κράνος σε κάθε πλαίσιο, καλύπτοντας έτσι ολόκληρη την περιοχή με πράσινο. Ωστόσο, όπως μπορείτε να δείτε στην οπτικοποίηση, το μοντέλο μας είχε περιορισμούς, οι οποίοι απεικονίζονται σαφώς τόσο ποιοτικά όσο και ποσοτικά στην οπτικοποίηση.
Ωστόσο, όπως μπορείτε να δείτε στην οπτικοποίηση, το μοντέλο μας είχε περιορισμούς.
Επομένως, αυτή η νέα οπτικοποίηση μας δίνει ένα εργαλείο για τη διάκριση μεταξύ ενός εξαιρετικού ανιχνευτή κράνους και ενός τέλειου ανιχνευτή κράνους. Παρέχει επίσης μια γρήγορη οπτική περίληψη που μας επιτρέπει να συγκρίνουμε την απόδοση του ανιχνευτή σε διαφορετικά παιχνίδια και να προσδιορίσουμε γρήγορα τη χρονική θέση και τον τύπο σφάλματος που διαδίδουν τα μοντέλα. Αυτό μπορεί περαιτέρω να αξιοποιηθεί για την αξιολόγηση βελτιωμένων μοντέλων ανιχνευτή κράνους μετά την επανεκπαίδευση.

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

Προϋποθέσεις

Για να αναπαραγάγετε αυτήν την ανάλυση στο δικό σας περιβάλλον, πρέπει να συμπληρώσετε τις ακόλουθες προϋποθέσεις:

  1. Δημιουργήστε έναν λογαριασμό AWS.
  2. Δημιουργήστε μια παρουσία SageMaker.

Συνιστάται να χρησιμοποιείτε μια παρουσία με υποστήριξη GPU, για παράδειγμα ml.p3.2xlarge. Το μέγεθος της έντασης EBS πρέπει να είναι περίπου 50 GB για την αποθήκευση όλων των απαραίτητων δεδομένων.

  1. Κατεβάστε τα δεδομένα από το Kaggle χρησιμοποιώντας το API Kaggle.

Αναφέρομαι στο Διαπιστευτήρια API για ανάκτηση και αποθήκευση του kaggle.json αρχείο στο SageMaker μέσα /home/ec2-user/.kaggle. Για λόγους ασφαλείας, φροντίστε να αλλάξετε τρόπους για άλλους τυχαίους χρήστες. Δείτε τον ακόλουθο κωδικό:

pip install kaggle mkdir /home/ec2-user/.kaggle mv kaggle.json /home/ec2-user/.kaggle chmod 600 ~/.kaggle/kaggle.json kaggle competitions download -c nfl-impact-detection 

Δημιουργία μοντέλου ανίχνευσης κράνους

Το ακόλουθο απόσπασμα κώδικα εμφανίζει την προσαρμοσμένη κλάση συνόλου δεδομένων για κράνη:

class DatasetHelmet(Dataset): def __init__(self, marking, image_ids, transforms=None, test=False): super().__init__() self.image_ids = image_ids self.marking = marking self.transforms = transforms self.test = test def __getitem__(self, index: int): image_id = self.image_ids[index] image, boxes, labels = self.load_image_and_boxes(index) num_boxes = len(boxes) if num_boxes > 0: target = {} new_boxes = torch.as_tensor(boxes, dtype=torch.float32) # there is only one class labels = torch.ones((num_boxes,), dtype=torch.int64) area = (new_boxes[:, 3] - new_boxes[:, 1]) * (new_boxes[:, 2] - new_boxes[:, 0]) # suppose all instances are not crowd iscrowd = torch.zeros((num_boxes,), dtype=torch.int64) target['boxes'] = new_boxes target['labels'] = labels target['image_id'] = torch.tensor([index]) target["area"] = area target["iscrowd"] = iscrowd else: target = {} if self.transforms is not None: image, target = self.transforms(image, target) return image, target def __len__(self) -> int: return self.image_ids.shape[0] def load_image_and_boxes(self, index): image_id = self.image_ids[index] TRAIN_ROOT_PATH = args.train + "images" image = cv2.imread(f'{TRAIN_ROOT_PATH}/{image_id}', cv2.IMREAD_COLOR).copy().astype(np.float32) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB).astype(np.float32) image /= 255.0 records = self.marking[self.marking['image'] == image_id] boxes = records[['left', 'top', 'width', 'height']].values boxes[:, 2] = boxes[:, 0] + boxes[:, 2] boxes[:, 3] = boxes[:, 1] + boxes[:, 3] labels = records['label'].values return image, boxes, labels 

Ο παρακάτω κώδικας δείχνει την κύρια λειτουργία εκπαίδευσης:

def main(args): # Read images label csv file image_labels = pd.read_csv('/home/ec2-user/SageMaker/helmet_detection/input/image_labels.csv' # # Split annotations into train and validation np.random.seed(0) image_names = np.random.permutation(image_labels.image.unique()) valid_image_len = int(len(image_names)*0.2) images_valid = image_names[:valid_image_len] images_train = image_names[valid_image_len:] logging.info(f"images_valid {images_valid}, n images_train {images_train}") # Define train and validation datasets and data loaders TRAIN_ROOT_PATH = args.train train_dataset = DatasetHelmet( image_ids=images_train, marking=image_labels, transforms=get_transform(train=True), test=False, ) validation_dataset = DatasetHelmet( image_ids=images_valid, marking=image_labels, transforms=get_transform(train=False), test=True, ) data_loader = torch.utils.data.DataLoader( train_dataset, batch_size=args.batch_size, shuffle=True, num_workers=1, collate_fn=utils_torchvision.collate_fn ) data_loader_valid = torch.utils.data.DataLoader( validation_dataset, batch_size=args.batch_size, shuffle=False, num_workers=1, collate_fn=utils_torchvision.collate_fn ) print(f"We have {len(train_dataset)} images for training and {len(validation_dataset)} for validation") # Set up model device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') ## Our dataset has two classes only - helmet and not helmet num_classes = 2 ## Get the model using our helper function model = get_model(num_classes) print(f"Loaded model") # Set up training start_epoch = 0 end_epoch = args.epochs params = [p for p in model.parameters() if p.requires_grad] optimizer = torch.optim.SGD(params, lr=0.005, momentum=0.9, weight_decay=0.0005) lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1) print(f"Loaded model parameters") ## if retraining from a checkpoint file if args.retrain: checkpoint = torch.load(os.path.join(args.model_dir, "model_checkpoint.pt")) model.load_state_dict(checkpoint['model_state_dict']) optimizer.load_state_dict(checkpoint['optimizer_state_dict']) start_epoch = checkpoint['epoch'] + 1 end_epoch = start_epoch + args.epochs print('nLoaded checkpoint from epoch %d.n' % start_epoch) print(start_epoch, end_epoch) # Train model loss_epoch = [] for epoch in range(start_epoch, end_epoch): # train for one epoch, printing every 1 iterations print(f"Training epoch {epoch}") train_one_epoch(model, optimizer, data_loader, data_loader_valid, device, epoch, loss_epoch, print_freq=1) # update the learning rate lr_scheduler.step() # evaluate on the test dataset evaluate(model, data_loader_valid, device=device, print_freq=1) # save checkpoint model after each epoch torch.save({ 'epoch': epoch, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict() }, os.path.join(args.model_dir, "model_checkpoint.pt")) # Save final model torch.save(model.state_dict(), os.path.join(args.model_dir, "model_helmet_frcnn.pt")) loss_df = pd.DataFrame(loss_epoch, columns=["train_loss", "val_loss"]) loss_df.reset_index(inplace=True) loss_df = loss_df.rename(columns = {'index':'Epoch'}) print(loss_df) loss_df.to_csv (os.path.join(args.model_dir, "loss_epoch.csv"), index = False, header=True) 

Αξιολόγηση μοντέλου ανίχνευσης κράνους

Χρησιμοποιήστε το αποθηκευμένο μοντέλο για να εκτελέσετε προβλέψεις σε ολόκληρο το παιχνίδι. Ο ακόλουθος κώδικας είναι ένα παράδειγμα λειτουργίας για την εκτέλεση αξιολογήσεων:

def run_detection_eval_video(video_in, gtfile_name, model_path, full_video=True, subset_video=60, conf_thres=0.9, iou_threshold = 0.5): """ Run detection on video Args: video_in: Input video path gtfile_name: Ground Truth annotation json file name model_path: Location of the pretrained model.pt full_video: Bool to indicate whether to run the whole video, default = False subset_video: Number of frames to run detection on conf_thres = Only consider detections with score higher than conf_thres, default = 0.9 iou_threshold = Match detection with ground trurh if iou is higher than iou_threshold, default = 0.5 Returns: Predicted detection for all the frames in a video, evaluation for detection, a dataframe with bounding boxes for false negatives and false positives df_predictions (pandas.DataFrame): prediction of detected object for all frames with columns ['frame_id', 'class_id', 'score', 'x1', 'y1', 'x2', 'y2'] eval_results (pandas.DataFrame): Count of total number of objects in gt and det, and tp, fn, fp for all frames with columns ['frame_id', 'num_object_gt', 'num_object_det', 'tp', 'fn', 'fp'] fns (pandas.DataFrame): False negative records in a Pandas Dataframe for all frames with columns ['frame_id','class_id','x1','y1','x2','y2'], return empty if no false negatives fps (pandas.DataFrame): False positive records in a Pandas Dataframe for all frames with columns ['frame_id','class_id', 'score', 'x1','y1','x2','y2'], return empty if no false positives """ # Capture the input video vid = cv2.VideoCapture(video_in) # Get video title vid_title = os.path.splitext(os.path.basename(video_in))[0] # Get total number of frames num_frames = vid.get(cv2.CAP_PROP_FRAME_COUNT) # load model num_classes = 2 model = ObjectDetector.load_custom_model(model_path=model_path, num_classes=num_classes) print("Pretrained model loaded") # Get GT annotations gt_labels = pd.read_csv('/home/ec2-user/SageMaker/helmet_detection/input/train_labels.csv') video = os.path.basename(video_in) print("Processing video: ",video) labels = gt_labels[gt_labels['video']==video] # if running for the whole video, then change the size of subset_video with total number of frames if full_video: subset_video = int(num_frames) df_predictions = [] # predictions for whole video eval_results = [] # detection evaluations for the whole video fns = [] # false negative detections for the whole video fps = [] # false positive detections for the whole video for i in range(subset_video): ret, frame = vid.read() print("Processing frame#: {} running detection and evaluation for videos".format(i+1)) # Get detection for this frame list_frame = [frame] dataset_frame = FramesDataset(list_frame) prediction = ObjectDetector.run_detection(dataset_frame, model) df_prediction = ObjectDetector.to_dataframe_highconf(prediction, conf_thres, i) df_predictions.append(df_prediction) # Get label for this frame cur_label = labels[labels['frame']==i+1] # get this frame's record cur_boxes = cur_label[['left','width','top','height']].values gt = ObjectDetector.get_gt_frame(i+1, cur_boxes) # Evaluate detection for this frame eval_result, fn, fp = ObjectDetector.evaluate_detections_iou(gt, df_prediction, iou_threshold) eval_results.append(eval_result) if fn is not None: fns.append(fn) if fp is not None: fps.append(fp) # Concatenate predictions, evaluation resutls, fns and fps for all frames of the video df_predictions = pd.concat(df_predictions) eval_results = pd.concat(eval_results) # Concatenate fns if not empty, otherwise create an empty dataframe if not fns: fns = pd.DataFrame() else: fns = pd.concat(fns) # Concatenate fps if not empty, otherwise create an empty dataframe if not fps: fps = pd.DataFrame() else: fps = pd.concat(fps) return df_predictions, eval_results, fns, fps 

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

pal = ["g","r","b"] plt.figure(figsize=(12,8)) plt.stackplot(eval_det['frame_id'], eval_det['tp'], eval_det['fn'], eval_det['fp'], labels=['TP','FN','FP'], colors=pal) plt.plot(eval_det['frame_id'], eval_det['num_object_gt'], color='k', linewidth=6, label='Total Helmets') plt.legend(loc='best', fontsize=12) plt.xlabel('Frame ID', fontsize=12) plt.ylabel(' # of TPs, FNs, FPs', fontsize=12) plt.axvline(x=snap_time, color='k', linestyle='--') plt.savefig('/home/ec2-user/SageMaker/helmet_detection/output/stacked.png') 

Συμπέρασμα

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

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

Οι αναγνώστες είναι ευπρόσδεκτοι να ρίξουν μια ματιά στο Διαγωνισμός Kaggle ιστοσελίδα και θα πρέπει να είναι σε θέση να αναπαράγει τα αποτελέσματα που παρουσιάζονται εδώ με τον κωδικό που περιλαμβάνεται στην ανάρτηση.


Σχετικά με τους Συγγραφείς

Σαμ Χάντλεσστον είναι ένας επιστημονικός επιστήμονας δεδομένων στη Biocore LLC, ο οποίος είναι επικεφαλής τεχνολογίας για το πρόγραμμα ψηφιακού αθλητή της NFL. Η Biocore είναι μια ομάδα μηχανικών παγκόσμιας κλάσης που εδρεύει στο Charlottesville της Βιρτζίνια, η οποία παρέχει έρευνα, δοκιμές, εμπειρογνωμοσύνη στη βιομηχανική, μοντελοποίηση και άλλες μηχανικές υπηρεσίες σε πελάτες αφιερωμένους στην κατανόηση και τη μείωση του τραυματισμού.

Jayeeta Ghosh είναι ένας Επιστήμονας δεδομένων που εργάζεται σε έργα AI / ML για πελάτες AWS και βοηθά στην επίλυση επιχειρηματικών προβλημάτων πελατών σε διάφορους κλάδους χρησιμοποιώντας βαθιά μάθηση και τεχνογνωσία στο cloud.

Πηγή: https://aws.amazon.com/blogs/machine-learning/helmet-detection-error-analysis-in-football-videos-using-amazon-sagemaker/

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

Περισσότερα από Ιστολόγιο μηχανικής εκμάθησης AWS