/ComputerVision

En repo för det vi gör inom Computer Vision

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

Computer Vision

Table of Contents

OpenCV

Grunder

I grunderna finns det två alternativ (Open CV Python Tut For Beginners och Afshins Open CV tutorial) både är väldigt bra, kika och se vilken du gillar och vill följa.

Gör de delar du tycker verkar spännande på videorna och gå sen vidare, ladda ner exempelkod och experimentera runt, nu ska vi lära oss!

Codebinds hemsida för kodexempel Afshins github med kodexempel

Kul Bonus Rita med webbkameran

Webcam Paint Application Using OpenCV, följ guiden och lär dig göra ett eget paint-program med webbkameran. Titta i files/Webcam_Paint_OpenCV för fungerande exempelkod att ha som referens. Den på hans github, fungerade inte senast jag tittade. Exempel på delar man kan utveckla:

  • Lägga till fler färger
  • Ha för valda objekt som skapas
  • spara ner som en bild

Road Recognition

För road recognition har vi också två val (vilken lyx!).

  • Det första alternativet är att man fortsätter med programming Knowledges serie och hoppar till video 30?(Kan vara redan 28) Värt att veta om denna är att jag inte har kikat på den själv och vet inte kvaliteteten den håller.

  • Det andra alternativet är att man följer Self-Driving Car video serien (filväg nedan). Den är mycket bra i min mening, kan rekomenderas starkt! Teams\TEBLOCK1X0s\Files\TEBLOCK\Resurser\Videor\Self-Driving Car\5. Computer Vision Finding Lane Lines

YOLO!! You only look once (Object detection)

YOLO är en algoritm för att finna objekt på en bild,video eller live-ström. denna bygger på neurala nätverk och fungerar så att den kolla på bilden i helhet och tittar sedan endast på delar som ändras. Detta gör att den är mycket snabbare och än algoritmer som tittar på varje pixel i bilden varje gång. Det försa vi ska göra är att ladda ner ett förtränat set med yolo object. Dessa kallas Coco och kan identifera 80 olika förbestämda objekt som telefon, flygplan, person osv. Vi ska senare titta på hur vi kan träna egna objekt, samt hur vi kan exportera dem till mikrokontrollen.

Följ guiden i länken ovan, här är en till bra resurs som kan ge extra koll.

Filerna guiden pratar om finns i Githubben Computer Vision, det kan vara lättare att ladda ner dem därifrån.

Länkar till vikterna

Lägg dessa i deras respektive mapp, Coco i yolo-coco osv. Coco vikt Danger vikt Lego vikt

Föj guiden, för att starta koden så rekomenderar jag att man gör som på bilden nedan och skriver in följande kod (exempel finns längre ned). python kodnamn.py --image images/bild.biltyp --yolo yolomapp

Öppna CMD

Exempelkod

Exmpelkod ligger i submappen yolo-openCV-detector här på github, där finns tre olika typer av yolo set:

  • yolo-coco, samma som i exemplet.
  • yolo-danger, tränade på att se farliga material skyltar.
  • yolo-legogubbe- tränad på att känna igen legogubbar.

Förövrigt finns det en mapp med exempelbilder som man kan testa yolon på. I settet legogubbar finns flera olika vikter, testa gärna flera av dem genom att byta namn på den man vill testa till yolo.weights, blir det någon skillnad? Det finns även kod för det han gör i guiden och två fortsättningar:

1.yoloopencvimage.py 1.5.yolotestimage.py 2.yoloopencamera.py

Fortsättningarna går jag igenom här(yolo-openCV-detector/README). yolo1

Kommandon

python 1.yoloopencvimage.py --image images/room.png --yolo yolo-coco
python 1.yoloopencvimage.py --image images/danger2.jpg --yolo yolo-danger
python 1.yoloopencvimage.py --image images/dangerbig.jpg --yolo yolo-danger --confidence 0.7
//--yolo yolo-danger --confidence 0.7 Fungerar även för 1,5 och två
python 1.5.yolotestimage.py  --yolo yolo-legogubbe
python 2.yoloopencamera.py  --yolo yolo-legogubbe

python 1.yoloopencvimage.py --image images/legogang.jpg --yolo yolo-legogubbe

Google Colab

Träna yolo i molnet med keras

I detta avsnitt ska vi testa träna yolo, detta ska vi göra i molnet så sparar vi på vår egna dators datakraft. I vårt fall ska vi använda Google Colabs vilket är ett verktyg som kör pythonkod liknande jupyter notebook på googles servrar. Där får man 12 gb ram och kan använda denna virtuella maskinen i 12 timmar innan den startas om. För att träna saker längre än tolv timmar kan man spara sina vikter mellan varven och starta upp igen när maskinen startats om.

Vi ska följa en guide som lär oss hur man gör en yolo vikt som kan känna igen tvättbjörnar. Ni följer instruktionerna i guiden men gör fet via google, se länken nedan.

För detta behöver du först skapa ett googlekonto om du inte redan har ett och gå sedan in på länken här (Ny länk

(Gammal länk).

Gör det först för racoon datasettet, testa sedan ändra om så du kan göra det för legogubbarna.

Skapa eget yolo-dataset

Det du vill tänka på när du gör ditt eget datasett är att få ut det mesta av det, om du tränar det att se hästar vill du inte bara ha exempel på bruna hästar för då kanske den inte förstår att en vit häst är en häst. Du vill inte heller ha bara bilder på ensamma hästar för då kanske settet inte förstår att det kan vara flera hästar på samma bild. Du vill inte heller ha att alla hästar står från samma håll för då tror AIn att det är enda sättet hästar står på och alla som står annorlunda är då inte hästar. Lego exemplet är bra exempel att titta på, försök se fel i testbilderna som lego-settet missar och fundera varför.

Söktips

site:https://brickset.com/minifigs
site:http://www.collectibleminifigs.com
python download_images.py --urls urls.txt --output images

Denna guide lär dig albela ett dataset på NFCA artiklar. Den har redan en färdig bildsamling som du kan använda för att testa köra koden med.

När du ska skapa din egen data så är den här yolo annotation tool mycket bra så kör med den istället för den som rekomenderas i guiden.

Istället för main.py i artikeln så använd den här, main.py den är omgjord för python 3, se till att ha laddat ner alla bibliotek via pip för att få koden att fungera! När programmet är öppnat så måste du se till att ha bilderna liggande i en mapp som heter images och inuti en submapp som heter det du vill kalla ditt data set. Exempel images/bilar/volvo1.jpg, images/bilar/volvo2.jpg... Då kan du sedan skriva in bilar i rutan i programmet så kommer den gå igenom alla bilder i mappen.

python main.py

Images example

För att köra i karas

Bild endelse

I karas måste bilderna vara av filtypen .JPEG för att kunna tränas. För att göra om bilder till .JPEG istället för jpg eller png. så finns det verktyget rekomenderat i guiden annars finns även ett simpeplt python skript jag har gjort(renamer) Du väljer bara mappen renamer ska köras i och kör scriptet så byter den endelse på objektet. Detta får inte göras innan du labelat bilderna för då visas de inte upp i annotationtool!. Råkar du dock göra det så är det enkelt att ändra om i koden för renamer så den gör motsatta, det vill säga från JPEG till jpg.

python renamer.py

Label konverterare

Du måste också konvertera dina labels till voc format, det vill säga xml istället för .txt. Detta gär vi genom att ladda ner pythonscriptet yolo-voc-converter.py, ändrar om det så klasstyp och mapp stämmer för dig. För att få detta och fungera måste bilderna och labels ligga i samma mapp. Du kan till exempel lägga både bilder och labels direkt i label mappen.

python yolo-voc-converter.py Label

Ladda upp

Efter detta så är det bara att antingen ladda upp ditt datasett till en github repo och länka den till keras koden på google colab via github clone eller att ladda upp det via gdrive eller manuellt via ladda upp knappen. Våga vinn!

Mappstrukturen jag rekommenderar är detta.

annotations/
annotations_xml/
images/
testing_annotations_xml/
testing_images/
Readme.md

Förklaring

I mappen

  • annotations bör det ligga labels som txt-filer, detta för att man ska kunna träna yolo med darknet om man vill.
  • annotations_xml ska det ligga labesl som xml filer, detta för att man ska kunna träna med Keras.
  • images, bilderna som ska användas för träning
  • testing_annotations_xml, annotations som xml för validering/testing
  • testing_images, bilderna som ska användas för validering/testing
  • Readme, förklarar vad datasettet är och vad som ligger på de olika platserna.

Varför finns ingen testing för .txt filerna? Jo det finns inte för att i darknet så skickar man in två listor(dessa skapas av process.py i annotation-tool) en för test och en för träning. De kan därför ligga kvar i samma mappar.

OpenMV

Köra Yolo på MAIX Dock (mikrokontroll)

MAiX Dock För att köra Yolo på MAIX Dock så måste man följa följande steg.

  1. Ladda ner kflash_gui Teams\TEBLOCK1X0s\Files\TEBLOCK\Årskurs 2\Artificel inteligens\Computer Vision\MAIXPY (Sipeed)
  2. Ladda ner och installera senaste versionen av maixpy-ide-windows(0.2.4 har vi i mappen). Teams\TEBLOCK1X0s\Files\TEBLOCK\Årskurs 2\Artificel inteligens\Computer Vision\MAIXPY (Sipeed)\kmodels
  3. Ladda ner och flasha senaste versionen av maixpy (v0.5.0_0_gae433e8 har vi i mappen) genom att öppna Kflash_gui. Flash Bin
  4. Ladda ner och flasha din kmodel till rätt plats i mikrokontrollens minne eller till ett sdkort (se lista nedan) Flash Kmodel

OM DU inte får upp några COM-portar så måste du uppdatera drivers manuellt. Denna heter CH34x_Install_Windows_v3_4 och ligger i Teams\TEBLOCK1X0s\Files\TEBLOCK\Årskurs 2\Artificel inteligens\Computer Vision\MAIXPY (Sipeed)\

Du kan få install error men det är okej.

Minnesplats och maixpy version

  • 20class.kmodel= 0x500000 - vanliga
  • racoon.kmodel= 0x600000 - vanliga
  • lego.kmodel= 0x600000 - vanliga

Hur ska man tänka?

Tänk att dina egenskapade kmodels bör vara på plats 0x600000 och att de ofta bör ha minimum_with_ide_support då de är större än de förskapade sakerna.

  1. Öppna MAiX IDE och anslut till mikrokontrollern via den gröna knappen i vänstra hörnet (se bild). När den knappen har blivit röd så är du ansluten och kan trycka på playknappen under. När den har blivit ett rött kryss så är koden överförd till mikrokontrollen och den körs. Du kan nu använda din mikrokontroll och glöm inte att kika i serialmonitorn(också med på bilden, längst ner i mitten). Anslut

Om den inte vill ansluta vad kan det vara för fel då?

  • Ett fel kan vara att du har bränt det till fel flashdel, t.ex 0x60000 istället för 0x600000 eller 0x500000, titta noga och gör om.
  • Man kan ha för stor kmodel och måste använda maixpy_minimum_with_ide_support eller maixpy_minimum istället för vanliga maixpy.

Legogubbe

Road following

För att kunna hitta vägar eller streck i allmänhet i openMV så gör man lite annorlunda än i OpenCV, tankesättet är detsamma men tillvägagångsättet varierar. Här har jag gjort en kodsnutt som hittar ett streck i mitten av skärmen. Det kan man ha som grund när man bygger på och utvecklar det till något som mer liknar resultatet i OpenCV, om det behövs, vill säga.

Här kommer några bra resurser för att kunna göra din egen road recognition eller bara bli bättre på OpenMV överlag. Testa dessa, ändra saker,få inspiration, lek och få det till något bra, våga vinn: