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

395 lines
13 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Enkel bildeklassifisering\n",
"\n",
"Denne notatboken viser deg hvordan du kan klassifisere bilder ved hjelp av et forhåndstrent nevralt nettverk.\n",
"\n",
"**Hva du vil lære:**\n",
"- Hvordan laste inn og bruke en forhåndstrent modell\n",
"- Forbehandling av bilder\n",
"- Å gjøre prediksjoner på bilder\n",
"- Forståelse av tillitsnivåer\n",
"\n",
"**Bruksområde:** Identifisere objekter i bilder (som \"katt\", \"hund\", \"bil\", osv.)\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Steg 1: Importer nødvendige biblioteker\n",
"\n",
"La oss importere verktøyene vi trenger. Ikke bekymre deg hvis du ikke forstår alle disse ennå!\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": [
"## Steg 2: Last inn forhåndstrent modell\n",
"\n",
"Vi skal bruke **MobileNetV2**, et nevralt nettverk som allerede er trent på millioner av bilder.\n",
"\n",
"Dette kalles **Transfer Learning** - å bruke en modell som noen andre har trent!\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": [
"## Trinn 3: Hjelpefunksjoner\n",
"\n",
"La oss lage funksjoner for å laste inn og klargjøre bilder for modellen vår.\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": [
"## Steg 4: Test på eksempelbilder\n",
"\n",
"La oss prøve å klassifisere noen bilder fra internett!\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": [
"### Klassifiser Hvert Bilde\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": [
"## Steg 5: Prøv dine egne bilder!\n",
"\n",
"Bytt ut URL-en nedenfor med hvilken som helst bilde-URL du ønsker å klassifisere.\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": [
"## 💡 Hva skjedde akkurat?\n",
"\n",
"1. **Vi lastet inn en forhåndstrent modell** - MobileNetV2 ble trent på millioner av bilder\n",
"2. **Vi forhåndsprosesserte bilder** - Endret størrelse og format for modellen\n",
"3. **Modellen gjorde prediksjoner** - Den ga sannsynligheter for 1000 objektklasser\n",
"4. **Vi dekodet resultatene** - Konverterte tall til lesbare etiketter\n",
"\n",
"### Forståelse av tillitsnivåer\n",
"\n",
"- **90-100%**: Veldig sikker (nesten garantert riktig)\n",
"- **70-90%**: Sikker (sannsynligvis riktig)\n",
"- **50-70%**: Noe sikker (kan være riktig)\n",
"- **Under 50%**: Ikke veldig sikker (usikker)\n",
"\n",
"### Hvorfor kan prediksjoner være feil?\n",
"\n",
"- **Uvanlig vinkel eller belysning** - Modellen ble trent på typiske bilder\n",
"- **Flere objekter** - Modellen forventer ett hovedobjekt\n",
"- **Sjeldne objekter** - Modellen kjenner bare 1000 kategorier\n",
"- **Lav bildekvalitet** - Uklare eller pikselerte bilder er vanskeligere\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🚀 Neste steg\n",
"\n",
"1. **Prøv forskjellige bilder:**\n",
" - Finn bilder på [Unsplash](https://unsplash.com)\n",
" - Høyreklikk → \"Kopier bildeadresse\" for å få URL\n",
"\n",
"2. **Eksperimenter:**\n",
" - Hva skjer med abstrakt kunst?\n",
" - Kan den gjenkjenne objekter fra forskjellige vinkler?\n",
" - Hvordan håndterer den flere objekter?\n",
"\n",
"3. **Lær mer:**\n",
" - Utforsk [Computer Vision-leksjoner](../lessons/4-ComputerVision/README.md)\n",
" - Lær å trene din egen bildegjenkjenner\n",
" - Forstå hvordan CNN-er (Convolutional Neural Networks) fungerer\n",
"\n",
"---\n",
"\n",
"## 🎉 Gratulerer!\n",
"\n",
"Du har nettopp bygget en bildegjenkjenner ved hjelp av et toppmoderne nevralt nettverk!\n",
"\n",
"Denne teknikken brukes til:\n",
"- Google Photos (organisering av bilder)\n",
"- Selvkjørende biler (gjenkjenning av objekter)\n",
"- Medisinsk diagnostikk (analyse av røntgenbilder)\n",
"- Kvalitetskontroll (oppdage feil)\n",
"\n",
"Fortsett å utforske og lære! 🚀\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\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:47:53+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "no"
}
},
"nbformat": 4,
"nbformat_minor": 4
}