Taula de continguts:

Detecció d'objectes amb plaques SIPeed MaiX (Kendryte K210): 6 passos
Detecció d'objectes amb plaques SIPeed MaiX (Kendryte K210): 6 passos

Vídeo: Detecció d'objectes amb plaques SIPeed MaiX (Kendryte K210): 6 passos

Vídeo: Detecció d'objectes amb plaques SIPeed MaiX (Kendryte K210): 6 passos
Vídeo: Chapter 13 - Triplanetary by E. E. Smith - The Hill 2024, Desembre
Anonim
Image
Image

Com a continuació del meu article anterior sobre reconeixement d’imatges amb Sipeed MaiX Boards, vaig decidir escriure un altre tutorial, centrat en la detecció d’objectes. Recentment va aparèixer un maquinari interessant amb el xip Kendryte K210, incloent-hi Seeed AI Hat per Edge Computing, M5StickV de la pila M5 i HuskyLens de DFRobot (tot i que aquest té un microprogramari propietari i més orientat a principiants complets). A causa del seu preu barat, Kendryte K210 ha atret les persones que desitgen afegir visió per computador als seus projectes. Però, com és habitual amb els productes de maquinari xinesos, falta suport tècnic i això és el que intento millorar amb els meus articles i vídeos. Però tingueu en compte que no formo part de l’equip de desenvolupadors de Kendryte o Sipeed i no puc respondre a totes les preguntes relacionades amb el seu producte.

Amb això en ment, comencem! Començarem amb una visió breu (i simplificada) de com funcionen els models CNN de reconeixement d’objectes.

ACTUALITZACIÓ DE MAIG DE 2020: Veient com el meu article i el meu vídeo sobre la detecció d’objectes amb taulers K210 encara són molt populars i entre els millors resultats de YouTube i Google, vaig decidir actualitzar l’article per incloure la informació sobre aXeleRate, marc basat en Keras per a IA Edge desenvolupo. aXeleRate, bàsicament, es basa en la col·lecció d’escriptures que he utilitzat per formar models de reconeixement d’imatges / detecció d’objectes, combinats en un marc únic i optimitzats per al flux de treball a Google Colab. És més còmode d’utilitzar i més actualitzat.

Per a la versió antiga de l'article, encara la podeu veure a steemit.com.

Pas 1: explicació de l'arquitectura del model de detecció d'objectes

S'explica l'arquitectura del model de detecció d'objectes
S'explica l'arquitectura del model de detecció d'objectes
S'explica l'arquitectura del model de detecció d'objectes
S'explica l'arquitectura del model de detecció d'objectes

Els models de reconeixement d’imatges (o classificació d’imatges) prenen tota la imatge com a entrada i generen una llista de probabilitats per a cada classe que intentem reconèixer. És molt útil si l’objecte que ens interessa ocupa una gran part de la imatge i no ens importa molt la seva ubicació. Però, què passa si el nostre projecte (per exemple, càmera de seguiment facial) ens exigeix no només tenir coneixements sobre el tipus d’objecte de la imatge, sinó també les seves coordenades. I què passa amb el projecte que requereixi la detecció de múltiples objectes (per exemple, per comptar)?

Aquí és quan els models de detecció d’objectes són útils. En aquest article utilitzarem l'arquitectura YOLO (només es mira una vegada) i centrarem l'explicació en la mecànica interna d'aquesta arquitectura en particular.

Intentem determinar quins objectes hi ha a la imatge i quines són les seves coordenades. Atès que l'aprenentatge automàtic no és màgic i no "una màquina de pensar", sinó només un algorisme que utilitza estadístiques per optimitzar la funció (xarxa neuronal) per resoldre millor un problema concret. Hem de parafrasejar aquest problema per fer-lo més "optimitzable". Un enfocament ingenu aquí seria tenir l'algorisme que minimitzés la pèrdua (diferència) entre la seva predicció i les coordenades correctes de l'objecte. Això funcionaria força bé, sempre que només tinguem un objecte a la imatge. Per a diversos objectes adoptem un enfocament diferent: afegim la quadrícula i fem que la nostra xarxa prediui la presència (o absència) dels objectes a cada quadrícula. Sona molt bé, però encara deixa massa incertesa a la xarxa: com es pot produir la predicció i què fer quan hi ha diversos objectes amb el centre dins d’una cel·la de quadrícula? Hem d’afegir una restricció més, les anomenades àncores. Els ancoratges són mides inicials (amplada, alçada), algunes de les quals (la més propera a la mida de l'objecte) es redimensionaran a la mida de l'objecte, mitjançant algunes sortides de la xarxa neuronal (mapa de funcions final).

Així doncs, aquí teniu una vista de nivell superior sobre què passa quan la xarxa neuronal d’arquitectura YOLO realitza una detecció d’objectes a la imatge. Segons les funcions detectades per la xarxa extractora de funcions, es fa un conjunt de prediccions per a cada cel·la de quadrícula, que inclou el desplaçament d'ancoratges, la probabilitat d'ancoratge i la classe d'ancoratge. Llavors descartem les prediccions amb baixa probabilitat i voilà!

Pas 2: prepareu el medi ambient

Prepareu el medi ambient
Prepareu el medi ambient

aXeleRate es basa en un meravellós projecte de penny4860, el detector de dígits SVHN yolo-v2. aXeleRate porta aquesta implementació del detector YOLO a Keras al següent nivell i utilitza el seu sistema de configuració convenient per realitzar entrenaments i conversions de reconeixement d’imatges / detecció d’objectes i xarxes de segmentació d’imatges amb diversos backends.

Hi ha dues maneres d'utilitzar aXeleRate: executant-se localment a la màquina Ubuntu o al Google Colab. Per executar-vos a Google Colab, consulteu aquest exemple:

Quadern Colab de detecció d’objectes PASCAL-VOC

També és molt més fàcil entrenar el vostre model localment i exportar-lo per fer-lo servir amb acceleració de maquinari. Us recomano que instal·leu totes les dependències necessàries a l’entorn d’Anaconda per mantenir el projecte separat dels altres i evitar conflictes.

Descarregueu l'instal·lador aquí.

Un cop finalitzada la instal·lació, creeu un entorn nou:

conda create -n yolo python = 3.7

Activem el nou entorn

conda activar yolo

Apareixerà un prefix abans de l'intèrpret d'ordres bash amb el nom de l'entorn, que indica que treballeu ara en aquest entorn.

Instal·leu aXeleRate a la vostra màquina local amb

pip install git +

A continuació, executeu això per descarregar scripts que necessiteu per a la formació i la inferència:

git clone

Podeu executar proves ràpides amb tests_training.py a la carpeta aXeleRate. Executarà formació i inferències per a cada tipus de model, guardarà i convertirà models entrenats. Com que només té formació per a 5 èpoques i el conjunt de dades és molt petit, no podreu obtenir models útils, però aquest script només està destinat a comprovar l'absència d'errors.

Pas 3: entrenar un model de detecció d'objectes amb Keras

Entreneu un model de detecció d'objectes amb Keras
Entreneu un model de detecció d'objectes amb Keras

Ara podem executar un script de formació amb el fitxer de configuració. Com que la implementació de Keras del detector d’objectes YOLO és bastant complicada, en lloc d’explicar cada tros de codi rellevant, explicaré com configurar la formació i també descriuré els mòduls rellevants, en cas que vulgueu fer-hi alguns canvis.

Comencem amb un exemple de joguina i entrenem un detector de mapaches. Hi ha un fitxer de configuració dins de la carpeta / config, raccoon_detector.json. Triem MobileNet7_5 com a arquitectura (on 7_5 és un paràmetre alfa de la implementació original de Mobilenet, controla l’amplada de la xarxa) i 224x224 com a mida d’entrada. Vegem els paràmetres més importants de la configuració:

El tipus és el model frontal: el classificador, el detector o Segnet L’arquitectura és el model principal (extractor de funcions)

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

Per obtenir més informació sobre ancoratges, llegiu aquí

Les etiquetes són etiquetes presents al vostre conjunt de dades. IMPORTANT: Llisteu totes les etiquetes presents al conjunt de dades.

object_scale determina quant penalitzar la predicció incorrecta de confiança dels predictors d'objectes

no_object_scale determina quant penalitzar la predicció incorrecta de confiança dels predictors que no són objectes

coord_scale determina quant penalitzar les prediccions de posició i mida incorrectes (x, y, w, h)

class_scale determina quant penalitzar la predicció incorrecta de classe

augumentació: augment de la imatge, redimensionament, desplaçament i difuminació de la imatge per tal d’evitar l’ajust excessiu i tenir una major varietat en el conjunt de dades.

train_times, validation_times: quantes vegades es repeteix el conjunt de dades. Útil si teniu augumentació

activat

first_trainable_layer: us permet congelar determinades capes si utilitzeu una xarxa de funcions prèviament entrenada

Ara hem de descarregar el conjunt de dades, que he compartit al meu Google Drive (conjunt de dades original), que és un conjunt de dades de detecció de mapaches, que conté 150 imatges anotades.

Assegureu-vos de canviar les línies del fitxer de configuració (train_image_folder, train_annot_folder) en conseqüència i, a continuació, inicieu la formació amb l'ordre següent:

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

train.py llegeix la configuració del fitxer.json i entrena el model amb un script axelerate / networks / yolo / yolo_frontend.py. yolo / backend / loss.py és on s’implementa la funció de pèrdua personalitzada i yolo / backend / network.py és on es crea el model (entrada, extracte de funcions i capes de detecció juntes). axelerate / networks / common_utils / fit.py és un script que implementa el procés de formació i axelerate / networks / common_utils / feature.py conté extractors de funcions. Si teniu intenció d’utilitzar un model entrenat amb xip K210 i microprogramari Micropython, a causa de les limitacions de memòria podeu triar entre MobileNet (2_5, 5_0 i 7_5) i TinyYolo, però he trobat que MobileNet proporciona una precisió de detecció millor.

Com que és un exemple de joguina i només conté 150 imatges de mapaches, el procés d'entrenament hauria de ser bastant ràpid, fins i tot sense GPU, tot i que la precisió serà lluny de ser estel·lar. Per a projectes relacionats amb el treball, he format un detector de senyals de trànsit i un detector de números, tots dos conjunts de dades inclosos en uns quants milers d’exemples de formació.

Pas 4: convertiu-lo a format.kmodel

Converteix-lo a format.kmodel
Converteix-lo a format.kmodel

Amb aXeleRate, la conversió del model es realitza automàticament; probablement aquesta sigui la diferència més gran respecte a la versió anterior dels scripts d’entrenament. A més, obteniu els fitxers del model i el gràfic d’entrenament ben guardats a la carpeta del projecte. També vaig trobar que la precisió de la validació de vegades no permet estimar el rendiment real del model per a la detecció d'objectes i per això vaig afegir mAP com a mètrica de validació per als models de detecció d'objectes. Podeu llegir més sobre mAP aquí.

Si la precisió mitjana del MAP (la nostra mètrica de validació) no millora durant 20 èpoques, la formació s’aturarà prematurament. Cada vegada que millora MAP, el model es desa a la carpeta del projecte. Un cop acabat l'entrenament, aXeleRate converteix automàticament el millor model en formats especificats: podeu triar "tflite", "k210" o "edgetpu" a partir d'ara.

Ara fins a l'últim pas, realment executem el nostre model amb maquinari Sipeed.

Pas 5: executeu el microprogramari Micropython

Executeu-vos amb el microprogramari Micropython
Executeu-vos amb el microprogramari Micropython

És possible fer inferències amb el nostre model de detecció d’objectes amb codi C, però per comoditat utilitzarem el microprogramari Micropython i el MaixPy IDE.

Descarregueu MaixPy IDE des d’aquí i microprogramari micropitó des d’aquí. Podeu fer servir l'script python kflash.py per gravar el firmware o descarregar aquí una eina flash GUI independent.

Copieu model.kmodel a l’arrel d’una targeta SD i inseriu-la a Sipeed Maix Bit (o a un altre dispositiu K210). També podeu gravar.kmodel a la memòria flash del dispositiu. El meu script d’exemple llegeix.kmodel des de la memòria flash. Si feu servir una targeta SD, canvieu aquesta línia

tasca = kpu.load (0x200000)

a

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

Obriu MaixPy IDE i premeu el botó de connexió. Obriu el script raccoon_detector.py des de la carpeta example_scripts / k210 / detector i premeu el botó Inici. Hauríeu de veure una reproducció en directe des de la càmera amb caixes de delimitació al voltant … bé, mapaches. Podeu augmentar la precisió del model proporcionant més exemples d’entrenament, però tingueu en compte que es tracta d’un model petit de fades (1,9 M) i que tindrà problemes per detectar objectes petits (a causa de la baixa resolució).

Una de les preguntes que vaig rebre en comentaris al meu article anterior sobre reconeixement d’imatges és com enviar els resultats de la detecció a través d’UART / I2C a un altre dispositiu connectat a les plaques de desenvolupament Sipeed. Al meu dipòsit de github podreu trobar un altre script d’exemple, raccoon_detector_uart.py, que (ho heu endevinat) detecta mapaches i envia les coordenades de les caixes delimitadores a través d’UART. Tingueu en compte que els pins que s’utilitzen per a la comunicació UART són diferents de les diferents plaques, és una cosa que heu de comprovar a la documentació.

Pas 6: resum

Kendryte K210 és un xip sòlid per a visió per ordinador, flexible, tot i que amb poca memòria disponible. Fins ara, als meus tutorials hem tractat d’utilitzar-lo per reconèixer objectes personalitzats, detectar objectes personalitzats i executar algunes tasques de visió per ordinador basades en OpenMV. Sé de veritat que també és adequat per al reconeixement de cares i, amb algunes molèsties, hauria de ser possible fer detecció de postures i segmentació d'imatges (podeu utilitzar aXeleRate per formar el model de segmentació semàntica, però encara no he implementat la inferència amb K210). No dubteu a fer una ullada als problemes del dipòsit aXeleRate i feu un PR si creieu que hi ha algunes millores que podeu aportar.

A continuació, es detallen alguns articles que he utilitzat per escriure aquest tutorial. Vegeu si voleu obtenir més informació sobre la detecció d'objectes amb xarxes neuronals:

Detectors d'objectes de caixa delimitadora: entenent YOLO, només es mira una vegada

Comprendre YOLO (més matemàtiques)

Guia suau sobre com funciona la localització d'objectes YOLO amb Keras (part 2)

Detecció d'objectes en temps real amb YOLO, YOLOv2 i ara YOLOv3

Espero que pugueu utilitzar els coneixements que teniu ara per construir alguns projectes impressionants amb visió artificial. Podeu comprar taulers Sipeed aquí, que són una de les opcions més barates disponibles per a ML en sistemes incrustats.

Afegiu-me a LinkedIn si teniu cap pregunta i subscriviu-vos al meu canal de YouTube per rebre notificacions sobre projectes més interessants relacionats amb l'aprenentatge automàtic i la robòtica.

Recomanat: