AI-For-Beginners/translations/nl/examples/03-image-classifier.ipynb

395 lines
13 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Eenvoudige Beeldclassifier\n",
"\n",
"Deze notebook laat zien hoe je afbeeldingen kunt classificeren met behulp van een vooraf getraind neuraal netwerk.\n",
"\n",
"**Wat je zult leren:**\n",
"- Hoe je een vooraf getraind model laadt en gebruikt\n",
"- Beeldvoorverwerking\n",
"- Voorspellingen maken op afbeeldingen\n",
"- Begrijpen van vertrouwensscores\n",
"\n",
"**Toepassing:** Objecten in afbeeldingen identificeren (zoals \"kat\", \"hond\", \"auto\", enz.) \n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stap 1: Vereiste bibliotheken importeren\n",
"\n",
"Laten we de benodigde tools importeren. Maak je geen zorgen als je ze nog niet allemaal begrijpt!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Core libraries\n",
"import numpy as np\n",
"from PIL import Image\n",
"import requests\n",
"from io import BytesIO\n",
"\n",
"# TensorFlow for deep learning\n",
"try:\n",
" import tensorflow as tf\n",
" from tensorflow.keras.applications import MobileNetV2\n",
" from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions\n",
" print(\"✅ TensorFlow loaded successfully!\")\n",
" print(f\" Version: {tf.__version__}\")\n",
"except ImportError:\n",
" print(\"❌ Please install TensorFlow: pip install tensorflow\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stap 2: Vooraf getraind model laden\n",
"\n",
"We gebruiken **MobileNetV2**, een neuraal netwerk dat al is getraind op miljoenen afbeeldingen.\n",
"\n",
"Dit wordt **Transfer Learning** genoemd - het gebruiken van een model dat door iemand anders is getraind!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"📦 Loading pre-trained MobileNetV2 model...\")\n",
"print(\" This may take a minute on first run (downloading weights)...\")\n",
"\n",
"# Load the model\n",
"# include_top=True means we use the classification layer\n",
"# weights='imagenet' means it was trained on ImageNet dataset\n",
"model = MobileNetV2(weights='imagenet', include_top=True)\n",
"\n",
"print(\"✅ Model loaded!\")\n",
"print(f\" The model can recognize 1000 different object categories\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stap 3: Hulpfuncties\n",
"\n",
"Laten we functies maken om afbeeldingen te laden en voor te bereiden voor ons model.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def load_image_from_url(url):\n",
" \"\"\"\n",
" Load an image from a URL.\n",
" \n",
" Args:\n",
" url: Web address of the image\n",
" \n",
" Returns:\n",
" PIL Image object\n",
" \"\"\"\n",
" response = requests.get(url)\n",
" img = Image.open(BytesIO(response.content))\n",
" return img\n",
"\n",
"\n",
"def prepare_image(img):\n",
" \"\"\"\n",
" Prepare an image for the model.\n",
" \n",
" Steps:\n",
" 1. Resize to 224x224 (model's expected size)\n",
" 2. Convert to array\n",
" 3. Add batch dimension\n",
" 4. Preprocess for MobileNetV2\n",
" \n",
" Args:\n",
" img: PIL Image\n",
" \n",
" Returns:\n",
" Preprocessed image array\n",
" \"\"\"\n",
" # Resize to 224x224 pixels\n",
" img = img.resize((224, 224))\n",
" \n",
" # Convert to numpy array\n",
" img_array = np.array(img)\n",
" \n",
" # Add batch dimension (model expects multiple images)\n",
" img_array = np.expand_dims(img_array, axis=0)\n",
" \n",
" # Preprocess for MobileNetV2\n",
" img_array = preprocess_input(img_array)\n",
" \n",
" return img_array\n",
"\n",
"\n",
"def classify_image(img):\n",
" \"\"\"\n",
" Classify an image and return top predictions.\n",
" \n",
" Args:\n",
" img: PIL Image\n",
" \n",
" Returns:\n",
" List of (class_name, confidence) tuples\n",
" \"\"\"\n",
" # Prepare the image\n",
" img_array = prepare_image(img)\n",
" \n",
" # Make prediction\n",
" predictions = model.predict(img_array, verbose=0)\n",
" \n",
" # Decode predictions to human-readable labels\n",
" # top=5 means we get the top 5 most likely classes\n",
" decoded = decode_predictions(predictions, top=5)[0]\n",
" \n",
" # Convert to simpler format\n",
" results = [(label, float(confidence)) for (_, label, confidence) in decoded]\n",
" \n",
" return results\n",
"\n",
"\n",
"print(\"✅ Helper functions ready!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stap 4: Testen op voorbeeldafbeeldingen\n",
"\n",
"Laten we enkele afbeeldingen van het internet classificeren!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Sample images to classify\n",
"# These are from Unsplash (free stock photos)\n",
"test_images = [\n",
" {\n",
" \"url\": \"https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba?w=400\",\n",
" \"description\": \"A cat\"\n",
" },\n",
" {\n",
" \"url\": \"https://images.unsplash.com/photo-1552053831-71594a27632d?w=400\",\n",
" \"description\": \"A dog\"\n",
" },\n",
" {\n",
" \"url\": \"https://images.unsplash.com/photo-1511919884226-fd3cad34687c?w=400\",\n",
" \"description\": \"A car\"\n",
" },\n",
"]\n",
"\n",
"print(f\"🧪 Testing on {len(test_images)} images...\")\n",
"print(\"=\" * 70)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Classificeer Elke Afbeelding\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for i, img_data in enumerate(test_images, 1):\n",
" print(f\"\\n📸 Image {i}: {img_data['description']}\")\n",
" print(\"-\" * 70)\n",
" \n",
" try:\n",
" # Load image\n",
" img = load_image_from_url(img_data['url'])\n",
" \n",
" # Display image\n",
" display(img.resize((200, 200))) # Show smaller version\n",
" \n",
" # Classify\n",
" results = classify_image(img)\n",
" \n",
" # Show predictions\n",
" print(\"\\n🎯 Top 5 Predictions:\")\n",
" for rank, (label, confidence) in enumerate(results, 1):\n",
" # Create a visual bar\n",
" bar_length = int(confidence * 50)\n",
" bar = \"█\" * bar_length\n",
" \n",
" print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n",
" \n",
" except Exception as e:\n",
" print(f\"❌ Error: {e}\")\n",
"\n",
"print(\"\\n\" + \"=\" * 70)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stap 5: Probeer je eigen afbeeldingen!\n",
"\n",
"Vervang de onderstaande URL door een willekeurige afbeeldings-URL die je wilt classificeren.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Try your own image!\n",
"# Replace this URL with any image URL\n",
"custom_image_url = \"https://images.unsplash.com/photo-1472491235688-bdc81a63246e?w=400\" # A flower\n",
"\n",
"print(\"🖼️ Classifying your custom image...\")\n",
"print(\"=\" * 70)\n",
"\n",
"try:\n",
" # Load and show image\n",
" img = load_image_from_url(custom_image_url)\n",
" display(img.resize((300, 300)))\n",
" \n",
" # Classify\n",
" results = classify_image(img)\n",
" \n",
" # Show results\n",
" print(\"\\n🎯 Top 5 Predictions:\")\n",
" print(\"-\" * 70)\n",
" for rank, (label, confidence) in enumerate(results, 1):\n",
" bar_length = int(confidence * 50)\n",
" bar = \"█\" * bar_length\n",
" print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n",
" \n",
" # Highlight top prediction\n",
" top_label, top_confidence = results[0]\n",
" print(\"\\n\" + \"=\" * 70)\n",
" print(f\"\\n🏆 Best guess: {top_label} ({top_confidence*100:.2f}% confident)\")\n",
" \n",
"except Exception as e:\n",
" print(f\"❌ Error: {e}\")\n",
" print(\" Make sure the URL points to a valid image!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 💡 Wat is er net gebeurd?\n",
"\n",
"1. **We hebben een voorgetraind model geladen** - MobileNetV2 is getraind op miljoenen afbeeldingen\n",
"2. **We hebben afbeeldingen vooraf verwerkt** - Ze zijn aangepast en geformatteerd voor het model\n",
"3. **Het model heeft voorspellingen gedaan** - Het gaf waarschijnlijkheden voor 1000 objectklassen\n",
"4. **We hebben de resultaten gedecodeerd** - Nummers zijn omgezet naar menselijk leesbare labels\n",
"\n",
"### Begrijpen van vertrouwensscores\n",
"\n",
"- **90-100%**: Zeer zeker (bijna zeker correct)\n",
"- **70-90%**: Zeker (waarschijnlijk correct)\n",
"- **50-70%**: Enigszins zeker (misschien correct)\n",
"- **Onder 50%**: Niet erg zeker (onzeker)\n",
"\n",
"### Waarom kunnen voorspellingen fout zijn?\n",
"\n",
"- **Ongewone hoek of belichting** - Het model is getraind op typische foto's\n",
"- **Meerdere objecten** - Het model verwacht één hoofdobject\n",
"- **Zeldzame objecten** - Het model kent slechts 1000 categorieën\n",
"- **Lage kwaliteit afbeelding** - Vage of gepixelde afbeeldingen zijn moeilijker\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🚀 Volgende stappen\n",
"\n",
"1. **Probeer verschillende afbeeldingen:**\n",
" - Zoek afbeeldingen op [Unsplash](https://unsplash.com)\n",
" - Rechtsklik → \"Afbeeldingsadres kopiëren\" om de URL te verkrijgen\n",
"\n",
"2. **Experimenteer:**\n",
" - Wat gebeurt er met abstracte kunst?\n",
" - Kan het objecten vanuit verschillende hoeken herkennen?\n",
" - Hoe gaat het om met meerdere objecten?\n",
"\n",
"3. **Meer leren:**\n",
" - Verken [lessen over Computer Vision](../lessons/4-ComputerVision/README.md)\n",
" - Leer hoe je je eigen beeldclassifier kunt trainen\n",
" - Begrijp hoe CNNs (Convolutionele Neurale Netwerken) werken\n",
"\n",
"---\n",
"\n",
"## 🎉 Gefeliciteerd!\n",
"\n",
"Je hebt zojuist een beeldclassifier gebouwd met behulp van een geavanceerd neuraal netwerk!\n",
"\n",
"Deze techniek wordt ook gebruikt voor:\n",
"- Google Foto's (het organiseren van je foto's)\n",
"- Zelfrijdende auto's (het herkennen van objecten)\n",
"- Medische diagnoses (het analyseren van röntgenfoto's)\n",
"- Kwaliteitscontrole (het opsporen van defecten)\n",
"\n",
"Blijf ontdekken en leren! 🚀\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.0"
},
"coopTranslator": {
"original_hash": "1d472141d9df46b751542b3c29f88677",
"translation_date": "2025-10-03T11:48:39+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "nl"
}
},
"nbformat": 4,
"nbformat_minor": 4
}