Cuprins:

Detectarea obiectelor cu plăci Sipeed MaiX (Kendryte K210): 6 pași
Detectarea obiectelor cu plăci Sipeed MaiX (Kendryte K210): 6 pași

Video: Detectarea obiectelor cu plăci Sipeed MaiX (Kendryte K210): 6 pași

Video: Detectarea obiectelor cu plăci Sipeed MaiX (Kendryte K210): 6 pași
Video: Fa-ti propriul detector de obiecte personalizate cu yolov5 folosind google colab si Python. CPU 2024, Iulie
Anonim
Image
Image

Ca o continuare a articolului meu anterior despre recunoașterea imaginilor cu Sipeed MaiX Boards, am decis să scriu un alt tutorial, concentrându-mă pe detectarea obiectelor. A apărut recent un hardware interesant cu cipul Kendryte K210, inclusiv Seeed AI Hat pentru Edge Computing, M5StickV din stiva M5 și DFRobot's HuskyLens (deși acesta are firmware proprietar și mai vizat pentru începători complet). Datorită prețului său ieftin, Kendryte K210 a atras atenția oamenilor, dorind să adauge viziune computerizată proiectelor lor. Dar, ca de obicei, cu produsele hardware chinezești, asistența tehnică lipsește și acest lucru este ceva ce încerc să îmbunătățesc cu articolele și videoclipurile mele. Dar rețineți că nu fac parte din echipa de dezvoltatori Kendryte sau Sipeed și nu pot răspunde la toate întrebările legate de produsul lor.

Având în vedere acest lucru, să începem! Vom începe cu o prezentare scurtă (și simplificată) a modului în care funcționează modelele CNN de recunoaștere a obiectelor.

ACTUALIZARE MAI 2020: Văzând cum articolul și videoclipul meu despre Detectarea obiectelor cu plăcile K210 sunt încă foarte populare și printre rezultatele de top de pe YouTube și Google, am decis să actualizez articolul pentru a include informații despre aXeleRate, cadru bazat pe Keras pentru AI pe Edge dezvolt. aXeleRate, în esență, se bazează pe colecția de scripturi pe care le-am folosit pentru instruirea modelelor de recunoaștere a imaginilor / de detectare a obiectelor - combinate într-un singur cadru și optimizate pentru fluxul de lucru pe Google Colab. Este mai convenabil de utilizat și mai actualizat.

Pentru versiunea veche a articolului, o puteți vedea în continuare pe steemit.com.

Pasul 1: Arhitectura modelului de detectare a obiectelor explicată

Arhitectura modelului de detectare a obiectelor explicată
Arhitectura modelului de detectare a obiectelor explicată
Arhitectura modelului de detectare a obiectelor explicată
Arhitectura modelului de detectare a obiectelor explicată

Modelele de recunoaștere a imaginii (sau clasificarea imaginilor) iau întreaga imagine ca intrare și emit o listă de probabilități pentru fiecare clasă pe care încercăm să o recunoaștem. Este foarte util dacă obiectul care ne interesează ocupă o mare parte din imagine și nu ne pasă prea mult de locația sa. Dar ce se întâmplă dacă proiectul nostru (să zicem, camera de urmărire a feței) ne cere nu numai să avem cunoștințe despre tipul de obiect din imagine, ci și coordonatele acestuia. Și ce zici de proiect care necesită detectarea mai multor obiecte (de exemplu pentru numărare)?

Iată când sunt utile modelele de detectare a obiectelor. În acest articol vom folosi arhitectura YOLO (arăți o singură dată) și vom concentra explicația asupra mecanicii interne ale acestei arhitecturi.

Încercăm să determinăm ce obiecte sunt prezente în imagine și care sunt coordonatele lor. Deoarece învățarea automată nu este magie și nu „o mașină gânditoare”, ci doar un algoritm care folosește statistici pentru a optimiza funcția (rețeaua neuronală) pentru a rezolva mai bine o anumită problemă. Trebuie să parafrazăm această problemă pentru a o face mai „optimizabilă”. O abordare naivă aici ar fi aceea de a avea algoritmul care minimizează pierderea (diferența) dintre predicția și coordonatele corecte ale obiectului. Asta ar funcționa destul de bine, atâta timp cât avem un singur obiect în imagine. Pentru mai multe obiecte adoptăm o abordare diferită - adăugăm grila și facem rețeaua noastră să prezică prezența (sau absența) obiectului (obiectelor) în fiecare grilă. Sună grozav, dar lasă în continuare prea multă incertitudine rețelei - cum să scoateți predicția și ce să faceți atunci când există mai multe obiecte cu centrul în interiorul unei celule de rețea? Trebuie să adăugăm încă o constrângere - așa-numitele ancore. Ancorele sunt dimensiuni inițiale (lățime, înălțime) dintre care unele (cele mai apropiate de dimensiunea obiectului) vor fi redimensionate la dimensiunea obiectului - folosind unele ieșiri din rețeaua neuronală (harta caracteristică finală).

Deci, iată o vedere de nivel superior asupra a ceea ce se întâmplă atunci când rețeaua neuronală de arhitectură YOLO efectuează o detectare a obiectelor pe imagine. Conform caracteristicilor detectate de rețeaua de extragere a caracteristicilor, pentru fiecare celulă de rețea se face un set de predicții, care include decalajul ancorelor, probabilitatea ancorelor și clasa ancorelor. Apoi vom arunca predicțiile cu probabilitate scăzută și voilă!

Pasul 2: Pregătiți mediul

Pregătiți mediul
Pregătiți mediul

aXeleRate se bazează pe un proiect minunat de penny4860, SVHN yolo-v2 digit detector. aXeleRate duce această implementare a detectorului YOLO în Keras la un nivel următor și folosește sistemul său de configurare convenabil pentru a efectua instruirea și conversia rețelelor de recunoaștere a imaginii / de detectare a obiectelor și a rețelelor de segmentare a imaginilor cu diferite backend-uri.

Pentru a fi două moduri de a utiliza aXeleRate: rularea locală pe mașina Ubuntu sau în Google Colab. Pentru a rula în Google Colab, aruncați o privire la acest exemplu:

PASCAL-VOC Detectarea obiectelor Colab Notebook

Este de asemenea mult mai ușor să vă instruiți modelul la nivel local și să-l exportați pentru a fi utilizat cu accelerarea hardware. Vă recomandăm să instalați toate dependențele necesare în mediul Anaconda pentru a vă menține proiectul separat de ceilalți și pentru a evita conflictele.

Descărcați programul de instalare de aici.

După finalizarea instalării, creați un mediu nou:

conda create -n yolo python = 3.7

Să activăm noul mediu

conda activate yolo

Va apărea un prefix înainte de shell-ul bash cu numele mediului, indicând faptul că lucrați acum în acel mediu.

Instalați aXeleRate pe mașina dvs. locală cu

pip install git +

Și apoi executați acest lucru pentru a descărca scripturi de care veți avea nevoie pentru instruire și deducere:

git clone

Puteți rula teste rapide cu tests_training.py în folderul aXeleRate. Va rula instruire și inferență pentru fiecare tip de model, va salva și va converti modelele instruite. Deoarece este doar antrenament pentru 5 epoci și setul de date este foarte mic, nu veți putea obține modele utile, dar acest script este destinat numai pentru verificarea absenței erorilor.

Pasul 3: Antrenează un model de detectare a obiectelor cu Keras

Antrenează un model de detectare a obiectelor cu Keras
Antrenează un model de detectare a obiectelor cu Keras

Acum putem rula un script de antrenament cu fișierul de configurare. Deoarece implementarea Keras a detectorului de obiecte YOLO este destul de complicată, în loc să explic fiecare piesă de cod relevantă, voi explica cum să configurați instruirea și, de asemenea, să descriu modulele relevante, în cazul în care doriți să le faceți singuri unele modificări.

Să începem cu un exemplu de jucărie și să antrenăm un detector de raton. Există un fișier de configurare în dosarul / config, raccoon_detector.json. Alegem MobileNet7_5 ca arhitectură (unde 7_5 este parametru alfa al implementării originale Mobilenet, controlează lățimea rețelei) și 224x224 ca dimensiune de intrare. Să aruncăm o privire asupra celor mai importanți parametri din config:

Tipul este frontend model - Clasificator, Detector sau Segnet Arhitectura este backend model (extractor de caracteristici)

- Yolo complet - Yolo minuscul - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50

Pentru mai multe informații despre ancore, citiți aici

Etichetele sunt etichete prezente în setul de date. IMPORTANT: Vă rugăm să enumerați toate etichetele prezente în setul de date.

object_scale determină cât de mult să penalizăm predicția greșită a încrederii predictorilor de obiecte

no_object_scale determină cât de mult pentru a penaliza predicția greșită a încrederii predictorilor non-obiect

coord_scale determină cât de mult se penalizează predicțiile greșite ale poziției și dimensiunilor (x, y, w, h)

class_scale determină cât de mult pentru a penaliza predicția greșită a clasei

augumentare - augumentarea imaginii, redimensionarea, deplasarea și estomparea imaginii pentru a preveni supraadaptarea și pentru a avea o varietate mai mare în setul de date.

train_times, validation_times - de câte ori se repetă setul de date. Util dacă aveți augumentație

activat

first_trainable_layer - vă permite să înghețați anumite straturi dacă utilizați o rețea de caracteristici pre-antrenată

Acum trebuie să descărcăm setul de date, pe care l-am distribuit pe Google Drive (setul de date original), care este un set de date pentru detectarea ratonului, care conține 150 de imagini adnotate.

Asigurați-vă că schimbați liniile din fișierul de configurare (train_image_folder, train_annot_folder) în consecință și apoi începeți antrenamentul cu următoarea comandă:

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

train.py citește configurația din fișierul.json și antrenează modelul cu scriptul axelerate / networks / yolo / yolo_frontend.py. yolo / backend / loss.py este locul în care este implementată funcția de pierdere personalizată și yolo / backend / network.py este locul în care este creat modelul (intrare, extractor de caracteristici și straturi de detectare puse împreună). axelerate / networks / common_utils / fit.py este un script care implementează procesul de instruire și axelerate / networks / common_utils / feature.py conține extracte de caracteristici. Dacă intenționați să utilizați un model instruit cu cip K210 și firmware Micropython, din cauza limitărilor de memorie puteți alege între MobileNet (2_5, 5_0 și 7_5) și TinyYolo, dar am descoperit că MobileNet oferă o precizie mai bună de detectare.

Deoarece este un exemplu de jucărie și conține doar 150 de imagini de ratoni, procesul de antrenament ar trebui să fie destul de rapid, chiar și fără GPU, deși precizia va fi departe de a fi stelară. Pentru proiectele legate de muncă am instruit un detector de semne de circulație și un detector de numere, ambele seturi de date au inclus peste câteva mii de exemple de instruire.

Pasul 4: convertiți-l în format.kmodel

Convertiți-l în format.kmodel
Convertiți-l în format.kmodel

Cu aXeleRate, conversia modelului se realizează automat - aceasta este probabil cea mai mare diferență față de vechea versiune a scripturilor de antrenament! În plus, veți obține fișierele model și graficul de antrenament salvate în folderul proiectului. De asemenea, am constatat că acuratețea vaiidării uneori nu reușește să ofere o estimare a performanței reale a modelului pentru detectarea obiectelor și de aceea am adăugat MAP ca metodă de validare pentru modelele de detectare a obiectelor. Puteți citi mai multe despre MAP aici.

Dacă MAP, precizia medie medie (metrica noastră de validare) nu se îmbunătățește timp de 20 de epoci, antrenamentul se va opri prematur. De fiecare dată când mAP se îmbunătățește, modelul este salvat în folderul proiectului. După încheierea antrenamentului, aXeleRate convertește automat cel mai bun model în formatele specificate - puteți alege „tflite”, „k210” sau „edgetpu” începând de acum.

Acum, la ultimul pas, rulăm de fapt modelul nostru pe hardware Sipeed!

Pasul 5: Rulați pe Micropython Firmware

Rulați pe Micropython Firmware
Rulați pe Micropython Firmware

Este posibil să se deducă modelul nostru de detectare a obiectelor cu cod C, dar, din motive de comoditate, vom folosi firmware-ul Micropython și ID-ul MaixPy.

Descărcați MaixPy IDE de aici și firmware-ul micropython de aici. Puteți utiliza scriptul python kflash.py pentru a arde firmware-ul sau pentru a descărca instrumentul flash GUI separat aici.

Copiați model.kmodel în rădăcina unui card SD și introduceți cardul SD în Sipeed Maix Bit (sau alt dispozitiv K210). Alternativ, puteți arde.kmodel în memoria flash a dispozitivului. Scriptul meu de exemplu citește.kmodel din memoria flash. Dacă utilizați cardul SD, vă rugăm să schimbați această linie

task = kpu.load (0x200000)

la

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

Deschideți MaixPy IDE și apăsați butonul de conectare. Deschideți scriptul raccoon_detector.py din folderul example_scripts / k210 / detector și apăsați butonul Start. Ar trebui să vedeți un flux live de la cameră cu cutii de delimitare în jurul … ei bine, ratoni. Puteți crește precizia modelului oferind mai multe exemple de instruire, dar rețineți că este un model mic de zână (1,9 M) și va avea probleme la detectarea obiectelor mici (datorită rezoluției reduse).

Una dintre întrebările pe care le-am primit în comentariile la articolul meu anterior despre recunoașterea imaginilor este cum să trimit rezultatele detectării prin UART / I2C către alte dispozitive conectate la plăcile de dezvoltare Sipeed. În depozitul meu github veți putea găsi un alt exemplu de script, raccoon_detector_uart.py, care (ați ghicit-o) detectează ratoni și trimite coordonatele casetelor de delimitare peste UART. Rețineți că pinii utilizați pentru comunicarea UART sunt diferite de plăcile diferite, acest lucru trebuie să vă verificați în documentație.

Pasul 6: Rezumat

Kendryte K210 este un cip solid pentru viziunea computerizată, flexibil, deși cu memorie limitată disponibilă. Până în prezent, în tutorialele mele am acoperit utilizarea acestuia pentru recunoașterea obiectelor personalizate, detectarea obiectelor personalizate și executarea unor sarcini de viziune computerizată bazate pe OpenMV. Știu, de fapt, că este potrivit și pentru recunoașterea feței și, cu unele modificări, ar trebui să fie posibilă detectarea pozelor și segmentarea imaginii (puteți utiliza aXeleRate pentru a antrena modelul de segmentare semantică, dar nu am implementat încă inferența cu K210). Simțiți-vă liber să aruncați o privire la problemele din depozitele aXeleRate și să faceți un PR dacă credeți că există unele îmbunătățiri pe care le puteți contribui!

Iată câteva articole pe care le-am folosit în scrierea acestui tutorial, aruncați o privire dacă doriți să aflați mai multe despre detectarea obiectelor cu rețele neuronale:

Detectoare de obiecte pentru cutii de delimitare: înțelegerea lui YOLO, arăți o singură dată

Înțelegerea YOLO (mai multe matematici)

Ghid delicat despre modul în care funcționează localizarea obiectelor YOLO cu Keras (partea 2)

Detectarea obiectelor în timp real cu YOLO, YOLOv2 și acum YOLOv3

Sper că puteți folosi cunoștințele pe care le aveți acum pentru a construi câteva proiecte minunate cu viziune automată! Puteți cumpăra plăci Sipeed aici, acestea sunt printre cele mai ieftine opțiuni disponibile pentru ML pe sistemele încorporate.

Adăugați-mă pe LinkedIn dacă aveți întrebări și abonați-vă la canalul meu YouTube pentru a primi notificări despre proiecte mai interesante care implică învățarea automată și robotică.

Recomandat: