TensorFlow Lite trong các dịch vụ của Google Play

TensorFlow Lite khả dụng trong thời gian chạy các dịch vụ của Google Play cho tất cả các thiết bị Android chạy phiên bản hiện tại của dịch vụ Play. Thời gian chạy này cho phép bạn chạy các mô hình máy học (ML) mà không cần đóng gói tĩnh các thư viện TensorFlow Lite vào ứng dụng của bạn.

Với API dịch vụ của Google Play, bạn có thể giảm kích thước ứng dụng của mình và cải thiện hiệu suất từ ​​phiên bản ổn định mới nhất của thư viện. TensorFlow Lite trong các dịch vụ của Google Play là cách được khuyến nghị để sử dụng TensorFlow Lite trên Android.

Bạn có thể bắt đầu với thời gian chạy dịch vụ Play bằng Quickstart , cung cấp hướng dẫn từng bước để triển khai ứng dụng mẫu. Nếu bạn đang sử dụng TensorFlow Lite độc ​​lập trong ứng dụng của mình, hãy tham khảo phần Di chuyển từ TensorFlow Lite độc ​​lập để cập nhật ứng dụng hiện có để sử dụng thời gian chạy dịch vụ Play. Để biết thêm thông tin về các dịch vụ của Google Play, hãy xem trang web các dịch vụ của Google Play .

Sử dụng thời gian chạy các dịch vụ Play

TensorFlow Lite trong các dịch vụ của Google Play có sẵn thông qua API tác vụ TensorFlow Lite và API thông dịch viên TensorFlow Lite . Thư viện Tác vụ cung cấp các giao diện mô hình ngoài hộp được tối ưu hóa cho các tác vụ học máy thông thường sử dụng dữ liệu hình ảnh, âm thanh và văn bản. API TensorFlow Lite Interpreter, được cung cấp bởi thư viện hỗ trợ và thời gian chạy TensorFlow, cung cấp một giao diện có mục đích chung hơn để xây dựng và chạy các mô hình ML.

Các phần sau đây cung cấp hướng dẫn về cách triển khai API Trình thông dịch và Thư viện tác vụ trong các dịch vụ của Google Play. Mặc dù ứng dụng có thể sử dụng cả API phiên dịch và API thư viện tác vụ, nhưng hầu hết các ứng dụng chỉ nên sử dụng một bộ API.

Sử dụng API thư viện tác vụ

API tác vụ TensorFlow Lite bao bọc API phiên dịch và cung cấp giao diện lập trình cấp cao cho các tác vụ học máy phổ biến sử dụng dữ liệu hình ảnh, âm thanh và văn bản. Bạn nên sử dụng API tác vụ nếu ứng dụng của bạn yêu cầu một trong các tác vụ được hỗ trợ .

1. Thêm phụ thuộc dự án

Sự phụ thuộc vào dự án của bạn phụ thuộc vào trường hợp sử dụng máy học của bạn. Các API tác vụ chứa các thư viện sau:

  • Thư viện tầm nhìn: org.tensorflow:tensorflow-lite-task-vision-play-services
  • Thư viện âm thanh: org.tensorflow:tensorflow-lite-task-audio-play-services
  • Thư viện văn bản: org.tensorflow:tensorflow-lite-task-text-play-services

Thêm một trong các phần phụ thuộc vào mã dự án ứng dụng của bạn để truy cập API dịch vụ Play cho TensorFlow Lite. Ví dụ: sử dụng những điều sau đây để thực hiện một nhiệm vụ tầm nhìn:

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

2. Thêm khởi tạo TensorFlow Lite

Khởi tạo thành phần TensorFlow Lite của API dịch vụ Google Play trước khi sử dụng các API TensorFlow Lite. Ví dụ sau khởi tạo thư viện tầm nhìn:

Kotlin

init {
  TfLiteVision.initialize(context)
    }
  }

3. Chạy suy luận

Sau khi khởi tạo thành phần TensorFlow Lite, hãy gọi phương thức detect() để tạo ra các suy luận. Mã chính xác trong phương thức detect() thay đổi tùy thuộc vào thư viện và trường hợp sử dụng. Sau đây là trường hợp sử dụng phát hiện đối tượng đơn giản với thư viện TfLiteVision :

Kotlin

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

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

  ...

}

Tùy thuộc vào định dạng dữ liệu, bạn cũng có thể cần phải xử lý trước và chuyển đổi dữ liệu của mình trong phương thức detect() trước khi tạo ra các suy luận. Ví dụ: dữ liệu hình ảnh cho một máy dò đối tượng yêu cầu những điều sau:

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

Sử dụng API thông dịch viên

Các API thông dịch viên cung cấp nhiều quyền kiểm soát và linh hoạt hơn các API thư viện tác vụ. Bạn nên sử dụng API thông dịch nếu tác vụ học máy của bạn không được thư viện Tác vụ hỗ trợ hoặc nếu bạn yêu cầu giao diện có mục đích chung hơn để xây dựng và chạy các mô hình ML.

1. Thêm phụ thuộc dự án

Thêm các phần phụ thuộc sau vào mã dự án ứng dụng của bạn để truy cập API dịch vụ Play cho 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. Thêm khởi tạo TensorFlow Lite

Khởi tạo thành phần TensorFlow Lite của API dịch vụ Google Play trước khi sử dụng các API TensorFlow Lite:

Kotlin

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

Java

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

3. Tạo Trình thông dịch và đặt tùy chọn thời gian chạy

Tạo trình thông dịch bằng InterpreterApi.create() và định cấu hình nó để sử dụng thời gian chạy các dịch vụ của Google Play, bằng cách gọi InterpreterApi.Options.setRuntime() , như được hiển thị trong mã ví dụ sau:

Kotlin

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()));
  });

Bạn nên sử dụng cách triển khai ở trên vì nó tránh chặn luồng giao diện người dùng Android. Nếu bạn cần quản lý việc thực thi luồng chặt chẽ hơn, bạn có thể thêm lệnh gọi Tasks.await() để tạo trình thông dịch:

Kotlin

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

Java

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

4. Chạy suy luận

Sử dụng đối tượng interpreter bạn đã tạo, gọi phương thức run() để tạo ra một suy luận.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

Tăng tốc phần cứng

TensorFlow Lite cho phép bạn tăng tốc hiệu suất của mô hình bằng cách sử dụng bộ xử lý phần cứng chuyên dụng, chẳng hạn như bộ xử lý đồ họa (GPU). Bạn có thể tận dụng các bộ xử lý chuyên biệt này bằng cách sử dụng trình điều khiển phần cứng được gọi là đại biểu . Bạn có thể sử dụng các đại biểu tăng tốc phần cứng sau với TensorFlow Lite trong các dịch vụ của Google Play:

  • Người ủy quyền GPU (được khuyến nghị) - Người được ủy quyền này được cung cấp thông qua các dịch vụ của Google Play và được tải động, giống như các phiên bản dịch vụ Play của API tác vụ và API phiên dịch.

  • Đại biểu NNAPI - Đại biểu này có sẵn dưới dạng phụ thuộc thư viện được bao gồm trong dự án phát triển Android của bạn và được đóng gói vào ứng dụng của bạn.

Để biết thêm thông tin về tăng tốc phần cứng với TensorFlow Lite, hãy xem trang TensorFlow Lite Delegates .

Kiểm tra tính tương thích của thiết bị

Không phải tất cả các thiết bị đều hỗ trợ tăng tốc phần cứng GPU với TFLite. Để giảm thiểu lỗi và sự cố có thể xảy ra, hãy sử dụng phương pháp TfLiteGpu.isGpuDelegateAvailable để kiểm tra xem thiết bị có tương thích với GPU ủy quyền hay không.

Sử dụng phương pháp này để xác nhận xem thiết bị có tương thích với GPU hay không và sử dụng CPU hoặc NNAPI ủy quyền làm phương án dự phòng khi GPU không được hỗ trợ.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

Khi bạn có một biến như useGpuTask , bạn có thể sử dụng nó để xác định xem thiết bị có sử dụng GPU ủy quyền hay không. Các ví dụ sau đây cho thấy cách này có thể được thực hiện với cả Thư viện tác vụ và API thông dịch viên.

Với Task Api

Kotlin

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()
});
    

Với Trình thông dịch Api

Kotlin

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 với API thư viện tác vụ

Để sử dụng ủy quyền GPU với các API tác vụ:

  1. Cập nhật các phần phụ thuộc của dự án để sử dụng ủy quyền GPU từ các dịch vụ Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. Khởi tạo đại biểu GPU với setEnableGpuDelegateSupport . Ví dụ: bạn có thể khởi tạo đại biểu GPU cho TfLiteVision bằng cách sau:

    Kotlin

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

    Java

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. Bật tùy chọn ủy quyền GPU với BaseOptions :

    Kotlin

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

    Java

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. Định cấu hình các tùy chọn bằng .setBaseOptions . Ví dụ: bạn có thể thiết lập GPU trong ObjectDetector bằng cách sau:

    Kotlin

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

    Java

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

GPU với API phiên dịch

Để sử dụng đại biểu GPU với các API thông dịch viên:

  1. Cập nhật các phần phụ thuộc của dự án để sử dụng ủy quyền GPU từ các dịch vụ Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. Bật tùy chọn ủy quyền GPU trong khởi tạo TFlite:

    Kotlin

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

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. Đặt đại biểu GPU trong các tùy chọn trình thông dịch để sử dụng DelegateFactory bằng cách gọi addDelegateFactory() trong InterpreterApi.Options() :

    Kotlin

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

    Java

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

Di chuyển từ TensorFlow Lite độc ​​lập

Nếu bạn định chuyển ứng dụng của mình từ TensorFlow Lite độc ​​lập sang API dịch vụ Play, hãy xem lại hướng dẫn bổ sung sau để cập nhật mã dự án ứng dụng của bạn:

  1. Xem lại phần Giới hạn của trang này để đảm bảo trường hợp sử dụng của bạn được hỗ trợ.
  2. Trước khi cập nhật mã của bạn, hãy kiểm tra hiệu suất và độ chính xác cho các mô hình của bạn, đặc biệt nếu bạn đang sử dụng các phiên bản TensorFlow Lite trước phiên bản 2.1, vì vậy bạn có một cơ sở để so sánh với việc triển khai mới.
  3. Nếu bạn đã di chuyển tất cả mã của mình để sử dụng API dịch vụ Play cho TensorFlow Lite, bạn nên xóa các phần phụ thuộc thư viện thời gian chạy TensorFlow Lite hiện có (các mục có org.tensorflow: tensorflow-lite :* ) khỏi tệp build.gradle để bạn có thể giảm kích thước ứng dụng của bạn.
  4. Xác định tất cả các lần tạo đối tượng new Interpreter trong mã của bạn và sửa đổi nó để nó sử dụng lệnh gọi InterpreterApi.create (). API mới này không đồng bộ, có nghĩa là trong hầu hết các trường hợp, nó không phải là một sự thay thế thả vào và bạn phải đăng ký một trình lắng nghe khi cuộc gọi hoàn tất. Tham khảo đoạn mã trong mã Bước 3 .
  5. Thêm import org.tensorflow.lite.InterpreterApi;import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; vào bất kỳ tệp nguồn nào bằng cách sử dụng các lớp org.tensorflow.lite.Interpreter hoặc org.tensorflow.lite.InterpreterApi .
  6. Nếu bất kỳ lệnh gọi kết quả nào đến InterpreterApi.create() chỉ có một đối số, hãy thêm new InterpreterApi.Options() mới vào danh sách đối số.
  7. Nối .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) vào đối số cuối cùng của bất kỳ lệnh gọi nào tới InterpreterApi.create() .
  8. Thay thế tất cả các lần xuất hiện khác của lớp org.tensorflow.lite.Interpreter bằng org.tensorflow.lite.InterpreterApi .

Nếu bạn muốn sử dụng TensorFlow Lite độc ​​lập và API dịch vụ Play song song, bạn phải sử dụng TensorFlow Lite 2.9 (hoặc mới hơn). TensorFlow Lite 2.8 và các phiên bản trước đó không tương thích với phiên bản API dịch vụ Play.

Hạn chế

TensorFlow Lite trong các dịch vụ của Google Play có các hạn chế sau:

  • Hỗ trợ cho các đại biểu tăng tốc phần cứng được giới hạn cho các đại biểu được liệt kê trong phần Tăng tốc phần cứng . Không có đại biểu tăng tốc nào khác được hỗ trợ.
  • Không hỗ trợ quyền truy cập vào TensorFlow Lite thông qua API gốc . Chỉ các API TensorFlow Lite Java có sẵn thông qua các dịch vụ của Google Play.
  • Các API TensorFlow Lite thử nghiệm hoặc không dùng nữa, bao gồm các hoạt động tùy chỉnh, không được hỗ trợ.

Hỗ trợ và phản hồi

Bạn có thể cung cấp phản hồi và nhận hỗ trợ thông qua Trình theo dõi vấn đề TensorFlow. Vui lòng báo cáo sự cố và yêu cầu hỗ trợ bằng cách sử dụng mẫu Sự cố cho TensorFlow Lite trong các dịch vụ của Google Play.

Điều khoản dịch vụ

Việc sử dụng TensorFlow Lite trong các API dịch vụ của Google Play phải tuân theo Điều khoản dịch vụ của API Google .

Quyền riêng tư và thu thập dữ liệu

Khi bạn sử dụng TensorFlow Lite trong API dịch vụ của Google Play, việc xử lý dữ liệu đầu vào, chẳng hạn như hình ảnh, video, văn bản, hoàn toàn diễn ra trên thiết bị và API dịch vụ TensorFlow Lite trong Google Play không gửi dữ liệu đó đến máy chủ của Google. Do đó, bạn có thể sử dụng các API của chúng tôi để xử lý dữ liệu không được rời khỏi thiết bị.

Các API dịch vụ của TensorFlow Lite trong Google Play có thể liên hệ với các máy chủ của Google theo thời gian để nhận những thông tin như sửa lỗi, các mẫu được cập nhật và thông tin về khả năng tương thích của trình tăng tốc phần cứng. Các API dịch vụ của TensorFlow Lite trong Google Play cũng gửi các chỉ số về hiệu suất và việc sử dụng các API trong ứng dụng của bạn cho Google. Google sử dụng dữ liệu chỉ số này để đo lường hiệu suất, gỡ lỗi, duy trì và cải thiện API, đồng thời phát hiện việc lạm dụng hoặc lạm dụng, như được mô tả thêm trong Chính sách quyền riêng tư của chúng tôi.

Bạn có trách nhiệm thông báo cho người dùng ứng dụng của mình về việc Google xử lý dữ liệu chỉ số API của dịch vụ TensorFlow Lite trong Google Play theo yêu cầu của luật hiện hành.

Dữ liệu chúng tôi thu thập bao gồm:

  • Thông tin thiết bị (chẳng hạn như nhà sản xuất, kiểu máy, phiên bản hệ điều hành và bản dựng) và các bộ tăng tốc phần cứng ML có sẵn (GPU và DSP). Được sử dụng để chẩn đoán và phân tích sử dụng.
  • Mã nhận dạng thiết bị được sử dụng để chẩn đoán và phân tích sử dụng.
  • Thông tin ứng dụng (tên gói, phiên bản ứng dụng). Được sử dụng để chẩn đoán và phân tích sử dụng.
  • Cấu hình API (chẳng hạn như đại biểu nào đang được sử dụng). Được sử dụng để chẩn đoán và phân tích sử dụng.
  • Loại sự kiện (chẳng hạn như tạo trình thông dịch, suy luận). Được sử dụng để chẩn đoán và phân tích sử dụng.
  • Các mã lỗi. Được sử dụng để chẩn đoán.
  • Chỉ số hiệu suất. Được sử dụng để chẩn đoán.

Bước tiếp theo

Để biết thêm thông tin về việc triển khai học máy trong ứng dụng di động của bạn với TensorFlow Lite, hãy xem Hướng dẫn dành cho nhà phát triển TensorFlow Lite . Bạn có thể tìm thấy các mô hình TensorFlow Lite bổ sung để phân loại hình ảnh, phát hiện đối tượng và các ứng dụng khác trên TensorFlow Hub .