זיהוי פרחים עם TensorFlow Lite ב-Android

1. מבוא

657431be3173fa86.png android.png

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

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

ב-codelab הזה משתמשים ב-TensorFlow Lite כדי להריץ מודל לזיהוי תמונות במכשיר Android.

התקנה של Android Studio מגרסה 4.1 ואילך

אם עדיין לא התקנתם אותו, תוכלו להוריד ולהתקין את Android Studio 4.1 ואילך בזמן שאתם מאמנים את מודל TensorFlow Lite.

מה תלמדו

  • איך מאמנים מסווג תמונות מותאם אישית באמצעות TensorFlow Lite Model Maker.
  • איך משתמשים ב-Android Studio כדי לייבא את מודל TensorFlow Lite כדי לשלב את המודל המותאם אישית באפליקציית Android באמצעות CameraX.
  • איך משתמשים ב-GPU בטלפון כדי להאיץ את המודל.

מה תפַתחו

אפליקציית מצלמה פשוטה שמריצה תוכנית לזיהוי תמונות של TensorFlow כדי לזהות פרחים.

f11c2821f2c8311d.png

רישיון: שימוש חופשי

2. אימון של כלי לזיהוי פרחים באמצעות Colab

לפני שמתחילים לאמן את המודל, מתחילים להוריד ולהתקין את Android Studio 4.1 ואילך.

פותחים את Colab שבו מוסבר איך לאמן מסווג באמצעות Keras כדי לזהות פרחים באמצעות TensorFlow Lite transfer learning.

3. הגדרת ספריית העבודה

שכפול מאגר Git

הפקודה הבאה תשכפל את מאגר Git שמכיל את הקבצים שנדרשים ל-Codelab הזה:

git clone https://github.com/hoitab/TFLClassify.git

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

cd TFLClassify

4. הגדרת אפליקציית השלד ל-Android

android.png

התקנה של Android Studio מגרסה 4.1 ואילך

אם היא לא מותקנת, צריך להתקין את AndroidStudio 4.1 ואילך.

פתיחת הפרויקט באמצעות Android Studio

כדי לפתוח פרויקט באמצעות Android Studio:

  1. פותחים את Android Studio 7f2480ded53a193b.png. אחרי שהפרויקט נטען, בוחרים באפשרות 'פתיחת פרויקט קיים' בחלון הקופץ הזה:

f3b8bea7e3b39376.png

  1. בבורר הקבצים, בוחרים באפשרות TFLClassify/build.gradle מספריית העבודה.
  1. בפעם הראשונה שפותחים את הפרויקט, מופיע חלון קופץ עם הכיתוב Gradle Sync (סנכרון Gradle) שבו מוצגת שאלה לגבי שימוש ב-Gradle Wrapper. לחץ על "אישור".

d68b4d7189e6c1e4.png

  1. אם עדיין לא עשיתם זאת, מפעילים בטלפון את מצב הפיתוח ואת ניפוי הבאגים ב-USB. זוהי הגדרה חד-פעמית. פועלים לפי ההוראות האלה.
  2. אחרי שהפרויקט והטלפון מוכנים, אפשר להריץ את הפרויקט במכשיר אמיתי. לשם כך, בוחרים באפשרות TFL_Classify.start ולוחצים על לחצן ההפעלה 86934b7b01ad7565.png בסרגל הכלים:

60a77ef126c1373d.png

  1. עכשיו מאשרים ל-Tensorflow Demo גישה למצלמה:

b63cba02bb36b7e3.png

  1. במסך הטלפון יופיעו מספרים אקראיים במקום התוצאות האמיתיות.

82c603596afa35f1.png

5. הוספת TensorFlow Lite לאפליקציית Android

  1. בוחרים את המודול start בסייר הפרויקטים בצד שמאל:

cede7f2b8b23c1a7.png

  1. לוחצים לחיצה ימנית על מודול start או לוחצים על File ואז על New > Other > TensorFlow Lite Model.

bf243d9fdd27e20a.png

  1. בוחרים את מיקום המודל שבו הורדתם את המודל המותאם אישית FlowerModel.tflite קודם לכן.

cfee18cc6674a408.png

  1. לוחצים על Finish.
  2. בסוף התהליך תראו את ההודעה הבאה. הקובץ FlowerModel.tflite מיובא בהצלחה ומוצג בו מידע ברמה גבוהה לגבי המודל, כולל הקלט והפלט, וגם קוד לדוגמה שיעזור לכם להתחיל.

82840065f0d59def.png

6. אופציונלי: בדיקת כל רשימת המשימות לביצוע

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

  1. דרך טובה לראות מה אנחנו הולכים לעשות היא לבדוק את רשימת המשימות. כדי לעשות זאת, בוחרים בסרגל התפריטים העליון באפשרות View > Tool Windows > TODO

5de29b413574f25c.png

  1. כברירת מחדל, מוצגת רשימה של כל המשימות בכל המודולים, ולכן קשה להבין אותה. כדי למיין רק את משימות ה-TODO שצריך להתחיל, לוחצים על לחצן הקיבוץ בצד של חלונית ה-TODO ובוחרים באפשרות Modules

5d8fe7b102340208.png

  1. מרחיבים את כל הפריטים בקטע 'מודולים להתחלה':

8d0f14a039995b20.png

7. הרצת המודל המותאם אישית באמצעות TensorFlow Lite

  1. לוחצים על TODO 1 ברשימת המשימות או פותחים את הקובץ MainActivity.kt ומאתרים את TODO 1. מוסיפים את השורה הבאה כדי לאתחל את המודל:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. בתוך שיטת הניתוח של CameraX Analyzer, צריך להמיר את תרגום דרך המצלמה ImageProxy ל-Bitmap וליצור אובייקט TensorImage לתהליך ההסקה.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. מעבדים את התמונה ומבצעים את הפעולות הבאות על התוצאה:
  • מיון התוצאות בסדר יורד לפי ההסתברות של מאפיין score, כך שההסתברות הכי גבוהה תופיע ראשונה.
  • הפונקציה מחזירה את k התוצאות המובילות, כפי שמוגדר על ידי הקבוע MAX_RESULT_DISPLAY. אפשר לשנות את הערך של המשתנה הזה כדי לקבל יותר או פחות תוצאות.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. ממירים את התוצאות הממוינות והמסוננות לאובייקטים של נתונים Recognition שמוכנים לשימוש ב-RecyclerView באמצעות קישור נתונים:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. מוסיפים הערה או מוחקים את השורות הבאות שעוזרות ליצור את התוצאות המזויפות שראינו קודם:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. מריצים את האפליקציה במכשיר אמיתי על ידי בחירה באפשרות TFL_Classify.start ולחיצה על לחצן ההרצה 86934b7b01ad7565.png בסרגל הכלים:

60a77ef126c1373d.png

  1. בטלפון יוצג המסך הבא עם מספרים אקראיים במקום שבו יוצגו התוצאות האמיתיות:

f11c2821f2c8311d.png

8. אופציונלי: האצת הסקת מסקנות באמצעות נציג GPU

‫TensorFlow Lite תומך בכמה מאיצי חומרה כדי להאיץ את ההסקה במכשיר הנייד. ‫GPU הוא אחד מהמאיצים ש-TensorFlow Lite יכול להשתמש בהם באמצעות מנגנון של נציג, והוא די פשוט לשימוש.

  1. פותחים את build.gradle במודול start או לוחצים על TODO 5 ברשימת ה-TODO ומוסיפים את יחסי התלות הבאים:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. חוזרים לקובץ MainActivity.kt או לוחצים על TODO 6 ברשימת ה-TODO. מחליפים את ההפעלה הפשוטה של flowerModel בקוד הבא: מקבלים מופע של רשימת התאימות של ה-GPU ומפעילים את ה-GPU בהתאם לכך שהוא אחד ממעבדי ה-GPU התואמים שמופיעים ברשימה. אחרת, מפעילים 4 תהליכי CPU כדי להריץ את המודל:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. כדי להשתמש בזה, משנים את מאתחל המודל ומוסיפים options לקלט של השיטה:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. מריצים את האפליקציה במכשיר אמיתי על ידי בחירה באפשרות TFL_Classify.start ולחיצה על לחצן ההרצה 86934b7b01ad7565.png בסרגל הכלים:

60a77ef126c1373d.png

9. מה השלב הבא?

הנה כמה קישורים למידע נוסף: