Indholdsfortegnelse:

Objektregistrering med Sipeed MaiX -plader (Kendryte K210): 6 trin
Objektregistrering med Sipeed MaiX -plader (Kendryte K210): 6 trin

Video: Objektregistrering med Sipeed MaiX -plader (Kendryte K210): 6 trin

Video: Objektregistrering med Sipeed MaiX -plader (Kendryte K210): 6 trin
Video: #264 Еженедельный обзор #65 — Новые продукты от производителей // Новости 2024, Juli
Anonim
Image
Image

Som en fortsættelse af min tidligere artikel om billedgenkendelse med Sipeed MaiX Boards, besluttede jeg at skrive en anden vejledning med fokus på objektdetektering. Der dukkede for nylig en interessant hardware op med Kendryte K210 -chip, herunder Seeed AI Hat for Edge Computing, M5 stack's M5StickV og DFRobot's HuskyLens (selvom den ene har proprietær firmware og mere målrettet til komplette begyndere). På grund af den billige pris har Kendryte K210 appelleret til folk, der ønsker at tilføje computervision til deres projekter. Men som sædvanlig med kinesiske hardwareprodukter mangler den tekniske support, og det er noget, jeg prøver at forbedre med mine artikler og videoer. Men husk, at jeg ikke er på Kendryte- eller Sipeed -udviklerteamet og ikke kan besvare alle de spørgsmål, der er relateret til deres produkt.

Med det i tankerne, lad os starte! Vi begynder med en kort (og forenklet) oversigt over, hvordan CNN -modeller til genkendelse af objekter fungerer.

OPDATERING MAJ 2020: Da jeg så, hvordan min artikel og video om objektdetektering med K210-tavler stadig er meget populære, og blandt de bedste resultater på YouTube og Google, besluttede jeg at opdatere artiklen til at omfatte oplysningerne om aXeleRate, Keras-baserede rammer for AI om Edge udvikler jeg. aXeleRate er hovedsageligt baseret på den samling af scripts, jeg brugte til træning af billedgenkendelse/objektdetekteringsmodeller - kombineret til en enkelt ramme og optimeret til arbejdsgang på Google Colab. Det er mere praktisk at bruge og mere opdateret.

For den gamle version af artiklen kan du stadig se den på steemit.com.

Trin 1: Forklaring af modelarkitektur af objekt

Objektregistrering Model Arkitektur Forklaret
Objektregistrering Model Arkitektur Forklaret
Objektregistrering Model Arkitektur Forklaret
Objektregistrering Model Arkitektur Forklaret

Billedgenkendelsesmodeller (eller billedklassificering) tager hele billedet som input og sender en liste over sandsynligheder for hver klasse, vi prøver at genkende. Det er meget nyttigt, hvis objektet, vi er interesseret i, optager en stor del af billedet, og vi er ligeglade med dets placering. Men hvad nu hvis vores projekt (f.eks. Ansigtssporingskamera) kræver, at vi ikke kun har viden om objekttypen i billedet, men også dets koordinater. Og hvad med projekt, der kræver, at detektere flere objekter (f.eks. Til tælling)?

Her er det, når objektdetekteringsmodeller kommer til nytte. I denne artikel bruger vi YOLO (du kigger kun én gang) arkitektur og fokuserer forklaringen på den interne mekanik i denne særlige arkitektur.

Vi forsøger at bestemme, hvilke objekter der er til stede på billedet, og hvad er deres koordinater. Da maskinlæring ikke er magi og ikke "en tænkemaskine", men blot en algoritme, der bruger statistik til at optimere funktionen (neuralt netværk) til bedre at løse et bestemt problem. Vi er nødt til at omskrive dette problem for at gøre det mere "optimerbart". En naiv tilgang her ville være at få algoritmen til at minimere tab (forskel) mellem dens forudsigelse og korrekte koordinater for objektet. Det ville fungere ret godt, så længe vi kun har et objekt i billedet. For flere objekter tager vi en anden tilgang - vi tilføjer gitteret og får vores netværk til at forudsige tilstedeværelsen (eller fraværet) af objektet / objekterne i hvert gitter. Det lyder godt, men efterlader stadig for meget usikkerhed for netværket - hvordan sender man forudsigelsen, og hvad skal man gøre, når der er flere objekter med centrum inde i en gittercelle? Vi skal tilføje endnu en begrænsning - såkaldte ankre. Anker er indledende størrelser (bredde, højde), hvoraf nogle (det nærmeste objektstørrelsen) vil blive ændret til objektstørrelsen - ved hjælp af nogle output fra det neurale netværk (sidste funktionskort).

Så her er en visning på topniveau om, hvad der foregår, når YOLO-arkitekturens neurale netværk udfører en objektdetektion på billedet. I henhold til funktioner, der er registreret af funktionsudtrækningsnetværk, foretages der for hver gittercelle et sæt forudsigelser, som omfatter ankreforskydning, anker sandsynlighed og ankerklasse. Så kasserer vi forudsigelserne med lav sandsynlighed og voila!

Trin 2: Forbered miljøet

Forbered miljøet
Forbered miljøet

aXeleRate er baseret på et vidunderligt projekt af penny4860, SVHN yolo-v2 cifret detektor. aXeleRate tager denne implementering af YOLO -detektor i Keras til et næste niveau og bruger sit praktiske konfigurationssystem til at udføre træning og konvertering af billedgenkendelse/objektdetektering og billedsegmenteringsnetværk med forskellige backends.

To er to måder at bruge aXeleRate på: Kører lokalt på Ubuntu -maskine eller i Google Colab. For at køre i Google Colab, skal du kigge på dette eksempel:

PASCAL-VOC Object Detection Colab Notebook

Det er også meget lettere at træne din model lokalt og eksportere den til hardware -acceleration. Jeg anbefaler stærkt, at du installerer alle de nødvendige afhængigheder i Anaconda -miljøet for at holde dit projekt adskilt fra andre og undgå konflikter.

Download installationsprogrammet her.

Efter installationen er fuldført, skal du oprette et nyt miljø:

conda create -n yolo python = 3.7

Lad os aktivere det nye miljø

conda aktivere yolo

Et præfiks før din bash shell vises med miljøets navn, hvilket angiver, at du arbejder nu i det miljø.

Installer aXeleRate på din lokale maskine med

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

Og kør derefter dette for at downloade scripts, du skal bruge til træning og slutning:

git -klon

Du kan køre hurtige tests med tests_training.py i aXeleRate -mappen. Det vil køre træning og slutning for hver modeltype, gemme og konvertere uddannede modeller. Da det kun er træning i 5 epoker og datasættet er meget lille, vil du ikke kunne få nyttige modeller, men dette script er kun beregnet til at kontrollere, om der ikke er fejl.

Trin 3: Træn en objektdetekteringsmodel med Keras

Træn en objektdetekteringsmodel med Keras
Træn en objektdetekteringsmodel med Keras

Nu kan vi køre et træningsscript med konfigurationsfilen. Da Keras implementering af YOLO objektdetektor er ret kompliceret, vil jeg i stedet for at forklare hvert relevant stykke kode, forklare hvordan du konfigurerer træningen og også beskriver relevante moduler, hvis du selv vil foretage nogle ændringer af dem.

Lad os starte med et legetøjseksempel og træne en racoon detektor. Der er en config -fil inde i /config -mappen, raccoon_detector.json. Vi vælger MobileNet7_5 som arkitektur (hvor 7_5 er alfa -parameter for den oprindelige Mobilenet -implementering, styrer bredden på netværket) og 224x224 som inputstørrelse. Lad os se på de vigtigste parametre i konfigurationen:

Type er model frontend - Classifier, Detector eller SegnetArchitecture er model backend (feature extractor)

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

For mere information om ankre, læs venligst her

Etiketter er etiketter, der findes i dit datasæt. VIGTIGT: Angiv venligst alle etiketterne i datasættet.

object_scale bestemmer, hvor meget der skal straffes med forkert forudsigelse af objektforudsigelsers tillid

no_object_scale bestemmer, hvor meget der skal straffe forkert forudsigelse af tillid for ikke-objektforudsigere

coord_scale bestemmer, hvor meget der skal straffes forkerte positioner og størrelsesforudsigelser (x, y, w, h)

class_scale bestemmer, hvor meget der skal straffe forkert klasseforudsigelse

augumentation - billedforstørrelse, ændring af størrelse, forskydning og sløring af billedet for at forhindre overmontering og have større variation i datasæt.

train_times, validation_times - hvor mange gange datasættet skal gentages. Nyttigt, hvis du har augumentation

aktiveret

first_trainable_layer - giver dig mulighed for at fryse bestemte lag, hvis du bruger et forududdannet funktionsnetværk

Nu skal vi downloade datasættet, som jeg delte på mit Google Drive (originalt datasæt), som er et racoon -detekteringsdatasæt, der indeholder 150 annoterede billeder.

Sørg for at ændre linjerne i konfigurationsfilen (train_image_folder, train_annot_folder) i overensstemmelse hermed og derefter starte træningen med følgende kommando:

python axelerate/train.py -c configs/vaskebjørn_detektor.json

train.py læser konfigurationen fra.json -filen og træner modellen med axelerate/networks/yolo/yolo_frontend.py script. yolo/backend/loss.py er, hvor brugerdefineret tabsfunktion er implementeret, og yolo/backend/network.py er, hvor modellen oprettes (input, funktionsudtræk og detekteringslag sat sammen). axelerate/networks/common_utils/fit.py er script, der implementerer træningsproces og axelerate/netværk/common_utils/feature.py indeholder funktionsudtræk. Hvis du har til hensigt at bruge uddannet model med K210 -chip og Micropython -firmware, kan du på grund af hukommelsesbegrænsninger vælge mellem MobileNet (2_5, 5_0 og 7_5) og TinyYolo, men jeg har fundet MobileNet giver bedre detekteringsnøjagtighed.

Da det er et legetøjseksempel og kun indeholder 150 billeder af vaskebjørne, bør træningsprocessen være temmelig hurtig, selv uden GPU, selvom nøjagtigheden vil være langt fra stjernen. Til arbejdsrelateret projekt har jeg uddannet en trafikskiltdetektor og en nummerdetektor, begge datasæt omfattede over et par tusinde træningseksempler.

Trin 4: Konverter det til.kmodel -format

Konverter det til.kmodel Format
Konverter det til.kmodel Format

Med aXeleRate udføres modelkonvertering automatisk - dette er nok den største forskel fra den gamle version af træningsscripts! Plus du får modelfilerne og træningsgrafen gemt pænt i projektmappen. Jeg fandt også ud af, at vaiidationsnøjagtighed undertiden ikke giver et skøn over modelens reelle ydeevne til objektdetektering, og derfor tilføjede jeg mAP som en valideringsmetrik for objektdetekteringsmodeller. Du kan læse mere om mAP her.

Hvis mAP, den gennemsnitlige gennemsnitlige præcision (vores valideringsmetrik) ikke forbedres i 20 epoker, stopper træningen for tidligt. Hver gang mAP forbedres, gemmes modellen i projektmappen. Efter træning er slut, konverterer aXeleRate automatisk den bedste model til angivne formater - du kan vælge "tflite", "k210" eller "edgetpu" fra nu af.

Nu til det sidste trin, faktisk kører vores model på Sipeed hardware!

Trin 5: Kør på Micropython Firmware

Kør på Micropython Firmware
Kør på Micropython Firmware

Det er muligt at køre inferens med vores objektdetekteringsmodel med C -kode, men for nemheds skyld vil vi bruge Micropython -firmware og MaixPy IDE i stedet.

Download MaixPy IDE herfra og micropython -firmware herfra. Du kan bruge python script kflash.py til at brænde firmwaren eller downloade separat GUI -flashværktøj her.

Kopier model.kmodel til roden af et SD -kort, og indsæt SD -kortet i Sipeed Maix Bit (eller en anden K210 -enhed). Alternativt kan du brænde.kmodel til enhedens flash -hukommelse. Mit eksempel script læser.kmodel fra flash -hukommelse. Hvis du bruger SD -kort, skal du ændre denne linje

opgave = kpu.load (0x200000)

til

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

Åbn MaixPy IDE, og tryk på forbindelsesknappen. Åbn raccoon_detector.py -script fra mappen example_scripts/k210/detector, og tryk på knappen Start. Du burde se en livestream fra kameraet med afgrænsningskasser rundt om … ja, vaskebjørne. Du kan øge nøjagtigheden af modellen ved at give flere træningseksempler, men husk på, at det er en eventyrlig lille model (1,9 M), og den vil have problemer med at opdage små objekter (på grund af lav opløsning).

Et af de spørgsmål, jeg modtog i kommentarer til min tidligere artikel om billedgenkendelse, er, hvordan man sender registreringsresultaterne over UART/I2C til en anden enhed, der er forbundet til Sipeed -udviklingsbrætter. I mit github -depot vil du kunne finde et andet eksempel script, raccoon_detector_uart.py, som (du gættede det) opdager vaskebjørne og sender koordinaterne til afgrænsningsbokse over UART. Husk, at stifter, der bruges til UART -kommunikation, er forskellige fra forskellige tavler, det er noget, du skal tjekke selv i dokumentationen.

Trin 6: Resumé

Kendryte K210 er en solid chip til computersyn, fleksibel, omend med begrænset hukommelse tilgængelig. Hidtil har vi i mine selvstudier dækket brug af det til at genkende brugerdefinerede objekter, opdage brugerdefinerede objekter og køre nogle OpenMV -baserede computervisionsopgaver. Jeg ved med sikkerhed, at den også er velegnet til ansigtsgenkendelse, og med lidt puslespil burde det være muligt at udføre posedetektering og billedsegmentering (du kan bruge aXeleRate til at træne semantisk segmenteringsmodel, men jeg har endnu ikke implementeret slutningen med K210). Tag et kig på aXeleRate -opbevaringsproblemer og lav en PR, hvis du mener, at der er nogle forbedringer, du kan bidrage med!

Her er nogle artikler, jeg brugte til at skrive denne vejledning, se hvis du vil lære mere om objektdetektering med neurale netværk:

Afgrænsende kasseobjektdetektorer: forståelse YOLO, du ser kun en gang

Forståelse af YOLO (mere matematik)

Blid guide til, hvordan YOLO Object Localization fungerer med Keras (del 2)

Objektregistrering i realtid med YOLO, YOLOv2 og nu YOLOv3

Håber du kan bruge den viden du har nu til at bygge nogle fantastiske projekter med maskinsyn! Du kan købe Sipeed -tavler her, de er blandt de billigste muligheder for ML på indlejrede systemer.

Tilføj mig på LinkedIn, hvis du har spørgsmål, og tilmeld dig min YouTube -kanal for at få besked om flere interessante projekter, der involverer maskinlæring og robotik.

Anbefalede: