การใช้ข้อมูลเมตา LiteRT ช่วยให้นักพัฒนาแอป สร้างโค้ด Wrapper เพื่อเปิดใช้การผสานรวมใน Android ได้ สำหรับนักพัฒนาแอปส่วนใหญ่แล้ว อินเทอร์เฟซแบบกราฟิกของการเชื่อมโยงโมเดล ML ของ Android Studio เป็นอินเทอร์เฟซที่ ใช้งานง่ายที่สุด หากต้องการการปรับแต่งเพิ่มเติมหรือใช้เครื่องมือบรรทัดคำสั่ง คุณก็ใช้ LiteRT Codegen ได้เช่นกัน
ใช้การเชื่อมโยงโมเดล ML ของ Android Studio
สำหรับโมเดล LiteRT ที่ได้รับการปรับปรุงด้วยข้อมูลเมตา นักพัฒนาแอปสามารถใช้การเชื่อมโยงโมเดล ML ของ Android
Studio เพื่อกำหนดค่าการตั้งค่าสำหรับโปรเจ็กต์โดยอัตโนมัติและ
สร้างคลาส Wrapper ตามข้อมูลเมตาของโมเดล โค้ด Wrapper จะช่วยให้คุณไม่จำเป็นต้องโต้ตอบกับ ByteBuffer โดยตรง
แต่นักพัฒนาแอปสามารถ
โต้ตอบกับโมเดล LiteRT ด้วยออบเจ็กต์ที่มีการพิมพ์ เช่น Bitmap และ Rect
นำเข้าโมเดล LiteRT ใน Android Studio
คลิกขวาที่โมดูลที่คุณต้องการใช้โมเดล TFLite หรือคลิก
Fileจากนั้นNew>Other>LiteRT Modelเลือกตำแหน่งของไฟล์ TFLite โปรดทราบว่าเครื่องมือจะกำหนดค่าทรัพยากร Dependency ของโมดูลในนามของคุณด้วยการเชื่อมโยงโมเดล ML และจะแทรกทรัพยากร Dependency ทั้งหมดลงในไฟล์
build.gradleของโมดูล Android โดยอัตโนมัติไม่บังคับ: เลือกช่องทำเครื่องหมายที่ 2 เพื่อนำเข้า TensorFlow GPU หากต้องการใช้การเร่งด้วย GPU
คลิก
Finishหน้าจอต่อไปนี้จะปรากฏขึ้นหลังจากนำเข้าสำเร็จ หากต้องการเริ่มใช้โมเดล ให้เลือก 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"
}