شروع سریع برای اندروید

این آموزش به شما نشان می دهد که چگونه با استفاده از TensorFlow Lite یک برنامه اندروید بسازید تا فید دوربین زنده را تجزیه و تحلیل کنید و اشیاء را با استفاده از یک مدل یادگیری ماشینی با استفاده از حداقل مقدار کد شناسایی کنید. اگر یک پروژه موجود را به روز می کنید، می توانید از نمونه کد به عنوان مرجع استفاده کنید و به دستورالعمل های اصلاح پروژه خود بروید .

تشخیص اشیا با یادگیری ماشینی

دمو متحرک تشخیص شی مدل یادگیری ماشین در این آموزش تشخیص اشیا را انجام می دهد. یک مدل تشخیص شی، داده‌های تصویر را در قالب خاصی می‌گیرد، آن‌ها را تجزیه و تحلیل می‌کند و سعی می‌کند موارد موجود در تصویر را به عنوان یکی از مجموعه‌ای از کلاس‌های شناخته‌شده طبقه‌بندی کند که برای تشخیص آموزش دیده است. سرعتی که یک مدل با آن می تواند یک شی شناخته شده را شناسایی کند (که پیش بینی یا استنتاج شی نامیده می شود) معمولاً در میلی ثانیه اندازه گیری می شود. در عمل، سرعت استنتاج بر اساس سخت افزار میزبان مدل، اندازه داده های در حال پردازش و اندازه مدل یادگیری ماشین متفاوت است.

راه اندازی و اجرای مثال

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

  • اندروید استودیو 4.2.2 یا بالاتر
  • Android SDK نسخه 31 یا بالاتر

کد نمونه را دریافت کنید

یک کپی محلی از کد نمونه ایجاد کنید. از این کد برای ایجاد پروژه در اندروید استودیو و اجرای نمونه برنامه استفاده خواهید کرد.

برای شبیه سازی و تنظیم کد مثال:

  1. مخزن git
    git clone https://github.com/android/camera-samples.git
    
    را کلون کنید
  2. نمونه git خود را طوری پیکربندی کنید که از پرداخت پراکنده استفاده کند، بنابراین فقط فایل‌های برنامه نمونه تشخیص شی را داشته باشید:

    cd camera-samples
    git sparse-checkout init --cone
    git sparse-checkout set CameraXAdvanced
    

پروژه را وارد و اجرا کنید

یک پروژه از کد نمونه دانلود شده ایجاد کنید، پروژه را بسازید و سپس آن را اجرا کنید.

برای وارد کردن و ساخت نمونه پروژه کد:

  1. Android Studio را راه اندازی کنید.
  2. از صفحه خوش آمدگویی Android Studio، Import Project را انتخاب کنید یا File > New > Import Project را انتخاب کنید.
  3. به فهرست کد نمونه حاوی فایل build.gradle ( .../android/camera-samples/CameraXAdvanced/build.gradle ) بروید و آن دایرکتوری را انتخاب کنید.

اگر دایرکتوری صحیح را انتخاب کنید، Android Studio یک پروژه جدید ایجاد می کند و آن را می سازد. بسته به سرعت کامپیوتر شما و اگر از اندروید استودیو برای پروژه های دیگر استفاده کرده اید، این فرآیند می تواند چند دقیقه طول بکشد. پس از اتمام ساخت، Android Studio یک پیام BUILD SUCCESSFUL را در پانل وضعیت Build Output نمایش می دهد.

اختیاری: برای رفع خطاهای ساخت با به روز رسانی نسخه افزونه اندروید:

  1. فایل build.gradle را در فهرست پروژه باز کنید.
  2. نسخه ابزار اندروید را به صورت زیر تغییر دهید:

    // from:
    classpath 'com.android.tools.build:gradle:4.2.2'
    // to:
    classpath 'com.android.tools.build:gradle:4.1.2'
    
  3. پروژه را با انتخاب: File > Sync Project with Gradle Files همگام سازی کنید.

برای اجرای پروژه:

  1. از Android Studio، پروژه را با انتخاب Run > Run… و CameraActivity اجرا کنید.
  2. برای آزمایش برنامه، یک دستگاه اندروید متصل با دوربین را انتخاب کنید.

بخش های بعدی تغییراتی را که باید در پروژه موجود خود انجام دهید تا این قابلیت را به برنامه خود اضافه کنید، با استفاده از این برنامه مثال به عنوان نقطه مرجع به شما نشان می دهد.

وابستگی های پروژه را اضافه کنید

در برنامه خود، باید وابستگی‌های پروژه خاصی را برای اجرای مدل‌های یادگیری ماشینی TensorFlow Lite اضافه کنید و به توابع ابزاری دسترسی داشته باشید که داده‌هایی مانند تصاویر را به یک قالب داده تانسور تبدیل می‌کنند که می‌تواند توسط مدلی که استفاده می‌کنید پردازش شود.

برنامه مثال از چندین کتابخانه TensorFlow Lite برای فعال کردن اجرای مدل یادگیری ماشینی تشخیص اشیا استفاده می کند:

  • کتابخانه اصلی TensorFlow Lite - کلاس های ورودی داده های مورد نیاز، اجرای مدل یادگیری ماشین و نتایج خروجی از پردازش مدل را ارائه می دهد.
  • کتابخانه پشتیبانی TensorFlow Lite - این کتابخانه یک کلاس کمکی برای ترجمه تصاویر از دوربین به یک شی داده TensorImage ارائه می دهد که می تواند توسط مدل یادگیری ماشین پردازش شود.
  • کتابخانه TensorFlow Lite GPU - این کتابخانه برای تسریع اجرای مدل با استفاده از پردازنده‌های GPU روی دستگاه، در صورت موجود بودن، پشتیبانی می‌کند.

دستورالعمل‌های زیر نحوه اضافه کردن وابستگی‌های پروژه و ماژول مورد نیاز را به پروژه برنامه Android خود توضیح می‌دهند.

برای افزودن وابستگی های ماژول:

  1. در ماژولی که از TensorFlow Lite استفاده می‌کند، فایل build.gradle ماژول را به‌روزرسانی کنید تا وابستگی‌های زیر را شامل شود. در کد نمونه، این فایل در اینجا قرار دارد: .../android/camera-samples/CameraXAdvanced/tflite/build.gradle ( مرجع کد )

    ...
    dependencies {
    ...
        // Tensorflow lite dependencies
        implementation 'org.tensorflow:tensorflow-lite:2.8.0'
        implementation 'org.tensorflow:tensorflow-lite-gpu:2.8.0'
        implementation 'org.tensorflow:tensorflow-lite-support:2.8.0'
    ...
    }
    
  2. در Android Studio، وابستگی‌های پروژه را با انتخاب: File > Sync Project with Gradle Files همگام‌سازی کنید.

مفسر مدل ML را راه اندازی کنید

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

یک مدل TensorFlow Lite شامل یک فایل .tflite . حاوی کد مدل و اغلب شامل یک فایل برچسب حاوی نام کلاس‌های پیش‌بینی‌شده توسط مدل است. در مورد تشخیص اشیا، کلاس ها اشیایی مانند یک شخص، سگ، گربه یا ماشین هستند. مدل‌ها معمولاً در فهرست src/main/assets ماژول اصلی ذخیره می‌شوند، مانند نمونه کد:

  • CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_quant.tflite
  • CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_labels.txt

برای راحتی و خوانایی کد، مثال یک شیء همراه را اعلام می کند که تنظیمات مدل را تعریف می کند.

برای مقداردهی اولیه مدل در برنامه خود:

  1. یک شیء همراه برای تعریف تنظیمات مدل ایجاد کنید: ( مرجع کد )

    companion object {
       private val TAG = CameraActivity::class.java.simpleName
    
       private const val ACCURACY_THRESHOLD = 0.5f
       private const val MODEL_PATH = "coco_ssd_mobilenet_v1_1.0_quant.tflite"
       private const val LABELS_PATH = "coco_ssd_mobilenet_v1_1.0_labels.txt"
    }
    
  2. از تنظیمات این شی برای ساختن یک شی مترجم TensorFlow Lite استفاده کنید که حاوی مدل است: ( مرجع کد )

    private val tflite by lazy {
       Interpreter(
           FileUtil.loadMappedFile(this, MODEL_PATH),
           Interpreter.Options().addDelegate(nnApiDelegate))
    }
    

پیکربندی شتاب دهنده سخت افزاری

هنگام راه اندازی یک مدل TensorFlow Lite در برنامه خود، می توانید از ویژگی های شتاب سخت افزاری برای سرعت بخشیدن به محاسبات پیش بینی مدل استفاده کنید. مثال کد بالا از NNAPI Delegate برای مدیریت شتاب سخت افزاری اجرای مدل استفاده می کند:

Interpreter.Options().addDelegate(nnApiDelegate)

نمایندگان TensorFlow Lite ماژول‌های نرم‌افزاری هستند که اجرای مدل‌های یادگیری ماشین را با استفاده از سخت‌افزار پردازش تخصصی روی یک دستگاه تلفن همراه، مانند GPU، TPU، یا DSP تسریع می‌کنند. استفاده از نمایندگان برای اجرای مدل‌های TensorFlow Lite توصیه می‌شود، اما الزامی نیست.

برای اطلاعات بیشتر در مورد استفاده از نمایندگان با TensorFlow Lite، به TensorFlow Lite Delegates مراجعه کنید.

داده هایی را به مدل ارائه دهید

در برنامه Android شما، کد شما با تبدیل داده‌های موجود مانند تصاویر به قالب داده‌های Tensor که می‌تواند توسط مدل شما پردازش شود، داده‌ها را برای تفسیر در اختیار مدل قرار می‌دهد. داده ها در یک Tensor باید ابعاد یا شکل خاصی داشته باشند که با قالب داده های مورد استفاده برای آموزش مدل مطابقت داشته باشد.

برای تعیین شکل تانسور مورد نیاز برای یک مدل:

  • همانطور که در قطعه کد زیر نشان داده شده است، برای تعیین شکل تانسور استفاده شده توسط مدل خود از شی Interpreter اولیه استفاده کنید: ( مرجع کد )

    private val tfInputSize by lazy {
       val inputIndex = 0
       val inputShape = tflite.getInputTensor(inputIndex).shape()
       Size(inputShape[2], inputShape[1]) // Order of axis is: {1, height, width, 3}
    }
    

مدل تشخیص شی مورد استفاده در کد مثال، تصاویر مربعی با اندازه 300 در 300 پیکسل را انتظار دارد.

قبل از اینکه بتوانید تصاویری از دوربین ارائه دهید، برنامه شما باید تصویر را بگیرد، آن را با اندازه مورد انتظار مطابقت دهد، چرخش آن را تنظیم کند و داده های تصویر را عادی کند. هنگام پردازش تصاویر با یک مدل TensorFlow Lite، می توانید از کلاس ImageProcessor کتابخانه پشتیبانی TensorFlow Lite برای مدیریت پیش پردازش داده ها استفاده کنید، همانطور که در زیر نشان داده شده است.

برای تبدیل داده های تصویر برای یک مدل:

  1. از پشتیبانی کتابخانه ImageProcessor برای ایجاد یک شی برای تبدیل داده های تصویر به قالبی استفاده کنید که مدل شما بتواند از آن برای اجرای پیش بینی ها استفاده کند: ( مرجع کد )

    private val tfImageProcessor by lazy {
       val cropSize = minOf(bitmapBuffer.width, bitmapBuffer.height)
       ImageProcessor.Builder()
           .add(ResizeWithCropOrPadOp(cropSize, cropSize))
           .add(ResizeOp(
               tfInputSize.height, tfInputSize.width, ResizeOp.ResizeMethod.NEAREST_NEIGHBOR))
           .add(Rot90Op(-imageRotationDegrees / 90))
           .add(NormalizeOp(0f, 1f))
           .build()
    }
    
  2. داده های تصویر را از سیستم دوربین اندروید کپی کنید و آن را برای تجزیه و تحلیل با شی ImageProcessor خود آماده کنید: ( مرجع کد )

    // Copy out RGB bits to the shared buffer
    image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer)  }
    
    // Process the image in Tensorflow
    val tfImage =  tfImageProcessor.process(tfImageBuffer.apply { load(bitmapBuffer) })
    

پیش بینی ها را اجرا کنید

در برنامه Android خود، هنگامی که یک شی TensorImage با داده‌های تصویر در قالب درست ایجاد کردید، می‌توانید مدل را با آن داده‌ها اجرا کنید تا یک پیش‌بینی یا استنتاج ایجاد کنید. کد مثال برای این آموزش از یک کلاس ObjectDetectionHelper استفاده می کند که این کد را در یک متد predict() predict کپسوله می کند.

برای اجرای یک پیش‌بینی روی مجموعه‌ای از داده‌های تصویر:

  1. پیش‌بینی را با ارسال داده‌های تصویر به تابع پیش‌بینی خود اجرا کنید: ( مرجع کد )

    // Perform the object detection for the current frame
    val predictions = detector.predict(tfImage)
    
  2. برای ایجاد پیش‌بینی، متد اجرا را در نمونه شی tflite خود با داده‌های تصویر فراخوانی کنید: ( مرجع کد )

    fun predict(image: TensorImage): List<ObjectPrediction> {
       tflite.runForMultipleInputsOutputs(arrayOf(image.buffer), outputBuffer)
       return predictions
    }
    

شی TensorFlow Lite Interpreter این داده ها را دریافت می کند، آن را بر اساس مدل اجرا می کند و فهرستی از پیش بینی ها را تولید می کند. برای پردازش مداوم داده‌ها توسط مدل، از runForMultipleInputsOutputs() استفاده کنید تا اشیاء Interpreter ایجاد و سپس برای هر پیش‌بینی توسط سیستم حذف نشود.

خروجی مدل دسته

در برنامه Android شما، پس از اجرای داده‌های تصویر در برابر مدل تشخیص شی، فهرستی از پیش‌بینی‌ها را تولید می‌کند که کد برنامه شما باید با اجرای منطق تجاری اضافی، نمایش نتایج به کاربر، یا انجام اقدامات دیگر انجام دهد.

خروجی هر مدل TensorFlow Lite از نظر تعداد پیش‌بینی‌هایی که تولید می‌کند (یک یا چند)، و اطلاعات توصیفی برای هر پیش‌بینی متفاوت است. در مورد یک مدل تشخیص شی، پیش‌بینی‌ها معمولاً شامل داده‌هایی برای یک کادر محدود می‌شوند که نشان می‌دهد یک شی در کجای تصویر شناسایی شده است. در کد مثال، داده های برگردانده شده به عنوان لیستی از اشیاء ObjectPrediction فرمت می شوند، همانطور که در زیر نشان داده شده است: ( مرجع کد )

val predictions get() = (0 until OBJECT_COUNT).map {
   ObjectPrediction(

       // The locations are an array of [0, 1] floats for [top, left, bottom, right]
       location = locations[0][it].let {
           RectF(it[1], it[0], it[3], it[2])
       },

       // SSD Mobilenet V1 Model assumes class 0 is background class
       // in label file and class labels start from 1 to number_of_classes + 1,
       // while outputClasses correspond to class index from 0 to number_of_classes
       label = labels[1 + labelIndices[0][it].toInt()],

       // Score is a single value of [0, 1]
       score = scores[0][it]
   )
}

اسکرین شات تشخیص اشیا برای مدل مورد استفاده در این مثال، هر پیش‌بینی شامل یک مکان جعبه مرزی برای شی، یک برچسب برای شی، و یک امتیاز پیش‌بینی بین 0 تا 1 به‌عنوان شناور است که نشان‌دهنده اطمینان پیش‌بینی است، که 1 بالاترین رتبه اطمینان است. . به طور کلی، پیش‌بینی‌هایی با امتیاز کمتر از 50 درصد (0.5) غیرقطعی در نظر گرفته می‌شوند. با این حال، نحوه مدیریت نتایج پیش‌بینی کم ارزش به شما و نیازهای برنامه شما بستگی دارد.

هنگامی که مدل یک نتیجه پیش بینی را برگرداند، برنامه شما می تواند با ارائه نتیجه به کاربر یا اجرای منطق اضافی، بر اساس آن پیش بینی عمل کند. در مورد کد مثال، برنامه یک کادر محدود در اطراف شی شناسایی شده ترسیم می کند و نام کلاس را روی صفحه نمایش می دهد. برای جزئیات، تابع CameraActivity.reportPrediction() را در کد مثال مرور کنید.

مراحل بعدی

  • کاربردهای مختلف TensorFlow Lite را در مثال‌ها کاوش کنید.
  • در مورد استفاده از مدل‌های یادگیری ماشین با TensorFlow Lite در بخش Models بیشتر بیاموزید.
  • در راهنمای برنامه نویس TensorFlow Lite درباره پیاده سازی یادگیری ماشین در برنامه تلفن همراه خود بیشتر بیاموزید.