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

395 lines
14 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",
"هذا ما يُعرف بـ **التعلم بالنقل** - استخدام نموذج قام شخص آخر بتدريبه!\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",
"استبدل الرابط أدناه بأي رابط صورة تريد تصنيفها.\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"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🚀 الخطوات التالية\n",
"\n",
"1. **جرب صورًا مختلفة:**\n",
" - ابحث عن صور على [Unsplash](https://unsplash.com)\n",
" - انقر بزر الماوس الأيمن → \"نسخ عنوان الصورة\" للحصول على الرابط\n",
"\n",
"2. **جرب:**\n",
" - ماذا يحدث مع الفن التجريدي؟\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",
"- التشخيص الطبي (تحليل الأشعة السينية)\n",
"- مراقبة الجودة (اكتشاف العيوب)\n",
"\n",
"استمر في الاستكشاف والتعلم! 🚀\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**إخلاء المسؤولية**: \nتم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [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:38:20+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "ar"
}
},
"nbformat": 4,
"nbformat_minor": 4
}