1. לפני שמתחילים
ML Kit הוא ערכת SDK לנייד שמאפשרת לכם להשתמש במומחיות של Google בתחום הלמידה החישובית במכשיר באפליקציות ל-Android ול-iOS. אתם יכולים להשתמש בממשקי ה-API החזקים והנוחים של Vision ו-Natural Language כדי לפתור אתגרים נפוצים באפליקציות או ליצור חוויות משתמש חדשות לגמרי. כל הכלים האלה מבוססים על מודלים מתקדמים של למידת מכונה של Google, והם זמינים ללא עלות.
כל ממשקי ה-API של ML Kit פועלים במכשיר, ומאפשרים תרחישים לדוגמה של שימוש בזמן אמת, למשל עיבוד של שידור חי ממצלמה. המשמעות היא גם שהפונקציונליות זמינה במצב אופליין.
בשיעור הקוד הזה נסביר איך להוסיף לאפליקציה הקיימת ל-Android זיהוי ואת מעקב אחר אובייקטים (ODT) בתמונה נתונה. לתשומת ליבכם: בשיעור הקוד הזה אנחנו משתמשים בכמה קיצורי דרך כדי להדגיש את השימוש ב-ODT של ML Kit.
מה תפַתחו
בקודלאב הזה תלמדו ליצור אפליקציה ל-Android באמצעות ML Kit. האפליקציה תשתמש ב-ML Kit Object Detection and Tracking API כדי לזהות אובייקטים בתמונה נתונה.בסוף התהליך אמור להופיע משהו שדומה לתמונה שבצד שמאל. |
מה תלמדו
- איך משלבים את ML Kit SDK באפליקציה ל-Android
- ML Kit Object Detection and Tracking API
מה צריך להכין
- גרסה עדכנית של Android Studio (גרסה 4.1.2 ואילך)
- Android Studio Emulator או מכשיר Android פיזי
- הקוד לדוגמה
- ידע בסיסי בפיתוח Android ב-Kotlin
סדנת הקוד הזו מתמקדת ב-ML Kit. מושגים וחסימות קוד לא רלוונטיים מוצגים בקצרה, וניתן פשוט להעתיק ולהדביק אותם.
2. להגדרה
הורדת הקוד
כדי להוריד את כל הקוד של סדנת הקוד הזו, לוחצים על הקישור הבא:
פותחים את קובץ ה-ZIP שהורדתם. הפקודה הזו תבצע ביטול אריזה של תיקיית root (mlkit-android-main
) עם כל המשאבים הנדרשים. בסדנת הקוד הזו, תצטרכו רק את המקורות שבספריית המשנה object-detection
.
ספריית המשנה object-detection במאגר mlkit-android מכילה שתי ספריות:
- starter – קוד לתחילת הדרך שעליו תבנו את הקוד ב-Codelab הזה.
- final – קוד מלא של אפליקציית הדוגמה המוגמרת.
3. הוספת ML Kit Object Detection and Tracking API לפרויקט
ייבוא האפליקציה ל-Android Studio
נתחיל בייבוא האפליקציה למתחילים ל-Android Studio.
פותחים את Android Studio, בוחרים באפשרות Import Project (Gradle, Eclipse ADT, etc.) ובוחרים את התיקייה starter
מקוד המקור שהורדתם מקודם.
הוספת יחסי התלות לזיהוי אובייקטים ומעקב אחריהם ב-ML Kit
יחסי התלות של ML Kit מאפשרים לכם לשלב את ML Kit ODT SDK באפליקציה. מוסיפים את השורות הבאות לסוף הקובץ app/build.gradle
של הפרויקט:
build.gradle
dependencies {
// ...
implementation 'com.google.mlkit:object-detection:16.2.4'
}
סנכרון הפרויקט עם קובצי Gradle
כדי לוודא שכל יחסי התלות זמינים לאפליקציה, צריך לסנכרן את הפרויקט עם קובצי Gradle בשלב הזה.
בוחרים באפשרות סנכרון הפרויקט עם קובצי Gradle ( ) בסרגל הכלים של Android Studio.
(אם הלחצן הזה מושבת, חשוב לייבא רק את starter/app/build.gradle
, ולא את המאגר כולו.)
4. הפעלת האפליקציה למתחילים
אחרי שמייבאים את הפרויקט ל-Android Studio ומוסיפים את יחסי התלות לזיהוי אובייקטים ולמעקב אחר אובייקטים ב-ML Kit, אפשר להריץ את האפליקציה בפעם הראשונה.
מחברים את מכשיר Android למארח באמצעות USB, או מפעילים את אמולטור Android Studio ולוחצים על הפעלה ( ) בסרגל הכלים של Android Studio.
הפעלה של האפליקציה וסקירתה
האפליקציה אמורה להיפתח במכשיר Android. הוא מכיל קוד סטנדרטי שמאפשר לצלם תמונה או לבחור תמונה מוגדרת מראש, ולהעביר אותה לצינור עיבוד נתונים לזיהוי ולמעקב אחר אובייקטים שתבנו ב-codelab הזה. לפני שנכתוב קוד, נלמד קצת על האפליקציה.
קודם כול, יש לחצן ( ) בתחתית המסך שמאפשר:
- להציג את אפליקציית המצלמה המשולבת במכשיר או במהדמ.
- מצלמים תמונה באפליקציית המצלמה
- לקבל את התמונה שצולמה באפליקציית ההתחלה
- הצגת התמונה
מנסים את הלחצן צילום תמונה, פועלים לפי ההנחיות לצילום תמונה, מאשרים את התמונה ומתבוננים בה באפליקציית ההתחלה.
חוזרים על הפעולה כמה פעמים כדי לראות איך זה עובד:
שנית, יש 3 תמונות מוגדרות מראש שאפשר לבחור מתוכן. אם אתם משתמשים במהדר של Android, תוכלו להשתמש בתמונות האלה מאוחר יותר כדי לבדוק את קוד זיהוי האובייקטים.
בוחרים תמונה מתוך 3 התמונות המוגדרות מראש. בודקים שהתמונה מופיעה בתצוגה המוגדלת:
5. הוספת זיהוי אובייקטים במכשיר
בשלב הזה תוסיפו לאפליקציית ההתחלה את הפונקציונליות לזיהוי אובייקטים בתמונות. כפי שראיתם בשלב הקודם, אפליקציית ה-starter מכילה קוד לדוגמה לצילום תמונות באמצעות אפליקציית המצלמה במכשיר. אם אתם מריצים את הקודלה במהדמנת Android, יש באפליקציה גם 3 תמונות מוגדרות מראש שתוכלו לנסות לזהות בהן אובייקטים.
אחרי שבוחרים תמונה, מתוך התמונות המוגדרות מראש או מצלמים תמונה באמצעות אפליקציית המצלמה, קוד ה-boilerplate מפענח את התמונה הזו למכונה של Bitmap
, מציג אותה במסך וקורא ל-method runObjectDetection
עם התמונה.
בשלב הזה, תוסיפו קוד לשיטה runObjectDetection
כדי לבצע זיהוי אובייקטים.
הגדרה והפעלה של זיהוי אובייקטים במכשיר בתמונה
יש רק 3 שלבים פשוטים עם 3 ממשקי API להגדרת ML Kit ODT:
- הכנת תמונה:
InputImage
- יוצרים אובייקט של גלאי:
ObjectDetection.getClient(options)
- מחברים את שני האובייקטים שלמעלה:
process(image)
כדי לעשות זאת, צריך להשתמש בפונקציה runObjectDetection(bitmap: Bitmap)
בקובץ MainActivity.kt
.
/**
* ML Kit Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
}
כרגע הפונקציה ריקה. כדי להטמיע את ML Kit ODT, ממשיכים לשלבים הבאים. לאורך הדרך, מערכת Android Studio תבקש מכם להוסיף את הייבוא הנדרש:
com.google.mlkit.vision.common.InputImage
com.google.mlkit.vision.objects.ObjectDetection
com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
שלב 1: יוצרים את InputImage
ב-ML Kit יש ממשק API פשוט ליצירת InputImage
מ-Bitmap
. לאחר מכן תוכלו להזין InputImage
לממשקי ה-API של ML Kit.
// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)
מוסיפים את הקוד שלמעלה לחלק העליון של runObjectDetection(bitmap:Bitmap)
.
שלב 2: יוצרים מכשיר גלאי
ML Kit מבוסס על תבנית התכנון של Builder. מעבירים את ההגדרות ל-builder, ואז מקבלים ממנו גלאי. יש 3 אפשרויות להגדרה (האפשרויות שמודגשות באותיות מודגשות משמשות בקודלאב הזה):
- מצב הגלאי (תמונה אחת או שידור)
- מצב זיהוי (זיהוי אובייקט יחיד או מרובים)
- מצב הסיווג (מופעל או מושבת)
סדנת הקוד הזו מיועדת לזיהוי ולסיווג של מספר אובייקטים בתמונה אחת. מוסיפים את זה עכשיו:
// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
.setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
.enableMultipleObjects()
.enableClassification()
.build()
val objectDetector = ObjectDetection.getClient(options)
שלב 3: מעבירים תמונות לגלאי
זיהוי אובייקטים וסיווג שלהם מתבצע בעיבוד אסינכרוני:
- שולחים תמונה לגלאי (דרך
process()
). - הגלאי עובד קשה מאוד על כך.
- הגלאי מדווח לכם על התוצאה באמצעות קריאה חוזרת (callback).
הקוד הבא עושה בדיוק את זה (מעתיקים ומצרפים אותו לקוד הקיים בתוך fun runObjectDetection(bitmap:Bitmap)):
// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
.addOnSuccessListener {
// Task completed successfully
debugPrint(it)
}
.addOnFailureListener {
// Task failed with an exception
Log.e(TAG, it.message.toString())
}
בסיום, הגלאי מודיע לכם על:
- המספר הכולל של העצמים שזוהו. כל אובייקט שזוהה מתואר באמצעות:
trackingId
: מספר שלם שמשמש למעקב אחריו בין המסגרות (לא נעשה בו שימוש בקודלאב הזה).boundingBox
: התיבה התוחמת של האובייקט.labels:
רשימת תוויות של האובייקט שזוהה (רק כשהסיווג מופעל):index
(אחזור המדד של התווית הזו)text
(קבלת הטקסט של התווית הזו, כולל 'מוצרי אופנה', 'מזון', 'מוצרי בית', 'מקום', 'צמח')confidence
(מספר ממשי (float) בין 0.0 ל-1.0, כאשר הערך 1.0 מייצג 100%)
כנראה שמתם לב שהקוד מבצע עיבוד מסוג printf לתוצאה שזוהתה באמצעות debugPrint()
.
מוסיפים אותו לכיתה MainActivity
:
private fun debugPrint(detectedObjects: List<DetectedObject>) {
detectedObjects.forEachIndexed { index, detectedObject ->
val box = detectedObject.boundingBox
Log.d(TAG, "Detected object: $index")
Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
detectedObject.labels.forEach {
Log.d(TAG, " categories: ${it.text}")
Log.d(TAG, " confidence: ${it.confidence}")
}
}
}
עכשיו אתם מוכנים לקבל תמונות לזיהוי.
כדי להריץ את הקוד, לוחצים על הפעלה ( ) בסרגל הכלים של Android Studio. אפשר לנסות לבחור תמונה מוגדרת מראש או לצלם תמונה, ואז לבדוק את חלון logcat( ) בתוך סביבת הפיתוח המשולבת.
התוצאה אמורה להיראות כך:
D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection: categories: Food
D/MLKit Object Detection: confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection: trackingId: null
D/MLKit Object Detection: boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection: categories: Home good
D/MLKit Object Detection: confidence: 0.75390625
כלומר, המזהה זיהה 3 אובייקטים:
- הקטגוריות הן מזון ומוצרי בית.
- לא מוחזרת קטגוריה עבור האירוע השני כי זוהי כיתה לא ידועה.
- לא
trackingId
(כי זהו מצב הזיהוי של תמונה אחת). - המיקום בתוך המלבן
boundingBox
(למשל, (481, 2021) – (2426, 3376)) - לזיהוי יש רמת ודאות גבוהה שהתמונה הראשונה היא מזון (רמת ודאות של 90% – היה זה סלט).
טכנית, זה כל מה שצריך כדי להפעיל את זיהוי האובייקטים של ML Kit: כל מה שצריך כבר יש לכם! מזל טוב!
מבחינת ממשק המשתמש, אתם עדיין בשלב שבו התחלתם, אבל אתם יכולים להשתמש בתוצאות שזוהו בממשק המשתמש, למשל לצייר את תיבת הגבול כדי ליצור חוויה טובה יותר: נעבור לשלב הבא – עיבוד פוסט-פרודקשן של התוצאות שזוהו.
6. עיבוד פוסט-פרודקשן של תוצאות הזיהוי
בשלבים הקודמים הדפסתם את התוצאה שזוהתה ב-logcat: פשוט ומהיר.
בקטע הזה תשתמשו בתוצאה בתמונה:
- ציור התיבה התוחמת (bounding box) בתמונה
- ציור שם הקטגוריה ודרגת האמון בתוך תיבת הסימון
הסבר על הכלים להצגה חזותית
ב-codelab יש קוד לדוגמה שיעזור לכם להמחיש את תוצאת הזיהוי. אתם יכולים להשתמש בכלים האלה כדי לפשט את הקוד של התצוגה החזותית:
data class BoxWithText(val box: Rect, val text: String)
זהו סוג נתונים לאחסון תוצאה של זיהוי אובייקטים לצורך ויזואליזציה.box
הוא תיבת הגבול שבה נמצא האובייקט, ו-text
היא מחרוזת תוצאת הזיהוי שמוצגת יחד עם תיבת הגבול של האובייקט.fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap
השיטה הזו מצייר את תוצאות זיהוי האובייקטים ב-detectionResults
על הקלטbitmap
ומחזירה את העותק המשופר שלו.
דוגמה לפלט של שיטת השירות drawDetectionResult
:
תצוגה חזותית של תוצאת הזיהוי ב-ML Kit
משתמשים בכלי הוויזואליזציה כדי לצייר את תוצאת זיהוי האובייקטים של ML Kit מעל לתמונה שהוזנה.
עוברים למיקום שבו קוראים ל-debugPrint()
ומוסיפים את קטע הקוד הבא מתחתיו:
// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
var text = "Unknown"
// We will show the top confident detection result if it exist
if (obj.labels.isNotEmpty()) {
val firstLabel = obj.labels.first()
text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
}
BoxWithText(obj.boundingBox, text)
}
// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)
// Show the detection result on the app screen
runOnUiThread {
inputImageView.setImageBitmap(visualizedResult)
}
- מתחילים בניתוח
DetectedObject
של ML Kit ויוצרים רשימה של אובייקטים מסוגBoxWithText
כדי להציג את תוצאת התצוגה החזותית. - לאחר מכן, מציירים את תוצאת הזיהוי מעל תמונת הקלט באמצעות שיטת השירות
drawDetectionResult
ומציגים אותה במסך.
הפעלה
עכשיו לוחצים על הפעלה ( ) בסרגל הכלים של Android Studio.
אחרי שהאפליקציה נטענת, לוחצים על הלחצן עם סמל המצלמה, מכוונים את המצלמה לאובייקט, מצלמים תמונה, מאשרים את התמונה (באפליקציית המצלמה) או מקישים בקלות על תמונות מוגדרות מראש. תראו את תוצאות הזיהוי. לחצו שוב על הלחצן או בחרו תמונה אחרת כדי לחזור על הפעולה כמה פעמים וליהנות מ-ODT העדכני ביותר של ML Kit.
7. מעולה!
השתמשתם ב-ML Kit כדי להוסיף לאפליקציה יכולות של זיהוי אובייקטים:
- 3 שלבים עם 3 ממשקי API
- יצירת תמונת קלט
- יצירת גלאי
- שליחת תמונה לזיהוי
זה כל מה שצריך כדי להפעיל את השירות.
בהמשך, מומלץ לשפר את המודל: כפי שאפשר לראות, מודל ברירת המחדל יכול לזהות רק 5 קטגוריות – המודל לא מזהה אפילו סכין, מזלג ובקבוק. מומלץ לעיין בקודלאבים האחרים במסלול הלמידה שלנו בנושא למידת מכונה במכשיר – זיהוי אובייקטים, כדי ללמוד איך מארגנים אימון של מודל מותאם אישית.
מה עסקנו בו
- איך מוסיפים את התכונות 'זיהוי אובייקטים' ו'מעקב אחר אובייקטים' של ML Kit לאפליקציה ל-Android
- איך משתמשים ב-ML Kit לזיהוי אובייקטים במכשיר ולמעקב אחריהם כדי לזהות אובייקטים בתמונות
השלבים הבאים
- אפשר להרחיב את הבדיקה באמצעות ML Kit ODT עם תמונות וסרטונים חיים נוספים כדי לבדוק את הדיוק והביצועים של הזיהוי והסיווג
- במאמר מסלול הלמידה של זיהוי אובייקטים בנושא למידת מכונה במכשיר מוסבר איך מארגנים אימון של מודל מותאם אישית.
- שימוש ב-ML Kit ODT באפליקציה ל-Android