TensorFlow Lite בשירותי Google Play

TensorFlow Lite זמין בזמן ריצה של שירותי Google Play עבור כל מכשירי אנדרואיד המריצים את הגרסה הנוכחית של שירותי Play. זמן ריצה זה מאפשר לך להפעיל מודלים של למידת מכונה (ML) מבלי לאגד באופן סטטי ספריות TensorFlow Lite באפליקציה שלך.

עם ה-API של שירותי Google Play, אתה יכול להקטין את גודל האפליקציות שלך ולהשיג ביצועים משופרים מהגרסה היציבה האחרונה של הספריות. TensorFlow Lite בשירותי Google Play היא הדרך המומלצת להשתמש ב- TensorFlow Lite באנדרואיד.

אתה יכול להתחיל עם זמן הריצה של שירותי Play עם ה- Quickstart , המספק מדריך שלב אחר שלב ליישום יישום לדוגמה. אם אתה כבר משתמש ב-TensorFlow Lite העצמאי באפליקציה שלך, עיין בסעיף מעבר מ-TensorFlow Lite העצמאי כדי לעדכן אפליקציה קיימת לשימוש בזמן הריצה של שירותי Play. למידע נוסף על שירותי Google Play, עיין באתר שירותי Google Play .

שימוש בזמן הריצה של שירותי Play

TensorFlow Lite בשירותי Google Play זמין דרך TensorFlow Lite Task API ו- TensorFlow Lite Interpreter API . ספריית המשימות מספקת ממשקי מודל אופטימליים מחוץ לקופסה עבור משימות נפוצות של למידת מכונה באמצעות נתוני חזותיים, אודיו וטקסט. TensorFlow Lite Interpreter API, המסופק על ידי ספריות זמן הריצה ותמיכה של TensorFlow, מספק ממשק למטרות כלליות יותר לבנייה והרצה של מודלים של ML.

הסעיפים הבאים מספקים הוראות כיצד ליישם את ממשקי ה-API של Interpreter ו-Task Library בשירותי Google Play. אמנם אפליקציה יכולה להשתמש גם בממשקי API של Interpreter וגם בממשקי API של ספריית משימות, אבל רוב האפליקציות צריכות להשתמש רק בקבוצה אחת של ממשקי API.

שימוש בממשקי ה-API של ספריית המשימות

ה-TensorFlow Lite Task API עוטף את Interpreter API ומספק ממשק תכנות ברמה גבוהה למשימות למידת מכונה נפוצות המשתמשות בנתוני חזותיים, אודיו וטקסט. עליך להשתמש ב-Task API אם היישום שלך דורש אחת מהמשימות הנתמכות .

1. הוסף תלות בפרויקט

התלות בפרויקט שלך תלויה במקרה השימוש שלך למידת מכונה. ממשקי ה-API של המשימה מכילים את הספריות הבאות:

  • ספריית חזון: org.tensorflow:tensorflow-lite-task-vision-play-services
  • ספריית אודיו: org.tensorflow:tensorflow-lite-task-audio-play-services
  • ספריית טקסט: org.tensorflow:tensorflow-lite-task-text-play-services

הוסף אחת מהתלות לקוד פרויקט האפליקציה שלך כדי לגשת ל-Play Services API עבור TensorFlow Lite. לדוגמה, השתמש בדברים הבאים כדי ליישם משימת חזון:

dependencies {
...
    implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
...
}

2. הוסף אתחול של TensorFlow Lite

אתחל את רכיב TensorFlow Lite של ה-API של שירותי Google Play לפני השימוש בממשקי ה-API של TensorFlow Lite. הדוגמה הבאה מאתחלת את ספריית החזון:

קוטלין

init {
  TfLiteVision.initialize(context)
    }
  }

3. הפעל מסקנות

לאחר אתחול הרכיב TensorFlow Lite, קרא לשיטת detect() כדי ליצור מסקנות. הקוד המדויק בשיטת detect() משתנה בהתאם לספרייה ולמקרה השימוש. להלן מקרה שימוש פשוט לזיהוי אובייקטים עם ספריית TfLiteVision :

קוטלין

fun detect(...) {
  if (!TfLiteVision.isInitialized()) {
    Log.e(TAG, "detect: TfLiteVision is not initialized yet")
    return
  }

  if (objectDetector == null) {
    setupObjectDetector()
  }

  ...

}

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

val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
val results = objectDetector?.detect(tensorImage)

שימוש בממשקי ה-API של Interpreter

ממשקי ה-API של המתורגמנים מציעים יותר שליטה וגמישות מאשר ממשקי ה-API של ספריית המשימות. עליך להשתמש בממשקי ה-API של Interpreter אם משימת למידת המכונה שלך אינה נתמכת על ידי ספריית המשימות, או אם אתה זקוק לממשק למטרות כלליות יותר לבנייה והרצה של מודלים של ML.

1. הוסף תלות בפרויקט

הוסף את התלות הבאות לקוד פרויקט האפליקציה שלך כדי לגשת ל-Play Services API עבור TensorFlow Lite:

dependencies {
...
    // Tensorflow Lite dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    // Optional: include Tensorflow Lite Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

2. הוסף אתחול של TensorFlow Lite

אתחל את רכיב TensorFlow Lite של ה-API של שירותי Google Play לפני השימוש בממשקי ה-API של TensorFlow Lite:

קוטלין

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Java

Task<Void> initializeTask = TfLite.initialize(context);

3. צור מתורגמן והגדר אפשרות זמן ריצה

צור מתורגמן באמצעות InterpreterApi.create() והגדר אותו לשימוש בזמן ריצה של שירותי Google Play, על ידי קריאה ל- InterpreterApi.Options.setRuntime() , כפי שמוצג בקוד הדוגמה הבא:

קוטלין

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private lateinit var interpreter: InterpreterApi
...
initializeTask.addOnSuccessListener {
  val interpreterOption =
    InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  interpreter = InterpreterApi.create(
    modelBuffer,
    interpreterOption
  )}
  .addOnFailureListener { e ->
    Log.e("Interpreter", "Cannot initialize interpreter", e)
  }

Java

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private InterpreterApi interpreter;
...
initializeTask.addOnSuccessListener(a -> {
    interpreter = InterpreterApi.create(modelBuffer,
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY));
  })
  .addOnFailureListener(e -> {
    Log.e("Interpreter", String.format("Cannot initialize interpreter: %s",
          e.getMessage()));
  });

עליך להשתמש ביישום שלמעלה מכיוון שהוא נמנע מחסימת שרשור ממשק המשתמש של אנדרואיד. אם אתה צריך לנהל את ביצוע השרשור מקרוב יותר, אתה יכול להוסיף קריאה Tasks.await() ליצירת המתורגמן:

קוטלין

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

Java

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. הפעל מסקנות

באמצעות אובייקט interpreter שיצרת, קרא למתודה run() כדי ליצור הסקה.

קוטלין

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

האצת חומרה

TensorFlow Lite מאפשר לך להאיץ את הביצועים של הדגם שלך באמצעות מעבדי חומרה מיוחדים, כגון יחידות עיבוד גרפיות (GPUs). אתה יכול לנצל את המעבדים המיוחדים הללו באמצעות מנהלי התקנים של חומרה הנקראים Delegates . אתה יכול להשתמש בנציגי האצת החומרה הבאים עם TensorFlow Lite בשירותי Google Play:

  • נציג GPU (מומלץ) - נציג זה מסופק דרך שירותי Google Play ונטען באופן דינמי, בדיוק כמו גרסאות שירותי Play של ה-Task API ו-Interpreter API.

  • נציג NNAPI - נציג זה זמין כתלות ספרייה כלולה בפרויקט הפיתוח של Android שלך, ומצורף לאפליקציה שלך.

למידע נוסף על האצת חומרה עם TensorFlow Lite, עיין בדף TensorFlow Lite Delegates .

בדיקת תאימות המכשיר

לא כל המכשירים תומכים בהאצת חומרה של GPU עם TFLite. על מנת לצמצם שגיאות וקריסות אפשריות, השתמש בשיטה TfLiteGpu.isGpuDelegateAvailable כדי לבדוק אם התקן תואם לנציג ה-GPU.

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

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

ברגע שיש לך משתנה כמו useGpuTask , אתה יכול להשתמש בו כדי לקבוע אם מכשירים משתמשים ב-GPU Delegate. הדוגמאות הבאות מראות כיצד ניתן לעשות זאת הן עם ספריית המשימות והן עם ממשקי ה-API של המתורגמן.

עם ה-Task Api

קוטלין

lateinit val optionsTask = useGpuTask.continueWith { task ->
  val baseOptionsBuilder = BaseOptions.builder()
  if (task.result) {
    baseOptionsBuilder.useGpu()
  }
 ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
}
    

Java

Task<ObjectDetectorOptions> optionsTask = useGpuTask.continueWith({ task ->
  BaseOptions baseOptionsBuilder = BaseOptions.builder();
  if (task.getResult()) {
    baseOptionsBuilder.useGpu();
  }
  return ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
});
    

עם אפי המתורגמן

קוטלין

val interpreterTask = useGpuTask.continueWith { task ->
  val interpreterOptions = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  if (task.result) {
      interpreterOptions.addDelegateFactory(GpuDelegateFactory())
  }
  InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions)
}
    

Java

Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  InterpreterApi.Options options =
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY);
  if (task.getResult()) {
     options.addDelegateFactory(new GpuDelegateFactory());
  }
  return options;
});
    

GPU עם ממשקי API של ספריית משימות

כדי להשתמש בנציג ה-GPU עם ממשקי ה-API של המשימה:

  1. עדכן את תלות הפרויקט כדי להשתמש בנציג ה-GPU משירותי Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. אתחל את נציג ה-GPU עם setEnableGpuDelegateSupport . לדוגמה, אתה יכול לאתחל את נציג ה-GPU עבור TfLiteVision עם הפעולות הבאות:

    קוטלין

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
        

    Java

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. הפעל את אפשרות הנציג של GPU עם BaseOptions :

    קוטלין

        val baseOptions = BaseOptions.builder().useGpu().build()
        

    Java

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. הגדר את האפשרויות באמצעות .setBaseOptions . לדוגמה, אתה יכול להגדיר GPU ב- ObjectDetector עם הדברים הבאים:

    קוטלין

        val options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build()
        

    Java

        ObjectDetectorOptions options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build();
        

GPU עם ממשקי API של מתורגמן

כדי להשתמש בנציג ה-GPU עם ממשקי ה-API של Interpreter:

  1. עדכן את תלות הפרויקט כדי להשתמש בנציג ה-GPU משירותי Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. הפעל את אפשרות הנציג של GPU באתחול TFlite:

    קוטלין

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build())
        

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. הגדר את נציג GPU באפשרויות המתורגמן להשתמש ב- DelegateFactory על ידי קריאה addDelegateFactory() בתוך InterpreterApi.Options() :

    קוטלין

        val interpreterOption = InterpreterApi.Options()
         .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
         .addDelegateFactory(GpuDelegateFactory())
        

    Java

        Options interpreterOption = InterpreterApi.Options()
          .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
          .addDelegateFactory(new GpuDelegateFactory());
        

מעבר מ-TensorFlow Lite העומד בפני עצמו

אם אתה מתכנן להעביר את האפליקציה שלך מ-TensorFlow Lite העצמאי ל-Play Services API, עיין בהנחיה הנוספת הבאה לעדכון קוד פרויקט האפליקציה שלך:

  1. עיין בסעיף ההגבלות בדף זה כדי לוודא שהמקרה של השימוש שלך נתמך.
  2. לפני עדכון הקוד שלך, בצע בדיקות ביצועים ודיוק עבור הדגמים שלך, במיוחד אם אתה משתמש בגרסאות של TensorFlow Lite מוקדמות יותר מגרסה 2.1, כך שיש לך קו בסיס להשוואה מול היישום החדש.
  3. אם העברת את כל הקוד שלך לשימוש ב-Play Services API עבור TensorFlow Lite, עליך להסיר את התלויות הקיימות של ספריית זמן הריצה של TensorFlow Lite (ערכים עם org.tensorflow: tensorflow-lite :* ) מקובץ ה-build.gradle שלך ​​כדי שתוכל יכול להקטין את גודל האפליקציה שלך.
  4. זהה את כל המופעים של יצירת אובייקט new Interpreter בקוד שלך, ושנה אותו כך שישתמש בקריאה InterpreterApi.create() . ה-API החדש הזה הוא אסינכרוני, מה שאומר שברוב המקרים הוא לא תחליף ל-Drop-in, ואתה חייב לרשום מאזין למועד השלמת השיחה. עיין בקטע הקוד בקוד שלב 3 .
  5. הוסף import org.tensorflow.lite.InterpreterApi; import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; לקבצי מקור כלשהם באמצעות org.tensorflow.lite.Interpreter או org.tensorflow.lite.InterpreterApi .
  6. אם לאחת מהקריאות שהתקבלו ל- InterpreterApi.create() יש רק ארגומנט בודד, הוסף new InterpreterApi.Options() לרשימת הארגומנטים.
  7. הוסף .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) לארגומנט האחרון של כל קריאות ל- InterpreterApi.create() .
  8. החלף את כל המופעים האחרים של המחלקה org.tensorflow.lite.Interpreter ב- org.tensorflow.lite.InterpreterApi .

אם אתה רוצה להשתמש ב-TensorFlow Lite העצמאי וב-Play Services API זה לצד זה, עליך להשתמש TensorFlow Lite 2.9 (או מאוחר יותר). TensorFlow Lite 2.8 וגרסאות קודמות אינן תואמות לגרסת ה-API של שירותי Play.

מגבלות

ל-TensorFlow Lite בשירותי Google Play יש את המגבלות הבאות:

  • התמיכה בנציגי האצת חומרה מוגבלת לנציגים המפורטים בסעיף האצת חומרה . אין נציגי האצה אחרים נתמכים.
  • גישה ל-TensorFlow Lite באמצעות ממשקי API מקוריים אינה נתמכת. רק ממשקי API של TensorFlow Lite Java זמינים דרך שירותי Google Play.
  • ממשקי API של TensorFlow Lite ניסיוניים או שהוצאו משימוש, כולל פעולות מותאמות אישית, אינם נתמכים.

תמיכה ומשוב

אתה יכול לספק משוב ולקבל תמיכה באמצעות TensorFlow Issue Tracker. אנא דווח על בעיות ובקשות תמיכה באמצעות תבנית הבעיה עבור TensorFlow Lite בשירותי Google Play.

תנאי השירות

השימוש ב-TensorFlow Lite בממשקי API של שירותי Google Play כפוף לתנאים וההגבלות של Google APIs .

פרטיות ואיסוף נתונים

כאשר אתה משתמש ב-TensorFlow Lite בממשקי API של שירותי Google Play, עיבוד נתוני הקלט, כגון תמונות, וידאו, טקסט, מתרחש במלואו במכשיר, וממשקי ה-API של TensorFlow Lite בשירותי Google Play לא שולחים נתונים אלה לשרתי Google. כתוצאה מכך, אתה יכול להשתמש בממשקי ה-API שלנו לעיבוד נתונים שאסור לצאת מהמכשיר.

ה-TensorFlow Lite ב-API של שירותי Google Play עשוי ליצור קשר עם שרתי Google מעת לעת כדי לקבל דברים כמו תיקוני באגים, דגמים מעודכנים ומידע על תאימות מאיץ החומרה. ממשקי API של TensorFlow Lite בשירותי Google Play שולחים לגוגל גם מדדים לגבי הביצועים והשימוש של ממשקי ה-API באפליקציה שלך. Google משתמשת בנתונים של מדדים אלה כדי למדוד ביצועים, לנפות באגים, לתחזק ולשפר את ממשקי ה-API, ולזהות שימוש לרעה או שימוש לרעה, כמתואר בהמשך במדיניות הפרטיות שלנו.

אתה אחראי ליידע את המשתמשים באפליקציה שלך על העיבוד של Google של TensorFlow Lite בנתוני מדדי ממשקי API של שירותי Google Play כפי שנדרש על פי החוק החל.

הנתונים שאנו אוספים כוללים את הדברים הבאים:

  • מידע על המכשיר (כגון יצרן, דגם, גרסת מערכת הפעלה ומבנה) ומאיצי חומרה זמינים של ML (GPU ו-DSP). משמש לאבחון וניתוח שימוש.
  • מזהה מכשיר המשמש לאבחון וניתוח שימוש.
  • מידע על האפליקציה (שם החבילה, גרסת האפליקציה). משמש לאבחון וניתוח שימוש.
  • תצורת API (כגון אילו נציגים נמצאים בשימוש). משמש לאבחון וניתוח שימוש.
  • סוג אירוע (כגון יצירת מתורגמן, מסקנות). משמש לאבחון וניתוח שימוש.
  • קודי שגיאה. משמש לאבחון.
  • מדדי ביצועים. משמש לאבחון.

הצעדים הבאים

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