ایجاد رابط های مدل با استفاده از ابرداده

با استفاده از LiteRT Metadata ، توسعه‌دهندگان می‌توانند کد Wrapper را برای فعال کردن یکپارچه‌سازی در Android ایجاد کنند. برای اکثر توسعه دهندگان، رابط گرافیکی Android Studio ML Model Binding ساده ترین استفاده از آن است. اگر به سفارشی سازی بیشتری نیاز دارید یا از ابزار خط فرمان استفاده می کنید، LiteRT Codegen نیز موجود است.

از Android Studio ML Model Binding استفاده کنید

برای مدل‌های LiteRT که با ابرداده بهبود یافته‌اند، توسعه‌دهندگان می‌توانند از Android Studio ML Model Binding برای پیکربندی خودکار تنظیمات پروژه و تولید کلاس‌های بسته‌بندی بر اساس فراداده مدل استفاده کنند. کد wrapper نیاز به تعامل مستقیم با ByteBuffer را از بین می برد. در عوض، توسعه دهندگان می توانند با مدل LiteRT با اشیاء تایپ شده مانند Bitmap و Rect تعامل داشته باشند.

یک مدل LiteRT را در Android Studio وارد کنید

  1. روی ماژولی که می‌خواهید از مدل TFLite استفاده کنید کلیک راست کنید یا روی File کلیک کنید، سپس New > Other > LiteRT Model کلیک کنید.

  2. محل فایل TFLite خود را انتخاب کنید. توجه داشته باشید که ابزار، وابستگی ماژول را از طرف شما با ML Model binding پیکربندی می‌کند و همه وابستگی‌ها به‌طور خودکار در فایل build.gradle ماژول Android شما درج می‌شوند.

    اختیاری: اگر می‌خواهید از شتاب GPU استفاده کنید، کادر دوم را برای وارد کردن GPU TensorFlow انتخاب کنید.

  3. روی Finish کلیک کنید.

  4. پس از موفقیت آمیز شدن وارد کردن، صفحه زیر ظاهر می شود. برای شروع استفاده از مدل، Kotlin یا Java را انتخاب کنید، کد را در قسمت Sample Code کپی و پیست کنید. می‌توانید با دوبار کلیک کردن روی مدل TFLite زیر فهرست ml در Android Studio به این صفحه بازگردید.

استنتاج مدل شتاب دهنده

ML Model Binding راهی را برای توسعه دهندگان فراهم می کند تا کد خود را از طریق استفاده از نمایندگان و تعداد رشته ها تسریع کنند.

مرحله 1. فایل build.gradle ماژول را بررسی کنید که دارای وابستگی زیر باشد:

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'com.google.ai.edge.litert:litert-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
      

جاوا

    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 بهبود یافته با ابرداده ، توسعه‌دهندگان می‌توانند از تولیدکننده کد بسته‌بندی Android LiteRT برای ایجاد کد پوشش مخصوص پلتفرم استفاده کنند. کد wrapper نیاز به تعامل مستقیم با 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 یا سایر محیط های راه دور استفاده می کنید، ممکن است راحت تر نتیجه را در یک آرشیو فشرده فشرده کنید و آن را در پروژه 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 استفاده کنید و ماژول تولید شده را با استفاده از: And File -> New -> Import Module -> SRC_ROOT را انتخاب کنید.

با استفاده از مثال بالا، دایرکتوری و ماژول وارد شده classify_wrapper نامیده می شود.

مرحله 2: فایل build.gradle برنامه را به روز کنید

در ماژول برنامه ای که ماژول کتابخانه تولید شده را مصرف می کند:

در بخش اندروید موارد زیر را اضافه کنید:

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
  • (اختیاری) numThreads : تعداد رشته هایی که برای اجرای مدل استفاده می شود - پیش فرض یک است.

به عنوان مثال، برای استفاده از یک نماینده GPU و حداکثر سه رشته، می توانید مدل را به صورت زیر مقداردهی کنید:

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

عیب یابی

اگر یک 'java.io.FileNotFoundException دریافت کردید: این فایل را نمی توان به عنوان توصیفگر فایل باز کرد. احتمالاً خطای فشرده شده است، خطوط زیر را در قسمت اندروید ماژول برنامه که از ماژول کتابخانه استفاده می کند وارد کنید:

aaptOptions {
   noCompress "tflite"
}