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

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

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

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

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

  1. คลิกขวาที่โมดูลที่คุณต้องการใช้รูปแบบ TFLite หรือคลิก File แล้วคลิก New > Other > TensorFlow Lite 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 Model Binding ช่วยให้นักพัฒนาซอฟต์แวร์เร่งการเขียนโค้ดโดยใช้ผู้รับมอบสิทธิ์และจำนวนชุดข้อความ

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

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

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

สร้างอินเทอร์เฟซของโมเดลด้วยโปรแกรมสร้างโค้ด TensorFlow Lite

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

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

สร้างโค้ด 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 ที่คุณต้องการใช้โมเดล TensorFlow Lite และนำเข้าโมดูลที่สร้างด้วยตัวกรอง ไฟล์ -> ใหม่ -> นำเข้าโมดูล -> เลือก 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: ไฟล์นี้ไม่สามารถเปิดเป็นคำอธิบายไฟล์ได้ เนื่องจากอาจมีการบีบอัด" ให้แทรกบรรทัดต่อไปนี้ในส่วน Android ของโมดูลแอปที่จะใช้โมดูลไลบรารี

aaptOptions {
   noCompress "tflite"
}