Je werpt een blik op een foto en herkent meteen een hond, een auto of het gezicht van je beste vriend. Je brein doet dit moeiteloos โ maar voor een computer is "zien" een ongelooflijk complexe taak.
Computer vision is het vakgebied binnen AI dat machines het vermogen geeft om visuele informatie uit de wereld te interpreteren en te begrijpen โ afbeeldingen, video's en live camerabeelden.
Voor een computer is een afbeelding niets meer dan een raster van getallen.
# Loading an image and viewing its pixel values
from PIL import Image
import numpy as np
img = Image.open("dog.jpg")
pixels = np.array(img)
print(f"Image shape: {pixels.shape}")
# Output example: (480, 640, 3) โ 480 rows, 640 columns, 3 colour channels
print(f"Total pixel values: {pixels.size:,}")
# Output example: 921,600
# A single pixel in the top-left corner
print(f"Top-left pixel (R, G, B): {pixels[0, 0]}")
# Output example: [142, 178, 225] โ a light blue sky pixel
Ruwe pixelwaarden zijn op zichzelf betekenisloos. De AI moet kenmerken detecteren โ betekenisvolle patronen:
Zie het als leren lezen: eerst leer je letters (laagniveau), dan woorden (middenniveau) en vervolgens zinnen en betekenis (hoogniveau).
De menselijke visuele cortex verwerkt beelden ook in lagen! Neuronen dicht bij je ogen detecteren eenvoudige randen en kleuren, terwijl diepere hersengebieden complexe objecten en gezichten herkennen. CNN's zijn letterlijk geรฏnspireerd op deze biologische architectuur.
Het Convolutioneel Neuraal Netwerk is het werkpaard van computer vision. Laten we een intuรฏtie opbouwen voor hoe het werkt โ geen zware wiskunde nodig.
Stel je voor dat je een klein vergrootglas (van bijvoorbeeld 3ร3 pixels) op een afbeelding plaatst en het over elke positie schuift. Op elke positie zoekt het filter naar een specifiek patroon โ een verticale rand, een horizontale lijn, een bocht.
Elk filter produceert een nieuwe afbeelding genaamd een featuremap die laat zien waar dat patroon is gevonden.
| Laag | Wat Het Doet | Analogie | |------|-------------|----------| | Convolutioneel | Schuift filters over de afbeelding om kenmerken te detecteren | Een detective die elke centimeter van een plaats delict onderzoekt met een vergrootglas | | Activatie (ReLU) | Behoudt alleen de sterke signalen, verwijdert ruis | Belangrijk bewijs markeren en afleidingen negeren | | Pooling | Verkleint de featuremaps met behoud van belangrijke informatie | Een hoofdstuk samenvatten in kernpunten | | Volledig Verbonden | Combineert alle kenmerken om een eindbeslissing te nemen | De jury beraadslaagt en komt tot een uitspraak |
# Building a simple CNN with TensorFlow/Keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
model = Sequential([
# First convolutional layer: 32 filters, 3x3 each
Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
MaxPooling2D(pool_size=(2, 2)),
# Second convolutional layer: 64 filters
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
# Flatten and classify
Flatten(),
Dense(128, activation='relu'),
Dense(10, activation='softmax'), # 10 classes
])
model.summary()
Je hoeft filters niet met de hand te ontwerpen! Tijdens het trainen leert het CNN welke filters het nuttigst zijn. Vroege lagen leren mogelijk randen te detecteren, terwijl diepere lagen leren om oren, ogen of volledige gezichten te herkennen โ allemaal automatisch vanuit data.
Vraag: "Wat staat er op deze afbeelding?"
Het model kent รฉรฉn enkel label toe aan de volledige afbeelding: "kat", "auto", "pizza".
Dit is wat je hebt geleerd bij AI Sprouts โ geef het model een afbeelding en je krijgt een label terug.
Vraag: "Welke objecten zijn hier, en waar bevinden ze zich?"
Het model tekent begrenzingskaders rond elk object en labelt ze. Dit is wat zelfrijdende auto's gebruiken om voetgangers, verkeersborden en andere voertuigen te lokaliseren.
Vraag: "Welke exacte pixels horen bij welk object?"
Het model kleurt elke pixel met zijn objectklasse. Dit levert pixelperfecte contouren op โ essentieel voor medische beeldvorming (tumorcontouren) en AR-filters (je gezicht scheiden van de achtergrond).
# Using a pre-trained object detection model
# This uses YOLO (You Only Look Once) โ one of the fastest detectors
# Pseudocode for clarity
def detect_objects(image_path):
"""Detect and label objects in an image."""
model = load_pretrained_model("yolov8")
image = load_image(image_path)
results = model.predict(image)
for detection in results:
print(f"Object: {detection.label}")
print(f" Confidence: {detection.confidence:.1%}")
print(f" Location: {detection.bounding_box}")
print()
# Example output:
# Object: person
# Confidence: 97.2%
# Location: (120, 50, 340, 480)
# Object: bicycle
# Confidence: 89.5%
# Location: (200, 300, 450, 520)
Zelfrijdende auto's moeten objecten in real-time detecteren โ zo'n 30 beelden per seconde verwerken. Dat betekent dat de AI ongeveer 33 milliseconden heeft om elk beeld te analyseren. Hoe denk je dat ingenieurs nauwkeurigheid en snelheid in balans brengen? Wat gebeurt er als het model 99,9% nauwkeurig is maar 1 miljoen beelden per dag verwerkt?
Het YOLO-model (You Only Look Once) voor objectdetectie kan meer dan 45 beelden per seconde verwerken op een moderne GPU. De bedenker, Joseph Redmon, stopte uiteindelijk met zijn onderzoek vanwege ethische bezwaren over hoe de technologie gebruikt zou kunnen worden voor surveillance en militaire toepassingen.
Je hoeft geen model helemaal zelf te trainen om met computer vision te experimenteren. Voorgetrainde modellen zoals ResNet, MobileNet of EfficientNet hebben al geleerd van miljoenen afbeeldingen.
# Using a pre-trained model to classify an image
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import (
preprocess_input, decode_predictions
)
from tensorflow.keras.preprocessing import image
import numpy as np
# Load pre-trained MobileNetV2 (trained on ImageNet โ 1000 classes)
model = MobileNetV2(weights='imagenet')
# Load and preprocess an image
img = image.load_img("photo.jpg", target_size=(224, 224))
img_array = preprocess_input(
np.expand_dims(image.img_to_array(img), axis=0)
)
# Get predictions
predictions = model.predict(img_array)
top_3 = decode_predictions(predictions, top=3)[0]
print("Top 3 Predictions:")
for rank, (id, label, confidence) in enumerate(top_3, 1):
bar = "โ" * int(confidence * 40)
print(f" {rank}. {label}: {confidence:.1%} {bar}")
# Example output:
# 1. golden_retriever: 92.3% โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# 2. Labrador_retriever: 4.1% โโ
# 3. cocker_spaniel: 1.8% โ
MobileNetV2 is specifiek ontworpen om op mobiele telefoons te draaien. Het heeft slechts 3,4 miljoen parameters โ vergeleken met de 60 miljoen van ResNet-152 โ en behoudt daarbij indrukwekkende nauwkeurigheid. Dit wordt bereikt door "depthwise separable convolutions," een slimme architecturale truc die de berekeningen vermindert.
Grote kracht brengt grote verantwoordelijkheid met zich mee:
De technologie zelf is neutraal โ het gaat erom hoe wij ervoor kiezen om haar in te zetten.
Je hebt nu drie krachtige takken van AI verkend: toepassingen in de gezondheidszorg, natuurlijke taalverwerking en computer vision. Dit zijn de fundamenten waarop echte AI-ingenieurs elke dag bouwen. In komende lessen duiken we in AI in de creatieve kunsten โ hoe machines muziek, kunst en verhalen genereren!