بناء نظام التعرف على الأشياء باستخدام التعلم العميق وKeras

Amine
05/09/2024

1. مقدمة حول التعرف على الأشياء باستخدام التعلم العميق

التعرف على الأشياء (Object Detection) هو أحد تطبيقات التعلم العميق حيث يتم تدريب النموذج على التعرف على الكائنات داخل الصور، وتحديد أماكن هذه الكائنات باستخدام مربعات الإحاطة (Bounding Boxes). تُستخدم هذه التقنية في تطبيقات مثل السيارات ذاتية القيادة، أنظمة المراقبة، وأتمتة المهام المختلفة.

في هذا الدليل، سنقوم ببناء نموذج بسيط للتعرف على الكائنات باستخدام مكتبة Keras وشبكة عصبية تلافيفية (CNN). يمكن توسيع هذا النموذج لاحقًا لاستخدام تقنيات أكثر تعقيدًا مثل **YOLO** أو **SSD**.

2. إعداد بيئة العمل

أولاً، نحتاج إلى إعداد بيئة العمل وتثبيت المكتبات المطلوبة. سنحتاج إلى TensorFlow و Keras، بالإضافة إلى بعض المكتبات الأخرى مثل NumPy و OpenCV للتعامل مع الصور.

pip install tensorflow keras opencv-python numpy

3. تحضير بيانات التدريب

من أجل تدريب النموذج على التعرف على الكائنات، نحتاج إلى مجموعة بيانات تحتوي على صور تحتوي على كائنات مع مربعات إحاطة (Bounding Boxes) تحدد مواقع الكائنات في الصور. يمكننا استخدام مجموعات بيانات جاهزة مثل **COCO** أو **Pascal VOC**، أو يمكنك إعداد مجموعة بيانات خاصة بك.

كل صورة يجب أن تكون مصحوبة بملف يحتوي على إحداثيات مربعات الإحاطة (Bounding Box) الخاصة بالكائنات وتصنيفها.

# مثال على كيفية تحميل الصور ومربعات الإحاطة
import cv2
import numpy as np

# تحميل صورة
image = cv2.imread('path_to_image.jpg')

# معلومات المربعات (x_min, y_min, x_max, y_max) لكل كائن
bounding_boxes = [
    {'class': 'person', 'box': [50, 100, 200, 300]},
    {'class': 'car', 'box': [300, 400, 500, 600]}
]

# رسم مربعات الإحاطة على الصورة
for box in bounding_boxes:
    x_min, y_min, x_max, y_max = box['box']
    cv2.rectangle(image, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)
    cv2.putText(image, box['class'], (x_min, y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

# عرض الصورة مع المربعات
cv2.imshow("Image with Bounding Boxes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. بناء نموذج التعرف على الأشياء باستخدام Keras

سنقوم الآن ببناء نموذج **CNN** بسيط لتحديد وتصنيف الكائنات في الصور. هذا النموذج سيقوم بالتنبؤ بمربعات الإحاطة (Bounding Boxes) لكل كائن في الصورة بالإضافة إلى تصنيف هذه الكائنات.

النموذج يعتمد على شبكة CNN لاستخراج الميزات من الصورة، ثم تمرير هذه الميزات إلى طبقات Dense للتنبؤ بإحداثيات المربعات وتصنيف الكائنات.

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

def build_object_detection_model(input_shape):
    model = Sequential()
    
    # الطبقات التلافيفية لاستخراج الميزات
    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    model.add(Conv2D(128, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    # تحويل الميزات إلى طبقات Dense للتنبؤ بمربعات الإحاطة والتصنيفات
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    
    # إخراج المربعات (4 إحداثيات لكل مربع)
    model.add(Dense(4, activation='linear'))  # Bounding box (x_min, y_min, x_max, y_max)
    
    # إخراج التصنيفات (افتراض أن لدينا 3 كائنات مختلفة)
    model.add(Dense(3, activation='softmax'))  # Classes (e.g. person, car, etc.)
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    
    return model

# تحديد حجم الصورة كمدخلات للنموذج
input_shape = (224, 224, 3)
model = build_object_detection_model(input_shape)
model.summary()

في هذا النموذج، قمنا بإنشاء طبقات CNN لاستخراج الميزات من الصورة. بعد ذلك، قمنا بإضافة طبقات **Dense** للتنبؤ بإحداثيات مربعات الإحاطة (Bounding Boxes) وكذلك تصنيف الكائنات الموجودة في الصورة.

5. تدريب النموذج

بعد بناء النموذج، نحتاج الآن إلى تدريبه باستخدام مجموعة من الصور مع مربعات الإحاطة. سنقوم بتحميل الصور والبيانات، ثم تدريب النموذج على هذه البيانات.

نفترض أن لدينا بيانات تدريب تحتوي على صور مع مربعات الإحاطة وتصنيفاتها. سنقوم بتدريب النموذج كما يلي:

import numpy as np
from sklearn.model_selection import train_test_split

# افتراض أن لدينا مجموعة بيانات (صور + مربعات + تصنيفات)
X_train = np.random.rand(1000, 224, 224, 3)  # بيانات عشوائية كبديل للصور الحقيقية
y_train_boxes = np.random.rand(1000, 4)  # إحداثيات المربعات (x_min, y_min, x_max, y_max)
y_train_classes = np.random.randint(0, 3, size=(1000, 1))  # التصنيفات (مثلاً: person, car, etc.)

# تحويل التصنيفات إلى one-hot encoding
from keras.utils import to_categorical
y_train_classes_onehot = to_categorical(y_train_classes, num_classes=3)

# تقسيم البيانات إلى تدريب واختبار
X_train, X_val, y_train_boxes, y_val_boxes, y_train_classes_onehot, y_val_classes_onehot = train_test_split(
    X_train, y_train_boxes, y_train_classes_onehot, test_size=0.2)

# تدريب النموذج
history = model.fit(
    X_train, 
    [y_train_boxes, y_train_classes_onehot], 
    epochs=20, 
    batch_size=32, 
    validation_data=(X_val, [y_val_boxes, y_val_classes_onehot])
)

# عرض نتائج التدريب
import matplotlib.pyplot as plt
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Loss over epochs')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

6. اختبار النموذج على صور جديدة

بعد تدريب النموذج، يمكننا اختباره على صور جديدة للتعرف على الكائنات الموجودة فيها. نقوم بتمرير الصورة إلى النموذج والحصول على إحداثيات مربعات الإحاطة والتصنيفات.

# تحميل صورة جديدة
test_image = cv2.imread('path_to_new_image.jpg')
test_image_resized = cv2.resize(test_image, (224, 224))

# الحصول على التنبؤات من النموذج
boxes, classes = model.predict(np.expand_dims(test_image_resized, axis=0))

# رسم مربعات الإحاطة على الصورة
for box in boxes:
    x_min, y_min, x_max, y_max = box
    cv2.rectangle(test_image, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)

# عرض الصورة مع المربعات
cv2.imshow("Test Image with Bounding Boxes", test_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. الخاتمة

في هذا الدليل، تعلمنا كيفية بناء نظام التعرف على الأشياء باستخدام Keras. قمنا بتحضير البيانات، وبناء نموذج باستخدام CNN، ثم قمنا بتدريب النموذج واختباره على بيانات جديدة. هذا النظام يمكن توسيعه لاستخدام نماذج أكثر تعقيدًا مثل **YOLO** أو **SSD** لتحسين الأداء والدقة.

يمكنك تحسين النظام باستخدام تقنيات مثل تحسين البيانات (Data Augmentation)، وضبط المعلمات لتحسين دقة النموذج.

التعليقات

اترك تعليقاً