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 TensorFlow Lite, 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, giao diện đồ hoạ của Liên kết mô hình học máy của Android Studio là giao diện dễ sử dụng nhất. Nếu cần tuỳ chỉnh nhiều hơn hoặc sử dụng công cụ dòng lệnh, bạn cũng có thể sử dụng TensorFlow Lite Codegen.

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

Đối với các mô hình TensorFlow Lite được tăng cường bằng siêu dữ liệu, nhà phát triển có thể sử dụ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 các lớp trình bao bọc dựa trên siêu dữ liệu của mô hình. Mã bao bọc giúp bạn không cần phải 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 với các đối tượng đã nhập như BitmapRect.

Thêm mô hình TensorFlow Lite trong Android Studio

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

  2. Chọn vị trí của tệp TFLite. Xin lưu ý rằng công cụ này sẽ thay mặt bạn định cấu hình phần phụ thuộc của mô-đun với 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 được tự động 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 GPU.

  3. Nhấp vào Finish.

  4. Màn hình sau đây sẽ xuất hiện sau khi nhập thành công. Để bắt đầu sử dụng mô hình, hãy chọn Kotlin hoặc Java, 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 của 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 thực thể đại diệ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 đó chứa phần phụ thuộc sau:

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
    }

Bước 2. Phát hiện xem GPU chạy trên thiết bị có tương thích với tính năng uỷ quyền GPU của TensorFlow hay không, 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ã TensorFlow Lite

Đối với mô hình TensorFlow Lite đượ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 TensorFlow Lite cho Android để tạo mã bao bọc dành riêng cho nền tảng. Mã bao bọc giúp bạn không cần phải 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 đã nhập như BitmapRect.

Tính hữu ích của trình tạo mã phụ thuộc vào tính hoàn chỉnh của mục nhập siêu dữ liệu của mô hình TensorFlow Lite. 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ã bao bọc

Bạn sẽ cần cài đặt công cụ sau đây trong thiết bị đầu cuối của mình:

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 đang sử dụng Google Colab hoặc môi trường từ xa khác, bạn có thể dễ dàng nén kết quả vào tệp lưu trữ zip và tải 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ã được tạo (nếu cần) vào 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 TensorFlow lite và nhập mô-đun đã tạo bằng cách: And File -> New -> Import Module -> chọn SRC_ROOT

Trong 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 đoạn mã sau:

aaptOptions {
   noCompress "tflite"
}

Trong mục phần phụ thuộc, hãy thêm những thành phần 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 này cung cấp cho nhà phát triển một cách để tăng tốc mã của họ thông qua việc sử dụng thực thể đại diện và số lượng luồng. Bạn có thể đặt các thuộc tính này khi khởi chạy đối tượng mô hình vì cần có 3 tham số:

  • Context: Ngữ cảnh của hoạt động hoặc dịch vụ 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à 1.

Ví dụ: để sử dụng đại biểu GPU và tối đa 3 luồng, bạn có thể khởi chạy 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; tệp có thể đã bị nén", 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"
}