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

397 lines
17 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ตัวจำแนกภาพแบบง่าย\n",
"\n",
"โน้ตบุ๊กนี้จะแสดงวิธีการจำแนกภาพโดยใช้เครือข่ายประสาทที่ผ่านการฝึกมาแล้ว\n",
"\n",
"**สิ่งที่คุณจะได้เรียนรู้:**\n",
"- วิธีโหลดและใช้งานโมเดลที่ผ่านการฝึกมาแล้ว\n",
"- การเตรียมภาพก่อนประมวลผล\n",
"- การทำนายผลบนภาพ\n",
"- การทำความเข้าใจคะแนนความมั่นใจ\n",
"\n",
"**กรณีการใช้งาน:** ระบุวัตถุในภาพ (เช่น \"แมว\", \"สุนัข\", \"รถยนต์\" เป็นต้น)\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ขั้นตอนที่ 1: นำเข้าไลบรารีที่จำเป็น\n",
"\n",
"มานำเครื่องมือที่เราต้องใช้กันเถอะ ไม่ต้องกังวลถ้าคุณยังไม่เข้าใจทั้งหมดในตอนนี้!\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": [
"## ขั้นตอนที่ 2: โหลดโมเดลที่ผ่านการฝึกมาแล้ว\n",
"\n",
"เราจะใช้ **MobileNetV2** ซึ่งเป็นเครือข่ายประสาทที่ผ่านการฝึกด้วยภาพนับล้านมาแล้ว\n",
"\n",
"สิ่งนี้เรียกว่า **Transfer Learning** - การใช้โมเดลที่มีคนอื่นฝึกไว้แล้ว!\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": [
"## ขั้นตอนที่ 3: ฟังก์ชันช่วยเหลือ\n",
"\n",
"มาสร้างฟังก์ชันสำหรับโหลดและเตรียมรูปภาพให้พร้อมสำหรับโมเดลของเรากันเถอะ\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": [
"## ขั้นตอนที่ 4: ทดสอบกับภาพตัวอย่าง\n",
"\n",
"ลองมาทำการจำแนกภาพบางภาพจากอินเทอร์เน็ตกัน!\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": [
"### จำแนกแต่ละภาพ\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": [
"## ขั้นตอนที่ 5: ลองใช้ภาพของคุณเอง!\n",
"\n",
"เปลี่ยน URL ด้านล่างด้วย URL ของภาพใดก็ได้ที่คุณต้องการจำแนกประเภท.\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": [
"## 💡 เกิดอะไรขึ้น?\n",
"\n",
"1. **เราโหลดโมเดลที่ถูกฝึกมาแล้ว** - MobileNetV2 ถูกฝึกด้วยภาพนับล้าน\n",
"2. **เราเตรียมภาพให้พร้อมใช้งาน** - ปรับขนาดและจัดรูปแบบให้เหมาะกับโมเดล\n",
"3. **โมเดลทำการทำนาย** - ให้ผลลัพธ์เป็นความน่าจะเป็นสำหรับวัตถุ 1000 ประเภท\n",
"4. **เราแปลงผลลัพธ์** - เปลี่ยนตัวเลขให้เป็นชื่อที่มนุษย์เข้าใจได้\n",
"\n",
"### ทำความเข้าใจคะแนนความมั่นใจ\n",
"\n",
"- **90-100%**: มั่นใจมาก (เกือบจะถูกต้องแน่นอน)\n",
"- **70-90%**: มั่นใจ (น่าจะถูกต้อง)\n",
"- **50-70%**: มั่นใจระดับหนึ่ง (อาจจะถูกต้อง)\n",
"- **ต่ำกว่า 50%**: ไม่ค่อยมั่นใจ (ไม่แน่ใจ)\n",
"\n",
"### ทำไมการทำนายอาจผิดพลาด?\n",
"\n",
"- **มุมหรือแสงที่ผิดปกติ** - โมเดลถูกฝึกด้วยภาพทั่วไป\n",
"- **มีวัตถุหลายอย่างในภาพ** - โมเดลคาดหวังว่าจะมีวัตถุหลักเพียงหนึ่งเดียว\n",
"- **วัตถุที่พบได้ยาก** - โมเดลรู้จักเพียง 1000 ประเภท\n",
"- **ภาพคุณภาพต่ำ** - ภาพเบลอหรือมีพิกเซลต่ำทำให้วิเคราะห์ยาก\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🚀 ขั้นตอนถัดไป\n",
"\n",
"1. **ลองใช้ภาพที่แตกต่างกัน:**\n",
" - ค้นหาภาพจาก [Unsplash](https://unsplash.com)\n",
" - คลิกขวา → \"คัดลอกที่อยู่ภาพ\" เพื่อรับ URL\n",
"\n",
"2. **ทดลอง:**\n",
" - จะเกิดอะไรขึ้นกับงานศิลปะเชิงนามธรรม?\n",
" - สามารถจดจำวัตถุจากมุมมองที่แตกต่างกันได้หรือไม่?\n",
" - มันจัดการกับวัตถุหลายชิ้นอย่างไร?\n",
"\n",
"3. **เรียนรู้เพิ่มเติม:**\n",
" - สำรวจ [บทเรียนเกี่ยวกับ Computer Vision](../lessons/4-ComputerVision/README.md)\n",
" - เรียนรู้วิธีฝึกฝนตัวจำแนกภาพของคุณเอง\n",
" - ทำความเข้าใจว่า CNNs (Convolutional Neural Networks) ทำงานอย่างไร\n",
"\n",
"---\n",
"\n",
"## 🎉 ขอแสดงความยินดี!\n",
"\n",
"คุณเพิ่งสร้างตัวจำแนกภาพโดยใช้เครือข่ายประสาทเทียมที่ล้ำสมัย!\n",
"\n",
"เทคนิคเดียวกันนี้ถูกนำไปใช้ใน:\n",
"- Google Photos (จัดระเบียบรูปภาพของคุณ)\n",
"- รถยนต์ไร้คนขับ (จดจำวัตถุ)\n",
"- การวินิจฉัยทางการแพทย์ (วิเคราะห์ภาพเอ็กซ์เรย์)\n",
"- การควบคุมคุณภาพ (ตรวจจับข้อบกพร่อง)\n",
"\n",
"อย่าหยุดสำรวจและเรียนรู้ต่อไป! 🚀\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ข้อจำกัดความรับผิดชอบ**: \nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้\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:46:35+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "th"
}
},
"nbformat": 4,
"nbformat_minor": 4
}