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

TensorFlow Lite có sẵn trong thời gian chạy dịch vụ Google Play cho tất cả các thiết bị Android chạy phiên bản dịch vụ Play hiện tại. 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 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ụ 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 thư viện ổn định mới nhất. TensorFlow Lite trong dịch vụ 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 , phần này cung cấp hướng dẫn từng bước để triển khai một ứ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ó nhằm sử dụng thời gian chạy dịch vụ Play. Để biết thêm thông tin về dịch vụ Google Play, hãy xem trang web dịch vụ Google Play .

Sử dụng thời gian chạy 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 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 sẵn dùng được tối ưu hóa cho các tác vụ máy học phổ biến 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 các thư viện hỗ trợ và 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 triển khai API Thư viện tác vụ và Thông dịch viên 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. Đặt đại biểu GPU trong 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 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 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ế tùy ý 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; 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.

Hạn chế

TensorFlow Lite trong dịch vụ Google Play có những 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 ở 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ợ.
  • Truy cập vào TensorFlow Lite thông qua API gốc không được hỗ trợ. Chỉ các API Java TensorFlow Lite mới khả dụng thông qua các dịch vụ của Google Play.
  • Các API TensorFlow Lite thử nghiệm hoặc không được dùng nữa, bao gồm cả 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 sự cố 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 API dịch vụ 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ụ Google Play, quá trình xử lý dữ liệu đầu vào, chẳng hạn như hình ảnh, video, văn bản, diễn ra hoàn toàn trên thiết bị và TensorFlow Lite trong API dịch vụ Google Play không gửi dữ liệu đó đến máy chủ Google. Do đó, bạn có thể sử dụng API của chúng tôi để xử lý dữ liệu không nên rời khỏi thiết bị.

TensorFlow Lite trong API dịch vụ Google Play đôi khi có thể liên hệ với máy chủ Google để nhận những nội dung như sửa lỗi, mô hình 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. TensorFlow Lite trong API dịch vụ Google Play cũng gửi số liệu về hiệu suất và mức sử dụng API trong ứng dụng của bạn tới Google. Google sử dụng dữ liệu số liệu này để đo lường hiệu suất, gỡ lỗi, duy trì và cải thiện API cũng như phát hiện hành vi sử dụng sai 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ý TensorFlow Lite trong dữ liệu chỉ số API của dịch vụ 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 mức 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.
  • 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ề cách triển khai machine learning 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 .