كيفية إنشاء مصنف صور بسيط

تصنيف الصور هو تطبيق رائع للتعلم العميق. يمكننا تدريب خوارزمية قوية لنمذجة مجموعة بيانات صورة كبيرة. يمكن بعد ذلك استخدام هذا النموذج لتصنيف مجموعة صور متشابهة ولكنها غير معروفة.

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

سنناقش في هذه المقالة كل ذلك - من العثور على مجموعة بيانات إلى تدريب نموذجك. سأحاول تبسيط الأمور قدر الإمكان عن طريق تجنب بعض التفاصيل الفنية ( ملاحظة: يرجى ملاحظة أن هذا لا يعني أن هذه التفاصيل ليست مهمة. سأذكر بعض الموارد الرائعة التي يمكنك الرجوع إليها لمعرفة المزيد حول هذه الموضوعات ). الغرض من هذه المقالة هو شرح العملية الأساسية لبناء مصنف الصور وهذا ما سنركز عليه أكثر هنا.

سنقوم ببناء مصنف صور لمجموعة بيانات Fashion-MNIST. مجموعة بيانات Fashion-MNIST هي مجموعة من صور مقالات Zalando. يحتوي على 60.000 صورة لمجموعة التدريب و 10000 صورة لبيانات مجموعة الاختبار ( سنناقش مجموعات بيانات الاختبار والتدريب جنبًا إلى جنب مع مجموعة بيانات التحقق لاحقًا ). تنتمي هذه الصور إلى ملصقات 10 فئات مختلفة.

استيراد مكتبات

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

  1. Numpy - مكتبة بايثون للحساب العددي
  2. الباندا - معالجة بيانات مكتبة بايثون
  3. Matplotlib - تصور بيانات مكتبة بايثون
  4. Keras - مكتبة Python تعتمد على Tensorflow لإنشاء نماذج التعلم العميق
  5. Jupyter - سأقوم بتشغيل كل التعليمات البرمجية الخاصة بي على Jupyter Notebooks. يمكنك تثبيته عبر الرابط. يمكنك استخدام Google Colabs أيضًا إذا كنت بحاجة إلى قوة حسابية أفضل.

إلى جانب هؤلاء الأربعة ، سنستخدم أيضًا scikit-Learn. سيصبح الغرض من هذه المكتبات أكثر وضوحًا بمجرد الغوص في الكود.

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

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

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

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

to_categorical: to_categorical هي أداة مساعدة keras. يتم استخدامه لتحويل الملصقات الفئوية إلى ترميزات واحدة ساخنة. لنفترض أن لدينا ثلاث تصنيفات ("تفاح" ، "برتقال" ، "موز") ، ثم ترميز واحد ساخن لكل من هذه سيكون [1 ، 0 ، 0] -> "تفاح" ، [0 ، 1 ، 0] -> "البرتقال" ، [0 ، 0 ، 1] -> "الموز".

باقي وحدات Keras التي قمنا باستيرادها هي طبقات تلافيفية. سنناقش الطبقات التلافيفية عندما نبدأ في بناء نموذجنا. سنلقي أيضًا نظرة سريعة على ما تفعله كل طبقة من هذه الطبقات.

المعالجة المسبقة للبيانات

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

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

train_df = pd.read_csv('./fashion-mnist_train.csv') test_df = pd.read_csv('./fashion-mnist_test.csv')

بادئ ذي بدء ، دعنا نستورد مجموعة البيانات الخاصة بنا ( ها هو الرابط لتنزيل مجموعة البيانات هذه على نظامك ). بمجرد قيامك باستيراد مجموعة البيانات ، قم بتشغيل الأمر التالي.

train_df.head()

سيوضح لك هذا الأمر كيف تبدو بياناتك. تُظهر لقطة الشاشة التالية إخراج هذا الأمر.

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

train_data = np.array(train_df.iloc[:, 1:]) test_data = np.array(test_df.iloc[:, 1:])

حان الوقت الآن للحصول على ملصقاتنا.

train_labels = to_categorical(train_df.iloc[:, 0]) test_labels = to_categorical(test_df.iloc[:, 0])

هنا ، يمكنك أن ترى أننا استخدمنا to_categorical لتحويل بياناتنا الفئوية إلى ترميز واحد ساخن.

سنقوم الآن بإعادة تشكيل البيانات وإدخالها في النوع float32 حتى نتمكن من استخدامها بسهولة.

rows, cols = 28, 28 train_data = train_data.reshape(train_data.shape[0], rows, cols, 1) test_data = test_data.reshape(test_data.shape[0], rows, cols, 1) train_data = train_data.astype('float32') test_data = test_data.astype('float32')

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

train_data /= 255.0 test_data /= 255.0

الشبكات العصبية التلافيفية

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

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

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

بخلاف الطبقات التلافيفية ، تحتوي شبكة CNN النموذجية أيضًا على نوعين آخرين من الطبقات: 1) طبقة تجميع ، و 2) طبقة متصلة بالكامل.

تُستخدم طبقات التجميع لتعميم إخراج الطبقات التلافيفية. إلى جانب التعميم ، فإنه يقلل أيضًا من عدد المعلمات في النموذج عن طريق أخذ عينات لأسفل لمخرجات الطبقة التلافيفية.

As we just learned, convolutional layers represent high level features from image data. Fully connected layers use these high level features to train the parameters and to learn to classify those images.

We will also use the Dropout, Batch-normalization and Flatten layers in addition to the layers mentioned above. Flatten layer converts the output of convolutional layers into a one dimensional feature vector. It is important to flatten the outputs because Dense (Fully connected) layers only accept a feature vector as input. Dropout and Batch-normalization layers are for preventing the model from overfitting.

train_x, val_x, train_y, val_y = train_test_split(train_data, train_labels, test_size=0.2) batch_size = 256 epochs = 5 input_shape = (rows, cols, 1)
def baseline_model(): model = Sequential() model.add(BatchNormalization(input_shape=input_shape)) model.add(Conv2D(32, (3, 3), padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2))) model.add(Dropout(0.25)) model.add(BatchNormalization()) model.add(Conv2D(32, (3, 3), padding="same", 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")) return model

The code that you see above is the code for our CNN model. You can structure these layers in many different ways to get good results. There are many popular CNN architectures which give state of the art results. Here, I have just created my own simple architecture for the purpose of this problem. Feel free to try your own and let me know what results you get :)

Training the model

Once you have created the model you can import it and then compile it by using the code below.

model = baseline_model() model.compile(loss='categorical_crossentropy', optimizer="sgd", metrics=['accuracy']) 

model.compile configures the learning process for our model. We have passed it three arguments. These arguments define the loss function for our model, optimizer and metrics.

history = model.fit(train_x, train_y, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(val_x, val_y)) 

And finally by running the code above you can train your model. I am training this model for just five epochs but you can increase the number of epochs. After your training process is completed you can make predictions on the test set by using the following code.

predictions= model.predict(test_data)

Conclusion

Congrats! You did it, you have taken your first step into the amazing world of computer vision.

You have created a your own image classifier. Even though this is a great achievement, we have just scratched the surface.

There is a lot you can do with CNNs. The applications are limitless. I hope that this article helped you to get an understanding of how the process of training these models works.

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

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