389 lines
17 KiB
Plaintext
389 lines
17 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# អ្នកចាត់ថ្នាក់រូបភាពសាមញ្ញ\n",
|
|
"\n",
|
|
"សៀវភៅកំណត់ត្រានេះបង្ហាញអ្នកពីរបៀបចាត់ថ្នាក់រូបភាពដោយប្រើបណ្តាញសរសៃប្រសammatមុនដែលបានបណ្តុះបណ្តាលរួច។\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",
|
|
"នេះហៅថា **ការរៀនផ្ទេរ** - ប្រើគំរូដែលនរណាម្នាក់បានបណ្តុះបណ្តាលរួចហើយ!\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. **ម៉ូដែលបានទស្សន៍ទាយ** - វាបានផ្តល់ព្រាប្បុលភាពសម្រាប់ ១០០០ ចំណាត់ថ្នាក់វត្ថុ\n",
|
|
"4. **យើងបានបកស្រាយលទ្ធផល** - បម្លែងលេខទៅជាអត្ថបទដែលមនុស្សអាចអានបាន\n",
|
|
"\n",
|
|
"### ការយល់ដឹងអំពីពិន្ទុទំនុកចិត្ត\n",
|
|
"\n",
|
|
"- **៩០-១០០%**: មានទំនុកចិត្តខ្លាំង (ភាគច្រើនត្រឹមត្រូវ)\n",
|
|
"- **៧០-៩០%**: មានទំនុកចិត្ត (ប្រហែលត្រឹមត្រូវ)\n",
|
|
"- **៥០-៧០%**: មានទំនុកចិត្តខ្លះៗ (ប្រហែលជាត្រឹមត្រូវ)\n",
|
|
"- **ក្រោម ៥០%**: មិនមានទំនុកចិត្តខ្លាំង (មិនប្រាកដ)\n",
|
|
"\n",
|
|
"### ហេតុអ្វីបានជា ការទស្សន៍ទាយអាចខុស?\n",
|
|
"\n",
|
|
"- **មុំឬពន្លឺមិនធម្មតា** - ម៉ូដែលបានបណ្តុះដោយរូបថតទំរង់ទូទៅ\n",
|
|
"- **វត្ថុច្រើនកន្លែង** - ម៉ូដែលនឹកស្រមៃមានវត្ថុមួយដើម\n",
|
|
"- **វត្ថុសម្បូរទ្រង់ទ្រាយកោសិកា** - ម៉ូដែលស្គាល់តែ ១០០០ ប្រភេទ\n",
|
|
"- **រូបភាពគុណភាពទាប** - រូបភាពមិនច្បាស់ឬម៉ូសេតារីមានការលំបាក\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## 🚀 ជំហានបន្ទាប់\n",
|
|
"\n",
|
|
"1. **សាកល្បងរូបភាពផ្សេងៗ:**\n",
|
|
" - ស្វែងរករូបភាពនៅលើ [Unsplash](https://unsplash.com)\n",
|
|
" - ចុចមែកខាងស្តាំ → \"ចម្លងអាសយដ្ឋានរូបភាព\" ដើម្បីទទួលបាន URL\n",
|
|
"\n",
|
|
"2. **សាកល្បង:**\n",
|
|
" - តើមានអ្វីកើតឡើងជាមួយសិល្បៈ abstract?\n",
|
|
" - តើវាអាចរកឃើញវត្ថុពីមุมផ្សេងៗទេ?\n",
|
|
" - តើវាដំណើរការយ៉ាងដូចម្តេចជាមួយវត្ថុច្រើន?\n",
|
|
"\n",
|
|
"3. **រៀនបន្ថែម:**\n",
|
|
" - ស្វែងយល់អំពី [មេរៀនទស្សនវិទ្យាកុំព្យូទ័រ](../lessons/4-ComputerVision/README.md)\n",
|
|
" - រៀនបណ្ដុះបណ្ដាលម៉ាស៊ីនចាត់ថ្នាក់រូបភាពឯង\n",
|
|
" - យល់ដឹងពីរបៀប CNNs (បណ្តាញប្រសាទបូកបញ្ចូល) ធ្វើការ\n",
|
|
"\n",
|
|
"---\n",
|
|
"\n",
|
|
"## 🎉 សូមអបអរសាទរ!\n",
|
|
"\n",
|
|
"អ្នកទើបបង្កើតម៉ាស៊ីនចាត់ថ្នាក់រូបភាពដោយប្រើបណ្តាញប្រសាទទំនើប!\n",
|
|
"\n",
|
|
"បច្ចេកវិទ្យានេះត្រូវបានប្រើសម្រាប់:\n",
|
|
"- Google Photos (ចាត់តាំងរូបថតរបស់អ្នក)\n",
|
|
"- ឡានបើកដោយខ្លួនឯង (ស្គាល់វត្ថុ)\n",
|
|
"- ការធ្វើវិភាគវេជ្ជសាស្រ្ត (វិភាគរូបថត X-ray)\n",
|
|
"- ការត្រួតពិនិត្យគុណភាព (រកកោសិលិ្អ)\n",
|
|
"\n",
|
|
"បន្តស្វែងយល់ និងរៀនបន្ថែម! 🚀\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**កំណត់សម្គាល់**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខំប្រឹងប្រែងរកភាពត្រឹមត្រូវ សូមកត់សម្គាល់ថាការបកប្រែដោយស្វ័យប្រវត្តិសមត្ថភាពអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាតំណើរការរបស់វាគួរត្រូវបានគេចាត់ទុកថាជា ប្រភពផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ៗ គេបนะนำឲ្យប្រើការបកប្រែដោយមនុស្សឯកទេសជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសផ្សេង ដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\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"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
} |