Tạo giao diện mô hình bằng siêu dữ liệu

Khi sử dụng Siêu dữ liệu LiteRT, nhà phát triển có thể tạo mã trình bao bọc để bật tính năng tích hợp trên Android. Đối với hầu hết các nhà phát triển, giao diện đồ hoạ của Tính năng liên kết mô hình ML của Android Studio là dễ sử dụng nhất. Nếu cần tuỳ chỉnh thêm hoặc đang sử dụng công cụ dòng lệnh, bạn cũng có thể dùng LiteRT Codegen.

Sử dụng tính năng liên kết mô hình học máy của Android Studio

Đối với các mô hình LiteRT được tăng cường bằng siêu dữ liệu, nhà phát triển có thể sử dụng Android Studio ML Model Binding để tự động định cấu hình các chế độ cài đặt cho dự án và tạo các lớp bao bọc dựa trên siêu dữ liệu mô hình. Mã bao bọc giúp bạn không cần tương tác trực tiếp với ByteBuffer. Thay vào đó, nhà phát triển có thể tương tác với mô hình LiteRT bằng các đối tượng được nhập như BitmapRect.

Nhập một mô hình LiteRT trong Android Studio

  1. Nhấp chuột phải vào mô-đun mà bạn muốn sử dụng mô hình TFLite hoặc nhấp vào File, sau đó nhấp vào New > Other > LiteRT Model

  2. Chọn vị trí của tệp TFLite. Xin lưu ý rằng công cụ này sẽ định cấu hình phần phụ thuộc của mô-đun thay cho bạn bằng tính năng liên kết Mô hình học máy và tất cả các phần phụ thuộc sẽ tự động được chèn vào tệp build.gradle của mô-đun Android.

    Không bắt buộc: Chọn hộp đánh dấu thứ hai để nhập GPU TensorFlow nếu bạn muốn sử dụng tính năng tăng tốc bằng GPU.

  3. Nhấp vào Finish.

  4. Màn hình sau đây sẽ xuất hiện sau khi quá trình nhập hoàn tất. Để bắt đầu sử dụng mô hình này, hãy chọn Kotlin hoặc Java, sau đó sao chép và dán mã trong phần Sample Code. Bạn có thể quay lại màn hình này bằng cách nhấp đúp vào mô hình TFLite trong thư mục ml trong Android Studio.

Tăng tốc suy luận mô hình

Liên kết mô hình học máy cung cấp cho nhà phát triển một cách để tăng tốc mã thông qua việc sử dụng các uỷ quyền và số lượng luồng.

Bước 1. Kiểm tra tệp build.gradle của mô-đun để đảm bảo tệp này chứa phần phụ thuộc sau:

    dependencies {
        ...
        // For the LiteRT GPU delegate, we need
        // 'com.google.ai.edge.litert:litert-gpu' version 1.*.
        implementation 'com.google.ai.edge.litert:litert-gpu:1.4.1'
    }

Bước 2. Phát hiện xem GPU đang chạy trên thiết bị có tương thích với uỷ quyền GPU TensorFlow hay không. Nếu không, hãy chạy mô hình bằng nhiều luồng CPU:

Kotlin

    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice) {
        // if the device has a supported GPU, add the GPU delegate
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        // if the GPU is not supported, run on 4 threads
        Model.Options.Builder().setNumThreads(4).build()
    }

    // Initialize the model as usual feeding in the options object
    val myModel = MyModel.newInstance(context, options)

    // Run inference per sample code
      

Java

    import org.tensorflow.lite.support.model.Model
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Model.Options options;
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        options = Model.Options.Builder().setDevice(Model.Device.GPU).build();
    } else {
        // if the GPU is not supported, run on 4 threads
        options = Model.Options.Builder().setNumThreads(4).build();
    }

    MyModel myModel = new MyModel.newInstance(context, options);

    // Run inference per sample code
      

Tạo giao diện mô hình bằng trình tạo mã LiteRT

Đối với mô hình LiteRT được tăng cường bằng siêu dữ liệu, nhà phát triển có thể sử dụng trình tạo mã bao bọc Android LiteRT để tạo mã bao bọc dành riêng cho nền tảng. Mã trình bao bọc giúp bạn không cần tương tác trực tiếp với ByteBuffer. Thay vào đó, nhà phát triển có thể tương tác với mô hình TensorFlow Lite bằng các đối tượng được nhập như BitmapRect.

Tính hữu ích của trình tạo mã phụ thuộc vào tính đầy đủ của mục siêu dữ liệu trong mô hình LiteRT. Hãy tham khảo phần <Codegen usage> trong các trường có liên quan trong metadata_schema.fbs để xem cách công cụ tạo mã phân tích cú pháp từng trường.

Tạo mã trình bao bọc

Bạn sẽ cần cài đặt các công cụ sau trong thiết bị đầu cuối:

pip install tflite-support

Sau khi hoàn tất, bạn có thể sử dụng trình tạo mã bằng cú pháp sau:

tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --package_name=org.tensorflow.lite.classify \
    --model_class_name=MyClassifierModel \
    --destination=./classify_wrapper

Mã kết quả sẽ nằm trong thư mục đích. Nếu đang sử dụng Google Colab hoặc môi trường từ xa khác, thì bạn có thể dễ dàng nén kết quả vào một tệp lưu trữ zip và tải kết quả đó xuống dự án Android Studio của mình:

# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/

# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')

Sử dụng mã đã tạo

Bước 1: Nhập mã đã tạo

Giải nén mã đã tạo (nếu cần) thành một cấu trúc thư mục. Gốc của mã được tạo được giả định là SRC_ROOT.

Mở dự án Android Studio mà bạn muốn sử dụng mô hình LiteRT và nhập mô-đun đã tạo bằng cách: Và File (Tệp) -> New (Mới) -> Import Module (Nhập mô-đun) -> chọn SRC_ROOT

Theo ví dụ trên, thư mục và mô-đun được nhập sẽ có tên là classify_wrapper.

Bước 2: Cập nhật tệp build.gradle của ứng dụng

Trong mô-đun ứng dụng sẽ sử dụng mô-đun thư viện đã tạo:

Trong phần android, hãy thêm nội dung sau:

aaptOptions {
   noCompress "tflite"
}

Trong mục phần phụ thuộc, hãy thêm nội dung sau:

implementation project(":classify_wrapper")

Bước 3: Sử dụng mô hình

// 1. Initialize the model
MyClassifierModel myImageClassifier = null;

try {
    myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
    // Error reading the model
}

if(null != myImageClassifier) {

    // 2. Set the input with a Bitmap called inputBitmap
    MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
    inputs.loadImage(inputBitmap));

    // 3. Run the model
    MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);

    // 4. Retrieve the result
    Map<String, Float> labeledProbability = outputs.getProbability();
}

Tăng tốc suy luận mô hình

Mã được tạo cung cấp cho nhà phát triển một cách để tăng tốc mã thông qua việc sử dụng các uỷ quyền và số lượng luồng. Bạn có thể đặt các tham số này khi khởi tạo đối tượng mô hình vì đối tượng này có 3 tham số:

  • Context: Bối cảnh từ Hoạt động hoặc Dịch vụ của Android
  • (Không bắt buộc) Device: Uỷ quyền tăng tốc TFLite. Ví dụ: GPUDelegate
  • (Không bắt buộc) numThreads: Số luồng dùng để chạy mô hình – mặc định là một.

Ví dụ: để sử dụng một uỷ quyền GPU và tối đa 3 luồng, bạn có thể khởi tạo mô hình như sau:

try {
    myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
    // Error reading the model
}

Khắc phục sự cố

Nếu bạn gặp lỗi "java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed" (java.io.FileNotFoundException: Không thể mở tệp này dưới dạng một bộ mô tả tệp; có thể tệp này đã được nén), hãy chèn các dòng sau vào phần android của mô-đun ứng dụng sẽ dùng mô-đun thư viện:

aaptOptions {
   noCompress "tflite"
}