1. לפני שמתחילים
ML Kit הוא SDK לנייד שמאפשר להשתמש במומחיות של Google בתחום למידת המכונה במכשיר באפליקציות ל-Android ול-iOS. אתם יכולים להשתמש בממשקי ה-API של Vision ושל Natural Language, שהם עוצמתיים אבל פשוטים לשימוש, כדי לפתור בעיות נפוצות באפליקציות שלכם או ליצור חוויות משתמש חדשות לגמרי. הכול מבוסס על המודלים הכי טובים של Google ללמידת מכונה, ומוצע לכם ללא עלות.
כל ממשקי ה-API של ML Kit פועלים במכשיר, כך שאפשר להשתמש בהם בתרחישי שימוש בזמן אמת שבהם רוצים לעבד סטרימינג חי מהמצלמה, למשל. זה גם אומר שהפונקציונליות זמינה במצב אופליין.
ב-codelab הזה נסביר בשלבים פשוטים איך להוסיף לאפליקציית Android קיימת זיהוי ומעקב של אובייקטים (ODT) בתמונה נתונה. חשוב לשים לב שב-codelab הזה נעשה שימוש בקיצורי דרך כדי להדגיש את השימוש ב-ODT של ML Kit.
מה תפַתחו
ב-Codelab הזה תלמדו איך ליצור אפליקציית Android באמצעות ML Kit. האפליקציה תשתמש ב-API של ML Kit Object Detection and Tracking (זיהוי ומעקב אובייקטים) כדי לזהות אובייקטים בתמונה נתונה.בסופו של דבר, אמור להתקבל משהו דומה לתמונה שמוצגת בצד שמאל. |
|
מה תלמדו
- איך משלבים ML Kit SDK באפליקציה ל-Android
- ML Kit Object Detection and Tracking API
מה תצטרכו
- גרסה עדכנית של Android Studio (גרסה 4.1.2 ואילך)
- אמולטור של Android Studio או מכשיר Android פיזי
- קוד לדוגמה
- ידע בסיסי בפיתוח ל-Android ב-Kotlin
ה-Codelab הזה מתמקד ב-ML Kit. מושגים ובלוקים של קוד שלא רלוונטיים מוצגים בקצרה, ואתם יכולים פשוט להעתיק ולהדביק אותם.
2. להגדרה
הורדת הקוד
כדי להוריד את כל הקוד של ה-Codelab הזה, לוחצים על הקישור הבא:
מחלצים את קובץ ה-ZIP שהורד. הפעולה הזו תפרוס תיקיית שורש (mlkit-android-main) עם כל המשאבים שתצטרכו. במהלך ה-codelab הזה, תצטרכו רק את המקורות בספריית המשנה 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.) (ייבוא פרויקט (Gradle, Eclipse ADT וכו')) ובוחרים את התיקייה starter מקוד המקור שהורדתם קודם.

הוספת יחסי התלות של ML Kit Object Detection and Tracking
התלויות של ML Kit מאפשרות לכם לשלב את ML Kit ODT SDK באפליקציה. מוסיפים את השורות הבאות לסוף הקובץ app/build.gradle של הפרויקט:
build.gradle
dependencies {
// ...
implementation 'com.google.mlkit:object-detection:16.2.4'
}
סנכרון הפרויקט עם קובצי Gradle
כדי לוודא שכל התלויות זמינות לאפליקציה, בשלב הזה צריך לסנכרן את הפרויקט עם קובצי gradle.
בסרגל הכלים של Android Studio, בוחרים באפשרות Sync Project with Gradle Files (סנכרון הפרויקט עם קובצי Gradle) (
).
(אם הלחצן הזה מושבת, צריך לוודא שמייבאים רק את starter/app/build.gradle ולא את כל המאגר).
4. הפעלת האפליקציה לתחילת הדרך
אחרי שייבאתם את הפרויקט ל-Android Studio והוספתם את התלות של ML Kit Object Detection and Tracking (זיהוי ומעקב אובייקטים), אתם מוכנים להפעיל את האפליקציה בפעם הראשונה.
מחברים את מכשיר Android למחשב המארח באמצעות USB, או מפעילים את האמולטור של Android Studio ולוחצים על Run (הפעלה) (
) בסרגל הכלים של Android Studio.
הפעלת האפליקציה ועיון בה
האפליקציה אמורה להיפתח במכשיר Android. יש בו קוד שחוזר על עצמו (boilerplate) שמאפשר לכם לצלם תמונה או לבחור תמונה מוגדרת מראש, ולהזין אותה לצינור עיבוד לזיהוי ולמעקב אחרי אובייקטים שתבנו ב-codelab הזה. לפני שכותבים קוד, כדאי להכיר קצת את האפליקציה.
קודם כל, יש לחצן (
) בתחתית כדי:
- פותחים את אפליקציית המצלמה שמשולבת במכשיר או באמולטור.
- מצלמים תמונה בתוך אפליקציית המצלמה
- מקבלים את התמונה שצולמה באפליקציה לתחילת הדרך
- הצגת התמונה
מנסים את הלחצן צילום תמונה, פועלים לפי ההנחיות לצילום תמונה, מאשרים את התמונה ורואים אותה מוצגת בתוך אפליקציה לתחילת הדרך.
כדי להבין איך זה עובד, כדאי לחזור על הפעולות כמה פעמים:

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

5. הוספת זיהוי אובייקטים במכשיר
בשלב הזה תוסיפו לאפליקציה לתחילת הדרך את הפונקציונליות של זיהוי אובייקטים בתמונות. כמו שראיתם בשלב הקודם, אפליקציה לתחילת הדרך מכילה קוד שחוזר על עצמו (boilerplate) לצילום תמונות באמצעות אפליקציית המצלמה במכשיר. יש גם 3 תמונות מוגדרות מראש באפליקציה שתוכלו לנסות עליהן זיהוי אובייקטים אם אתם מריצים את ה-codelab באמולטור של Android.
אחרי שבוחרים תמונה, מתוך התמונות המוגדרות מראש או מצילום תמונה באמצעות אפליקציית המצלמה, קוד ה-boilerplate מפענח את התמונה למופע Bitmap, מציג אותה במסך ומפעיל את השיטה runObjectDetection עם התמונה.
בשלב הזה תוסיפו קוד לשיטה runObjectDetection כדי לבצע זיהוי אובייקטים.
הגדרה והפעלה של זיהוי אובייקטים במכשיר בתמונה
ההגדרה של ML Kit ODT כוללת רק 3 שלבים פשוטים עם 3 ממשקי API:
- הכנת תמונה:
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.InputImagecom.google.mlkit.vision.objects.ObjectDetectioncom.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, ואז מקבלים ממנו detector. יש 3 אפשרויות להגדרה (האפשרויות שמופיעות במודגש משמשות ב-codelab הזה):
- מצב הגלאי (תמונה בודדת או סטרימינג)
- מצב זיהוי (יחיד או מרובה זיהוי אובייקטים)
- מצב סיווג (מופעל או מושבת)
ה-codelab הזה מיועד לזיהוי ולסיווג של כמה אובייקטים בתמונה אחת. מוסיפים את הפריט הבא:
// 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: מספר שלם שמשמש למעקב אחריו בין מסגרות (לא בשימוש ב-codelab הזה). -
boundingBox: התיבה התוחמת של האובייקט. labels:רשימה של תוויות לאובייקט שזוהה (רק אם הסיווג מופעל):index(קבלת האינדקס של התווית הזו)-
text(קבלת הטקסט של התווית הזו, כולל 'מוצרי אופנה', 'מזון', 'מוצרים לבית', 'מקום', 'צמח') -
confidence( מספר עשרוני בין 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}")
}
}
}
עכשיו אפשר לקבל תמונות לזיהוי!
כדי להריץ את ה-codelab, לוחצים על Run (הפעלה) (
) בסרגל הכלים של Android Studio. אפשר לנסות לבחור תמונה מוגדרת מראש או לצלם תמונה, ואז להסתכל על חלון logcat(
) בתוך ה-IDE.
הפלט אמור להיראות כך:
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: פשוט ומהיר.
בקטע הזה תלמדו איך להשתמש בתוצאה בתמונה:
- לשרטט את התיבה התוחמת על התמונה
- לצייר את שם הקטגוריה ואת רמת הביטחון בתוך תיבת התוחמת
הסבר על כלי ההדמיה
יש קוד boilerplate בתוך ה-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ומציגים אותה על המסך.
מפעילים פתרונות חכמים
עכשיו לוחצים על Run (הפעלה) (
) בסרגל הכלים של Android Studio.
אחרי שהאפליקציה נטענת, לוחצים על הכפתור עם סמל המצלמה, מכוונים את המצלמה לאובייקט, מצלמים תמונה ומאשרים אותה (באפליקציית המצלמה). אפשר גם פשוט להקיש על אחת מהתמונות המוגדרות מראש. אחרי הלחיצה על הלחצן, אמורות להופיע תוצאות הזיהוי. כדי לנסות שוב, לוחצים שוב על הלחצן או בוחרים תמונה אחרת. כדאי לנסות כמה פעמים כדי לראות את היכולות של ODT העדכני של ML Kit.

7. מעולה!
השתמשתם ב-ML Kit כדי להוסיף לאפליקציה יכולות של זיהוי אובייקטים:
- 3 שלבים עם 3 ממשקי API
- יצירת תמונת קלט
- יצירת גלאי
- שליחת תמונה לגלאי
זה כל מה שצריך לעשות כדי להתחיל להשתמש בו.
במהלך התהליך, יכול להיות שתרצו לשפר את המודל: כפי שניתן לראות, מודל ברירת המחדל יכול לזהות רק 5 קטגוריות – המודל אפילו לא יודע מה זה סכין, מזלג ובקבוק. כדאי לעיין ב-Codelab נוסף בתוכנית הלימודים בנושא למידת מכונה במכשיר – זיהוי אובייקטים, כדי ללמוד איך לאמן מודל בהתאמה אישית.
מה נכלל
- איך מוסיפים לאפליקציית Android את התכונות 'זיהוי אובייקטים' ו'מעקב אחרי אובייקטים' של ML Kit
- איך משתמשים בזיהוי ובמעקב אחרי אובייקטים במכשיר ב-ML Kit כדי לזהות אובייקטים בתמונות
השלבים הבאים
- כדי לחוות את הדיוק והביצועים של הזיהוי והסיווג, כדאי לנסות את ML Kit ODT עם תמונות נוספות וסרטוני וידאו בשידור חי
- כדי ללמוד איך לאמן מודל בהתאמה אישית, אפשר לעיין בתוכנית הלימודים בנושא למידת מכונה במכשיר – זיהוי אובייקטים
- איך משתמשים ב-ODT של ML Kit באפליקציית Android משלכם