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

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

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

สำหรับโมเดล 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 Model และการพึ่งพาทั้งหมดจะแทรกลงในไฟล์ 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 ที่ทำงานอยู่ในอุปกรณ์เข้ากันได้กับผู้รับมอบสิทธิ์ GPU ของ TensorFlow หรือไม่ หากไม่ได้เรียกใช้รุ่นโดยใช้ CPU หลายเธรด:

คอตลิน

    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 แยกวิเคราะห์แต่ละฟิลด์อย่างไร

สร้างรหัสเสื้อคลุม

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

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

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

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