ML Community Day คือวันที่ 9 พฤศจิกายน! ร่วมกับเราสำหรับการปรับปรุงจาก TensorFlow, JAX และอื่น ๆ เรียนรู้เพิ่มเติม

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

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

ใช้ Android Studio ML Model Binding

สำหรับโมเดล 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 คลิกขวาที่เมนูเพื่อเข้าถึงฟังก์ชันการนำเข้า TensorFlow Lite

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

    ทางเลือก: เลือกช่องทำเครื่องหมายที่สองสำหรับการนำเข้า TensorFlow GPU หากคุณต้องการใช้การเร่งความเร็ว GPU นำเข้ากล่องโต้ตอบสำหรับรุ่น TFLite

  3. คลิก Finish

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

การอนุมานแบบจำลองเร่ง

ML Model Binding เป็นวิธีสำหรับนักพัฒนาในการเร่งรหัสผ่านการใช้ผู้รับมอบสิทธิ์และจำนวนเธรด

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

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

ขั้นตอนที่ 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
      

สร้างอินเทอร์เฟซโมเดลด้วยตัวสร้างโค้ด TensorFlow Lite

สำหรับรุ่น TensorFlow Lite ที่ปรับปรุงด้วย ข้อมูลเมตา นักพัฒนาสามารถใช้โปรแกรมสร้างโค้ด Wrapper ของ TensorFlow Lite Android เพื่อสร้างโค้ดเสื้อคลุมเฉพาะแพลตฟอร์ม รหัส 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 และนำเข้าโมดูลที่สร้างขึ้นโดย: And File -> New -> Import Module -> เลือก SRC_ROOT

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

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

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

ในส่วน Android ให้เพิ่มสิ่งต่อไปนี้:

aaptOptions {
   noCompress "tflite"
}

ภายใต้ส่วนการอ้างอิงให้เพิ่มสิ่งต่อไปนี้:

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

การอนุมานแบบจำลองเร่ง

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

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

ตัวอย่างเช่นในการใช้ผู้รับมอบสิทธิ์ NNAPI และเธรดสูงสุดสามเธรดคุณสามารถเริ่มต้นโมเดลได้ดังนี้:

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

การแก้ไขปัญหา

หากคุณได้รับ 'java.io.FileNotFoundException: ไฟล์นี้ไม่สามารถเปิดเป็นตัวอธิบายไฟล์ได้ อาจเป็นข้อผิดพลาดของการบีบอัดแทรกบรรทัดต่อไปนี้ใต้ส่วน Android ของโมดูลแอปที่จะใช้โมดูลไลบรารี:

aaptOptions {
   noCompress "tflite"
}