با استفاده از LiteRT Metadata ، توسعهدهندگان میتوانند کد پوششی (wrapper code) را برای فعالسازی ادغام در اندروید تولید کنند. برای اکثر توسعهدهندگان، رابط گرافیکی Android Studio ML Model Binding سادهترین رابط کاربری است. اگر به سفارشیسازی بیشتری نیاز دارید یا از ابزار خط فرمان استفاده میکنید، LiteRT Codegen نیز موجود است.
استفاده از اتصال مدل ML در اندروید استودیو
برای مدلهای LiteRT که با فرادادهها (metadata) تقویت شدهاند، توسعهدهندگان میتوانند از Android Studio ML Model Binding برای پیکربندی خودکار تنظیمات پروژه و تولید کلاسهای wrapper بر اساس فرادادههای مدل استفاده کنند. کد wrapper نیاز به تعامل مستقیم با ByteBuffer را از بین میبرد. در عوض، توسعهدهندگان میتوانند با مدل LiteRT با اشیاء تایپشده مانند Bitmap و Rect تعامل داشته باشند.
یک مدل LiteRT را در Android Studio وارد کنید
روی ماژولی که میخواهید از مدل TFLite استفاده کنید، کلیک راست کنید یا روی
Fileکلیک کنید، سپسNew>Other>LiteRT Modelکنید.محل فایل TFLite خود را انتخاب کنید. توجه داشته باشید که این ابزار، وابستگی ماژول را از طرف شما با اتصال ML Model پیکربندی میکند و تمام وابستگیها به طور خودکار در فایل
build.gradleماژول اندروید شما وارد میشوند.اختیاری: اگر میخواهید از شتابدهندهی GPU استفاده کنید، کادر انتخاب دوم برای وارد کردن TensorFlow GPU را علامت بزنید.
Finishکلیک کنید.پس از موفقیتآمیز بودن وارد کردن، صفحه زیر ظاهر میشود. برای شروع استفاده از مدل، Kotlin یا Java را انتخاب کنید، کد را کپی کرده و در بخش
Sample Codeقرار دهید. میتوانید با دوبار کلیک کردن روی مدل TFLite در پوشهmlدر اندروید استودیو، به این صفحه بازگردید.
تسریع استنتاج مدل
اتصال مدل ML راهی را برای توسعهدهندگان فراهم میکند تا با استفاده از نمایندگان و تعداد نخها، سرعت کد خود را افزایش دهند.
مرحله ۱. فایل build.gradle ماژول را بررسی کنید که شامل وابستگیهای زیر باشد:
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'
}
مرحله ۲. تشخیص اینکه آیا پردازنده گرافیکی در حال اجرا روی دستگاه با TensorFlow GPU delegate سازگار است یا خیر، در غیر این صورت مدل را با استفاده از چندین نخ پردازنده اجرا کنید:
کاتلین
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
جاوا
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 که با فراداده بهبود یافته است، توسعهدهندگان میتوانند از مولد کد پوششی اندروید LiteRT برای ایجاد کد پوششی مخصوص پلتفرم استفاده کنند. کد پوششی نیاز به تعامل مستقیم با ByteBuffer را از بین میبرد. در عوض، توسعهدهندگان میتوانند با مدل TensorFlow Lite با اشیاء تایپشده مانند Bitmap و Rect تعامل داشته باشند.
سودمندی مولد کد به کامل بودن ورودی فراداده مدل LiteRT بستگی دارد. برای مشاهده نحوه تجزیه هر فیلد توسط ابزار کدژن، به بخش <Codegen usage> در زیر فیلدهای مربوطه در metadata_schema.fbs مراجعه کنید.
تولید کد پوششی
شما باید ابزارهای زیر را در ترمینال خود نصب کنید:
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 up the generated code
!zip -r classify_wrapper.zip classify_wrapper/
# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')
با استفاده از کد تولید شده
مرحله ۱: کد تولید شده را وارد کنید
در صورت لزوم، کد تولید شده را در یک ساختار دایرکتوری از حالت فشرده خارج کنید. فرض میشود ریشه کد تولید شده SRC_ROOT باشد.
پروژه اندروید استودیو را که میخواهید از مدل LiteRT در آن استفاده کنید، باز کنید و ماژول تولید شده را از طریق مسیر زیر وارد کنید: و File -> New -> Import Module -> select SRC_ROOT
با استفاده از مثال بالا، دایرکتوری و ماژول وارد شده، classify_wrapper نامیده میشوند.
مرحله ۲: فایل build.gradle برنامه را بهروزرسانی کنید
در ماژول app که ماژول کتابخانه تولید شده را مصرف خواهد کرد:
در بخش اندروید، موارد زیر را اضافه کنید:
aaptOptions {
noCompress "tflite"
}
در بخش وابستگیها، موارد زیر را اضافه کنید:
implementation project(":classify_wrapper")
مرحله ۳: استفاده از مدل
// 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: متن از فعالیت یا سرویس اندروید - (اختیاری)
Device: نماینده شتاب TFLite. برای مثال: GPUDelegate - (اختیاری)
numThreads: تعداد نخهای مورد استفاده برای اجرای مدل - پیشفرض یکی است.
برای مثال، برای استفاده از یک نماینده GPU و حداکثر سه نخ، میتوانید مدل را به این صورت مقداردهی اولیه کنید:
try {
myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
// Error reading the model
}
عیبیابی
اگر با خطای 'java.io.FileNotFoundException: This file can't be opened as a file descriptor; it is probably compressed' مواجه شدید، خطوط زیر را در بخش اندروید ماژول app که از ماژول کتابخانه استفاده میکند، وارد کنید:
aaptOptions {
noCompress "tflite"
}