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

TensorFlow Lite trong các dịch vụ của Google Play cũng có thể được truy cập bằng API Java, ngoài API gốc. Đặc biệt, TensorFlow Lite trong các dịch vụ của Google Play có sẵn thông qua API tác vụ TensorFlow LiteAPI trình thông dịch TensorFlow Lite . Thư viện tác vụ cung cấp các giao diện mô hình dùng ngay được tối ưu hóa cho các tác vụ máy học thông thường sử dụng dữ liệu hình ảnh, âm thanh và văn bản. API trình thông dịch TensorFlow Lite, được cung cấp bởi thời gian chạy TensorFlow, cung cấp 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 sử dụng API Thư viện tác vụ và Trình thông dịch với TensorFlow Lite trong các dịch vụ của Google Play. Mặc dù ứng dụng có thể sử dụng cả API thông 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 trình thông 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ần phụ thuộc của 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. 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 cách sau để thực hiện 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 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 các suy luận. Mã chính xác trong phương thức detect() khác nhau 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 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 suy luận. Ví dụ: dữ liệu hình ảnh cho máy dò đối tượng yêu cầu như 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

API thông dịch cung cấp nhiều quyền kiểm soát và tính linh hoạt hơn API Thư viện tác vụ. Bạn nên sử dụng API thông dịch nếu tác vụ machine learning 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ần phụ thuộc của 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 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 một trình thông dịch bằng cách sử dụng InterpreterApi.create() và định cấu hình nó để sử dụng thời gian chạy dịch vụ Google Play, bằng cách gọi InterpreterApi.Options.setRuntime() , như 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 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 mà 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 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 những bộ xử lý chuyên dụng 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:

  • Đại biểu GPU (được khuyến nghị) - Đại biểu 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 thông dịch.

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

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

Kiểm tra khả năng 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 bằng 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 đại biểu GPU 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 đại biểu NNAPI làm phương án dự phòng khi GPU không được hỗ trợ.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

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

Với Api nhiệm vụ

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 Api thông dịch viên

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 đại biểu GPU với API tác vụ:

  1. Cập nhật các phần phụ thuộc của dự án để sử dụng đại diện GPU từ 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 bằng 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. Kích hoạ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 cách sử dụ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 có API thông dịch

Để sử dụng đại biểu GPU với 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 đại diện GPU từ dịch vụ Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. Kích hoạt tùy chọn ủy quyền GPU trong quá trình khởi tạo TFlite:

    Kotlin

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

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. Bật ủy quyền GPU trong các tùy chọn trình thông dịch: đặt nhà máy ủy quyền thành GpuDelegateFactory bằng cách gọi addDelegateFactory() within 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 dự định di 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 đây để cập nhật mã dự án ứng dụng của bạn:

  1. Xem lại phần Hạn chế 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ã, 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 sớm hơn phiên bản 2.1, để bạn có cơ sở để so sánh với cách triển khai mới.
  3. Nếu đã di chuyển tất cả mã của mình để sử dụng API dịch vụ Play cho TensorFlow Lite, thì 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 từng lần để nó sử dụng lệnh gọi InterpreterApi.create(). TfLite.initialize mới 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à sự thay thế tùy ý: 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; tới 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 tới InterpreterApi.create() chỉ có một đối số duy nhất, hãy thêm new InterpreterApi.Options() 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ỳ cuộc 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 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 cũ hơn không tương thích với phiên bản API dịch vụ Play.