1. מבוא
הערה: כדי לבצע את הבדיקה ב-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 כדי לזהות פרחים.
רישיון: לשימוש בחינם
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 Studio 4.1 ואילך
אם היא עדיין לא מותקנת, מתקינים את AndroidStudio בגרסה 4.1 ואילך.
פתיחת הפרויקט באמצעות Android Studio
כדי לפתוח פרויקט ב-Android Studio, פועלים לפי השלבים הבאים:
- פותחים את Android Studio . לאחר הטעינה, בוחרים באפשרות 'פתיחת פרויקט קיים' מהחלון הקופץ הזה:
- בבורר הקבצים, בוחרים
TFLClassify/build.gradle
מספריית העבודה.
- תקבלו את התכונה Gradle Sync בחלון הקופץ, בפעם הראשונה שאתם פותחים את הפרויקט ושואלים איך להשתמש ב-Gradle wrapper. לחץ על "אישור".
- מפעילים מודל מפתחים וניפוי באגים ב-USB בטלפון אם עדיין לא עשיתם זאת. זוהי הגדרה חד-פעמית. יש לפעול לפי ההוראות האלו.
- כשהפרויקט והטלפון שלכם מוכנים, תוכלו להפעיל אותם במכשיר אמיתי. כדי לעשות זאת, בוחרים באפשרות
TFL_Classify.start
ולוחצים על לחצן ההרצה בסרגל הכלים:
- עכשיו צריך לתת להדגמה של Tensorflow גישה למצלמה:
- במסך הטלפון יופיע המסך הבא עם מספרים אקראיים שמחליפים את המקומות שבהם מוצגות תוצאות אמיתיות.
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
- כברירת מחדל, היא מפרטת את כל משימות המשימות בכל המודולים, ולכן היא קצת מבלבלת. כדי לברר רק את המשימות הראשונות לביצוע, לוחצים על לחצן 'קיבוץ לפי' שבצד חלונית המשימות 'מבצעים' ובוחרים באפשרות
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 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
לקלט ה-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)
}
}
- כדי להריץ את האפליקציה במכשיר אמיתי, בוחרים באפשרות
TFL_Classify.start
ולוחצים על לחצן ההרצה בסרגל הכלים:
9. מה השלב הבא?
מידע נוסף זמין בקישורים הבאים:
- כדאי לנסות מודלים אחרים של TFLite שתואמים לקישור של מודלים של למידת מכונה מ-tfhub.dev.
- מידע נוסף על TFLite זמין במסמכים ב-tensorflow.org ובמאגר הקודים.
- אפשר לנסות מודלים אחרים שאומנו מראש ל-TFLite, כולל מזהה מילת הפעלה של דיבור וגרסה של מענה חכם במכשיר.
- אפשר לקרוא מידע נוסף על TensorFlow באופן כללי במסמכי תחילת העבודה.