שילוב מודל מותאם אישית באפליקציה

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

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

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

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

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

  • צריך להשלים את שני ה-Codelabs הראשונים בתוכנית הלימודים הזו

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

  • שילוב מודל בהתאמה אישית שאומן במעבדה הקודמת באפליקציית Android או iOS

הדרישות

  • ‫Android Studio, שזמין בכתובת developer.android.com/studio לחלק של Android בשיעור Lab
  • ‫Xcode, שזמין ב-Apple App Store, לחלק של המעבדה שקשור ל-iOS

2. הורדת אפליקציית Starter

קודם כל צריך להוריד את האפליקציה מ-Codelab בנושא יצירת אפליקציית Computer Vision ראשונה ב-Android או ב-iOS. אם כבר עברתם את שיעור ה-Lab, הוא ייקרא ImageClassifierStep1. אם אתם לא רוצים לעבור את שיעור ה-Lab, אתם יכולים לשכפל את הגרסה המוגמרת ממאגר הקוד.

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

f3703d45d1332d1d.png

זו אפליקציה די פרימיטיבית, אבל היא מציגה פונקציונליות חזקה מאוד עם קוד קצר. עם זאת, אם רוצים שהפרח הזה יזוהה כחיננית ולא רק כפרח, צריך לעדכן את האפליקציה כך שתשתמש במודל המותאם אישית שנוצר במעבדת התכנות Create a custom model for your image classifier.

3. עדכון של build.gradle כדי להשתמש במודלים מותאמים אישית של ML Kit

  1. באמצעות Android Studio, מחפשים את הקובץ build.gradle ברמת האפליקציה. הדרך הקלה ביותר לעשות זאת היא באמצעות סייר הפרויקטים. מוודאים שהאפשרות Android מסומנת בחלק העליון, ובחלק התחתון תופיע תיקייה בשם Gradle Scripts.
  2. פותחים את הקובץ שמתאים למודול, עם שם האפליקציה ואחריו ‎.app כמו שמוצג כאן – (Module: ImageClassifierStep1.app):

8fe1d04b40610047.png

  1. בתחתית הקובץ, מאתרים את ההגדרה dependencies. אמורה להופיע שם השורה הזו:
implementation 'com.google.mlkit:image-labeling:17.0.1'

יכול להיות שמספר הגרסה יהיה שונה. מספר הגרסה העדכני תמיד מופיע באתר ML Kit בכתובת: https://developers.google.com/ml-kit/vision/image-labeling/android

  1. מחליפים את זה בהפניה לספריית התוויות של התמונות בהתאמה אישית. מספר הגרסה של המודל הזה מופיע בכתובת: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. בנוסף, תוסיפו מודל ‎ .tflite שיצרתם בשיעור ה-Lab הקודם. אתם לא רוצים שהמודל הזה יידחס כש-Android Studio יקמפל את האפליקציה, לכן חשוב להשתמש בהגדרה הזו בקטע Android של אותו קובץ build.gradle:
aaptOptions{
    noCompress "tflite"
}

מוודאים שהיא לא נמצאת בהגדרה אחרת. הוא צריך להיות מוטמע ישירות מתחת לתג android. לדוגמה:

62d546bff11d2a50.png

4. הוספת מודל TFLite

ב-codelab הקודם יצרתם מודל בהתאמה אישית והורדתם אותו כקובץ model.tflite.

בפרויקט, מחפשים את התיקייה assets שמכילה כרגע את flower1.jpg. מעתיקים את המודל לתיקייה הזו באופן הבא:

  1. לוחצים לחיצה ימנית על התיקייה Assets ב-Android Studio. בתפריט שנפתח, בוחרים באפשרות הצגה ב-Finder. ('הצגה בסייר' ב-Windows ו'הצגה בקבצים' ב-Linux).

db30b47e419a326b.png

  1. המערכת תעביר אתכם לספרייה במערכת הקבצים. מעתיקים את הקובץ model.tflite לספרייה הזו, לצד flower1.jpg.

36de0c51bec1c19e.png

‫Android Studio יתעדכן כך ששני הקבצים יופיעו בתיקיית הנכסים:

e9f4e9f394d9b357.png

עכשיו אפשר לעדכן את הקוד.

5. עדכון הקוד של המודל המותאם אישית

השלב הראשון הוא להוסיף קוד כדי לטעון את המודל המותאם אישית.

  1. בקובץ MainActivity, מוסיפים את השורה הבאה ל-onCreate, מיד מתחת לשורה setContentView(R.layout.activity_main).

הפעולה הזו תשתמש ב-LocalModel כדי לבנות מהנכס model.tflite. אם Android Studio מציג שגיאה ומסמן את LocalModel באדום, מקישים על ALT + Enter כדי לייבא את הספרייה. הוא אמור להוסיף ייבוא ל-com.google.mlkit.common.model.LocalModel בשבילכם.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

בעבר, השתמשתם במודל ברירת המחדל ב-btn.setOnClickListener handler. הוא הוגדר באמצעות הקוד הזה:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

תצטרכו להחליף אותו כדי להשתמש במודל המותאם אישית.

  1. הגדרת אובייקט של אפשרויות בהתאמה אישית:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

ההגדרה הזו מאפשרת להחליף את אפשרויות ברירת המחדל באפשרויות בהתאמה אישית. סף מהימנות מגדיר את רמת האיכות של התחזיות שיוחזרו. אם חוזרים לדוגמה שמופיעה בחלק העליון של ה-codelab הזה, שבה התמונה הייתה של חרצית, אפשר לראות 4 תחזיות, שלכל אחת מהן יש ערך לידה, למשל 'שמיים' עם הערך 0 .7632.

אפשר לסנן ביעילות תוצאות באיכות נמוכה יותר באמצעות הגדרת סף גבוה של רמת סמך. אם מגדירים את הערך הזה ל-0.9, למשל, לא יוחזרו תוויות עם עדיפות נמוכה יותר. הפרמטר setMaxResultCount() שימושי במודלים עם הרבה מחלקות, אבל במודל הזה יש רק 5 מחלקות, אז פשוט משאירים את הערך 5.

עכשיו יש לכם אפשרויות לתווית, ואתם יכולים לשנות את יצירת המופע של התווית ל:

val labeler = ImageLabeling.getClient(options)

שאר הקוד יפעל ללא שינוי. כדאי לנסות!

dd40c36c4edbb33.png

כאן אפשר לראות שהפרח הזה זוהה עכשיו כחיננית, עם הסתברות של 0 .959!

נניח שהוספתם תמונה שנייה של פרח והרצתם את ההנחיה מחדש:

8556a5fbea487842.png

היא מזהה את התמונה כשל ורד.

יכול להיות שתהיתם למה כתוב roses במקום רק rose. הסיבה לכך היא שערכי התוויות במערך הנתונים הם שמות התיקיות, ולצערנו השמות האלה לא עקביים. לפעמים הם מופיעים בצורת יחיד (למשל, daisy) ולפעמים בצורת רבים (למשל, roses). חשוב לא להתבלבל ולחשוב שהמודל מנסה לספור את הפריטים בתמונה – הוא הרבה יותר פרימיטיבי מזה, והוא יכול רק לזהות את סוגי הפרחים.

6. הורדת אפליקציית Start ל-iOS

  1. קודם צריך את האפליקציה מה-Codelab הראשון. אם כבר עברתם את שיעור ה-Lab, הוא ייקרא ImageClassifierStep1. אם אתם לא רוצים לעבור את שיעור ה-Lab, אתם יכולים לשכפל את הגרסה המוגמרת ממאגר. שימו לב שה-pods והקובץ ‎ .xcworkspace לא נמצאים במאגר, ולכן לפני שממשיכים לשלב הבא צריך להריץ את הפקודה'pod install' מאותה תיקייה שבה נמצא הקובץ ‎ .xcproject.
  2. פותחים את ImageClassifierStep1.xcworkspace ב-Xcode. שימו לב: צריך להשתמש בקובץ ‎ .xcworkspace ולא בקובץ ‎ .xcproject כי חבילת ML Kit נוצרה באמצעות pods, וסביבת העבודה תטען אותם.

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

מריצים את הפקודה ורואים משהו כזה:

9e151ed18f99fb98.png

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

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

7. שימוש בתרמילים של תווית תמונה בהתאמה אישית ב-ML Kit

באפליקציה הראשונה נעשה שימוש בקובץ pod כדי לקבל את הספריות והמודל הבסיסיים של ML Kit Image Labeler. כדי להשתמש בספריות של תוויות תמונות בהתאמה אישית, צריך לעדכן את הגרסה.

  1. מחפשים את הקובץ שנקרא podfile בספריית הפרויקט. פותחים אותו ורואים משהו כזה:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. משנים את הצהרת ה-POD מ-ImageLabeling ל-ImageLabelingCustom, כך:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. אחרי שמסיימים, משתמשים במסוף כדי לנווט לספרייה שמכילה את קובץ ה-Podfile (וגם את קובץ ה-xcworkspace) ומריצים את הפקודה pod install.

bb5d78eb7c7ab975.png

אחרי כמה רגעים, ספריות MLKitImageLabeling יוסרו והספריות המותאמות אישית יתווספו. עכשיו אפשר לפתוח את הקובץ ‎ .xcworkspace כדי לערוך את הקוד.

8. הוספת מודל TFLite ל-Xcode

בסדנת הקוד הקודמת יצרתם מודל בהתאמה אישית והורדתם אותו כקובץ model.tflite. אם אין לכם את הקובץ הזה, אתם צריכים לחזור ולהריץ את ה-codelab הזה, או לעיין בקוד של Colab כאן. אם אין לכם גישה ל-Google Colab, ה-notebook זמין בקישור הזה

  1. כשסביבת העבודה פתוחה ב-Xcode, גוררים את הקובץ model.tflite אל הפרויקט. הוא צריך להיות באותה תיקייה כמו שאר הקבצים, כמו ViewController.swift או Main.storyboard.
  2. תיפתח תיבת דו-שיח עם אפשרויות להוספת הקובץ. מוודאים שהאפשרות הוספה ליעדים מסומנת, אחרת המודל לא ייכלל באפליקציה כשהיא תופעל במכשיר.

שימו לב: אם התחלתם מהשלב הזה ואתם ממשיכים לפי ההוראות, הרשומה 'Add to Targets' תהיה ImageClassifierStep1. אם דילגתם קדימה לקוד המוגמר, הרשומה תהיה ImageClassifierStep2 (כמו שמוצג).

5b6a7f40c73f0f1f.png

כך תוכלו לטעון את המודל. בשלב הבא נסביר איך עושים את זה.

9. עדכון הקוד של המודל המותאם אישית

  1. פותחים את קובץ ה-ViewController.swift. יכול להיות שתופיע שגיאה בשורה 'import MLKitImageLabeling' בחלק העליון של הקובץ. הסיבה לכך היא שהסרתם את ספריות התיוג של התמונות הגנריות כשעדכנתם את קובץ ה-pod. אפשר למחוק את השורה הזו ולעדכן אותה כך:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

יכול להיות שקל לקרוא אותם במהירות ולחשוב שהם חוזרים על אותו קוד! אבל בסוף יש את האפשרויות 'נפוץ' ו'בהתאמה אישית'!

  1. בשלב הבא טוענים את המודל המותאם אישית שהוספתם בשלב הקודם. מאתרים את getLabels() func. מתחת לשורה visionImage.orientation = image.imageOrientation, מוסיפים את השורות הבאות:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. מחפשים את הקוד שמציין את האפשרויות של ImageLabeler הכללי. סביר להניח שמוצגת לך שגיאה כי הספריות האלה הוסרו:
let options = ImageLabelerOptions()

מחליפים את הקוד הזה בקוד הבא, כדי להשתמש ב-CustomImageLabelerOptions, וכדי לציין את המודל המקומי:

let options = CustomImageLabelerOptions(localModel: localModel)

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

238cd21748a97cf4.png

נניח שהוספתם תמונה שנייה של פרח והרצתם את ההנחיה מחדש:

75f3970a6b509bfe.png

האפליקציה זיהתה בהצלחה שהתמונה הזו תואמת לתווית 'ורדים'!

10. מעולה!

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

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

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