إنشاء واجهات نموذج باستخدام البيانات الوصفية

باستخدام البيانات الوصفية في LiteRT، يمكن للمطوّرين إنشاء رمز برنامج تضمين لإتاحة الدمج على Android. بالنسبة لمعظم المطورين، الواجهة الرسومية لميزة ربط نموذج تعلُّم الآلة على Android Studio هي أسهل في الاستخدام. إذا كنت بحاجة إلى مزيد من التخصيص أو كنت تستخدم سطر الأوامر الأدوات، يتوفر أيضًا LiteRT Codegen.

استخدام ربط نماذج تعلُّم الآلة في "استوديو Android"

بالنسبة إلى نماذج LiteRT المحسّنة باستخدام البيانات الوصفية، يمكن للمطوّرين استخدام ميزة "ربط نماذج تعلُّم الآلة" في "استوديو Android" لضبط إعدادات المشروع وإنشاء فئات برامج تضمين بناءً على النموذج بيانات التعريف. يلغي رمز التضمين الحاجة إلى التفاعل مباشرةً مع ByteBuffer بدلاً من ذلك، يمكن للمطورين التفاعل مع نموذج LiteRT مع الكائنات المكتوبة مثل Bitmap وRect.

استيراد نموذج LiteRT في "استوديو Android"

  1. انقر بزر الماوس الأيمن على الوحدة التي تريدها لاستخدام نموذج TFLite أو انقر على File، ثم New > Other LiteRT Model

  2. اختَر موقع ملف TFLite. لاحظ أن الأدوات يمكنك ضبط تبعية الوحدة نيابةً عنك من خلال ربط نموذج تعلُّم الآلة يتم إدراج جميع التبعيات تلقائيًا في وحدة Android ملف build.gradle.

    اختياري: ضَع علامة في مربّع الاختيار الثاني لاستيراد وحدة معالجة الرسومات TensorFlow إذا لم تريد استخدام تسريع وحدة معالجة الرسومات.

  3. انقر على Finish.

  4. ستظهر الشاشة التالية بعد إتمام عملية الاستيراد بنجاح. للبدء باستخدام النموذج، حدد Kotlin أو Java، وانسخ التعليمة البرمجية والصقها ضمن قسم "Sample Code". يمكنك العودة إلى هذه الشاشة عن طريق النقر مرّتين نموذج TFLite ضمن دليل ml في "استوديو Android".

تسريع الاستنتاج النموذجي

يوفّر ربط نموذج تعلُّم الآلة طريقة للمطوّرين لتسريع استخدام الرمز البرمجي استخدام المفوَّضين وعدد سلاسل المحادثات.

الخطوة 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: اكتشاف ما إذا كانت وحدة معالجة الرسومات التي تعمل على الجهاز متوافقة مع وحدة معالجة الرسومات TensorFlow تفويض، إذا لم يتم تشغيل النموذج باستخدام سلاسل متعددة لوحدة المعالجة المركزية (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 المحسَّن باستخدام البيانات الوصفية، ويمكن للمطوّرين استخدام أداة إنشاء رمز برنامج تضمين LiteRT في Android لإنشاء رمز برنامج تضمين خاص بالنظام الأساسي. يلغي رمز التضمين الحاجة إلى التفاعل مباشرةً مع "ByteBuffer" بدلاً من ذلك، يمكن للمطوّرين التفاعل مع TensorFlow هذا هو النموذج البسيط الذي يتضمّن عناصر مكتوبة، مثل 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":

# 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" الذي تريد استخدام LiteRT فيه. وقم باستيراد الوحدة التي تم إنشاؤها عن طريق: وملف -> جديد -> استيراد الوحدة -> اختيار 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" أو "الخدمة" على Android
  • (اختياري) Device: تفويض تسريع TFLite. مثل: GPUDelegate
  • (اختياري) numThreads: عدد سلاسل المحادثات المستخدَمة لتنفيذ النموذج الافتراضي هو واحد.

على سبيل المثال، لاستخدام تفويض وحدة معالجة الرسومات وما يصل إلى ثلاث سلاسل محادثات، يمكنك تهيئة النموذج على النحو التالي:

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

تحديد المشاكل وحلّها

إذا حصلت على الرمز 'java.io.FileNotFoundException: لا يمكن فتح هذا الملف كملف واصف الملف فمن المحتمل أن يكون مضغوطًا" يُرجى إدراج السطور التالية ضمن قسم android في وحدة التطبيق التي ستستخدم وحدة المكتبة:

aaptOptions {
   noCompress "tflite"
}