Innholdsfortegnelse:

Objektdeteksjon med Sipeed MaiX -plater (Kendryte K210): 6 trinn
Objektdeteksjon med Sipeed MaiX -plater (Kendryte K210): 6 trinn

Video: Objektdeteksjon med Sipeed MaiX -plater (Kendryte K210): 6 trinn

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

Som en fortsettelse av min forrige artikkel om bildegjenkjenning med Sipeed MaiX Boards, bestemte jeg meg for å skrive en annen opplæring, med fokus på gjenkjenning av objekter. Det dukket opp en interessant maskinvare nylig med Kendryte K210 -brikken, inkludert Seeed AI Hat for Edge Computing, M5 stack's M5StickV og DFRobot's HuskyLens (selv om den har proprietær fastvare og mer målrettet for komplette nybegynnere). På grunn av den lave prisen har Kendryte K210 appellert til folk som ønsker å legge datasyn til prosjektene sine. Men som vanlig med kinesiske maskinvareprodukter mangler teknisk støtte, og dette er noe jeg prøver å forbedre med artiklene og videoene mine. Men husk at jeg ikke er i utviklerteamet Kendryte eller Sipeed og ikke kan svare på alle spørsmålene knyttet til produktet.

Med det i bakhodet, la oss starte! Vi begynner med en kort (og forenklet) oversikt over hvordan objektgjenkjenning CNN -modeller fungerer.

OPPDATERING MAI 2020: Da jeg så hvordan artikkelen og videoen min om objektdeteksjon med K210-tavler fortsatt er veldig populær, og blant toppresultater på YouTube og Google bestemte jeg meg for å oppdatere artikkelen for å inkludere informasjon om aXeleRate, Keras-basert rammeverk for AI på Edge utvikler jeg. aXeleRate er i hovedsak basert på samlingen av skript jeg brukte for å trene modeller for bildegjenkjenning/objektgjenkjenning - kombinert til et enkelt rammeverk og optimalisert for arbeidsflyt på Google Colab. Det er mer praktisk å bruke og mer oppdatert.

For den gamle versjonen av artikkelen kan du fremdeles se den på steemit.com.

Trinn 1: Objektdeteksjon modellarkitektur forklart

Objektdeteksjon modellarkitektur forklart
Objektdeteksjon modellarkitektur forklart
Objektdeteksjon modellarkitektur forklart
Objektdeteksjon modellarkitektur forklart

Modeller for bildegjenkjenning (eller bildeklassifisering) tar hele bildet som input og sender ut en liste over sannsynligheter for hver klasse vi prøver å gjenkjenne. Det er veldig nyttig hvis objektet vi er interessert i opptar en stor del av bildet, og vi ikke bryr oss så mye om plasseringen. Men hva om prosjektet vårt (si ansiktssporingskamera) krever at vi ikke bare har kunnskap om typen objekt i bildet, men også dets koordinater. Og hva med prosjektet som krever at det oppdages flere objekter (for eksempel for telling)?

Her er når objektdeteksjonsmodeller kommer godt med. I denne artikkelen bruker vi YOLO (du ser bare en gang) arkitektur og fokuserer forklaringen på den interne mekanikken i denne arkitekturen.

Vi prøver å finne ut hvilke objekter som er tilstede i bildet og hva som er deres koordinater. Siden maskinlæring ikke er magi og ikke "en tankemaskin", men bare en algoritme som bruker statistikk for å optimalisere funksjonen (nevrale nettverk) for å bedre løse et bestemt problem. Vi må omskrive dette problemet for å gjøre det mer "optimaliserbart". En naiv tilnærming her ville være å ha algoritmen til å minimere tap (forskjell) mellom dens prediksjon og riktige koordinater til objektet. Det ville fungere ganske bra, så lenge vi bare har ett objekt i bildet. For flere objekter tar vi en annen tilnærming - vi legger til rutenettet og får nettverket til å forutsi tilstedeværelsen (eller fraværet) av objektet (e) i hvert rutenett. Høres bra ut, men gir fortsatt for mye usikkerhet for nettverket - hvordan sende ut spådommen og hva jeg skal gjøre når det er flere objekter med senter inne i en rutenettcelle? Vi må legge til en begrensning til - såkalte ankere. Anker er innledende størrelser (bredde, høyde) hvorav noen (nærmest objektstørrelsen) vil bli endret til objektstørrelsen - ved å bruke noen utganger fra det nevrale nettverket (siste funksjonskart).

Så her er en oversikt over hva som skjer når YOLO-arkitekturenes nevrale nettverk utfører en objektdeteksjon på bildet. I henhold til funksjoner som er oppdaget av funksjonsuttaksnettverk, blir det for hver rutenettcelle laget et spådom, som inkluderer ankerforskyvning, ankersannsynlighet og ankerklasse. Så forkaster vi spådommene med lav sannsynlighet og voila!

Trinn 2: Forbered miljøet

Forbered miljøet
Forbered miljøet

aXeleRate er basert på et fantastisk prosjekt av penny4860, SVHN yolo-v2 sifferdetektor. aXeleRate tar denne implementeringen av YOLO -detektoren i Keras til et neste nivå og bruker det praktiske konfigurasjonssystemet til å utføre opplæring og konvertering av bildegjenkjenning/objektsdeteksjon og bildesegmenteringsnettverk med forskjellige backends.

To er to måter å bruke aXeleRate på: å kjøre lokalt på Ubuntu -maskinen eller i Google Colab. For å kjøre i Google Colab, kan du se på dette eksemplet:

PASCAL-VOC Object Detection Colab Notebook

Det er også mye lettere å trene modellen din lokalt og eksportere den til maskinvareakselerasjon. Jeg anbefaler på det sterkeste at du installerer alle nødvendige avhengigheter i Anaconda -miljøet for å holde prosjektet ditt atskilt fra andre og unngå konflikter.

Last ned installasjonsprogrammet her.

Etter at installasjonen er fullført, opprett et nytt miljø:

conda create -n yolo python = 3.7

La oss aktivere det nye miljøet

conda aktivere yolo

Et prefiks før bash -skallet ditt vil vises med navnet på miljøet, som indikerer at du jobber nå i det miljøet.

Installer aXeleRate på din lokale maskin med

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

Og kjør dette for å laste ned skript du trenger for trening og slutning:

git -klon

Du kan kjøre hurtigtester med tests_training.py i aXeleRate -mappen. Det vil kjøre opplæring og slutning for hver modelltype, lagre og konvertere trente modeller. Siden det bare er trening for 5 epoker og datasettet er veldig lite, vil du ikke kunne få nyttige modeller, men dette skriptet er bare ment for å sjekke om det ikke er feil.

Trinn 3: Tren en objektdeteksjonsmodell med Keras

Tren en objektgjenkjenningsmodell med Keras
Tren en objektgjenkjenningsmodell med Keras

Nå kan vi kjøre et treningsskript med konfigurasjonsfilen. Siden Keras implementering av YOLO objektdetektor er ganske komplisert, i stedet for å forklare hvert relevant stykke kode, vil jeg forklare hvordan du konfigurerer opplæringen og også beskriver relevante moduler, i tilfelle du vil gjøre noen endringer i dem selv.

La oss starte med et lekeeksempel og trene en racoon detektor. Det er en konfigurasjonsfil inne i /config -mappen, raccoon_detector.json. Vi velger MobileNet7_5 som arkitektur (der 7_5 er alfa -parameter for den opprinnelige Mobilenet -implementeringen, kontrollerer bredden på nettverket) og 224x224 som inngangsstørrelse. La oss se på de viktigste parameterne i konfigurasjonen:

Type er modell frontend - Classifier, Detector eller SegnetArchitecture er modell backend (funksjonsekstraktor)

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

For mer informasjon om ankre, vennligst les her

Etiketter er etiketter som finnes i datasettet. VIKTIG: Vennligst oppfør alle etikettene i datasettet.

object_scale bestemmer hvor mye som skal straffes med feil prediksjon av tillit til objektforutsigere

no_object_scale bestemmer hvor mye man skal straffe feil spådom om tillit til ikke-objektprediktorer

coord_scale bestemmer hvor mye man skal straffe feil posisjon og størrelsesforutsigelser (x, y, w, h)

class_scale bestemmer hvor mye som skal straffe feil klassespådom

augumentation - image augumentation, resizing, shifting and uskarpe bildet for å forhindre overmontering og ha større variasjon i datasettet.

train_times, validation_times - hvor mange ganger datasettet skal gjentas. Nyttig hvis du har augumentation

aktivert

first_trainable_layer - lar deg fryse visse lag hvis du bruker et forhåndsutdannet funksjonsnettverk

Nå må vi laste ned datasettet, som jeg delte på Google Drive (originalt datasett), som er et datasett for racoon -deteksjon, som inneholder 150 kommenterte bilder.

Sørg for å endre linjene i konfigurasjonsfilen (train_image_folder, train_annot_folder) tilsvarende og deretter starte opplæringen med følgende kommando:

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

train.py leser konfigurasjonen fra.json -filen og trener modellen med akselerert/nettverk/yolo/yolo_frontend.py -skript. yolo/backend/loss.py er der egendefinert tapsfunksjon er implementert og yolo/backend/network.py er der modellen er opprettet (input, funksjonsuttrekker og deteksjonslag satt sammen). axelerate/networks/common_utils/fit.py er et skript som implementerer treningsprosessen og axelerate/networks/common_utils/feature.py inneholder funksjonsuttak. Hvis du har tenkt å bruke opplært modell med K210 -brikke og Micropython -fastvare, kan du på grunn av minnebegrensninger velge mellom MobileNet (2_5, 5_0 og 7_5) og TinyYolo, men jeg har funnet ut at MobileNet gir bedre gjenkjenningsnøyaktighet.

Siden det er et lekeeksempel og bare inneholder 150 bilder av vaskebjørn, bør treningsprosessen være ganske rask, selv uten GPU, selv om nøyaktigheten vil være langt fra fantastisk. For arbeidsrelaterte prosjekter har jeg trent en trafikkskiltdetektor og en nummerdetektor, begge datasettene inkluderte over noen få tusen opplæringseksempler.

Trinn 4: Konverter det til.kmodel -format

Konverter den til.kmodel Format
Konverter den til.kmodel Format

Med aXeleRate utføres modellkonvertering automatisk - dette er sannsynligvis den største forskjellen fra den gamle versjonen av treningsskript! I tillegg får du modellfilene og treningsgrafen pent lagret i prosjektmappen. Jeg fant også ut at vaiidasjonsnøyaktigheten noen ganger ikke gir et estimat på modellens virkelige ytelse for objektdeteksjon, og dette er grunnen til at jeg la til mAP som en valideringsberegning for objektdeteksjonsmodeller. Du kan lese mer om mAP her.

Hvis mAP, gjennomsnittlig gjennomsnittlig presisjon (vår valideringsberegning) ikke forbedres for 20 epoker, vil treningen stoppe for tidlig. Hver gang mAP forbedres, lagres modellen i prosjektmappen. Etter at treningen er over, konverterer aXeleRate automatisk den beste modellen til spesifiserte formater - du kan velge "tflite", "k210" eller "edgetpu" fra nå av.

Nå til det siste trinnet, faktisk kjører modellen vår på Sipeed maskinvare!

Trinn 5: Kjør på Micropython Firmware

Kjør på Micropython Firmware
Kjør på Micropython Firmware

Det er mulig å kjøre slutning på objektgjenkjenningsmodellen vår med C -kode, men for enkelhets skyld vil vi bruke Micropython -fastvare og MaixPy IDE i stedet.

Last ned MaixPy IDE herfra og micropython -fastvare herfra. Du kan bruke python script kflash.py til å brenne fastvaren eller laste ned separat GUI flash -verktøy her.

Kopier model.kmodel til roten til et SD -kort og sett inn SD -kortet i Sipeed Maix Bit (eller annen K210 -enhet). Alternativt kan du brenne.kmodel til enhetens flashminne. Eksempelskriptet mitt leser.kmodel fra flash -minne. Hvis du bruker SD -kort, må du endre denne linjen

oppgave = kpu.load (0x200000)

til

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

Åpne MaixPy IDE og trykk på tilkoblingsknappen. Åpne raccoon_detector.py -skriptet fra mappen example_scripts/k210/detector og trykk på Start -knappen. Du bør se en direktesending fra kameraet med avgrensende bokser rundt … vel, vaskebjørn. Du kan øke modellens nøyaktighet ved å gi flere opplæringseksempler, men husk at den er en liten liten modell (1,9 M), og den vil ha problemer med å oppdage små objekter (på grunn av lav oppløsning).

Et av spørsmålene jeg mottok i kommentarer til min forrige artikkel om bildegjenkjenning, er hvordan du sender deteksjonsresultatene over UART/I2C til en annen enhet som er koblet til Sipeed -utviklingstavler. I mitt github -depot vil du kunne finne et annet eksempelskript, raccoon_detector_uart.py, som (du gjettet det) oppdager vaskebjørner og sender koordinatene til grensebokser over UART. Husk at pins som brukes til UART -kommunikasjon er forskjellige fra forskjellige tavler. Dette er noe du må sjekke selv i dokumentasjonen.

Trinn 6: Oppsummering

Kendryte K210 er en solid chip for datasyn, fleksibel, om enn med begrenset minne tilgjengelig. Så langt, i mine opplæringsprogrammer, har vi dekket bruk av det for å gjenkjenne egendefinerte objekter, oppdage egendefinerte objekter og kjøre noen OpenMV -baserte datasynsoppgaver. Jeg vet at det også er egnet for ansiktsgjenkjenning, og med litt tinker bør det være mulig å gjøre posedeteksjon og bildesegmentering (du kan bruke aXeleRate for å trene semantisk segmenteringsmodell, men jeg har ennå ikke implementert slutningen med K210). Ta en titt på aXeleRate -depotproblemer og gjør en PR hvis du tror det er noen forbedringer du kan bidra med!

Her er noen artikler jeg brukte til å skrive denne opplæringen, ta en titt hvis du vil lære mer om gjenkjenning av objekter med nevrale nettverk:

Objektdetektorer for avgrensende bokser: å forstå YOLO, du ser bare en gang

Forstå YOLO (mer matematikk)

Skånsom guide til hvordan YOLO objektlokalisering fungerer med Keras (del 2)

Objektdeteksjon i sanntid med YOLO, YOLOv2 og nå YOLOv3

Håper du kan bruke kunnskapen du har nå til å bygge noen fantastiske prosjekter med maskinsyn! Du kan kjøpe Sipeed -brett her, de er blant de billigste alternativene som er tilgjengelige for ML på innebygde systemer.

Legg meg til på LinkedIn hvis du har spørsmål, og abonner på YouTube -kanalen min for å bli varslet om flere interessante prosjekter som involverer maskinlæring og robotikk.

Anbefalt: