זהה אובייקטים בתמונות עם דגם מאומן AutoML באנדרואיד

לאחר שתאמן את הדגם שלך באמצעות AutoML Vision Edge , תוכל להשתמש בו באפליקציה שלך כדי לזהות אובייקטים בתמונות.

ישנן שתי דרכים לשלב מודלים מאומנים מ-AutoML Vision Edge: אתה יכול לאגד את המודל על ידי הכנסתו לתיקיית הנכסים של האפליקציה שלך, או שאתה יכול להוריד אותו באופן דינמי מ-Firebase.

אפשרויות חבילת דגמים
מאגד באפליקציה שלך
  • הדגם הוא חלק מה-APK של האפליקציה שלך
  • הדגם זמין באופן מיידי, גם כאשר מכשיר האנדרואיד במצב לא מקוון
  • אין צורך בפרויקט Firebase
מתארח עם Firebase
  • מארח את הדגם על ידי העלאתו ל- Firebase Machine Learning
  • מקטין את גודל ה-APK
  • הורדת הדגם מתבצעת לפי דרישה
  • דחף עדכוני מודל מבלי לפרסם מחדש את האפליקציה שלך
  • בדיקת A/B קלה עם Firebase Remote Config
  • דורש פרויקט Firebase

לפני שאתה מתחיל

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

  2. הוסף את התלות של ספריית המשימות TensorFlow Lite לקובץ Gradle ברמת האפליקציה שלך, שהוא בדרך כלל app/build.gradle :

    לאגד דגם עם האפליקציה שלך:

    dependencies {
      // ...
      // Object detection with a bundled Auto ML model
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT'
    }
    

    להורדה דינמית של מודל מ-Firebase, הוסף גם את התלות של Firebase ML:

    dependencies {
      // ...
      // Object detection with an Auto ML model deployed to Firebase
      implementation platform('com.google.firebase:firebase-bom:26.1.1')
      implementation 'com.google.firebase:firebase-ml-model-interpreter'
    
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly'
    }
    

1. טען את הדגם

הגדר מקור דגם מקומי

כדי לאגד את הדגם עם האפליקציה שלך:

  1. חלץ את הדגם מארכיון ה-zip שהורדת ממסוף Google Cloud.
  2. כלול את הדגם שלך בחבילת האפליקציה שלך:
    1. אם אין לך תיקיית נכסים בפרויקט שלך, צור אחת על ידי לחיצה ימנית על app/ תיקיה ולאחר מכן לחיצה על חדש > תיקיה > תיקיית נכסים .
    2. העתק את קובץ המודל tflite שלך ​​עם מטא נתונים משובצים לתיקיית הנכסים.
  3. הוסף את הדברים הבאים לקובץ build.gradle של האפליקציה שלך כדי להבטיח ש-Gradle לא ידחוס את קובץ הדגם בעת בניית האפליקציה:

    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

    קובץ הדגם ייכלל בחבילת האפליקציה וזמין כנכס גולמי.

הגדר מקור מודל שמתארח ב-Firebase

כדי להשתמש במודל המתארח מרחוק, צור אובייקט RemoteModel , תוך ציון השם שהקצית למודל כשפרסמת אותו:

Java

// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
        new FirebaseCustomRemoteModel.Builder("your_model").build();

קוטלין

// Specify the name you assigned when you deployed the model.
val remoteModel =
    FirebaseCustomRemoteModel.Builder("your_model_name").build()

לאחר מכן, התחל את משימת הורדת הדגם, תוך ציון התנאים שבהם ברצונך לאפשר הורדה. אם הדגם אינו במכשיר, או אם זמינה גרסה חדשה יותר של הדגם, המשימה תוריד את הדגם באופן אסינכרוני מ-Firebase:

Java

DownloadConditions downloadConditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(@NonNull Task<Void> task) {
                // Success.
            }
        });

קוטלין

val downloadConditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
    .addOnSuccessListener {
        // Success.
    }

אפליקציות רבות מתחילות את משימת ההורדה בקוד האתחול שלהן, אך תוכל לעשות זאת בכל שלב לפני שתצטרך להשתמש במודל.

צור גלאי אובייקטים מהדגם שלך

לאחר שתגדיר את מקורות המודל שלך, צור אובייקט ObjectDetector מאחד מהם.

אם יש לך רק מודל מצורף מקומית, פשוט צור גלאי אובייקטים מקובץ המודל שלך והגדר את סף ציון הביטחון שאתה רוצה לדרוש (ראה הערכת המודל שלך ):

Java

// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);

קוטלין

// Initialization
val options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)

אם יש לך דגם שמתארח מרחוק, תצטרך לבדוק שהוא הורד לפני שתפעיל אותו. אתה יכול לבדוק את המצב של משימת הורדת המודל באמצעות שיטת isModelDownloaded() של מנהל המודלים.

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

Java

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
            }
        });

קוטלין

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener { success ->

        }

אם יש לך רק דגם שמתארח מרחוק, עליך להשבית את הפונקציונליות הקשורה לדגם - לדוגמה, לאפור או להסתיר חלק מהממשק שלך - עד שתאשר שהדגם הורד. אתה יכול לעשות זאת על ידי חיבור מאזין לשיטת download() של מנהל המודלים.

ברגע שאתה יודע שהמודל שלך הורד, צור גלאי אובייקטים מקובץ המודל:

Java

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnCompleteListener(new OnCompleteListener<File>() {
            @Override
            public void onComplete(@NonNull Task<File> task) {
                File modelFile = task.getResult();
                if (modelFile != null) {
                    ObjectDetectorOptions options = ObjectDetectorOptions.builder()
                            .setScoreThreshold(0)
                            .build();
                    objectDetector = ObjectDetector.createFromFileAndOptions(
                            getApplicationContext(), modelFile.getPath(), options);
                }
            }
        });

קוטלין

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnSuccessListener { modelFile ->
            val options = ObjectDetectorOptions.builder()
                    .setScoreThreshold(0f)
                    .build()
            objectDetector = ObjectDetector.createFromFileAndOptions(
                    applicationContext, modelFile.path, options)
        }

2. הכן את תמונת הקלט

לאחר מכן, עבור כל תמונה שברצונך לסמן, צור אובייקט TensorImage מהתמונה שלך. אתה יכול ליצור אובייקט TensorImage ממפת סיביות באמצעות fromBitmap Bitmap

Java

TensorImage image = TensorImage.fromBitmap(bitmap);

קוטלין

val image = TensorImage.fromBitmap(bitmap)

אם נתוני התמונה שלך אינם במפת Bitmap , אתה יכול לטעון מערך פיקסלים כפי שמוצג במסמכי TensorFlow Lite .

3. הפעל את גלאי האובייקטים

כדי לזהות אובייקטים בתמונה, העבר את האובייקט TensorImage לשיטת detect() של ObjectDetector .

Java

List<Detection> results = objectDetector.detect(image);

קוטלין

val results = objectDetector.detect(image)

4. קבל מידע על אובייקטים מסומנים

אם פעולת זיהוי האובייקטים מצליחה, היא מחזירה רשימה של Detection . כל אובייקט Detection מייצג משהו שזוהה בתמונה. אתה יכול לקבל את התיבה התוחמת של כל אובייקט והתוויות שלו.

לדוגמה:

Java

for (Detection result : results) {
    RectF bounds = result.getBoundingBox();
    List<Category> labels = result.getCategories();
}

קוטלין

for (result in results) {
    val bounds = result.getBoundingBox()
    val labels = result.getCategories()
}

טיפים לשיפור הביצועים בזמן אמת

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

  • קריאות מצערת לתיוג התמונה. אם מסגרת וידאו חדשה הופכת לזמינה בזמן שמתווית התמונה פועלת, שחרר את המסגרת. ראה את המחלקה VisionProcessorBase באפליקציה לדוגמה להתחלה מהירה לדוגמא.
  • אם אתה משתמש בפלט של מתווית התמונה כדי לשכב גרפיקה על תמונת הקלט, תחילה קבל את התוצאה, ולאחר מכן עבד את התמונה ואת שכבת העל בשלב אחד. על ידי כך, אתה מעבד למשטח התצוגה רק פעם אחת עבור כל מסגרת קלט. ראה את המחלקות CameraSourcePreview ו- GraphicOverlay באפליקציה לדוגמה להתחלה מהירה לדוגמא.
  • אם אתה משתמש בממשק ה-API של Camera2, צלם תמונות בפורמט ImageFormat.YUV_420_888 .

    אם אתה משתמש ב-Camera API הישן יותר, צלם תמונות בפורמט ImageFormat.NV21 .