با TensorFlow Lite در اندروید گل ها را بشناسید

۱. مقدمه

657431be3173fa86.pngاندروید.png

توجه: این آزمایشگاه کد برای آزمایش به یک دستگاه فیزیکی نیاز دارد.

TensorFlow یک چارچوب یادگیری ماشین چندمنظوره است. TensorFlow را می‌توان در هر جایی از آموزش مدل‌های عظیم در خوشه‌های ابری گرفته تا اجرای مدل‌ها به صورت محلی روی یک سیستم تعبیه‌شده مانند تلفن شما استفاده کرد.

این آزمایشگاه کد از TensorFlow Lite برای اجرای یک مدل تشخیص تصویر روی دستگاه اندروید استفاده می‌کند.

اندروید استودیو ۴.۱ یا بالاتر را نصب کنید

اگر از قبل آن را نصب نکرده‌اید، در حین آموزش مدل TensorFlow Lite خود ، AndroidStudio 4.1 یا بالاتر را دانلود و نصب کنید .

آنچه یاد خواهید گرفت

  • چگونه با استفاده از TensorFlow Lite Model Maker، طبقه‌بندی‌کننده تصویر سفارشی خود را آموزش دهیم؟
  • نحوه استفاده از اندروید استودیو برای وارد کردن مدل TensorFlow Lite جهت ادغام مدل سفارشی در یک برنامه اندروید با استفاده از CameraX.
  • نحوه استفاده از پردازنده گرافیکی (GPU) در گوشی برای سرعت بخشیدن به مدل

آنچه خواهید ساخت

یک اپلیکیشن دوربین ساده که یک برنامه تشخیص تصویر TensorFlow را برای شناسایی گل‌ها اجرا می‌کند.

f11c2821f2c8311d.png

مجوز: استفاده رایگان

۲. آموزش یک تشخیص‌دهنده گل با استفاده از Colab

قبل از شروع آموزش مدل، دانلود و نصب اندروید استودیو ۴.۱ یا بالاتر را شروع کنید.

Colab را باز کنید که نحوه آموزش یک طبقه‌بندی‌کننده با Keras را برای تشخیص گل‌ها با استفاده از یادگیری انتقالی TensorFlow Lite نشان می‌دهد.

۳. دایرکتوری کاری را تنظیم کنید

مخزن گیت را کلون کنید

دستور زیر مخزن گیت حاوی فایل‌های مورد نیاز برای این آزمایشگاه کد را کلون می‌کند:

git clone https://github.com/hoitab/TFLClassify.git

سپس، به دایرکتوری که مخزن را کلون کرده‌اید بروید. اینجا جایی است که در ادامه‌ی این آزمایشگاه کد روی آن کار خواهید کرد:

cd TFLClassify

۴. برنامه اسکلت اندروید را تنظیم کنید

اندروید.png

اندروید استودیو ۴.۱ یا بالاتر را نصب کنید

اگر از قبل آن را نصب نکرده‌اید، AndroidStudio 4.1 یا بالاتر را نصب کنید .

پروژه را با اندروید استودیو باز کنید

با انجام مراحل زیر، یک پروژه را با اندروید استودیو باز کنید:

  1. اندروید استودیو را باز کنید 7f2480ded53a193b.png پس از بارگذاری، از این پنجره، گزینه «باز کردن یک پروژه موجود» را انتخاب کنید:

f3b8bea7e3b39376.png

  1. در انتخابگر فایل، TFLClassify/build.gradle را از دایرکتوری کاری خود انتخاب کنید.
  1. اولین باری که پروژه را باز می‌کنید، یک پنجره‌ی «همگام‌سازی گرادل» (Gradle Sync) نمایش داده می‌شود که در مورد استفاده از gradle wrapper سوال می‌کند. روی «تأیید» (OK) کلیک کنید.

d68b4d7189e6c1e4.png

  1. اگر قبلاً مدل توسعه‌دهنده و اشکال‌زدایی USB را روی گوشی خود فعال نکرده‌اید، آن‌ها را فعال کنید. این تنظیمات فقط یک بار انجام می‌شوند. این دستورالعمل‌ها را دنبال کنید.
  2. وقتی پروژه و گوشی شما آماده شد، می‌توانید با انتخاب TFL_Classify.start و فشردن دکمه اجرا، آن را روی یک دستگاه واقعی اجرا کنید. ۸۶۹۳۴b7b01ad7565.png در نوار ابزار:

60a77ef126c1373d.png

  1. حالا به Tensorflow Demo اجازه دهید به دوربین شما دسترسی داشته باشد:

b63cba02bb36b7e3.png

  1. صفحه زیر را روی گوشی خود مشاهده خواهید کرد که در آن اعداد تصادفی جای نتایج واقعی را گرفته‌اند.

82c603596afa35f1.png

۵. اضافه کردن TensorFlow Lite به برنامه اندروید

  1. ماژول start را در کاوشگر پروژه در سمت چپ انتخاب کنید:

cede7f2b8b23c1a7.png

  1. روی ماژول start کلیک راست کنید یا روی File کلیک کنید، سپس New > Other > TensorFlow Lite Model کنید.

bf243d9fdd27e20a.png

  1. محل مدلی را که FlowerModel.tflite آموزش‌دیده سفارشی را قبلاً دانلود کرده‌اید، انتخاب کنید.

cfee18cc6674a408.png

  1. Finish کلیک کنید.
  2. در پایان تصویر زیر را مشاهده خواهید کرد. فایل FlowerModel.tflite با موفقیت وارد شده است و اطلاعات سطح بالایی در مورد مدل از جمله ورودی/خروجی و همچنین برخی از کدهای نمونه برای شروع کار را نشان می‌دهد.

82840065f0d59def.png

۶. اختیاری: بررسی تمام لیست کارها

لیست TODO، پیمایش به مکان دقیقی که باید codelab را به‌روزرسانی کنید، آسان می‌کند. همچنین می‌توانید از آن در پروژه اندروید خود برای یادآوری کارهای آینده استفاده کنید. می‌توانید با استفاده از کامنت‌های کد و تایپ کلمه کلیدی TODO موارد TODO را اضافه کنید. برای دسترسی به لیست TODOها، می‌توانید:

  1. یک راه عالی برای دیدن کاری که قرار است انجام دهیم، بررسی لیست TODO است. برای انجام این کار، از نوار منوی بالا View > Tool Windows > TODO را انتخاب کنید.

5de29b413574f25c.png

  1. به طور پیش‌فرض، تمام TODOها را در تمام ماژول‌ها فهرست می‌کند که کمی گیج‌کننده است. می‌توانیم فقط TODOهای شروع را با کلیک روی دکمه گروه‌بندی در کنار پنل TODO و انتخاب Modules مرتب کنیم.

5d8fe7b102340208.png

  1. تمام موارد زیر ماژول‌های شروع را گسترش دهید:

8d0f14a039995b20.png

۷. مدل سفارشی را با TensorFlow Lite اجرا کنید

  1. روی TODO 1 در لیست TODO کلیک کنید یا فایل MainActivity.kt را باز کنید و TODO 1 را پیدا کنید، مدل را با اضافه کردن این خط مقداردهی اولیه کنید:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. درون متد analyze برای تحلیلگر CameraX، باید ورودی دوربین ImageProxy به یک Bitmap تبدیل کنیم و یک شیء TensorImage برای فرآیند استنتاج ایجاد کنیم.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. تصویر را پردازش کنید و عملیات زیر را روی نتیجه انجام دهید:
  • نتایج را بر اساس احتمال، به صورت نزولی و زیر score ویژگی با بالاترین احتمال، مرتب کنید.
  • k نتیجه برتر را که توسط ثابت MAX_RESULT_DISPLAY تعریف شده است، در نظر بگیرید. می‌توانید به صورت اختیاری مقدار این متغیر را تغییر دهید تا نتایج کمتر یا بیشتری دریافت کنید.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. تبدیل نتایج مرتب‌شده و فیلترشده به اشیاء داده‌ی Recognition که آماده‌ی استفاده توسط RecyclerView از طریق Data Binding هستند:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. خطوط زیر را که به تولید نتایج جعلی که قبلاً می‌بینیم کمک می‌کنند، کامنت کنید یا حذف کنید:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. با انتخاب TFL_Classify.start و فشردن دکمه اجرا، برنامه را روی یک دستگاه واقعی اجرا کنید. ۸۶۹۳۴b7b01ad7565.png در نوار ابزار:

60a77ef126c1373d.png

  1. صفحه زیر را روی گوشی خود مشاهده خواهید کرد که در آن اعداد تصادفی جای نتایج واقعی را می‌گیرند:

f11c2821f2c8311d.png

۸. اختیاری: تسریع استنتاج با نماینده GPU

TensorFlow Lite از چندین شتاب‌دهنده سخت‌افزاری برای سرعت بخشیدن به استنتاج در دستگاه تلفن همراه شما پشتیبانی می‌کند. GPU یکی از شتاب‌دهنده‌هایی است که TensorFlow Lite می‌تواند از طریق مکانیسم نماینده از آن بهره ببرد و استفاده از آن نسبتاً آسان است.

  1. فایل build.gradle را در زیر ماژول start باز کنید یا می‌توانید روی TODO 5 در زیر لیست TODO کلیک کنید و وابستگی زیر را اضافه کنید:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. به فایل MainActivity.kt برگردید یا در لیست TODO روی TODO 6 کلیک کنید. شروع ساده flowerModel را با موارد زیر جایگزین کنید: یک نمونه از لیست سازگاری GPU دریافت کنید و GPU را بسته به اینکه آیا یکی از GPU های سازگار ذکر شده است یا خیر، مقداردهی اولیه کنید. در غیر این صورت، 4 رشته CPU را برای اجرای مدل آغاز کنید:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. با افزودن options به ورودی متد، مقداردهی اولیه مدل را برای استفاده از این تغییر دهید:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. با انتخاب TFL_Classify.start و فشردن دکمه اجرا، برنامه را روی یک دستگاه واقعی اجرا کنید. ۸۶۹۳۴b7b01ad7565.png در نوار ابزار:

60a77ef126c1373d.png

۹. بعدش چی؟

در اینجا چند لینک برای اطلاعات بیشتر آورده شده است: