Sommario:

Rilevamento di oggetti con schede Sipeed MaiX (Kendryte K210): 6 passaggi
Rilevamento di oggetti con schede Sipeed MaiX (Kendryte K210): 6 passaggi

Video: Rilevamento di oggetti con schede Sipeed MaiX (Kendryte K210): 6 passaggi

Video: Rilevamento di oggetti con schede Sipeed MaiX (Kendryte K210): 6 passaggi
Video: Несущая плата Raspberry Pi 4 CM с экраном | Обзор reTerminal, распаковка, демонстрация машинного обучения 2024, Novembre
Anonim
Image
Image

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

Spiegazione dell'architettura del modello di rilevamento degli oggetti
Spiegazione dell'architettura del modello di rilevamento degli oggetti
Spiegazione dell'architettura del modello di rilevamento degli oggetti
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

Preparare l'ambiente
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

Addestra un modello di rilevamento di oggetti con Keras
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

Convertilo in formato.kmodel
Convertilo 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

Esegui su firmware Micropython
Esegui su 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: