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

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

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

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

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

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

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

  • איך מאמנים מודל מותאם אישית של מסווג תמונות באמצעות TensorFlow Lite Model Maker.

הדרישות

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

2. שנתחיל?

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

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

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

4ee12554e75b103f.png

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

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

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

  1. מתקינים את TensorFlow Lite Model Maker. אפשר לעשות זאת באמצעות pip install. החלק &> /dev/null בסוף רק מבטל את הפלט. הפלט של Model Maker כולל הרבה דברים שלא רלוונטיים באופן מיידי. ההודעה הוסתרה כדי שתוכלו להתמקד במשימה שאתם מבצעים.
# 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. יצירת מודל לסיווג תמונות

‫Model Maker מסתיר הרבה מהפרטים הספציפיים של עיצוב רשת נוירונים, כך שלא צריך להתמודד עם עיצוב רשת ועם דברים כמו קונבולוציות, צפיפות, 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

בחלק הראשון מוצגת ארכיטקטורת המודל. מה שקורה מאחורי הקלעים ב-Model Maker נקרא למידת העברה. המערכת משתמשת במודל קיים שאומן מראש כנקודת התחלה, ופשוט לוקחת את הדברים שהמודל הזה למד על האופן שבו תמונות בנויות ומיישמת אותם כדי להבין את 5 הפרחים האלה. אפשר לראות את זה בשורה הראשונה:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

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

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