יצירת מודל מותאם אישית למסווג התמונות

1. לפני שמתחילים

ב-Codelab הקודם יצרת אפליקציה ל-Android ול-iOS שבה נעשה שימוש במודל בסיסי לתיוג תמונות שמזהה כמה מאות סוגים של תמונות. הוא זיהה תמונה של פרח באופן כללי מאוד – רואה עלי כותרת, פרח, צמח ושמיים.

כדי לעדכן את האפליקציה כך שהיא תזהה פרחים, חינניות או ורדים ספציפיים, יש צורך במודל מותאם אישית שעבר אימון על הרבה דוגמאות לכל סוג של פרח שאתם רוצים לזהות.

דרישות מוקדמות

  • ה-Codelab הקודם בנתיב הלמידה הזה.

מה תפַתחו ותלמדו

  • איך לאמן מודל מותאם אישית של מסווג תמונות באמצעות הכלי ליצירת מודלים של TensorFlow Lite.

למה תזדקק?

  • אין צורך בחומרה מסוימת – אפשר להשלים הכול בעזרת Google Colab בדפדפן.

2. תחילת העבודה

כל הקוד למעקב מוכן עבורך וזמין להפעלה באמצעות Google Colab כאן. אם אין לכם גישה ל-Google Colab, אתם יכולים לשכפל את המאגר ולהשתמש ב-notebook שנקרא CustomImageClassifierModel.ipynb, שנמצא בספרייה ImageClassificationMobile->colab.

אם יש לכם הרבה דוגמאות של פרחים מסוימים, קל יחסית לאמן מודל בעזרת יוצר המודלים של TensorFlow Lite לזהות אותם.

הדרך הקלה ביותר לעשות זאת היא ליצור קובץ .zip או .tgz שמכיל את התמונות, כשהן ממוינות לפי ספריות. לדוגמה, אם משתמשים בתמונות של פרחי חינניות, שן הארי, ורדים, חמניות וצבעונים, ניתן לארגן אותם בספריות כמו כך:

4ee12554e75b103f.png

צריך לדחוס את כל הנתונים ולארח אותם בשרת. אפשר גם לאמן מודלים באמצעותו. בשאר שיעור ה-Lab הזה תשתמשו בשיעור שהוכן בשבילכם.

בשיעור ה-Lab הזה נצא מנקודת הנחה שאתם משתמשים ב-Google Colab כדי לאמן את המודל. אפשר למצוא את Colab בכתובת colab.research.google.com. אם אתם משתמשים בסביבה אחרת, יכול להיות שתצטרכו להתקין הרבה יחסי תלות, ולא לפחות TensorFlow.

3. יחסי תלות של התקנה וייבוא

  1. מתקינים את TensorFlow Lite Model Maker. אפשר לעשות זאת באמצעות התקנה של PIP. &> /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. הורדה והכנה של הנתונים

אם התמונות מאורגנות בתיקיות והן דחוסות בקובץ ZIP, אם תורידו את קובץ ה-ZIP ותבטלו את הדחיסה שלו, התמונות יתויגו באופן אוטומטי לפי התיקייה שבה הן נמצאות. הספרייה הזו תסומן בתור 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. יצירת מודל של מסווג תמונות

'יוצר המודלים' מפשט הרבה פרטים על עיצוב רשת הנוירונים, כך שלא תצטרך להתעסק עם עיצוב הרשת ודברים כגון קונבולוציות, צפוף, relu, החלקה, פונקציות הפסד ואופטימיזציה. כמודל ברירת מחדל, אפשר פשוט להשתמש בשורת קוד אחת כדי ליצור מודל באמצעות אימון של רשת נוירונים על סמך הנתונים שסופקו:

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

החלק הראשון מציג את ארכיטקטורת המודל. מה שאנחנו עושים מאחורי הקלעים נקרא העברת למידה (Transfer Learning),שבה נעשה שימוש במודל קיים שעבר אימון מראש כנקודת התחלה. כל מה שהמודל הזה למד על בניית תמונות, יכול ליישם אותן כדי להבין את 5 הפרחים האלה. אפשר לראות את זה בשורה הראשונה:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

המפתח הוא המילה Hub, שלפיו המודל הזה הגיע מ-TensorFlow Hub. כברירת מחדל, הכלי TensorFlow Lite Model Maker משתמש במודל שנקרא MobileNet שנועדה לזהות 1,000 סוגים של תמונות. ההיגיון במקרה הזה הוא שהמתודולוגיה שבה היא משתמשת, על ידי למידת 'תכונות' כדי להבחין בין 1,000 מחלקות, ניתן לעשות שימוש חוזר. אותן 'תכונות' שאפשר למפות ל-5 סוגי הפרחים, כדי שלא צריך ללמוד אותם מאפס.

המודל עבר 5 תקופות של זמן: תקופה של אימון היא מחזור אימון מלא שבו רשת הנוירונים מנסה להתאים את התמונות לתוויות שלהן. עד שהיא עברה 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. מזל טוב

עכשיו אפשר לשלב אותו באפליקציה לנייד. תעשו זאת בשיעור ה-Lab הבא.