Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

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

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

  2. מוסיפים את התלות של הספרייה המשימות לייט TensorFlow בקובץ 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.
  2. כלול את הדגם שלך בחבילת האפליקציות שלך:
    1. אם אין לך נכסים התיקייה בפרויקט שלך, ליצור אחד על ידי לחיצה ימנית על app/ תיקייה, ולאחר מכן לחיצה על New> Folder> נכסים תיקיה.
    2. עותק tflite קובץ מודל עם מטה מוטבעים לתיקיית הנכסים.
  3. הוסף את הקוד הבא של האפליקציה שלך build.gradle הקובץ כדי לוודא Gradle לא לדחוס את קובץ המודל בעת בניית האפליקציה:

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

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

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

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

ג'אווה

// 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:

ג'אווה

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 חפץ מאחד מהם.

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

ג'אווה

// 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() שיטה.

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

ג'אווה

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

קוטלין

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

        }

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

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

ג'אווה

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 אובייקט מנקודת Bitmap באמצעות fromBitmap השיטה:

ג'אווה

TensorImage image = TensorImage.fromBitmap(bitmap);

קוטלין

val image = TensorImage.fromBitmap(bitmap)

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

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

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

ג'אווה

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

קוטלין

val results = objectDetector.detect(image)

4. קבל מידע על אובייקטים שכותרתם

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

לדוגמה:

ג'אווה

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 בכיתה ביישום מדגם QuickStart עבור דוגמה.
  • אם אתה משתמש בפלט של תווית התמונות כדי לכסות גרפיקה על תמונת הקלט, תחילה קבל את התוצאה ולאחר מכן עיבד את התמונה ואת שכבת העל בשלב אחד. בכך אתה מעבד למשטח התצוגה רק פעם אחת עבור כל מסגרת קלט. עיין CameraSourcePreview ו GraphicOverlay כיתות ביישום מדגם QuickStart עבור דוגמה.
  • אם אתה משתמש ב- API Camera2, ללכוד תמונות ב ImageFormat.YUV_420_888 פורמט.

    אם אתה משתמש ב- API המצלמה המבוגרת, ללכוד תמונות ב ImageFormat.NV21 פורמט.