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

1. מבוא

657431be3173fa86.png android.png

הערה: כדי לבצע את הבדיקה ב-Codelab הזה צריך מכשיר פיזי

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

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

צריך להתקין את Android Studio 4.1 ואילך

אם היא עדיין לא מותקנת, צריך להוריד ולהתקין את AndroidStudio 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.

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 wrapper. לחץ על "אישור".

d68b4d7189e6c1e4.png

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

60a77ef126c1373d.png

  1. עכשיו צריך לתת להדגמה של Tensorflow גישה למצלמה:

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. כברירת מחדל, היא מפרטת את כל משימות המשימות בכל המודולים, ולכן היא קצת מבלבלת. כדי לברר רק את המשימות הראשונות לביצוע, לוחצים על לחצן 'קיבוץ לפי' שבצד חלונית המשימות 'מבצעים' ובוחרים באפשרות 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 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 לקלט ה-method:
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. מה השלב הבא?

מידע נוסף זמין בקישורים הבאים: