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

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

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 nâng cao bằng siêu dữ liệu, nhà phát triển có thể sử dụng tính năng Liên kết mô hình học máy của Android Studio để tự động định cấu hình các chế độ cài đặt cho dự án và tạo lớp trình bao bọc dựa trên mô hình siêu dữ liệu. Mã bao bọc giúp loại bỏ nhu cầu 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 đã nhập như BitmapRect.

Nhập 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 đó là 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 liên kết Mô hình học máy và tất cả phần phụ thuộc được tự động chèn vào Tệp build.gradle.

    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 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 thành công. Để bắt đầu bằng cách sử dụng mô hình, chọn Kotlin hoặc Java, sao chép và dán mã vào bên dưới Sample Code. Bạn có thể quay lại màn hình này bằng cách nhấp đúp 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 giúp nhà phát triển tăng tốc mã thông qua việc sử dụng đại biểu và số lượng luồng.

Bước 1. Kiểm tra tệp build.gradle của mô-đun xem có chứa nội dung sau hay không phần phụ thuộc:

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'com.google.ai.edge.litert:litert-gpu:2.3.0'
    }

Bước 2. Phát hiện xem GPU đang chạy trên thiết bị có tương thích với GPU TensorFlow hay không uỷ quyền, nếu không 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 nâng cao bằng siêu dữ liệu, nhà phát triển có thể dùng trình tạo mã trình bao bọc Android LiteRT để tạo mã trình bao bọc dành riêng cho nền tảng. Mã bao bọc giúp loại bỏ nhu cầu 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 TensorFlow Mô hình thu gọn với các đối tượng đã nhập như BitmapRect.

Tính hữu ích của trình tạo mã phụ thuộc vào mức độ hoàn chỉnh của Mục siêu dữ liệu của mô hình LiteRT. Tham khảo phần <Codegen usage> vào 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ông cụ sau đây 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ã theo 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 bạn bằng Google Colab hoặc các thiết bị điều khiển từ xa khác có thể dễ dàng hơn khi nén kết quả vào một tệp lưu trữ zip và tải xuống vào dự án Android Studio của bạn:

# 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ã được tạo

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

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

Mở dự án Android Studio mà bạn muốn dùng LiteRT mô hình và nhập mô-đun được tạo bằng cách: Và tệp -> Mới -> Nhập mô-đun -> chọn SRC_ROOT

Sử dụng ví dụ trên, thư mục và mô-đun đã nhập sẽ được gọi 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 đoạn mã sau:

aaptOptions {
   noCompress "tflite"
}

Trong phần phần phụ thuộc, hãy thêm đoạn mã 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 giúp nhà phát triển tăng tốc mã thông qua việc sử dụng người được uỷ quyền và số lượng luồng. Bạn có thể thiết lập các giá trị này khi khởi tạo đối tượng mô hình vì cần 3 thông số:

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

Ví dụ: để sử dụng một GPU uỷ quyền 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: Không thể mở tệp này dưới dạng chỉ số mô tả tệp; nó có thể được nén lỗi, hãy chèn các dòng sau trong phần Android của mô-đun ứng dụng sẽ sử dụng mô-đun thư viện:

aaptOptions {
   noCompress "tflite"
}