Sommario:
- Passaggio 1: spiegazione dell'architettura del modello di rilevamento degli oggetti
- Passaggio 2: preparare l'ambiente
- Passaggio 3: addestra un modello di rilevamento di oggetti con Keras
- Passaggio 4: convertirlo in formato.kmodel
- Passaggio 5: esegui sul firmware Micropython
- Passaggio 6: riepilogo
Video: Rilevamento di oggetti con schede Sipeed MaiX (Kendryte K210): 6 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 09:59
Come continuazione del mio precedente articolo sul riconoscimento delle immagini con Sipeed MaiX Boards, ho deciso di scrivere un altro tutorial, concentrandomi sul rilevamento degli oggetti. Recentemente è apparso un hardware interessante con il chip Kendryte K210, tra cui Seeed AI Hat per Edge Computing, M5StickV dello stack M5 e HuskyLens di DFRobot (anche se quello ha un firmware proprietario e più mirato per i principianti). A causa del suo prezzo economico, Kendryte K210 ha attratto le persone che desiderano aggiungere la visione artificiale ai loro progetti. Ma come al solito con i prodotti hardware cinesi, manca il supporto tecnico e questo è qualcosa che sto cercando di migliorare con i miei articoli e video. Ma tieni presente che non faccio parte del team di sviluppatori Kendryte o Sipeed e non posso rispondere a tutte le domande relative al loro prodotto.
Con questo in mente, cominciamo! Inizieremo con una breve (e semplificata) panoramica di come funzionano i modelli CNN di riconoscimento degli oggetti.
AGGIORNAMENTO MAGGIO 2020: Vedendo come il mio articolo e video su Object Detection con le schede K210 sono ancora molto apprezzati e tra i primi risultati su YouTube e Google, ho deciso di aggiornare l'articolo per includere le informazioni su aXeleRate, framework basato su Keras per AI sul Edge sviluppo. aXeleRate, essenzialmente, si basa sulla raccolta di script che ho usato per addestrare i modelli di riconoscimento delle immagini/rilevamento di oggetti, combinati in un unico framework e ottimizzati per il flusso di lavoro su Google Colab. È più comodo da usare e più aggiornato.
Per la vecchia versione dell'articolo, puoi ancora vederlo su steemit.com.
Passaggio 1: spiegazione dell'architettura del modello di rilevamento degli oggetti
I modelli di riconoscimento delle immagini (o classificazione delle immagini) prendono l'intera immagine come input e generano un elenco di probabilità per ogni classe che stiamo cercando di riconoscere. È molto utile se l'oggetto che ci interessa occupa una grande porzione dell'immagine e non ci interessa molto la sua posizione. Ma cosa succede se il nostro progetto (ad esempio, una fotocamera per il tracciamento del viso) ci richiede non solo di conoscere il tipo di oggetto nell'immagine, ma anche le sue coordinate. E per quanto riguarda il progetto che richiede il rilevamento di più oggetti (ad esempio per il conteggio)?
Ecco quando i modelli di rilevamento degli oggetti tornano utili. In questo articolo utilizzeremo l'architettura YOLO (guarda solo una volta) e concentreremo la spiegazione sui meccanismi interni di questa particolare architettura.
Stiamo cercando di determinare quali oggetti sono presenti nell'immagine e quali sono le loro coordinate. Poiché l'apprendimento automatico non è magico e non "una macchina pensante", ma solo un algoritmo che utilizza le statistiche per ottimizzare la funzione (rete neurale) per risolvere al meglio un particolare problema. Dobbiamo parafrasare questo problema per renderlo più "ottimizzabile". Un approccio ingenuo qui sarebbe quello di avere l'algoritmo che riduce al minimo la perdita (differenza) tra la sua previsione e le coordinate corrette dell'oggetto. Funzionerebbe abbastanza bene, fintanto che abbiamo un solo oggetto nell'immagine. Per più oggetti adottiamo un approccio diverso: aggiungiamo la griglia e facciamo in modo che la nostra rete preveda la presenza (o l'assenza) degli oggetti in ciascuna griglia. Sembra fantastico, ma lascia ancora troppa incertezza per la rete: come emettere la previsione e cosa fare quando ci sono più oggetti con il centro all'interno di una cella della griglia? Dobbiamo aggiungere un altro vincolo, i cosiddetti ancoraggi. Le ancore sono dimensioni iniziali (larghezza, altezza) alcune delle quali (la più vicina alla dimensione dell'oggetto) verranno ridimensionate alla dimensione dell'oggetto, utilizzando alcuni output della rete neurale (mappa delle caratteristiche finali).
Quindi, ecco una vista di primo livello su cosa sta succedendo quando la rete neurale dell'architettura YOLO esegue un rilevamento di oggetti sull'immagine. In base alle caratteristiche rilevate dalla rete di estrazione delle caratteristiche, per ogni cella della griglia viene effettuata una serie di previsioni, che include l'offset delle ancore, la probabilità delle ancore e la classe delle ancore. Quindi scartiamo le previsioni con bassa probabilità e voilà!
Passaggio 2: preparare l'ambiente
aXeleRate si basa sul meraviglioso progetto di penny4860, il rilevatore di cifre SVHN yolo-v2. aXeleRate porta questa implementazione del rilevatore YOLO in Keras a un livello successivo e utilizza il suo comodo sistema di configurazione per eseguire l'addestramento e la conversione di reti di riconoscimento di immagini/rilevamento di oggetti e segmentazione di immagini con vari backend.
Esistono due modi per utilizzare aXeleRate: eseguire localmente su una macchina Ubuntu o in Google Colab. Per l'esecuzione in Google Colab, dai un'occhiata a questo esempio:
Notebook Colab per il rilevamento di oggetti PASCAL-VOC
Anche addestrare il tuo modello localmente ed esportarlo per essere utilizzato con l'accelerazione hardware ora è molto più semplice. Ti consiglio vivamente di installare tutte le dipendenze necessarie nell'ambiente Anaconda per mantenere il tuo progetto separato dagli altri ed evitare conflitti.
Scarica qui il programma di installazione.
Al termine dell'installazione, creare un nuovo ambiente:
conda create -n yolo python=3.7
Attiviamo il nuovo ambiente
conda attiva yolo
Apparirà un prefisso prima della shell bash con il nome dell'ambiente, a indicare che ora lavori in quell'ambiente.
Installa aXeleRate sul tuo computer locale con
pip install git+https://github.com/AIWintermuteAI/aXeleRate
E poi esegui questo per scaricare gli script necessari per l'addestramento e l'inferenza:
git clone
Puoi eseguire test rapidi con tests_training.py nella cartella aXeleRate. Eseguirà l'addestramento e l'inferenza per ogni tipo di modello, salverà e convertirà i modelli addestrati. Poiché è solo l'addestramento per 5 epoche e il set di dati è molto piccolo, non sarai in grado di ottenere modelli utili, ma questo script è pensato solo per verificare l'assenza di errori.
Passaggio 3: addestra un modello di rilevamento di oggetti con Keras
Ora possiamo eseguire uno script di addestramento con il file di configurazione. Poiché l'implementazione di Keras del rilevatore di oggetti YOLO è piuttosto complicata, invece di spiegare ogni pezzo di codice rilevante, spiegherò come configurare la formazione e descriverò anche i moduli pertinenti, nel caso in cui desideri apportare alcune modifiche a loro stessi.
Iniziamo con un esempio di giocattolo e addestriamo un rilevatore di procioni. C'è un file di configurazione all'interno della cartella /config, raccoon_detector.json. Scegliamo MobileNet7_5 come architettura (dove 7_5 è il parametro alfa dell'implementazione Mobilenet originale, controlla la larghezza della rete) e 224x224 come dimensione di input. Diamo un'occhiata ai parametri più importanti nella configurazione:
Il tipo è il frontend del modello - Classifier, Detector o SegnetArchitecture è il backend del modello (estrattore di funzionalità)
- Full Yolo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
Per ulteriori informazioni sugli ancoraggi, leggi qui
Le etichette sono etichette presenti nel tuo set di dati. IMPORTANTE: elencare tutte le etichette presenti nel dataset.
object_scale determina quanto penalizzare la previsione errata di confidenza dei predittori di oggetti
no_object_scale determina quanto penalizzare la previsione errata di confidenza dei predittori non oggetti
coord_scale determina quanto penalizzare le previsioni di posizione e dimensione errate (x, y, w, h)
class_scale determina quanto penalizzare la previsione di classe sbagliata
augumentation - potenziamento dell'immagine, ridimensionamento, spostamento e sfocatura dell'immagine per evitare l'overfitting e avere una maggiore varietà nel set di dati.
train_times, validation_times - quante volte ripetere il set di dati. Utile se hai l'auspicio
abilitato
first_trainable_layer: consente di congelare determinati livelli se si utilizza una rete di funzionalità pre-addestrata
Ora dobbiamo scaricare il set di dati, che ho condiviso sul mio Google Drive (set di dati originale), che è un set di dati di rilevamento dei procioni, contenente 150 immagini annotate.
Assicurati di modificare le righe nel file di configurazione (train_image_folder, train_annot_folder) di conseguenza e quindi avvia l'addestramento con il seguente comando:
python axelerate/train.py -c configs/raccoon_detector.json
train.py legge la configurazione dal file.json e addestra il modello con lo script axelerate/networks/yolo/yolo_frontend.py. yolo/backend/loss.py è il luogo in cui viene implementata la funzione di perdita personalizzata e yolo/backend/network.py è il luogo in cui viene creato il modello (input, estrattore di funzionalità e livelli di rilevamento messi insieme). axelerate/networks/common_utils/fit.py è uno script che implementa il processo di formazione e axelerate/networks/common_utils/feature.py contiene estrattori di funzionalità. Se intendi utilizzare un modello addestrato con chip K210 e firmware Micropython, a causa delle limitazioni di memoria puoi scegliere tra MobileNet (2_5, 5_0 e 7_5) e TinyYolo, ma ho scoperto che MobileNet offre una migliore precisione di rilevamento.
Poiché è un esempio di giocattolo e contiene solo 150 immagini di procioni, il processo di addestramento dovrebbe essere piuttosto veloce, anche senza GPU, anche se la precisione sarà tutt'altro che stellare. Per un progetto relativo al lavoro ho addestrato un rilevatore di segnali stradali e un rilevatore di numeri, entrambi i set di dati includevano più di qualche migliaio di esempi di formazione.
Passaggio 4: convertirlo in formato.kmodel
Con aXeleRate, la conversione del modello viene eseguita automaticamente: questa è probabilmente la più grande differenza rispetto alla vecchia versione degli script di allenamento! Inoltre, ottieni i file del modello e il grafico di allenamento salvati ordinatamente nella cartella del progetto. Inoltre ho scoperto che l'accuratezza della verifica a volte non riesce a fornire una stima delle prestazioni reali del modello per il rilevamento degli oggetti e questo è il motivo per cui ho aggiunto mAP come metrica di convalida per i modelli di rilevamento degli oggetti. Puoi leggere di più su mAP qui.
Se il mAP, la precisione media media (la nostra metrica di convalida) non migliora per 20 epoche, l'addestramento si interromperà prematuramente. Ogni volta che mAP migliora, il modello viene salvato nella cartella del progetto. Al termine dell'addestramento, aXeleRate converte automaticamente il modello migliore nei formati specificati: puoi scegliere "tflite", "k210" o "edgetpu" a partire da ora.
Passiamo ora all'ultimo passaggio, eseguendo effettivamente il nostro modello su hardware Sipeed!
Passaggio 5: esegui sul firmware Micropython
È possibile eseguire l'inferenza con il nostro modello di rilevamento degli oggetti con codice C, ma per comodità utilizzeremo invece il firmware Micropython e l'IDE MaixPy.
Scarica MaixPy IDE da qui e il firmware micropython da qui. Puoi utilizzare lo script python kflash.py per masterizzare il firmware o scaricare qui uno strumento flash della GUI separato.
Copia model.kmodel nella radice di una scheda SD e inserisci la scheda SD in Sipeed Maix Bit (o altro dispositivo K210). In alternativa puoi masterizzare.kmodel nella memoria flash del dispositivo. Il mio script di esempio legge.kmodel dalla memoria flash. Se stai usando una scheda SD, cambia questa riga
compito = kpu.load(0x20000)
a
task = kpu.load("/sd/model.kmodel")
Apri MaixPy IDE e premi il pulsante di connessione. Apri lo script raccoon_detector.py dalla cartella example_scripts/k210/detector e premi il pulsante Start. Dovresti vedere un live streaming dalla telecamera con riquadri di delimitazione intorno … beh, procioni. Puoi aumentare la precisione del modello fornendo più esempi di addestramento, ma tieni presente che è un modello abbastanza piccolo (1,9 M) e avrà problemi a rilevare piccoli oggetti (a causa della bassa risoluzione).
Una delle domande che ho ricevuto nei commenti al mio precedente articolo sul riconoscimento delle immagini è come inviare i risultati del rilevamento tramite UART/I2C ad altri dispositivi collegati alle schede di sviluppo Sipeed. Nel mio repository github potrai trovare un altro script di esempio, raccoon_detector_uart.py, che (hai indovinato) rileva i procioni e invia le coordinate dei riquadri di delimitazione su UART. Tieni presente che i pin utilizzati per la comunicazione UART sono diversi da schede diverse, questo è qualcosa che devi verificare nella documentazione.
Passaggio 6: riepilogo
Kendryte K210 è un solido chip per la visione artificiale, flessibile, anche se con memoria limitata a disposizione. Finora, nei miei tutorial abbiamo coperto l'utilizzo per riconoscere oggetti personalizzati, rilevare oggetti personalizzati ed eseguire alcune attività di visione artificiale basate su OpenMV. So per certo che è adatto anche per il riconoscimento facciale e con qualche ritocco dovrebbe essere possibile eseguire il rilevamento della posa e la segmentazione dell'immagine (puoi usare aXeleRate per addestrare il modello di segmentazione semantica, ma non ho ancora implementato l'inferenza con K210). Sentiti libero di dare un'occhiata ai problemi del repository aXeleRate e fare un PR se pensi che ci siano alcuni miglioramenti che puoi contribuire!
Ecco alcuni articoli che ho utilizzato per scrivere questo tutorial, dai un'occhiata se vuoi saperne di più sul rilevamento di oggetti con le reti neurali:
Rilevatori di oggetti Bounding Box: capire YOLO, si guarda solo una volta
Capire YOLO (più matematica)
Guida delicata su come funziona YOLO Object Localization con Keras (Parte 2)
Rilevamento di oggetti in tempo reale con YOLO, YOLOv2 e ora YOLOv3
Spero che tu possa usare le conoscenze che hai ora per costruire alcuni fantastici progetti con la visione artificiale! Puoi acquistare le schede Sipeed qui, sono tra le opzioni più economiche disponibili per ML su sistemi embedded.
Aggiungimi su LinkedIn se hai domande e iscriviti al mio canale YouTube per ricevere notifiche su progetti più interessanti che coinvolgono l'apprendimento automatico e la robotica.
Consigliato:
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento utilizzando Shape Puncher: 5 passaggi
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento utilizzando Shape Puncher: metodo di apprendimento/insegnamento per studenti nuovi alla programmazione orientata agli oggetti. Questo è un modo per consentire loro di visualizzare e vedere il processo di creazione di oggetti dalle classi.Parti:1. EkTools punzone grande da 2 pollici; le forme solide sono le migliori.2. Pezzo di carta o c
Riconoscimento delle immagini con schede K210 e Arduino IDE/Micropython: 6 passaggi (con immagini)
Riconoscimento immagine con schede K210 e Arduino IDE/Micropython: ho già scritto un articolo su come eseguire demo OpenMV su Sipeed Maix Bit e ho anche realizzato un video di demo di rilevamento oggetti con questa scheda. Una delle tante domande che le persone hanno posto è: come posso riconoscere un oggetto che la rete neurale non è tr
Cursore della telecamera di rilevamento degli oggetti con asse di rotazione. Stampato in 3D e costruito su RoboClaw DC Motor Controller e Arduino: 5 passaggi (con immagini)
Cursore della telecamera di rilevamento degli oggetti con asse di rotazione. Stampato in 3D e costruito sul RoboClaw DC Motor Controller e Arduino: questo progetto è stato uno dei miei progetti preferiti da quando ho avuto modo di combinare il mio interesse per la creazione di video con il fai-da-te. Ho sempre guardato e voluto emulare quegli scatti cinematografici nei film in cui una telecamera si muove su uno schermo mentre fa una panoramica per tracciare
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento con le forbici: 5 passaggi
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento Utilizzo delle forbici: metodo di apprendimento/insegnamento per studenti nuovi alla programmazione orientata agli oggetti. Questo è un modo per consentire loro di visualizzare e vedere il processo di creazione di oggetti dalle classi. Parti: 1. Forbici (va bene qualsiasi tipo). 2. Pezzo di carta o cartoncino. 3. Indicatore
Rilevamento di oggetti visivi con una fotocamera (TfCD): 15 passaggi (con immagini)
Visual Object Detection With a Camera (TfCD): i servizi cognitivi in grado di riconoscere emozioni, volti di persone o semplici oggetti sono attualmente ancora in una fase iniziale di sviluppo, ma con l'apprendimento automatico questa tecnologia si sta sviluppando sempre più. Possiamo aspettarci di vedere più di questa magia in