Πίνακας περιεχομένων:

Ανίχνευση αντικειμένων με πίνακες Sipeed MaiX (Kendryte K210): 6 βήματα
Ανίχνευση αντικειμένων με πίνακες Sipeed MaiX (Kendryte K210): 6 βήματα

Βίντεο: Ανίχνευση αντικειμένων με πίνακες Sipeed MaiX (Kendryte K210): 6 βήματα

Βίντεο: Ανίχνευση αντικειμένων με πίνακες Sipeed MaiX (Kendryte K210): 6 βήματα
Βίντεο: Κάμερα ασφαλείας 3 megapixel. Αξίζει την αγορά; Τι επηρεάζει η ανάλυση; 2024, Νοέμβριος
Anonim
Image
Image

Ως συνέχεια του προηγούμενου άρθρου μου σχετικά με την αναγνώριση εικόνας με τους πίνακες Sipeed MaiX, αποφάσισα να γράψω ένα άλλο σεμινάριο, εστιάζοντας στην ανίχνευση αντικειμένων. Πρόσφατα εμφανίστηκε ένα ενδιαφέρον υλικό με το τσιπ Kendryte K210, όπως το Seeed AI Hat for Edge Computing, το M5 stack's M5StickV και το HuskyLens του DFRobot (αν και αυτό έχει ιδιόκτητο υλικολογισμικό και απευθύνεται σε αρχάριους). Λόγω της φθηνής της τιμής, η Kendryte K210 απευθύνθηκε σε ανθρώπους που επιθυμούν να προσθέσουν όραμα υπολογιστή στα έργα τους. Αλλά όπως συνήθως με τα κινεζικά προϊόντα υλικού, η τεχνική υποστήριξη λείπει και αυτό είναι κάτι που προσπαθώ να βελτιώσω με τα άρθρα και τα βίντεό μου. Λάβετε όμως υπόψη ότι δεν είμαι στην ομάδα προγραμματιστών Kendryte ή Sipeed και δεν μπορώ να απαντήσω σε όλες τις ερωτήσεις που σχετίζονται με το προϊόν τους.

Με αυτό κατά νου, ας ξεκινήσουμε! Θα ξεκινήσουμε με μια σύντομη (και απλοποιημένη) επισκόπηση του τρόπου λειτουργίας των μοντέλων CNN αναγνώρισης αντικειμένων.

ΕΝΗΜΕΡΩΣΗ ΜΑAYΟΥ 2020: Βλέποντας πώς το άρθρο και το βίντεό μου για την Ανίχνευση αντικειμένων με πίνακες K210 εξακολουθούν να είναι πολύ δημοφιλή και μεταξύ των κορυφαίων αποτελεσμάτων στο YouTube και το Google, αποφάσισα να ενημερώσω το άρθρο για να συμπεριλάβω τις πληροφορίες σχετικά με το πλαίσιο AI που βασίζεται στο AXeleRate, Keras στο Edge αναπτύσσω. Το aXeleRate, ουσιαστικά, βασίζεται στη συλλογή σεναρίων που χρησιμοποίησα για την εκπαίδευση μοντέλων αναγνώρισης εικόνας/ανίχνευσης αντικειμένων - συνδυασμένα σε ένα ενιαίο πλαίσιο και βελτιστοποιημένα για ροή εργασιών στο Google Colab. Είναι πιο βολικό στη χρήση και πιο ενημερωμένο.

Για την παλιά έκδοση του άρθρου, μπορείτε ακόμα να το δείτε στο steemit.com.

Βήμα 1: Επεξήγηση αρχιτεκτονικής μοντέλου ανίχνευσης αντικειμένων

Επεξηγείται αρχιτεκτονική μοντέλου ανίχνευσης αντικειμένων
Επεξηγείται αρχιτεκτονική μοντέλου ανίχνευσης αντικειμένων
Επεξηγείται αρχιτεκτονική μοντέλου ανίχνευσης αντικειμένων
Επεξηγείται αρχιτεκτονική μοντέλου ανίχνευσης αντικειμένων

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

Εδώ είναι όταν τα μοντέλα ανίχνευσης αντικειμένων είναι χρήσιμα. Σε αυτό το άρθρο θα χρησιμοποιήσουμε την αρχιτεκτονική YOLO (κοιτάζετε μόνο μία φορά) και θα εστιάσουμε την εξήγηση στην εσωτερική μηχανική της συγκεκριμένης αρχιτεκτονικής.

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

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

Βήμα 2: Προετοιμάστε το Περιβάλλον

Προετοιμάστε το Περιβάλλον
Προετοιμάστε το Περιβάλλον

Το aXeleRate βασίζεται σε υπέροχο έργο της penny4860, ανιχνευτή ψηφίων SVHN yolo-v2. Το aXeleRate ανεβάζει αυτήν την εφαρμογή του ανιχνευτή YOLO στην Κεράς και χρησιμοποιεί το βολικό του σύστημα διαμόρφωσης για να εκτελέσει εκπαίδευση και μετατροπή δικτύων αναγνώρισης εικόνας/ανίχνευσης αντικειμένων και τμηματοποίησης εικόνας με διάφορα backend.

Υπάρχουν δύο τρόποι για να χρησιμοποιήσετε το aXeleRate: να εκτελείται τοπικά στο μηχάνημα Ubuntu ή στο Google Colab. Για να τρέξετε στο Google Colab, ρίξτε μια ματιά σε αυτό το παράδειγμα:

Σημειωματάριο Colab Ανίχνευσης Αντικειμένων PASCAL-VOC

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

Κατεβάστε το πρόγραμμα εγκατάστασης εδώ.

Αφού ολοκληρωθεί η εγκατάσταση, δημιουργήστε ένα νέο περιβάλλον:

conda create -n yolo python = 3,7

Ας ενεργοποιήσουμε το νέο περιβάλλον

conda activ yolo

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

Εγκαταστήστε το aXeleRate στον τοπικό σας υπολογιστή με

pip install git+https://github.com/AIWintermuteAI/aXeleRate

Στη συνέχεια, εκτελέστε το για να κατεβάσετε σενάρια που θα χρειαστείτε για εκπαίδευση και συμπεράσματα:

git clone

Μπορείτε να εκτελέσετε γρήγορες δοκιμές με το tests_training.py στο φάκελο aXeleRate. Θα εκτελεί εκπαίδευση και συμπεράσματα για κάθε τύπο μοντέλου, θα αποθηκεύει και θα μετατρέπει εκπαιδευμένα μοντέλα. Δεδομένου ότι εκπαιδεύεται μόνο για 5 εποχές και το σύνολο δεδομένων είναι πολύ μικρό, δεν θα μπορείτε να λάβετε χρήσιμα μοντέλα, αλλά αυτό το σενάριο προορίζεται μόνο για έλεγχο για απουσία σφαλμάτων.

Βήμα 3: Εκπαιδεύστε ένα μοντέλο ανίχνευσης αντικειμένων με Keras

Εκπαιδεύστε ένα μοντέλο ανίχνευσης αντικειμένων με Keras
Εκπαιδεύστε ένα μοντέλο ανίχνευσης αντικειμένων με Keras

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

Ας ξεκινήσουμε με ένα παράδειγμα παιχνιδιού και να εκπαιδεύσουμε έναν ανιχνευτή ρακούν. Υπάρχει ένα αρχείο ρυθμίσεων στο φάκελο /config, raccoon_detector.json. Επιλέγουμε το MobileNet7_5 ως αρχιτεκτονική (όπου το 7_5 είναι παράμετρο άλφα της αρχικής εφαρμογής Mobilenet, ελέγχει το πλάτος του δικτύου) και 224x224 ως μέγεθος εισόδου. Ας ρίξουμε μια ματιά στις πιο σημαντικές παραμέτρους στη διαμόρφωση:

Τύπος είναι πρότυπο πρότυπο - Classifier, Detector ή Segnet Η αρχιτεκτονική είναι μοντέλο backend (χαρακτηριστικό εξαγωγής)

- Full Yolo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50

Για περισσότερες πληροφορίες σχετικά με τις άγκυρες, διαβάστε εδώ

Οι ετικέτες είναι ετικέτες που υπάρχουν στο σύνολο δεδομένων σας. ΣΗΜΑΝΤΙΚΟ: Παρακαλούμε, αναφέρετε όλες τις ετικέτες που υπάρχουν στο σύνολο δεδομένων.

Η αντικειμενική_κλίμακα καθορίζει πόσο θα τιμωρηθεί η λανθασμένη πρόβλεψη εμπιστοσύνης των προγνωστικών αντικειμένων

Το no_object_scale καθορίζει πόσο θα τιμωρηθεί η λανθασμένη πρόβλεψη εμπιστοσύνης των μη αντικειμενικών προγνωστικών

Η κλίμακα

class_scale καθορίζει πόσο θα τιμωρηθούν λάθος προβλέψεις τάξης

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

train_times, validation_times - πόσες φορές να επαναλάβετε το σύνολο δεδομένων. Χρήσιμο εάν έχετε πρόσθετα στοιχεία

ενεργοποιημένο

first_trainable_layer - σας επιτρέπει να παγώσετε ορισμένα επίπεδα εάν χρησιμοποιείτε ένα προ -εκπαιδευμένο δίκτυο δυνατοτήτων

Τώρα πρέπει να κατεβάσουμε το σύνολο δεδομένων, το οποίο μοιράστηκα στο Google Drive μου (αρχικό σύνολο δεδομένων), το οποίο είναι ένα σύνολο εντοπισμού ρακούν, που περιέχει 150 σχολιασμένες εικόνες.

Βεβαιωθείτε ότι έχετε αλλάξει τις γραμμές στο αρχείο διαμόρφωσης (train_image_folder, train_annot_folder) και, στη συνέχεια, ξεκινήστε την εκπαίδευση με την ακόλουθη εντολή:

python axelerate/train.py -c configs/raccoon_detector.json

Το train.py διαβάζει τη διαμόρφωση από το αρχείο.json και εκπαιδεύει το μοντέλο με σενάριο axelerate/network/yolo/yolo_frontend.py. Το yolo/backend/loss.py είναι το σημείο όπου εφαρμόζεται η προσαρμοσμένη λειτουργία απώλειας και το yolo/backend/network.py είναι το σημείο όπου δημιουργείται το μοντέλο (είσοδος, εξαγωγέας χαρακτηριστικών και επίπεδα ανίχνευσης μαζί). Το axelerate/network/common_utils/fit.py είναι ένα σενάριο που υλοποιεί την εκπαιδευτική διαδικασία και το axelerate/network/common_utils/feature.py περιέχει στοιχεία εξαγωγής. Εάν σκοπεύετε να χρησιμοποιήσετε εκπαιδευμένο μοντέλο με τσιπ K210 και υλικολογισμικό Micropython, λόγω περιορισμών μνήμης μπορείτε να επιλέξετε μεταξύ MobileNet (2_5, 5_0 και 7_5) και TinyYolo, αλλά διαπίστωσα ότι το MobileNet δίνει καλύτερη ακρίβεια ανίχνευσης.

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

Βήμα 4: Μετατρέψτε το σε μορφή.kmodel

Μετατρέψτε το σε μορφή.kmodel
Μετατρέψτε το σε μορφή.kmodel

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

Εάν η μέση μέση ακρίβεια mAP (η μέτρησή μας επικύρωσης) δεν βελτιωθεί για 20 εποχές, η εκπαίδευση θα σταματήσει πρόωρα. Κάθε φορά που βελτιώνεται το mAP, το μοντέλο αποθηκεύεται στο φάκελο του έργου. Μετά την ολοκλήρωση της εκπαίδευσης, το aXeleRate μετατρέπει αυτόματα το καλύτερο μοντέλο σε συγκεκριμένες μορφές - μπορείτε να επιλέξετε "tflite", "k210" ή "edgetpu" από τώρα.

Τώρα στο τελευταίο βήμα, στην πραγματικότητα τρέχουμε το μοντέλο μας σε υλικό Sipeed!

Βήμα 5: Εκτελέστε το υλικολογισμικό Micropython

Εκτελέστε το υλικολογισμικό Micropython
Εκτελέστε το υλικολογισμικό Micropython

Είναι δυνατό να εκτελέσουμε συμπεράσματα με το μοντέλο ανίχνευσης αντικειμένων με κωδικό C, αλλά για λόγους ευκολίας θα χρησιμοποιήσουμε το υλικολογισμικό Micropython και το MaixPy IDE.

Κατεβάστε το MaixPy IDE από εδώ και το firmware micropython από εδώ. Μπορείτε να χρησιμοποιήσετε το Python script kflash.py για να κάψετε το υλικολογισμικό ή να κατεβάσετε ξεχωριστό εργαλείο flash GUI εδώ.

Αντιγράψτε το model.kmodel στη ρίζα μιας κάρτας SD και τοποθετήστε την κάρτα SD στο Sipeed Maix Bit (ή σε άλλη συσκευή K210). Εναλλακτικά, μπορείτε να εγγράψετε.kmodel στη μνήμη flash της συσκευής. Το σενάριο παραδείγματος μου διαβάζει.kmodel από μνήμη flash. Εάν χρησιμοποιείτε κάρτα SD, αλλάξτε αυτήν τη γραμμή

task = kpu.load (0x200000)

προς το

task = kpu.load ("/sd/model.kmodel")

Ανοίξτε το MaixPy IDE και πατήστε το κουμπί σύνδεσης. Ανοίξτε το σενάριο raccoon_detector.py από το φάκελο example_scripts/k210/detector και πατήστε το κουμπί Έναρξη. Θα πρέπει να βλέπετε μια ζωντανή ροή από την κάμερα με περιορισμένα κουτιά γύρω … καλά, ρακούν. Μπορείτε να αυξήσετε την ακρίβεια του μοντέλου παρέχοντας περισσότερα παραδείγματα κατάρτισης, αλλά να έχετε κατά νου ότι είναι νεράιδα μικρό μοντέλο (1,9 Μ) και θα έχει προβλήματα ανίχνευσης μικρών αντικειμένων (λόγω χαμηλής ανάλυσης).

Μια από τις ερωτήσεις που έλαβα στα σχόλια στο προηγούμενο άρθρο μου σχετικά με την αναγνώριση εικόνας είναι πώς να στείλω τα αποτελέσματα ανίχνευσης μέσω UART/I2C σε άλλη συσκευή που είναι συνδεδεμένη με τους πίνακες ανάπτυξης Sipeed. Στο αποθετήριο github μου θα μπορείτε να βρείτε ένα άλλο παράδειγμα σεναρίου, το raccoon_detector_uart.py, το οποίο (το μαντέψατε) ανιχνεύει ρακούν και στέλνει τις συντεταγμένες των πλαισίων οριοθέτησης μέσω του UART. Λάβετε υπόψη ότι οι ακίδες που χρησιμοποιούνται για την επικοινωνία UART είναι διαφορετικές από διαφορετικούς πίνακες, αυτό είναι κάτι που πρέπει να ελέγξετε μόνοι σας στην τεκμηρίωση.

Βήμα 6: Περίληψη

Το Kendryte K210 είναι ένα σταθερό τσιπ για όραση υπολογιστή, ευέλικτο, αν και με περιορισμένη διαθέσιμη μνήμη. Μέχρι στιγμής, στα σεμινάρια μου έχουμε καλύψει τη χρήση του για την αναγνώριση προσαρμοσμένων αντικειμένων, τον εντοπισμό προσαρμοσμένων αντικειμένων και την εκτέλεση ορισμένων εργασιών όρασης υπολογιστών που βασίζονται στο OpenMV. Γνωρίζω με βεβαιότητα ότι είναι επίσης κατάλληλο για αναγνώριση προσώπου και με κάποιες ακαταστασίες πρέπει να είναι δυνατή η ανίχνευση και η τμηματοποίηση εικόνας (μπορείτε να χρησιμοποιήσετε το aXeleRate για να εκπαιδεύσετε το μοντέλο σημασιολογικής τμηματοποίησης, αλλά δεν έχω ακόμη εφαρμόσει το συμπέρασμα με το K210) Το Μη διστάσετε να ρίξετε μια ματιά σε ζητήματα αποθήκευσης aXeleRate και να κάνετε PR αν πιστεύετε ότι υπάρχουν κάποιες βελτιώσεις που μπορείτε να συμβάλλετε!

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

Ανιχνευτές αντικειμένων περιοριστικού κιβωτίου: κατανόηση YOLO, Κοιτάτε μόνο μία φορά

Κατανόηση του YOLO (περισσότερα μαθηματικά)

Ευγενικός οδηγός για το πώς λειτουργεί το YOLO Object Localization με το Keras (Μέρος 2)

Ανίχνευση αντικειμένου σε πραγματικό χρόνο με YOLO, YOLOv2 και τώρα YOLOv3

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

Προσθέστε με στο LinkedIn αν έχετε οποιεσδήποτε ερωτήσεις και εγγραφείτε στο κανάλι μου στο YouTube για να λαμβάνετε ειδοποιήσεις για πιο ενδιαφέροντα έργα που περιλαμβάνουν μηχανική εκμάθηση και ρομποτική.

Συνιστάται: