สร้างอินเทอร์เฟซของโมเดลโดยใช้ข้อมูลเมตา

การใช้ข้อมูลเมตา LiteRT ช่วยให้นักพัฒนาแอป สร้างโค้ด Wrapper เพื่อเปิดใช้การผสานรวมใน Android ได้ สำหรับนักพัฒนาแอปส่วนใหญ่แล้ว อินเทอร์เฟซแบบกราฟิกของการเชื่อมโยงโมเดล ML ของ Android Studio เป็นอินเทอร์เฟซที่ ใช้งานง่ายที่สุด หากต้องการการปรับแต่งเพิ่มเติมหรือใช้เครื่องมือบรรทัดคำสั่ง คุณก็ใช้ LiteRT Codegen ได้เช่นกัน

ใช้การเชื่อมโยงโมเดล ML ของ Android Studio

สำหรับโมเดล LiteRT ที่ได้รับการปรับปรุงด้วยข้อมูลเมตา นักพัฒนาแอปสามารถใช้การเชื่อมโยงโมเดล ML ของ Android Studio เพื่อกำหนดค่าการตั้งค่าสำหรับโปรเจ็กต์โดยอัตโนมัติและ สร้างคลาส Wrapper ตามข้อมูลเมตาของโมเดล โค้ด Wrapper จะช่วยให้คุณไม่จำเป็นต้องโต้ตอบกับ ByteBuffer โดยตรง แต่นักพัฒนาแอปสามารถ โต้ตอบกับโมเดล LiteRT ด้วยออบเจ็กต์ที่มีการพิมพ์ เช่น Bitmap และ Rect

นำเข้าโมเดล LiteRT ใน Android Studio

  1. คลิกขวาที่โมดูลที่คุณต้องการใช้โมเดล TFLite หรือคลิก File จากนั้น New > Other > LiteRT Model

  2. เลือกตำแหน่งของไฟล์ TFLite โปรดทราบว่าเครื่องมือจะกำหนดค่าทรัพยากร Dependency ของโมดูลในนามของคุณด้วยการเชื่อมโยงโมเดล ML และจะแทรกทรัพยากร Dependency ทั้งหมดลงในไฟล์ build.gradle ของโมดูล Android โดยอัตโนมัติ

    ไม่บังคับ: เลือกช่องทำเครื่องหมายที่ 2 เพื่อนำเข้า TensorFlow GPU หากต้องการใช้การเร่งด้วย GPU

  3. คลิก Finish

  4. หน้าจอต่อไปนี้จะปรากฏขึ้นหลังจากนำเข้าสำเร็จ หากต้องการเริ่มใช้โมเดล ให้เลือก Kotlin หรือ Java แล้วคัดลอกและวางโค้ดในส่วน Sample Code คุณกลับไปที่หน้าจอนี้ได้โดยดับเบิลคลิก โมเดล TFLite ในไดเรกทอรี ml ใน Android Studio

การเร่งการอนุมานโมเดล

การเชื่อมโยงโมเดล ML ช่วยให้นักพัฒนาแอปเร่งความเร็วโค้ดได้โดย ใช้ตัวแทนและจำนวนเธรด

ขั้นตอนที่ 1 ตรวจสอบไฟล์ build.gradle ของโมดูลว่ามีทรัพยากร Dependency ต่อไปนี้หรือไม่

    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'
    }

ขั้นตอนที่ 2 ตรวจหาว่า GPU ที่ทำงานในอุปกรณ์เข้ากันได้กับ TensorFlow GPU delegate หรือไม่ หากไม่ ให้เรียกใช้โมเดลโดยใช้หลายเธรดของ 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
      

สร้างอินเทอร์เฟซโมเดลด้วยเครื่องมือสร้างโค้ด LiteRT

สำหรับโมเดล LiteRT ที่ได้รับการปรับปรุงด้วยข้อมูลเมตา นักพัฒนาแอปสามารถใช้เครื่องมือสร้างโค้ด Wrapper ของ Android สำหรับ LiteRT เพื่อสร้างโค้ด Wrapper ที่เฉพาะเจาะจงแพลตฟอร์ม โค้ด Wrapper ช่วยให้ไม่จำเป็นต้องโต้ตอบกับ ByteBuffer โดยตรง แต่นักพัฒนาแอปสามารถโต้ตอบกับโมเดล TensorFlow Lite ด้วยออบเจ็กต์ที่มีการพิมพ์ เช่น Bitmap และ Rect

ประโยชน์ของเครื่องมือสร้างโค้ดขึ้นอยู่กับความสมบูรณ์ของรายการข้อมูลเมตาของโมเดล LiteRT ดูวิธีที่เครื่องมือ Codegen แยกวิเคราะห์แต่ละฟิลด์ได้ในส่วน <Codegen usage> ภายใต้ฟิลด์ที่เกี่ยวข้องใน metadata_schema.fbs

สร้างโค้ด Wrapper

คุณจะต้องติดตั้งเครื่องมือต่อไปนี้ในเทอร์มินัล

pip install tflite-support

เมื่อเสร็จแล้ว คุณจะใช้เครื่องมือสร้างโค้ดได้โดยใช้ไวยากรณ์ต่อไปนี้

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

โค้ดที่ได้จะอยู่ในไดเรกทอรีปลายทาง หากคุณใช้ Google Colab หรือสภาพแวดล้อมระยะไกลอื่นๆ คุณอาจบีบอัดผลลัพธ์เป็นไฟล์ ZIP และดาวน์โหลดลงในโปรเจ็กต์ Android Studio ได้ง่ายกว่า

# 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')

การใช้โค้ดที่สร้างขึ้น

ขั้นตอนที่ 1: นำเข้าโค้ดที่สร้างขึ้น

คลายซิปโค้ดที่สร้างขึ้นหากจำเป็นลงในโครงสร้างไดเรกทอรี ระบบจะถือว่ารากของ โค้ดที่สร้างขึ้นคือ SRC_ROOT

เปิดโปรเจ็กต์ Android Studio ที่คุณต้องการใช้โมเดล LiteRT แล้วนำเข้าโมดูลที่สร้างขึ้นโดยทำดังนี้ File -> New -> Import Module -> select SRC_ROOT

จากตัวอย่างข้างต้น ไดเรกทอรีและโมดูลที่นำเข้าจะมีชื่อว่า classify_wrapper

ขั้นตอนที่ 2: อัปเดตไฟล์ build.gradle ของแอป

ในโมดูลแอปที่จะใช้โมดูลไลบรารีที่สร้างขึ้น ให้ทำดังนี้

เพิ่มข้อมูลต่อไปนี้ในส่วน Android

aaptOptions {
   noCompress "tflite"
}

เพิ่มรายการต่อไปนี้ในส่วนทรัพยากร Dependency

implementation project(":classify_wrapper")

ขั้นตอนที่ 3: การใช้โมเดล

// 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();
}

การเร่งการอนุมานโมเดล

โค้ดที่สร้างขึ้นช่วยให้นักพัฒนาซอฟต์แวร์เร่งความเร็วโค้ดได้ โดยใช้ผู้รับมอบสิทธิ์และจำนวน เธรด คุณตั้งค่าได้เมื่อเริ่มต้นออบเจ็กต์โมเดลเนื่องจากต้องใช้พารามิเตอร์ 3 รายการ ดังนี้

  • Context: บริบทจากกิจกรรมหรือบริการของ Android
  • (ไม่บังคับ) Device: ตัวแทนการเร่งความเร็ว TFLite เช่น GPUDelegate
  • (ไม่บังคับ) numThreads: จำนวนเธรดที่ใช้เรียกใช้โมเดล - ค่าเริ่มต้นคือ 1

เช่น หากต้องการใช้ตัวแทน GPU และสูงสุด 3 เธรด คุณสามารถเริ่มต้นโมเดลได้ดังนี้

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

การแก้ปัญหา

หากได้รับข้อผิดพลาด "java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed" ให้แทรกบรรทัดต่อไปนี้ ในส่วน android ของโมดูลแอปที่จะใช้โมดูลไลบรารี

aaptOptions {
   noCompress "tflite"
}