Skip to content

Latest commit

 

History

History
112 lines (65 loc) · 9.46 KB

File metadata and controls

112 lines (65 loc) · 9.46 KB

Introductie tot Computer Vision

Computer Vision is een vakgebied dat erop gericht is computers een hoog niveau van begrip van digitale afbeeldingen te geven. Dit is een vrij brede definitie, omdat begrip veel verschillende dingen kan betekenen, zoals het vinden van een object op een afbeelding (objectdetectie), begrijpen wat er gebeurt (eventdetectie), een afbeelding beschrijven in tekst, of een scène in 3D reconstrueren. Er zijn ook speciale taken die betrekking hebben op menselijke afbeeldingen: leeftijd- en emotie-inschatting, gezichtsdetectie en -identificatie, en 3D-houdingsinschatting, om er een paar te noemen.

Een van de eenvoudigste taken binnen computer vision is beeldclassificatie.

Computer vision wordt vaak beschouwd als een tak van AI. Tegenwoordig worden de meeste taken binnen computer vision opgelost met behulp van neurale netwerken. We zullen meer leren over het speciale type neurale netwerken dat wordt gebruikt voor computer vision, convolutionele neurale netwerken, in dit gedeelte.

Voordat je echter een afbeelding aan een neuraal netwerk doorgeeft, is het in veel gevallen zinvol om enkele algoritmische technieken te gebruiken om de afbeelding te verbeteren.

Er zijn verschillende Python-bibliotheken beschikbaar voor beeldverwerking:

  • imageio kan worden gebruikt voor het lezen/schrijven van verschillende afbeeldingsformaten. Het ondersteunt ook ffmpeg, een handig hulpmiddel om videoframes naar afbeeldingen te converteren.
  • Pillow (ook bekend als PIL) is iets krachtiger en ondersteunt ook enkele beeldmanipulaties zoals morphing, aanpassingen van het palet en meer.
  • OpenCV is een krachtige beeldverwerkingsbibliotheek geschreven in C++, die de de facto standaard is geworden voor beeldverwerking. Het heeft een handige Python-interface.
  • dlib is een C++-bibliotheek die veel machine learning-algoritmen implementeert, waaronder enkele algoritmen voor computer vision. Het heeft ook een Python-interface en kan worden gebruikt voor uitdagende taken zoals gezichts- en gezichtslandmarkdetectie.

OpenCV

OpenCV wordt beschouwd als de de facto standaard voor beeldverwerking. Het bevat veel nuttige algoritmen, geïmplementeerd in C++. Je kunt OpenCV ook vanuit Python aanroepen.

Een goede plek om OpenCV te leren is deze Learn OpenCV-cursus. In ons curriculum is het doel niet om OpenCV te leren, maar om je enkele voorbeelden te laten zien van wanneer het kan worden gebruikt en hoe.

Afbeeldingen laden

Afbeeldingen in Python kunnen handig worden weergegeven door NumPy-arrays. Bijvoorbeeld, grijswaardenafbeeldingen met een grootte van 320x200 pixels worden opgeslagen in een 200x320-array, en kleurenafbeeldingen van dezelfde afmetingen hebben een vorm van 200x320x3 (voor 3 kleurkanalen). Om een afbeelding te laden, kun je de volgende code gebruiken:

import cv2
import matplotlib.pyplot as plt

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

Traditioneel gebruikt OpenCV BGR (Blauw-Groen-Rood) codering voor kleurenafbeeldingen, terwijl de rest van de Python-tools de meer traditionele RGB (Rood-Groen-Blauw) gebruiken. Om ervoor te zorgen dat de afbeelding er correct uitziet, moet je deze converteren naar de RGB-kleurruimte, door ofwel de dimensies in de NumPy-array te verwisselen, of door een OpenCV-functie aan te roepen:

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

Dezelfde cvtColor-functie kan worden gebruikt om andere kleurruimte-transformaties uit te voeren, zoals het converteren van een afbeelding naar grijswaarden of naar de HSV (Hue-Saturation-Value) kleurruimte.

Je kunt OpenCV ook gebruiken om video frame-voor-frame te laden - een voorbeeld hiervan wordt gegeven in de oefening OpenCV Notebook.

Beeldverwerking

Voordat je een afbeelding aan een neuraal netwerk doorgeeft, wil je mogelijk enkele voorbewerkingsstappen toepassen. OpenCV kan veel dingen doen, waaronder:

  • Het formaat wijzigen van de afbeelding met im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS)
  • Het vervagen van de afbeelding met im = cv2.medianBlur(im,3) of im = cv2.GaussianBlur(im, (3,3), 0)
  • Het aanpassen van de helderheid en het contrast van de afbeelding kan worden gedaan door NumPy-arraymanipulaties, zoals beschreven in deze Stackoverflow-notitie.
  • Het gebruik van thresholding door de functies cv2.threshold/cv2.adaptiveThreshold aan te roepen, wat vaak de voorkeur heeft boven het aanpassen van helderheid of contrast.
  • Het toepassen van verschillende transformaties op de afbeelding:
    • Affine transformaties kunnen nuttig zijn als je rotatie, formaatwijziging en scheefheid wilt combineren in de afbeelding en je de bron- en bestemmingslocatie van drie punten in de afbeelding kent. Affine transformaties houden parallelle lijnen parallel.
    • Perspectieftransformaties kunnen nuttig zijn wanneer je de bron- en bestemmingsposities van 4 punten in de afbeelding kent. Bijvoorbeeld, als je een foto van een rechthoekig document maakt met een smartphonecamera vanuit een bepaalde hoek, en je wilt een rechthoekige afbeelding van het document zelf maken.
  • Beweging binnen de afbeelding begrijpen door gebruik te maken van optische stroom.

Voorbeelden van het gebruik van Computer Vision

In ons OpenCV Notebook geven we enkele voorbeelden van wanneer computer vision kan worden gebruikt om specifieke taken uit te voeren:

  • Voorbewerking van een foto van een Braille-boek. We richten ons op hoe we thresholding, kenmerkdetectie, perspectieftransformatie en NumPy-manipulaties kunnen gebruiken om individuele Braille-symbolen te scheiden voor verdere classificatie door een neuraal netwerk.
Braille Afbeelding Braille Afbeelding Voorbewerkt Braille Symbolen

Afbeelding uit OpenCV.ipynb

  • Beweging detecteren in video met behulp van frameverschillen. Als de camera vast staat, zouden frames van de camerafeed vrij vergelijkbaar met elkaar moeten zijn. Omdat frames worden weergegeven als arrays, krijg je door die arrays van twee opeenvolgende frames van elkaar af te trekken het pixelverschil, dat laag zou moeten zijn voor statische frames, en hoger wordt zodra er aanzienlijke beweging in de afbeelding is.

Afbeelding van videoframes en frameverschillen

Afbeelding uit OpenCV.ipynb

  • Beweging detecteren met behulp van Optische Stroom. Optische stroom stelt ons in staat te begrijpen hoe individuele pixels op videoframes bewegen. Er zijn twee soorten optische stroom:

    • Dense Optical Flow berekent het vectorveld dat voor elke pixel laat zien waar deze naartoe beweegt.
    • Sparse Optical Flow is gebaseerd op het nemen van enkele onderscheidende kenmerken in de afbeelding (bijv. randen) en het opbouwen van hun traject van frame tot frame.

Afbeelding van Optische Stroom

Afbeelding uit OpenCV.ipynb

✍️ Voorbeeld Notebooks: OpenCV probeer OpenCV in actie

Laten we enkele experimenten doen met OpenCV door OpenCV Notebook te verkennen.

Conclusie

Soms kunnen relatief complexe taken zoals bewegingsdetectie of vingertopdetectie puur door middel van computer vision worden opgelost. Het is daarom erg nuttig om de basistechnieken van computer vision te kennen en te weten wat bibliotheken zoals OpenCV kunnen doen.

🚀 Uitdaging

Bekijk deze video van de AI-show om meer te leren over het Cortic Tigers-project en hoe zij een blokgebaseerde oplossing hebben gebouwd om computervision-taken te democratiseren via een robot. Doe wat onderzoek naar andere projecten zoals deze die nieuwe leerlingen helpen om het vakgebied binnen te komen.

Review & Zelfstudie

Lees meer over optische stroom in deze geweldige tutorial.

In deze lab ga je een video maken met eenvoudige gebaren, en jouw doel is om op/neer/links/rechts bewegingen te extraheren met behulp van optische stroom.

Palm Movement Frame