اصنع أول نموذج Image classification لك في 10 دقائق!

1٬464

مقدمة

في الحقيقة لا يجب عليك أن تعمل في شركات عملاقة كجوجل أو غيرها لتقوم ببناء شبكة عصبية. الdeep learning هو عالم واسع ولتقليل الاحتمالات فما سنتحدث عنه اليوم هو ال image classification وسنقوم بعمله من بواسطة نموذج تعلم عميق بسيط ولكن ذو دقة عالية.

بمجرد فهمك للآلية التي تعمل بها الأمور سيصبح الكود بالنسبة إليك أمراً سهلاً. دعنا نر معاً.

ما هو الImage classification ؟

انظر للصورة أدناه

بالطبع ستتمكن من تمييزها بسهولة، هذه سيارة فاخرة!

قم بإعادة النظر إليها والتفكير من أين جاءك هذا الاستنتاج؟، في الحقيقة لقد قمت أولا بالنظر للصورة وتذكرت رؤيتك لسيارات سابقة فصنفتها على أنها سيارة، ثم قمت بالنظر لحالة السيارة وكيف تبدو حديثة وذات شكل لطيف فاستنتجت أنها ليست سيارة فقط، بل سيارة فاخرة.

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

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

والآن، دعنا نعرف متطلبات بناء image classifier :

تحتاج البيانات لدينا أن تكون في شكل معين للعمل عليها سنعود لذلك في وقت لاحق لكن أبقه في ذهنك الآن.

يجب أن يكون لديك ملفين :

  • ملف csv يحتوي على جميع الصور التي ستسخدمها في تدريب الموديل وتصنيفاتها الحقيقية.
  • مجلد يحتوي على جميع صور التدريب.

يحتلف ملف الcsv في الTest set عن ملف الcsv في الTraining set، فالأول يحتوي على جميع التي سنقوم باختبار المصنف بها لنرى مدى فعاليته، وبالتالي فهو لا يحتوي على إجابات أو تصنيفات لأنه من المفترض أن تكون هذه منته التصنيف!

إذا لم تكن بياناتك على الهيئة المذكورة سابقا، فلن يكون بإمكانك الوصول لاستنتاجات سليمة من النموذج عوضا عن ذلك سيقوم النموذج بإعطائك إجابات غريبة.

لفهم عملية بناء النموذج المُصَنٍف

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

1 – تحميل وتجهيز البيانات لما قبل عملية المعالجة :  30% من الوقت.

2 – تحديد بنية النموذج : 10% من الوقت.

3 – تدريب النموذج 50% من الوقت.

4 – تقدير الأداء 10% من الوقت.

اسمح لي أن أشرح كل خطوة من الخطوات المذكورة أعلاه بمزيد من التفصيل.  أهمية هذا الجزء تنبع من أنه لا يتم تصميم كل نموذج من المرة الأولى. ستحتاج إلى العودة بعد كل iteration تكرار، وصقل خطواتك ، وتشغيلها مرة أخرى. وجود فهم قوي للمفاهيم الأساسية سيقطع شوطًا طويلًا في تسريع العملية بأكملها.

1 – المرحلة الأولى : تحميل وتجهيز البيانات لما قبل عملية المعالجة

يختلف شكل البيانات المستخدمة باختلاف الframe work، بما أن تجهيز البيانات هي خطوة حرجة في أي مشروع تقوم به فأنصح بشدة بالتوجه لقراءة أساسيات معالجة الصور بالبايثون وبإمكان هذا المصدر مساعدتك

ولمعرفة كيفية أداء نموذجنا على البيانات (وقبل تعريضه لمجموعة الاختبار) ، نحتاج إلى إنشاء مجموعة تحقق. يتم ذلك عن طريق تقسيم بيانات مجموعة التدريب لبيانات للتدريب وبيانات للتحقق وعندما نشعر بالرضا عن أدائه، نستطيع استخدامه للتنبؤ في الTest data.

الوقت اللازم : 2-3 دقائق.

2 -المرحلة الثانية : تحديد بنية النموذج 

وهي خطوة مهمة في العملية بأكملها إذ علينا تحديد كيف سيبدو نموذجنا ويتطلب ذلك  الإجابة على أسئلة مثل:

  • كم عدد الطبقات ال convolution التي نحتاجها.
  • ما هي دالة التفعيل لكل طبقة.
  • كم عدد الوحدات المخفية التي يجب أن تمتلكها كل طبقة.

كيف نقرر هذه القيم؟ سؤال ممتاز! 

النهج الأول هو اختيار هذه القيم بناءً على الأبحاث / الدراسات الحالية، لكن هناك نهج آخر يتمثل في الاستمرار في تجربة القيم حتى تجد أفضل تطابق ولكن هذا قد يستغرق وقتًا طويلاً للغاية.
ينبغي أن يستغرق الأمر منك حوالي دقيقة لتقرير بنية النموذج.

3 -المرحلة الثالثة : تدريب النموذج 50% من الوقت.

لتدريب النموذج ، نحتاج إلى :

  • صور التدريب والإجابات الحقيقية لها.
  • صور التحقق من الصحة وإجاباتها  (نستخدم هذه الإجابات فقط للتحقق من صحة النموذج وليس خلال مرحلة التدريب).
  • نحدد أيضًا عدد الفترات الزمنية في هذه الخطوة. بالنسبة للمبتدئين ، سنقوم بتشغيل النموذج لعشرة epochs (فترة زمنية) (يمكنك تغيير عددها لاحقًا).

الوقت اللازم لهذه الخطوة: نظرًا لأن التدريب يتطلب أن يتعلم النموذج الهياكل ، فإننا نحتاج إلى حوالي 5 دقائق لتجاوز هذه الخطوة.

والآن حان الوقت لتقديم توقعات!

4 -المرحلة الرابعة : تقدير الأداء

أخيرًا، نقوم بتحميل بيانات الاختبار (الصور) وننتقل إلى خطوة المعالجة المسبقة هنا أيضًا.

تجهيز المشكلة وفهم البيانات

سنبدأ بتحدى مهم جدا في المواقع هذه الأيام وخصوصا مواقع التجارة الإلكترونية، ما نحتاجه هو بناء نموذج يمكنه تصنيف مجموعة معينة من الصور وفقًا للملابس (قميص ، بنطلون ، أحذية ، جوارب ، إلخ). وهي كما أتوقع أنك استنتجت تقع تحت نطاق مشاكل رؤية الحاسب أو الcomputer vision.

ويطلق عليه تحدي تحديد الملابس وهو أحد المشكلات المعروضة على موقع  DataHack platform، بإمكانك التسجيل وتحميل البيانات من الرابط.

سوف نقوم ببناء النموذج على  Google Colab حيث أنها توفر GPU مجاني لتدريب نموذجنا.

لدينا مجموعه من 70،000 صورة (28 × 28 )، منها 60،000 للتدريب و 10،000 للاختبار. يتم تمييز الصور المستخدمة في التدريب وفقًا لنوع الملابس مع 10 تصنيفات classes. ويكمن التحدي في تحديد نوع الملابس الموجودة في جميع صور الاختبار.

بناء النموذج

الآن حان الوقت لكتابة الأكواد! وتتمثل الخطوات في الآتي :

إعداد Google Colab
إضافة المكتبات
تحميل وتجهيز البيانات – (3 دقائق)
إنشاء مجموعة التحقق من الصحة
تحديد هيكل النموذج – (1 دقيقة)
تدريب النموذج – (5 دقائق)
عمل تنبؤات – (دقيقة واحدة)

الخطوة الأولى/ إعداد Google Colab

نظرا لأننا نقوم بأخذ البيانات من رابط جوجل درايف فسنقوم بإضافة بعض سطور الكود في نوت بوك google colab

قم بصناعة ملف Note book جديد python 3 واكتب فيه السطور التالية

!pip install PyDrive

والآن سنقوم بإضافة بعض المكتبات التي سنحتاجها :

import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

والآن سنقوم بعمل متغير drive للوصول لجوجل درايف

auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

ولتحميل البيانات سنقوم باستخدام ID الخاص بالملف المرفوع على جوجل درايف

download = drive.CreateFile({'id': '1BZOv422XJvxFUnGh-0xVeSvgFgqVY45q'})

قم باستبدال الID في الكود السابق بID الملف الخاص بك، والآن سنقوم بتحميل هذا الملف وفك الضغط unzip

download.GetContentFile('train_LbELtWX.zip')
!unzip train_LbELtWX.zip

عليك تشغيل هذه الخلايا في كل مرة تفتح فيها الNote book الخاصة بك

الخطوة الثانية / إضافة المكتبات

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import to_categorical
from keras.preprocessing import image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from tqdm import tqdm

الخطوة الثالثة / تحميل وتجهيز البيانات

train = pd.read_csv('train.csv')

والآن سنقوم بقراءة جميع الصور في بيانات التدريب، تخزينهم في List، ثم تحويل هذه الList ل numpy array

# We have grayscale images, so while loading the images we will keep grayscale=True, if you have RGB images, you should set grayscale as False
train_image = []
for i in tqdm(range(train.shape[0])):
    img = image.load_img('train/'+train['id'][i].astype('str')+'.png', target_size=(28,28,1), grayscale=True)
    img = image.img_to_array(img)
    img = img/255
    train_image.append(img)
X = np.array(train_image)

وبما أنها مشكلة تصنيف متعدد (multi classes classification problem (10 classes ، سنقوم بترميز المتغير المستهدف

y=train['label'].values
y = to_categorical(y)

الخطوة الرابعة / إنشاء مجموعة التحقق من الصحة

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)

الخطوة الخامسة / تحديد هيكل النموذج

سنقوم بعمل هيكل بسيط من طبقتين convolution، طبقة مخفية وواحدة خارجية.

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

ومن ثم نقوم بعمل compile للنموذج الذي قمنا ببناؤه للتو

model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])

الخطوة السادسة / تدريب النموذج

وهنا سنقوم بتدريب النموذج واستخدام بيانات التحقق من الصحة للتحقق من أدائه

model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))

الخطوة السابعة / عمل تنبؤات

في البداية سنقوم بعمل نفس الخطوات التي قمنا بها مع بيانات التدريب، قم بتحميل بيانات الاختبار، وتوقع التصنيف الذي تنتمي إليه باستخدام دالة model.predict_classes()

download = drive.CreateFile({'id': '1KuyWGFEpj7Fr2DgBsW8qsWvjqEzfoJBY'})
download.GetContentFile('test_ScVgIM0.zip')
!unzip test_ScVgIM0.zip

والآن نقوم بإضافة ملف الاختبار

test = pd.read_csv('test.csv')

والآن، سنقوم بقراءة وتخزين كل صور الاختبار

test_image = []
for i in tqdm(range(test.shape[0])):
    img = image.load_img('test/'+test['id'][i].astype('str')+'.png', target_size=(28,28,1), grayscale=True)
    img = image.img_to_array(img)
    img = img/255
    test_image.append(img)
test = np.array(test_image)


# making predictions
prediction = model.predict_classes(test)

سنقوم أيضا بإنشاء ملف submission لتحديث صفحة الdatahack platform لنرى فعالية نتائجنا على الleaderboard.

download = drive.CreateFile({'id': '1z4QXy7WravpSj-S4Cs9Fk8ZNaX-qh5HF'})
download.GetContentFile('sample_submission_I5njJSF.csv')

# creating submission file
sample = pd.read_csv('sample_submission_I5njJSF.csv')
sample['label'] = prediction
sample.to_csv('sample_cnn.csv', header=True, index=False)

قم بتنزيل ملف sample_cnn.csv  و رفعه على صفحة المسابقة لإنشاء النتائج الخاصة بك والتحقق من رتبتك على المتصدرين. سيوفر لك هذا حلًا قياسيًا للبدء في أي مشكلة تتعلق بتصنيف الصور!

بإمكانك تجربة تقنية hyperparameter tuning and regularization لتحسين أداء النموذج الذي تصنعه.

الآن، دعنا نختبر هذا النموذج على مجموعة مختلفة من البيانات، سنقوم بالعمل على مشكلة تدعى ‘Identify the Digits’ التعرف على الأرقام، قم بتحميل البيانات وحاول حل المشكلة بنفسك قبل البدء بقراءة حلها من هذا المقال.

في هذا التحدي علينا التعرف على الأرقام المتواجدة في الصور، لدينا ما يقرب من 700,000 صورة ، 49,000   منهم مستخدمة للتدريب، 21,000 مستخدمة للاختبار. وبالتالي فالمطلوب أن يتمكن النموذج الذي ستقوم ببناؤه من التعرف على الأرقام بداخل الصور.

هل أنت جاهز للبدء؟! رائع الآن قم بعمل note book python 3 جديدة.

# Setting up Colab
!pip install PyDrive
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
# Replace the id and filename in the below codes
download = drive.CreateFile({'id': '1ZCzHDAfwgLdQke_GNnHp_4OheRRtNPs-'})
download.GetContentFile('Train_UQcUa52.zip')
!unzip Train_UQcUa52.zip
# Importing libraries
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import to_categorical
from keras.preprocessing import image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from tqdm import tqdm
train = pd.read_csv('train.csv')
# Reading the training images
train_image = []
for i in tqdm(range(train.shape[0])):
    img = image.load_img('Images/train/'+train['filename'][i], target_size=(28,28,1), grayscale=True)
    img = image.img_to_array(img)
    img = img/255
    train_image.append(img)
X = np.array(train_image)
# Creating the target variable
y=train['label'].values
y = to_categorical(y)
# Creating validation set
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
# Define the model structure
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
# Compile the model
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
# Training the model
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
download = drive.CreateFile({'id': '1zHJR6yiI06ao-UAh_LXZQRIOzBO3sNDq'})
download.GetContentFile('Test_fCbTej3.csv')
test_file = pd.read_csv('Test_fCbTej3.csv')
test_image = []
for i in tqdm(range(test_file.shape[0])):
    img = image.load_img('Images/test/'+test_file['filename'][i], target_size=(28,28,1), grayscale=True)
    img = image.img_to_array(img)
    img = img/255
    test_image.append(img)
test = np.array(test_image)
prediction = model.predict_classes(test)
download = drive.CreateFile({'id': '1nRz5bD7ReGrdinpdFcHVIEyjqtPGPyHx'})
download.GetContentFile('Sample_Submission_lxuyBuB.csv')
sample = pd.read_csv('Sample_Submission_lxuyBuB.csv')
sample['filename'] = test_file['filename']
sample['label'] = prediction
sample.to_csv('sample.csv', header=True, index=False)

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

بداية جيدة أليس كذلك ؟، لكن عليك الوضع في الاعتبار أنه بإمكانك دائما التحسين، استمر في العمل على النموذج وتحسينه باستخدام قيم ال hyperparameter واكتشف كيفية تحسين الأداء أكثر.

كان الغرض من هذا المقال بيان أنه يمكنك بناء نموذج تعلم عميق في وقت قصير، فليس هناك أفضل من التعلم عن طريق صنع الأشياء، كبار علماء الdata science كانت لديهم هذه الأكواد جاهزة قبل أن يبدأ حتى Hackathon ، وقد استخدموها لتقديم بعض الحلول قبل الغوص في التفاصيل التحليلية، فبمجرد أن يصبح لديك حل بإمكانك العمل على تحسينه وزيادة سرعة أدائه.

في النهاية، إن وجدت هذا المقال مفيدا لا تنسى مشاركته مع أصدقائك بإمكانكم التنافس معا أيكم سيصنع نموذج أفضل بدقة أعلى. دعنا نحظى ببعض المرح!

مصدر مصدر1
تعليقات