Zbulimi i objekteve me bordet Sipeed MaiX (Kendryte K210): 6 hapa
Zbulimi i objekteve me bordet Sipeed MaiX (Kendryte K210): 6 hapa
Anonim
Image
Image

Si vazhdim i artikullit tim të mëparshëm në lidhje me njohjen e imazhit me Sipeed MaiX Boards, vendosa të shkruaj një tutorial tjetër, duke u fokusuar në zbulimin e objekteve. Kohët e fundit u shfaq një pajisje interesante me çipin Kendryte K210, duke përfshirë Seeed AI Hat për Edge Computing, M5 stack's M5StickV dhe HuskyLens të DFRobot (megjithëse ai ka firmware të pronarit dhe më i synuar për fillestarët e plotë). Për shkak të çmimit të lirë, Kendryte K210 u ka bërë thirrje njerëzve, të cilët dëshirojnë të shtojnë vizionin kompjuterik në projektet e tyre. Por si zakonisht me produktet harduerike kineze, mbështetja teknologjike mungon dhe kjo është diçka që po përpiqem ta përmirësoj me artikujt dhe videot e mia. Por mbani në mend, se unë nuk jam në ekipin e zhvilluesve Kendryte ose Sipeed dhe nuk mund t'u përgjigjem të gjitha pyetjeve që lidhen me produktin e tyre.

Me këtë në mendje, le të fillojmë! Ne do të fillojmë me një përmbledhje të shkurtër (dhe të thjeshtuar) se si funksionojnë modelet e njohjes së objekteve CNN.

PPRDITSIM MAJ 2020: Duke parë sesi artikulli dhe videoja ime mbi Objektin e Zbulimit me bordet K210 janë ende shumë të popullarizuara dhe në mesin e rezultateve kryesore në YouTube dhe Google, vendosa ta përditësoj artikullin për të përfshirë informacionin rreth aXeleRate, kuadrit të bazuar në Keras për AI në Edge unë zhvillohem. aXeleRate, në thelb, bazohet në koleksionin e skripteve që kam përdorur për trajnimin e modeleve të njohjes së imazhit/zbulimit të objekteve - të kombinuara në një kornizë të vetme dhe të optimizuar për rrjedhën e punës në Google Colab. Moreshtë më i përshtatshëm për t'u përdorur dhe më i përditësuar.

Për versionin e vjetër të artikullit, ende mund ta shihni në steemit.com.

Hapi 1: Arkitektura e Modelit të Zbulimit të Objekteve Shpjegohet

Arkitektura e Modelit të Zbulimit të Objekteve Shpjegohet
Arkitektura e Modelit të Zbulimit të Objekteve Shpjegohet
Arkitektura e Modelit të Zbulimit të Objekteve Shpjegohet
Arkitektura e Modelit të Zbulimit të Objekteve Shpjegohet

Modelet e njohjes së imazhit (ose klasifikimit të figurës) marrin të gjithë imazhin si hyrje dhe dalin një listë të probabiliteteve për secilën klasë që ne po përpiqemi të njohim. Veryshtë shumë e dobishme nëse objekti për të cilin jemi të interesuar zë një pjesë të madhe të imazhit dhe nuk na intereson shumë për vendndodhjen e tij. Por, çfarë nëse projekti ynë (të themi, kamera për përcjelljen e fytyrës) na kërkon jo vetëm që të kemi njohuri për llojin e objektit në imazh, por edhe koordinatat e tij. Po në lidhje me projektin që kërkon zbulimin e objekteve të shumta (për shembull për numërimin)?

Këtu është kur Modelet e Zbulimit të Objekteve vijnë në ndihmë. Në këtë artikull ne do të përdorim arkitekturën YOLO (ju shikoni vetëm një herë) dhe do të përqendrojmë shpjegimin në mekanikën e brendshme të kësaj arkitekture të veçantë.

Ne po përpiqemi të përcaktojmë se cilat objekte janë të pranishme në foto dhe cilat janë koordinatat e tyre. Meqenëse mësimi i makinerisë nuk është magji dhe jo "një makinë mendimi", por vetëm një algoritëm i cili përdor statistikat për të optimizuar funksionin (rrjetin nervor) për të zgjidhur më mirë një problem të veçantë. Ne duhet ta perifrazojmë këtë problem për ta bërë atë më "të optimizueshëm". Një qasje naive këtu do të ishte që algoritmi të minimizonte humbjen (ndryshimin) midis parashikimit të tij dhe koordinatave të sakta të objektit. Kjo do të funksiononte mjaft mirë, për sa kohë që ne kemi vetëm një objekt në imazh. Për objekte të shumta ne marrim një qasje të ndryshme - shtojmë rrjetin dhe bëjmë që rrjeti ynë të parashikojë praninë (ose mungesën) e objektit (ve) në secilin rrjet. Tingëllon shkëlqyeshëm, por gjithsesi lë shumë pasiguri për rrjetin - si të dalë parashikimi dhe çfarë të bëhet kur ka objekte të shumta me qendër brenda një qelize të rrjetit? Ne duhet të shtojmë një kufizim tjetër - të ashtuquajturat spiranca. Spirancat janë madhësi fillestare (gjerësia, lartësia) disa prej të cilave (më e afërta me madhësinë e objektit) do të ndryshojnë madhësinë e objektit - duke përdorur disa dalje nga rrjeti nervor (harta e veçorive përfundimtare).

Pra, këtu është një pamje e nivelit të lartë mbi atë që po ndodh kur rrjeti nervor i arkitekturës YOLO kryen një zbulim objekti në imazh. Sipas veçorive të zbuluara nga rrjeti nxjerrës i veçorive, për secilën qelizë të rrjetit bëhet një grup parashikimesh, i cili përfshin kompensimin e spirancave, probabilitetin e ankorimit dhe klasën e spirancës. Pastaj ne hedhim poshtë parashikimet me probabilitet të ulët dhe voila!

Hapi 2: Përgatitni Mjedisin

Përgatitni Mjedisin
Përgatitni Mjedisin

aXeleRate bazohet në një projekt të mrekullueshëm nga penny4860, detektor shifror SVHN yolo-v2. aXeleRate e çon këtë zbatim të detektorit YOLO në Keras në një nivel tjetër dhe përdor sistemin e tij të përshtatshëm të konfigurimit për të kryer trajnime dhe shndërrime në njohjen e imazheve/zbulimin e objekteve dhe rrjetet e segmentimit të imazhit me mbështetës të ndryshëm.

Janë dy mënyra për të përdorur aXeleRate: ekzekutimi lokal në makinën Ubuntu ose në Google Colab. Për të funksionuar në Google Colab, hidhini një sy këtij shembulli:

Fletore Colab e Zbulimit të Objekteve PASCAL-VOC

Trajnimi i modelit tuaj në vend dhe eksportimi i tij për t'u përdorur me përshpejtimin e harduerit është gjithashtu shumë më i lehtë tani. Unë ju rekomandoj shumë të instaloni të gjitha varësitë e nevojshme në mjedisin Anaconda për ta mbajtur projektin tuaj të ndarë nga të tjerët dhe për të shmangur konfliktet.

Shkarkoni instaluesin këtu.

Pasi të përfundojë instalimi, krijoni një mjedis të ri:

conda create -n yolo python = 3.7

Le të aktivizojmë mjedisin e ri

conda aktivizo yolo

Një parashtesë para guaskës tuaj bash do të shfaqet me emrin e mjedisit, duke treguar që ju punoni tani në atë mjedis.

Instaloni aXeleRate në makinën tuaj lokale me

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

Dhe pastaj ekzekutoni këtë për të shkarkuar skriptet që do t'ju nevojiten për trajnim dhe përfundim:

git klon

Ju mund të bëni teste të shpejta me tests_training.py në dosjen aXeleRate. Ai do të kryejë trajnime dhe përfundime për secilin lloj modeli, do të kursejë dhe konvertojë modele të trajnuara. Meqenëse është vetëm trajnim për 5 epoka dhe grupi i të dhënave është shumë i vogël, nuk do të jeni në gjendje të merrni modele të dobishme, por ky skenar është menduar vetëm për të kontrolluar mungesën e gabimeve.

Hapi 3: Trajnoni një model të zbulimit të objektit me Keras

Trajnoni një model zbulimi objektesh me Keras
Trajnoni një model zbulimi objektesh me Keras

Tani mund të ekzekutojmë një skenar trajnimi me skedarin e konfigurimit. Meqenëse zbatimi i Keras i detektorit të objekteve YOLO është mjaft i ndërlikuar, në vend që të shpjegoj çdo pjesë përkatëse të kodit, unë do të shpjegoj se si të konfiguroni trajnimin dhe gjithashtu të përshkruaj modulet përkatëse, në rast se dëshironi të bëni disa ndryshime në to vetë.

Le të fillojmë me një shembull lodrash dhe të trajnojmë një detektor rakun. Ekziston një skedar konfigurimi brenda dosjes /konfigurimit, raccoon_detector.json. Ne zgjedhim MobileNet7_5 si arkitekturë (ku 7_5 është parametri alfa i zbatimit origjinal Mobilenet, kontrollon gjerësinë e rrjetit) dhe 224x224 si madhësi hyrëse. Le të hedhim një vështrim në parametrat më të rëndësishëm në konfigurim:

Lloji është modeli i përparmë - Klasifikuesi, Zbuluesi ose SegnetArkitektura është modeli i pasmë (nxjerrës i veçorive)

- Yolo e plotë - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50

Për më shumë informacion mbi spirancat, ju lutemi lexoni këtu

Etiketat janë etiketa të pranishme në grupin tuaj të të dhënave. E RORTNDSISHME: Ju lutemi, listoni të gjitha etiketat e pranishme në grupin e të dhënave.

object_scale përcakton sa të ndëshkohet parashikimi i gabuar i besimit të parashikuesve të objekteve

no_object_scale përcakton se sa të ndëshkohet parashikimi i gabuar i besimit të parashikuesve jo-objekt

coord_scale përcakton sa të ndëshkoni parashikimet e gabuara të pozicionit dhe madhësisë (x, y, w, h)

class_scale përcakton sa të penalizohet parashikimi i gabuar i klasës

augumentation - shtimi i imazhit, ndryshimi i madhësisë, zhvendosja dhe turbullimi i imazhit në mënyrë që të parandalohet montimi i tepërt dhe të ketë një larmi më të madhe në grupin e të dhënave.

kohët e trenit, kohët e validimit - sa herë për të përsëritur grupin e të dhënave. E dobishme nëse keni një shtesë

aktivizuar

first_trainable_layer - ju lejon të ngrini shtresa të caktuara nëse jeni duke përdorur një rrjet tiparësh të stërvitur paraprakisht

Tani na duhet të shkarkojmë grupin e të dhënave, të cilin e kam ndarë në Google Drive (baza e të dhënave origjinale), e cila është një grup i të dhënave të zbulimit të rakunit, që përmban 150 fotografi të shënuara.

Sigurohuni që të ndryshoni linjat në skedarin e konfigurimit (train_image_folder, train_annot_folder) në përputhje me rrethanat dhe pastaj filloni trajnimin me komandën e mëposhtme:

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

train.py lexon konfigurimin nga skedari.json dhe stërvit modelin me shkrim axelerate/network/yolo/yolo_frontend.py. yolo/backend/loss.py është vendi ku zbatohet funksioni i personalizuar i humbjes dhe yolo/backend/network.py është vendi ku krijohet modeli (hyrja, nxjerrësi i veçorive dhe shtresat e zbulimit të vendosura së bashku). axelerate/networks/common_utils/fit.py është skript që zbaton procesin e trajnimit dhe axelerate/networks/common_utils/feature.py përmban nxjerrës të veçorive. Nëse keni ndërmend të përdorni modelin e trajnuar me çipin K210 dhe firmware Micropython, për shkak të kufizimeve të kujtesës ju mund të zgjidhni midis MobileNet (2_5, 5_0 dhe 7_5) dhe TinyYolo, por kam gjetur se MobileNet jep saktësi më të mirë të zbulimit.

Meqenëse është një shembull lodër dhe përmban vetëm 150 imazhe të rakunave, procesi i trajnimit duhet të jetë mjaft i shpejtë, edhe pa GPU, megjithëse saktësia do të jetë larg nga yjësia. Për projektet e lidhura me punën, kam trajnuar një detektor të shenjave të trafikut dhe një detektor të numrave, të dy grupet e të dhënave përfshinin mbi disa mijëra shembuj trajnimi.

Hapi 4: Ktheni atë në.kmodel Format

Shndërrojeni atë në.kmodel Format
Shndërrojeni atë në.kmodel Format

Me aXeleRate, konvertimi i modelit kryhet automatikisht - ky është ndoshta ndryshimi më i madh nga versioni i vjetër i skripteve të trajnimit! Plus ju merrni skedarët e modelit dhe grafikun e trajnimit të ruajtur me kujdes në dosjen e projektit. Gjithashtu zbulova se saktësia e heqjes dorë ndonjëherë nuk arrin të japë vlerësim mbi performancën reale të modelit për zbulimin e objekteve dhe kjo është arsyeja pse shtova mAP si një metrikë vlefshmërie për modelet e zbulimit të objekteve. Mund të lexoni më shumë rreth MAP këtu.

Nëse MAP, saktësia mesatare mesatare (metrika jonë e vlefshmërisë) nuk po përmirësohet për 20 epoka, trajnimi do të ndalet para kohe. Sa herë që përmirësohet MAP, modeli ruhet në dosjen e projektit. Pas përfundimit të trajnimit, aXeleRate konverton automatikisht modelin më të mirë në formate të specifikuara - tani mund të zgjidhni, "tflite", "k210" ose "edgetpu".

Tani në hapin e fundit, në të vërtetë drejtimin e modelit tonë në pajisjet Sipeed!

Hapi 5: Drejtoni në firmware Micropython

Drejtoni në firmware Micropython
Drejtoni në firmware Micropython

Modelshtë e mundur të nxirret përfundim me modelin tonë të zbulimit të objektit me kodin C, por për hir të lehtësisë ne do të përdorim firmware -in Micropython dhe MaixPy IDE në vend të tij.

Shkarkoni MaixPy IDE nga këtu dhe firmware micropython nga këtu. Ju mund të përdorni python script kflash.py për të djegur firmuerin ose për të shkarkuar vegla të veçanta flash GUI këtu.

Kopjoni model.kmodel në rrënjën e një karte SD dhe futni kartën SD në Sipeed Maix Bit (ose pajisje të tjera K210). Përndryshe, ju mund të digjni.kmodel në kujtesën flash të pajisjes. Skenari im shembull lexon.kmodel nga memoria flash. Nëse jeni duke përdorur kartë SD, ju lutemi ndryshoni këtë linjë

detyrë = kpu.load (0x200000)

te

detyrë = kpu.load ("/sd/model.kmodel")

Hapni MaixPy IDE dhe shtypni butonin e lidhjes. Hapni skenarin raccoon_detector.py nga dosja example_scripts/k210/detector dhe shtypni butonin Start. Ju duhet të shihni një transmetim të drejtpërdrejtë nga kamera me kuti kufizuese përreth … mirë, rakunët. Ju mund të rrisni saktësinë e modelit duke ofruar më shumë shembuj trajnimi, por mbani në mend se është model i vogël zanash (1.9 M) dhe do të ketë probleme në zbulimin e objekteve të vogla (për shkak të rezolucionit të ulët).

Një nga pyetjet që mora në komentet e artikullit tim të mëparshëm mbi njohjen e imazhit është se si t'i dërgoj rezultatet e zbulimit përmes UART/I2C në pajisje të tjera të lidhura me bordet e zhvillimit Sipeed. Në depon time të github ju do të jeni në gjendje të gjeni një skenar shembull tjetër, raccoon_detector_uart.py, i cili (e keni menduar) zbulon rakunët dhe dërgon koordinatat e kutive kufizuese mbi UART. Mbani në mend, se kunjat e përdorura për komunikimin UART janë të ndryshme nga tabela të ndryshme, kjo është diçka që ju duhet të kontrolloni vetë në dokumentacion.

Hapi 6: Përmbledhje

Kendryte K210 është një çip i fortë për shikimin e kompjuterit, fleksibël, megjithëse me memorie të kufizuar në dispozicion. Deri më tani, në mësimet e mia ne kemi mbuluar përdorimin e tij për njohjen e objekteve me porosi, zbulimin e objekteve me porosi dhe ekzekutimin e disa detyrave të vizionit kompjuterik të bazuar në OpenMV. Unë e di me siguri se është gjithashtu i përshtatshëm për njohjen e fytyrës dhe me disa ngatërrime duhet të jetë e mundur të bëhet zbulimi dhe ndarja e imazhit (ju mund të përdorni aXeleRate për të trajnuar modelin segmentues të segmentimit, por unë ende nuk e kam zbatuar përfundimin me K210) Me Mos ngurroni të hidhni një sy në çështjet e depozitave aXeleRate dhe bëni një PR nëse mendoni se ka disa përmirësime që mund të kontribuoni!

Këtu janë disa artikuj që kam përdorur për të shkruar këtë tutorial, hidhini një sy nëse doni të mësoni më shumë rreth zbulimit të objekteve me rrjetet nervore:

Detektorët e objekteve të kutisë së kufizuar: të kuptuarit YOLO, Ju dukeni vetëm një herë

Kuptimi i YOLO (më shumë matematikë)

Udhëzues i butë se si funksionon lokalizimi i objektit YOLO me Keras (Pjesa 2)

Zbulimi i objekteve në kohë reale me YOLO, YOLOv2 dhe tani YOLOv3

Shpresoj se mund të përdorni njohuritë që keni tani për të ndërtuar disa projekte të mrekullueshme me vizion makinerik! Ju mund të blini bordet Sipeed këtu, ato janë ndër opsionet më të lira të disponueshme për ML në sistemet e ngulitura.

Më shtoni në LinkedIn nëse keni ndonjë pyetje dhe regjistrohuni në kanalin tim në YouTube për t'u njoftuar për projekte më interesante që përfshijnë mësimin e makinerisë dhe robotikën.