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

این صفحه به شما نشان می دهد که چگونه با TensorFlow Lite یک برنامه اندروید بسازید تا فید دوربین زنده را تجزیه و تحلیل کنید و اشیا را شناسایی کنید. این مورد استفاده از یادگیری ماشینی، تشخیص شی نامیده می شود. برنامه نمونه از کتابخانه وظیفه TensorFlow Lite برای بینایی از طریق سرویس های Google Play استفاده می کند تا اجرای مدل یادگیری ماشینی تشخیص اشیا را فعال کند، که رویکرد توصیه شده برای ساخت یک برنامه ML با TensorFlow Lite است.

دمو متحرک تشخیص شی

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

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

  • اندروید استودیو 4.2 یا بالاتر
  • Android SDK نسخه 21 یا بالاتر

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

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

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

  1. کلون کردن مخزن git
    git clone https://github.com/tensorflow/examples.git
    
  2. نمونه git خود را برای استفاده از تسویه حساب پراکنده پیکربندی کنید، بنابراین فقط فایل‌های برنامه نمونه تشخیص شی را داشته باشید:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/object_detection/android_play_services
    

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

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

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

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

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

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

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

برنامه نمونه چگونه کار می کند

برنامه مثال از مدل تشخیص اشیاء از پیش آموزش دیده مانند mobilenetv1.tflite در قالب TensorFlow Lite برای جستجوی اشیاء در جریان ویدیوی زنده از دوربین دستگاه Android استفاده می کند. کد این ویژگی در درجه اول در این فایل ها است:

  • ObjectDetectorHelper.kt - محیط زمان اجرا را راه‌اندازی می‌کند، شتاب سخت‌افزاری را فعال می‌کند و مدل تشخیص شی ML را اجرا می‌کند.
  • CameraFragment.kt - جریان داده های تصویر دوربین را می سازد، داده ها را برای مدل آماده می کند و نتایج تشخیص شی را نمایش می دهد.

بخش‌های بعدی اجزای کلیدی این فایل‌های کد را به شما نشان می‌دهند، بنابراین می‌توانید یک برنامه اندروید را برای افزودن این قابلیت تغییر دهید.

برنامه را بسازید

بخش‌های زیر مراحل کلیدی ساخت برنامه اندرویدی خود و اجرای مدل نشان داده شده در برنامه مثال را توضیح می‌دهند. این دستورالعمل‌ها از برنامه مثالی که قبلاً نشان داده شد به عنوان یک نقطه مرجع استفاده می‌کنند.

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

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

برنامه نمونه از کتابخانه TensorFlow Lite Task برای دید از سرویس‌های Google Play استفاده می‌کند تا اجرای مدل یادگیری ماشینی تشخیص اشیا را فعال کند. دستورالعمل‌های زیر نحوه افزودن وابستگی‌های کتابخانه مورد نیاز را به پروژه برنامه Android خود توضیح می‌دهند.

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

  1. در ماژول برنامه Android که از TensorFlow Lite استفاده می‌کند، فایل build.gradle ماژول را به‌روزرسانی کنید تا وابستگی‌های زیر را شامل شود. در کد نمونه، این فایل در اینجا قرار دارد: ...examples/lite/examples/object_detection/android_play_services/app/build.gradle

    ...
    dependencies {
    ...
        // Tensorflow Lite dependencies
        implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
        implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    ...
    }
    
  2. در Android Studio، وابستگی‌های پروژه را با انتخاب: File > Sync Project with Gradle Files همگام‌سازی کنید.

سرویس های Google Play را راه اندازی کنید

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

برای راه‌اندازی TensorFlow Lite با سرویس‌های Google Play:

  1. یک شی TfLiteInitializationOptions ایجاد کنید و آن را تغییر دهید تا پشتیبانی GPU فعال شود:

    val options = TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build()
    
  2. از روش TfLiteVision.initialize() برای فعال کردن استفاده از زمان اجرا سرویس Play استفاده کنید و شنونده را تنظیم کنید تا تأیید کند که بارگیری با موفقیت انجام شده است:

    TfLiteVision.initialize(context, options).addOnSuccessListener {
        objectDetectorListener.onInitialized()
    }.addOnFailureListener {
        // Called if the GPU Delegate is not supported on the device
        TfLiteVision.initialize(context).addOnSuccessListener {
            objectDetectorListener.onInitialized()
        }.addOnFailureListener{
            objectDetectorListener.onError("TfLiteVision failed to initialize: "
                    + it.message)
        }
    }
    

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

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

.../src/main/assets/mobilenetv1.tflite`

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

  1. یک فایل مدل .tflite را به دایرکتوری src/main/assets پروژه توسعه خود اضافه کنید، مانند ssd_mobilenet_v1 .
  2. متغیر modelName را برای تعیین نام فایل مدل ML خود تنظیم کنید:

    val modelName = "mobilenetv1.tflite"
    
  3. گزینه هایی را برای مدل تنظیم کنید، مانند آستانه پیش بینی و اندازه مجموعه نتایج:

    val optionsBuilder =
        ObjectDetector.ObjectDetectorOptions.builder()
            .setScoreThreshold(threshold)
            .setMaxResults(maxResults)
    
  4. شتاب GPU را با گزینه‌ها فعال کنید و اگر شتاب در دستگاه پشتیبانی نمی‌شود، اجازه دهید کد به‌خوبی از کار بیفتد:

    try {
        optionsBuilder.useGpu()
    } catch(e: Exception) {
        objectDetectorListener.onError("GPU is not supported on this device")
    }
    
    
  5. از تنظیمات این آبجکت برای ساختن یک شیء TensorFlow Lite ObjectDetector استفاده کنید که حاوی مدل است:

    objectDetector =
        ObjectDetector.createFromFileAndOptions(
            context, modelName, optionsBuilder.build())
    

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

داده ها را برای مدل آماده کنید

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

برای آماده سازی داده ها برای پردازش توسط مدل:

  1. یک شی ImageAnalysis بسازید تا تصاویر را با فرمت مورد نیاز استخراج کنید:

    imageAnalyzer =
        ImageAnalysis.Builder()
            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888)
            .build()
            ...
    
  2. تحلیلگر را به زیرسیستم دوربین وصل کنید و یک بافر بیت مپ ایجاد کنید تا حاوی داده های دریافتی از دوربین باشد:

            .also {
            it.setAnalyzer(cameraExecutor) { image ->
                if (!::bitmapBuffer.isInitialized) {
                    bitmapBuffer = Bitmap.createBitmap(
                        image.width,
                        image.height,
                        Bitmap.Config.ARGB_8888
                    )
                }
                detectObjects(image)
            }
        }
    
  3. داده های تصویر خاص مورد نیاز مدل را استخراج کنید و اطلاعات چرخش تصویر را ارسال کنید:

    private fun detectObjects(image: ImageProxy) {
        // Copy out RGB bits to the shared bitmap buffer
        image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer) }
        val imageRotation = image.imageInfo.rotationDegrees
        objectDetectorHelper.detect(bitmapBuffer, imageRotation)
    }    
    
  4. همانطور که در روش ObjectDetectorHelper.detect() در برنامه مثال نشان داده شده است، هرگونه تبدیل داده نهایی را تکمیل کنید و داده های تصویر را به یک شی TensorImage اضافه کنید:

    val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
    
    // Preprocess the image and convert it into a TensorImage for detection.
    val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
    

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

هنگامی که یک شی TensorImage با داده های تصویر در قالب درست ایجاد کردید، می توانید مدل را در برابر آن داده ها اجرا کنید تا یک پیش بینی یا استنتاج ایجاد کنید. در برنامه مثال، این کد در متد ObjectDetectorHelper.detect() موجود است.

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

  • پیش بینی را با ارسال داده های تصویر به تابع پیش بینی خود اجرا کنید:

    val results = objectDetector?.detect(tensorImage)
    

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

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

برای رسیدگی به نتایج پیش‌بینی مدل:

  1. از یک الگوی شنونده برای ارسال نتایج به کد برنامه یا اشیاء رابط کاربری خود استفاده کنید. برنامه نمونه از این الگو برای ارسال نتایج تشخیص از شی ObjectDetectorHelper به شی CameraFragment استفاده می کند:

    objectDetectorListener.onResults( // instance of CameraFragment
        results,
        inferenceTime,
        tensorImage.height,
        tensorImage.width)
    
  2. بر روی نتایج عمل کنید، مانند نمایش پیش بینی به کاربر. برنامه مثال روی شی CameraPreview یک پوشش می‌کشد تا نتیجه را نشان دهد:

    override fun onResults(
      results: MutableList<Detection>?,
      inferenceTime: Long,
      imageHeight: Int,
      imageWidth: Int
    ) {
        activity?.runOnUiThread {
            fragmentCameraBinding.bottomSheetLayout.inferenceTimeVal.text =
                String.format("%d ms", inferenceTime)
    
            // Pass necessary information to OverlayView for drawing on the canvas
            fragmentCameraBinding.overlay.setResults(
                results ?: LinkedList<Detection>(),
                imageHeight,
                imageWidth
            )
    
            // Force a redraw
            fragmentCameraBinding.overlay.invalidate()
        }
    }
    

مراحل بعدی