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

397 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Yksinkertainen kuvien luokittelija\n",
"\n",
"Tämä muistikirja opastaa, kuinka voit luokitella kuvia esikoulutetun neuroverkon avulla.\n",
"\n",
"**Mitä opit:**\n",
"- Kuinka ladata ja käyttää esikoulutettua mallia\n",
"- Kuvien esikäsittely\n",
"- Ennusteiden tekeminen kuvista\n",
"- Luottamusarvojen ymmärtäminen\n",
"\n",
"**Käyttötapaus:** Tunnista esineitä kuvista (kuten \"kissa\", \"koira\", \"auto\" jne.)\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Vaihe 1: Tuo tarvittavat kirjastot\n",
"\n",
"Tuodaan työkalut, joita tarvitsemme. Älä huoli, jos et vielä ymmärrä kaikkia näitä!\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": [
"## Vaihe 2: Lataa esikoulutettu malli\n",
"\n",
"Käytämme **MobileNetV2**-mallia, joka on jo koulutettu miljoonilla kuvilla.\n",
"\n",
"Tätä kutsutaan **siirto-oppimiseksi** käytetään mallia, jonka joku muu on kouluttanut!\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": [
"## Vaihe 3: Apufunktiot\n",
"\n",
"Luodaan funktiot kuvien lataamiseen ja valmisteluun malliamme varten.\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": [
"## Vaihe 4: Testaa esimerkkikuvilla\n",
"\n",
"Kokeillaan luokitella joitakin kuvia internetistä!\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": [
"### Luokittele Jokainen Kuva\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": [
"## Vaihe 5: Kokeile omia kuviasi!\n",
"\n",
"Korvaa alla oleva URL millä tahansa kuvan URL-osoitteella, jonka haluat luokitella.\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": [
"## 💡 Mitä juuri tapahtui?\n",
"\n",
"1. **Latasimme esikoulutetun mallin** - MobileNetV2 on koulutettu miljoonilla kuvilla\n",
"2. **Esikäsittelimme kuvat** - Muokkasimme ja formatoimme ne mallia varten\n",
"3. **Malli teki ennusteita** - Se tuotti todennäköisyyksiä 1000 objektiluokalle\n",
"4. **Dekoodasimme tulokset** - Muutimme numerot ihmisten ymmärtämiin etiketteihin\n",
"\n",
"### Ymmärrä luottamusarvot\n",
"\n",
"- **90-100%**: Erittäin varma (melkein varmasti oikein)\n",
"- **70-90%**: Varma (todennäköisesti oikein)\n",
"- **50-70%**: Jossain määrin varma (saattaa olla oikein)\n",
"- **Alle 50%**: Ei kovin varma (epävarma)\n",
"\n",
"### Miksi ennusteet voivat olla vääriä?\n",
"\n",
"- **Epätavallinen kulma tai valaistus** - Malli on koulutettu tyypillisillä valokuvilla\n",
"- **Useita objekteja** - Malli odottaa yhtä pääobjektia\n",
"- **Harvinaiset objektit** - Malli tuntee vain 1000 kategoriaa\n",
"- **Huonolaatuinen kuva** - Epätarkat tai pikselöityneet kuvat ovat haastavampia\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🚀 Seuraavat askeleet\n",
"\n",
"1. **Kokeile eri kuvia:**\n",
" - Etsi kuvia [Unsplash](https://unsplash.com)-sivustolta\n",
" - Napsauta hiiren oikealla → \"Kopioi kuvan osoite\" saadaksesi URL-osoitteen\n",
"\n",
"2. **Kokeile:**\n",
" - Mitä tapahtuu abstraktin taiteen kanssa?\n",
" - Voiko se tunnistaa esineitä eri kulmista?\n",
" - Miten se käsittelee useita esineitä?\n",
"\n",
"3. **Opi lisää:**\n",
" - Tutustu [Tietokonenäkö-opetuksiin](../lessons/4-ComputerVision/README.md)\n",
" - Opi kouluttamaan oma kuvantunnistusmalli\n",
" - Ymmärrä, miten CNN:t (Convolutional Neural Networks) toimivat\n",
"\n",
"---\n",
"\n",
"## 🎉 Onnittelut!\n",
"\n",
"Rakensit juuri kuvantunnistimen käyttäen huippuluokan neuroverkkoa!\n",
"\n",
"Tämä sama tekniikka mahdollistaa:\n",
"- Google Kuvat (valokuvien järjestäminen)\n",
"- Itseohjautuvat autot (esineiden tunnistaminen)\n",
"- Lääketieteellinen diagnostiikka (röntgenkuvien analysointi)\n",
"- Laadunvalvonta (vikojen havaitseminen)\n",
"\n",
"Jatka tutkimista ja oppimista! 🚀\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\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:17+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "fi"
}
},
"nbformat": 4,
"nbformat_minor": 4
}