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

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

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

ב-Codelab הזה נעדכן את האפליקציה משיעור ה-Lab הראשון עם המודל מהשיעור השני!

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

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

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

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

  • שילוב מודל מותאם אישית באפליקציה ל-Android או ל-iOS, שאומן בשיעור ה-Lab הקודם

למה תזדקק?

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

2. הורדת האפליקציה למתחילים

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

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

f3703d45d1332d1d.png

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

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

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

8fe1d04b40610047.png

  1. בתחתית הקובץ, מאתרים את ההגדרה תלות. שם אמורה להופיע השורה הבאה:
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 מבצעת הידור (compile), יש להשתמש בהגדרה הזו בקטע Android של אותו קובץ build.gradle:
aaptOptions{
    noCompress "tflite"
}

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

62d546bff11d2a50.png

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

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

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

  1. לוחצים לחיצה ימנית על התיקייה נכסים ב-Android Studio. בתפריט שנפתח, בוחרים באפשרות הצגה ב-Finder. ('הצגה ב-Explorer' ב-Windows ו'הצגה ב-Files' ב-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()

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

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

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

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

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

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

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

val labeler = ImageLabeling.getClient(options)

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

dd40c36c4edbb33.png

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

נניח שהוספתם תמונת פרח שנייה ורצתם שוב עם אותה תמונה:

8556a5fbea487842.png

הוא מזהה אותו בתור ורד.

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

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

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

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

הריצו אותו ותראו משהו כזה:

9e151ed18f99fb98.png

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

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

7. שימוש בקבוצות Pod בהתאמה אישית של מתייג תמונות לערכת ML

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

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

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. משנים את ההצהרה של רצף המודעות מ-ImageLabeling ל-ImageLabelingCustom, באופן הבא:
platform :ios, '10.0'

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

bb5d78eb7c7ab975.png

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

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

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

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

שימו לב שההאפשרות 'הוספה ליעדים' יופיע ImageClassifierStep1 אם התחלתם מזה ואתם ממשיכים בשיעור ה-Lab הזה שלב אחר שלב, או ImageClassifierStep2 (כפי שמוצג), אם קפצתם קדימה לקוד המוכן.

5b6a7f40c73f0f1f.png

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

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

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

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

  1. בשלב הבא, טוענים את המודל המותאם אישית שהוספתם בשלב הקודם. מוצאים את הפאנק של getLabels(). מתחת לשורה שבה כתוב 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 כדי לקחת פריימים מפיד בשידור חי ולסווג אותם כדי לראות אילו פרחים הטלפון מזהה!

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