1. מבוא

הערה: כדי לבדוק את ה-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 כדי לזהות פרחים.

רישיון: שימוש חופשי
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 Studio מגרסה 4.1 ואילך
אם היא לא מותקנת, צריך להתקין את AndroidStudio 4.1 ואילך.
פתיחת הפרויקט באמצעות Android Studio
כדי לפתוח פרויקט באמצעות Android Studio:
- פותחים את Android Studio
. אחרי שהפרויקט נטען, בוחרים באפשרות 'פתיחת פרויקט קיים' בחלון הקופץ הזה:

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

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

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

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

5. הוספת TensorFlow Lite לאפליקציית Android
- בוחרים את המודול
startבסייר הפרויקטים בצד שמאל:

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

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

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

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

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

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

7. הרצת המודל המותאם אישית באמצעות TensorFlow Lite
- לוחצים על 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)
...
}
- בתוך שיטת הניתוח של 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))
...
}
- מעבדים את התמונה ומבצעים את הפעולות הבאות על התוצאה:
- מיון התוצאות בסדר יורד לפי ההסתברות של מאפיין
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
...
}
- ממירים את התוצאות הממוינות והמסוננות לאובייקטים של נתונים
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))
}
...
}
- מוסיפים הערה או מוחקים את השורות הבאות שעוזרות ליצור את התוצאות המזויפות שראינו קודם:
// 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.
- מריצים את האפליקציה במכשיר אמיתי על ידי בחירה באפשרות
TFL_Classify.startולחיצה על לחצן ההרצה
בסרגל הכלים:

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

8. אופציונלי: האצת הסקת מסקנות באמצעות נציג GPU
TensorFlow Lite תומך בכמה מאיצי חומרה כדי להאיץ את ההסקה במכשיר הנייד. GPU הוא אחד מהמאיצים ש-TensorFlow Lite יכול להשתמש בהם באמצעות מנגנון של נציג, והוא די פשוט לשימוש.
- פותחים את build.gradle במודול
startאו לוחצים על TODO 5 ברשימת ה-TODO ומוסיפים את יחסי התלות הבאים:
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- חוזרים לקובץ 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()
}
...
}
- כדי להשתמש בזה, משנים את מאתחל המודל ומוסיפים
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)
}
}
- מריצים את האפליקציה במכשיר אמיתי על ידי בחירה באפשרות
TFL_Classify.startולחיצה על לחצן ההרצה
בסרגל הכלים:

9. מה השלב הבא?
הנה כמה קישורים למידע נוסף:
- אפשר לנסות מודלים אחרים של TFLite שתואמים לקישור של מודלים של ML מ-tfhub.dev.
- מידע נוסף על TFLite זמין במסמכים בכתובת tensorflow.org ובמאגר הקוד.
- אפשר לנסות עוד מודלים שאומנו מראש ב-TFLite, כולל גלאי מילות הפעלה לדיבור וגרסה במכשיר של תשובות חכמות.
- במסמכי תחילת העבודה שלנו אפשר לקרוא מידע נוסף על TensorFlow באופן כללי.