إنشاء نموذج مخصّص لمصنِّف الصور

1. قبل البدء

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

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

المتطلبات الأساسية

  • الدرس التطبيقي السابق حول الترميز في هذا المسار التعليمي.

ما الذي ستبنيه وتتعلمه

  • كيفية تدريب نموذج مخصّص في "مصنِّف الصور" باستخدام تطبيق TensorFlow Lite الطراز للنماذج.

المتطلبات

  • لا حاجة إلى استخدام أجهزة معيّنة، ويمكن إكمال جميع المهام باستخدام Google Colab في المتصفّح.

2. البدء

تم إعداد جميع الرموز البرمجية المطلوب اتّباعها من أجلك، وهي متاحة للتنفيذ باستخدام Google Colab هنا. في حال لم يكن لديك إذن بالوصول إلى Google Colab، يمكنك استنساخ Repo واستخدام ورقة الملاحظات المسماة CustomImageClassifierModel.ipynb والتي يمكن العثور عليها في دليل ImageClassificationMobile->colab.

إذا كان لديك نماذج عديدة من زهور معيّنة، من السهل نسبيًا تدريب نموذج باستخدام أداة تصميم النماذج TensorFlow Lite للتعرّف عليها.

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

4ee12554e75b103f.png

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

ستفترض هذه الميزة الاختبارية أنّك تستخدم Google Colab لتدريب النموذج. يمكنك العثور على colab على colab.research.google.com. إذا كنت تستخدم بيئة أخرى، قد يتطلّب الأمر تثبيت الكثير من الاعتماديات، وليس على TensorFlow على الأقل.

3- تثبيت الاعتماديات واستيرادها

  1. تثبيت TensorFlow Lite model Maker. يمكنك إجراء ذلك باستخدام وضع "نافذة ضمن النافذة". تعمل &> /dev/null في النهاية إيقاف الإخراج. يُخرج مصمم النماذج الكثير من الأشياء التي ليست ذات صلة على الفور. تم إيقافه حتى تتمكن من التركيز على المهمة التي في متناول يديك.
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. الخطوة التالية هي استيراد المكتبات التي تحتاج إلى استخدامها والتأكد من استخدام TensorFlow 2.x:
# Imports and check that we are using TF2.x
import numpy as np
import os

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.image_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

الآن بعد أن أصبحت البيئة جاهزة، حان الوقت لبدء إنشاء نموذجك!

4. تنزيل بياناتك وإعدادها

إذا تم تنظيم الصور في مجلدات، وتم ضغط هذه المجلدات، ففي هذه الحالة إذا نزّلت الملف المضغوط وفك ضغطه، فسيتم تصنيف صورك تلقائيًا استنادًا إلى المجلد الموجود فيه. ستتم الإشارة إلى هذا الدليل باسم data_path.

data_path = tf.keras.utils.get_file(
      'flower_photos',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      untar=True)

يمكن بعد ذلك تحميل مسار البيانات هذا في نموذج شبكة عصبية للتدريب على فئة ImageClassifierDataLoader من TensorFlow Lite model Maker. ما عليك سوى توجيهه إلى المجلد وبدء العمل.

أحد العناصر المهمة في نماذج التدريب باستخدام تعلُّم الآلة هو عدم استخدام جميع بياناتك للتدريب. تراجع قليلاً لاختبار النموذج الذي يضم بيانات لم ترَها من قبل. ويمكن إجراء ذلك بسهولة باستخدام طريقة التقسيم لمجموعة البيانات التي تعود إلى ImageClassifierDataLoader. عن طريق تمرير 0.9 إليه، ستحصل على 90٪ منها كبيانات تدريب و10٪ كبيانات اختبار:

data = DataLoader.from_folder(data_path)
train_data, test_data = data.split(0.9)

الآن بعد أن تم إعداد بياناتك، يمكنك إنشاء نموذج باستخدامها.

5- إنشاء نموذج مصنِّف الصور

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

model = image_classifier.create(train_data)

عند تشغيل هذا، ستظهر لك نتيجة تشبه إلى حد ما ما يلي:

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
103/103 [===] - 15s 129ms/step - loss: 1.1169 - accuracy: 0.6181

Epoch 2/5
103/103 [===] - 13s 126ms/step - loss: 0.6595 - accuracy: 0.8911

Epoch 3/5
103/103 [===] - 13s 127ms/step - loss: 0.6239 - accuracy: 0.9133

Epoch 4/5
103/103 [===] - 13s 128ms/step - loss: 0.5994 - accuracy: 0.9287

Epoch 5/5
103/103 [===] - 13s 126ms/step - loss: 0.5836 - accuracy: 0.9385

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

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

المفتاح هو كلمة "Hub"، التي تخبرنا بأنّ هذا النموذج مصدره TensorFlow Hub. بشكل تلقائي، يستخدم تطبيق TensorFlow Lite نموذجًا لـ "MobileNet" وهو مصمّم للتعرّف على 1,000 نوع من الصور. والمنطق هنا هو أن المنهجية التي تستخدمها، من خلال تعلم "الميزات" للتفريق بين 1000 فئة، يمكن إعادة استخدامها. نفس "الميزات" يمكن تعيينها إلى فئاتنا الخمس من الزهور، بحيث لا يلزم تعلمها من البداية.

ومرّ النموذج بخمس فترات - حيث تمثل الحقبة دورة كاملة من التدريب حيث تحاول الشبكة العصبية مطابقة الصور مع تصنيفاتها. وبحلول الوقت الذي مرّ فيه 5 فترات، في حوالي دقيقة واحدة، كانت دقيقة بنسبة 93.85٪ في بيانات التدريب. ونظرًا لوجود 5 فصول، سيكون التخمين العشوائي دقيقًا بنسبة 20٪، وهذا هو التقدم! (كما يُبلغ أيضًا عن رقم "الخسارة"، لكنك تجاهل ذلك بأمان في الوقت الحالي).

في وقت سابق، قسّمت البيانات إلى بيانات تدريب واختبار، لكي تتمكن من الحصول على مقياس لمستوى أداء الشبكة على البيانات التي لم تطّلع عليها من قبل، وهو مؤشر أفضل على مستوى أدائها في العالم الحقيقي باستخدام model.evaluate في بيانات الاختبار:

loss, accuracy = model.evaluate(test_data)

سيؤدي هذا إلى إخراج شيء مثل هذا:

12/12 [===] - 5s 115ms/step - loss: 0.6622 - accuracy: 0.8801

لاحظ الدقة هنا. تبلغ نسبة الدقة 88.01%، لذا من المفترض أن يؤدي استخدام النموذج التلقائي في العالم الواقعي إلى توقُّع هذا المستوى من الدقة. وهذا ليس سيئًا بالنسبة إلى النموذج التلقائي الذي درّبته خلال دقيقة تقريبًا. بالطبع يمكنك إجراء الكثير من التعديلات لتحسين النموذج، وهذا علم في حد ذاته!

6- تصدير النموذج

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

ها هو الرمز:

model.export(export_dir='/mm_flowers')

في حال تشغيل هذا في Google Colab، يمكنك بعد ذلك الاطّلاع على النموذج من خلال النقر على رمز المجلد على يمين الشاشة:

cc5b9988775633b4.png

من هنا، ستحصل على قائمة بالدليل الحالي. استخدِم الزر المشار إليه للتحرّك "لأعلى". دليل:

51e6ac47c992142a.png

لقد حددت في التعليمة البرمجية للتصدير إلى الدليل mm_flowers. افتح ذلك الملف، وسيظهر ملف باسم "model.tflite". هذا هو نموذجك المُدرَّب.

57bad87f294fd189.png

اختَر الملف وسترى 3 نقاط منبثقة على يسار الشاشة. انقر عليها للحصول على قائمة سياقات ويمكنك تنزيل النموذج من هناك.

aee14ad10c4a8a1a.png

بعد بضع لحظات، سيتم تنزيل النموذج إلى مجلد التنزيلات.

7. تهانينا

أصبحت جاهزًا الآن لدمجها في تطبيق الأجهزة الجوّالة! ستفعل ذلك في التمرين المعملي التالي.