מידע על Codelab זה
1. מבוא
הערה: כדי לבדוק את הקוד, נדרש מכשיר פיזי
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 כדי לזהות פרחים.
רישיון: שימוש בחינם
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 Studio מגרסה 4.1 ואילך
אם היא עדיין לא מותקנת, מתקינים את AndroidStudio בגרסה 4.1 ואילך.
פתיחת הפרויקט באמצעות Android Studio
כדי לפתוח פרויקט ב-Android Studio:
- פותחים את Android Studio
. אחרי הטעינה, בוחרים באפשרות 'פתיחת פרויקט קיים' בחלון הקופץ:
- בבורר הקבצים, בוחרים את
TFLClassify/build.gradle
מתוך ספריית העבודה.
- בפעם הראשונה שפותחים את הפרויקט, מופיעה הודעה קופצת עם השאלה 'Gradle Sync' לגבי השימוש ב-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 ו-FlowerModel.lite יובאו בהצלחה, ומוצגים בהם פרטים ברמה גבוהה לגבי המודל, כולל הקלט / הפלט, וגם קוד לדוגמה שיעזור לכם להתחיל.
6. אופציונלי: בדיקה של כל רשימת המשימות
רשימת המשימות מאפשרת לנווט בקלות למיקום המדויק שבו צריך לעדכן את הקוד. אפשר גם להשתמש בו בפרויקט Android כדי להזכיר לעצמכם משימות עתידיות. אפשר להוסיף פריטים של 'דברים שצריך לעשות' באמצעות תגובות לקוד ולהקליד את מילת המפתח TODO
. כדי לגשת לרשימה של המשימות, אפשר:
- דרך מצוינת לראות מה אנחנו עומדים לעשות היא לעיין ברשימת המשימות. כדי לעשות זאת, בוחרים בסרגל התפריטים העליון באפשרות
View
>Tool Windows
>TODO
- כברירת מחדל, מוצגת רשימה של כל המשימות בכל המודולים, מה שעלול לבלבל. כדי למיין רק את המשימות בקטגוריה 'התחלה', לוחצים על הלחצן 'קיבוץ לפי' בצד חלונית המשימות ולוחצים על
Modules
.
- מרחיבים את כל הפריטים בקטע 'מודולים להתחלה':
7. הפעלת המודל המותאם אישית באמצעות TensorFlow Lite
- לוחצים על 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)
...
}
- בתוך שיטת הניתוח של 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 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- חוזרים לקובץ 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()
}
...
}
- כדי לשנות את ה-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)
}
}
- כדי להריץ את האפליקציה במכשיר אמיתי, בוחרים באפשרות
TFL_Classify.start
ולוחצים על לחצן ההפעלהבסרגל הכלים:
9. מה השלב הבא?
הנה כמה קישורים למידע נוסף:
- אפשר לנסות מודלים אחרים של TFLite שתואמים לקישור של מודלים של למידת מכונה מ-tfhub.dev.
- מידע נוסף על TFLite זמין במסמכים באתר tensorflow.org ובמאגר הקוד.
- כדאי לנסות מודלים אחרים של TFLite שהותאמו מראש, כולל גלאי של מילות מפתח לדיבור וגרסה במכשיר של תשובות חכמות.
- מידע נוסף על TensorFlow באופן כללי זמין במאמרים שלנו בנושא תחילת העבודה.