Skip to content

Latest commit

 

History

History
112 lines (65 loc) · 8.86 KB

File metadata and controls

112 lines (65 loc) · 8.86 KB

Introduktion till datorseende

Computer Vision är ett område som syftar till att ge datorer en hög nivå av förståelse för digitala bilder. Detta är en ganska bred definition, eftersom förståelse kan innebära många olika saker, inklusive att hitta ett objekt på en bild (objektdetektion), förstå vad som händer (händelsedetektion), beskriva en bild i text eller rekonstruera en scen i 3D. Det finns också specifika uppgifter relaterade till bilder av människor: ålders- och känsloestimering, ansiktsdetektion och identifiering, samt 3D-positionsestimering, för att nämna några.

En av de enklaste uppgifterna inom datorseende är bildklassificering.

Datorseende anses ofta vara en gren av AI. Idag löses de flesta uppgifter inom datorseende med hjälp av neurala nätverk. Vi kommer att lära oss mer om den speciella typen av neurala nätverk som används för datorseende, konvolutionella neurala nätverk, under denna sektion.

Men innan du skickar en bild till ett neuralt nätverk kan det i många fall vara vettigt att använda vissa algoritmiska tekniker för att förbättra bilden.

Det finns flera Python-bibliotek tillgängliga för bildbehandling:

  • imageio kan användas för att läsa/skriva olika bildformat. Det stöder också ffmpeg, ett användbart verktyg för att konvertera videoramar till bilder.
  • Pillow (även känt som PIL) är lite mer kraftfullt och stöder även viss bildmanipulation som morfning, palettjusteringar och mer.
  • OpenCV är ett kraftfullt bildbehandlingsbibliotek skrivet i C++, som har blivit standard för bildbehandling. Det har ett bekvämt Python-gränssnitt.
  • dlib är ett C++-bibliotek som implementerar många maskininlärningsalgoritmer, inklusive några av datorseendealgoritmerna. Det har också ett Python-gränssnitt och kan användas för utmanande uppgifter som ansikts- och ansiktslandmärkesdetektion.

OpenCV

OpenCV anses vara standard för bildbehandling. Det innehåller många användbara algoritmer, implementerade i C++. Du kan också använda OpenCV från Python.

En bra plats att lära sig OpenCV är denna Learn OpenCV-kurs. I vår kursplan är målet inte att lära sig OpenCV, utan att visa några exempel på när det kan användas och hur.

Ladda bilder

Bilder i Python kan bekvämt representeras av NumPy-arrayer. Till exempel skulle gråskalebilder med storleken 320x200 pixlar lagras i en 200x320-array, och färgbilder med samma dimension skulle ha formen 200x320x3 (för 3 färgkanaler). För att ladda en bild kan du använda följande kod:

import cv2
import matplotlib.pyplot as plt

im = cv2.imread('image.jpeg')
plt.imshow(im)

Traditionellt använder OpenCV BGR (Blå-Grön-Röd) kodning för färgbilder, medan resten av Python-verktygen använder den mer traditionella RGB (Röd-Grön-Blå). För att bilden ska se rätt ut måste du konvertera den till RGB-färgrymden, antingen genom att byta dimensioner i NumPy-arrayen eller genom att kalla en OpenCV-funktion:

im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)

Samma cvtColor-funktion kan användas för att utföra andra färgrymdstransformationer, såsom att konvertera en bild till gråskala eller till HSV (Hue-Saturation-Value) färgrymden.

Du kan också använda OpenCV för att ladda videor bildruta för bildruta - ett exempel ges i övningen OpenCV Notebook.

Bildbehandling

Innan du matar en bild till ett neuralt nätverk kan du vilja tillämpa flera förbehandlingssteg. OpenCV kan göra många saker, inklusive:

  • Ändra storlek på bilden med im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS)
  • Suddighet på bilden med im = cv2.medianBlur(im,3) eller im = cv2.GaussianBlur(im, (3,3), 0)
  • Ändra ljusstyrka och kontrast på bilden kan göras med NumPy-arraymanipulationer, som beskrivs i denna Stackoverflow-notis.
  • Använda tröskling genom att kalla cv2.threshold/cv2.adaptiveThreshold-funktioner, vilket ofta är att föredra framför att justera ljusstyrka eller kontrast.
  • Tillämpa olika transformationer på bilden:
    • Affina transformationer kan vara användbara om du behöver kombinera rotation, storleksändring och skevhet på bilden och du vet käll- och destinationspositionen för tre punkter i bilden. Affina transformationer håller parallella linjer parallella.
    • Perspektivtransformationer kan vara användbara när du vet käll- och destinationspositionen för fyra punkter i bilden. Till exempel, om du tar en bild av ett rektangulärt dokument med en smartphonekamera från en viss vinkel och vill göra en rektangulär bild av själva dokumentet.
  • Förstå rörelse i bilden genom att använda optisk flöde.

Exempel på användning av datorseende

I vår OpenCV Notebook ger vi några exempel på när datorseende kan användas för att utföra specifika uppgifter:

  • Förbehandling av ett fotografi av en Braille-bok. Vi fokuserar på hur vi kan använda tröskling, funktionsdetektion, perspektivtransformation och NumPy-manipulationer för att separera individuella Braille-symboler för vidare klassificering av ett neuralt nätverk.
Braille Image Braille Image Pre-processed Braille Symbols

Bild från OpenCV.ipynb

  • Detektera rörelse i video med hjälp av bildruteskillnad. Om kameran är fast, bör bildrutor från kameraflödet vara ganska lika varandra. Eftersom bildrutor representeras som arrayer, kan vi genom att subtrahera dessa arrayer för två efterföljande bildrutor få pixeldifferensen, som bör vara låg för statiska bildrutor och bli högre när det finns betydande rörelse i bilden.

Image of video frames and frame differences

Bild från OpenCV.ipynb

  • Detektera rörelse med hjälp av optiskt flöde. Optiskt flöde gör det möjligt för oss att förstå hur individuella pixlar på videobildrutor rör sig. Det finns två typer av optiskt flöde:

    • Tätt optiskt flöde beräknar vektorfältet som visar för varje pixel var den rör sig.
    • Gles optiskt flöde baseras på att ta några distinkta funktioner i bilden (t.ex. kanter) och bygga deras bana från bildruta till bildruta.

Image of Optical Flow

Bild från OpenCV.ipynb

✍️ Exempel Notebooks: OpenCV prova OpenCV i praktiken

Låt oss göra några experiment med OpenCV genom att utforska OpenCV Notebook

Slutsats

Ibland kan relativt komplexa uppgifter som rörelsedetektion eller fingertoppsdetektion lösas enbart med datorseende. Därför är det mycket användbart att känna till de grundläggande teknikerna inom datorseende och vad bibliotek som OpenCV kan göra.

🚀 Utmaning

Titta på denna video från AI-showen för att lära dig om Cortic Tigers-projektet och hur de byggde en blockbaserad lösning för att demokratisera datorseendeuppgifter via en robot. Gör lite forskning om andra projekt som detta som hjälper nya lärande att komma in i området.

Granskning & Självstudier

Läs mer om optiskt flöde i denna utmärkta handledning.

I detta labb kommer du att ta en video med enkla gester, och ditt mål är att extrahera upp/ner/vänster/höger rörelser med hjälp av optiskt flöde.

Palm Movement Frame