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

זיהוי פרחים באמצעות TensorFlow Lite ב-Android

מידע על Codelab זה

subjectהעדכון האחרון: אפר׳ 7, 2025
account_circleנכתב על ידי Hoi Lam (revamping author), Yash Katariya (original author)

1.‏ מבוא

657431be3173fa86.png android.png

הערה: כדי לבדוק את הקוד, נדרש מכשיר פיזי

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

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

אם עדיין לא עשיתם זאת, מורידים ומתקינים את 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 שמכיל את הקבצים הנדרשים לקודלאב הזה:

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

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

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 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 ו-FlowerModel.lite יובאו בהצלחה, ומוצגים בהם פרטים ברמה גבוהה לגבי המודל, כולל הקלט / הפלט, וגם קוד לדוגמה שיעזור לכם להתחיל.

82840065f0d59def.png

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

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

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

5de29b413574f25c.png

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

5d8fe7b102340208.png

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

8d0f14a039995b20.png

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

  1. לוחצים על TODO 1 ברשימת TODO או פותחים את הקובץ 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 בהתאם לכך שהוא אחד מה-GPUs התואמים שרשומים. אחרת, מפעילים 4 שרשורי מעבדים כדי להריץ את המודל:
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. כדי לשנות את ה-initializer של המודל כך שישתמש בזה, מוסיפים את 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.‏ מה השלב הבא?

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