ساخت و استقرار یک مدل تشخیص شی سفارشی با TensorFlow Lite (اندروید)

1. قبل از شروع

در این کد لبه، یاد می‌گیرید که چگونه یک مدل تشخیص شی سفارشی را با استفاده از مجموعه‌ای از تصاویر آموزشی با TFLite Model Maker آموزش دهید، سپس مدل خود را با استفاده از TFLite Task Library در یک برنامه Android مستقر کنید. شما:

  • یک برنامه اندروید بسازید که مواد تشکیل دهنده در تصاویر وعده های غذایی را تشخیص دهد.
  • یک مدل تشخیص شی از پیش آموزش‌دیده TFLite را ادغام کنید و محدودیت‌هایی را ببینید که مدل می‌تواند تشخیص دهد.
  • آموزش یک مدل تشخیص شی سفارشی برای تشخیص مواد/اجزای یک وعده غذایی با استفاده از مجموعه داده سفارشی به نام سالاد و مدل ساز TFLite.
  • با استفاده از TFLite Task Library، مدل سفارشی را در برنامه اندروید اجرا کنید.

در پایان، چیزی شبیه به تصویر زیر ایجاد خواهید کرد:

b9705235366ae162.png

پیش نیازها

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

  • توسعه اندروید با استفاده از Kotlin و Android Studio
  • سینتکس پایه پایتون

چیزی که یاد خواهید گرفت

  • نحوه آموزش یک مدل تشخیص شی سفارشی با استفاده از TFLite Model Maker.
  • نحوه استقرار یک مدل تشخیص شی TFLite با استفاده از TFLite Task Library.

آنچه شما نیاز دارید

  • نسخه اخیر اندروید استودیو (نسخه 4.2+)
  • شبیه ساز Android Studio یا یک دستگاه فیزیکی اندروید
  • کد نمونه
  • دانش اولیه توسعه اندروید در Kotlin

2. تشخیص شی

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

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

TensorFlow Lite

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

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

  • Model Maker یک کتابخانه Python است که آموزش مدل‌های TensorFlow Lite را با استفاده از داده‌های خود تنها با چند خط کد آسان می‌کند، بدون نیاز به تخصص یادگیری ماشین.
  • Task Library یک کتابخانه بین پلتفرمی است که استقرار مدل های TensorFlow Lite را تنها با چند خط کد در برنامه های تلفن همراه شما آسان می کند.

این آزمایشگاه کد روی TFLite تمرکز دارد. مفاهیم و بلوک های کدی که مربوط به TFLite و تشخیص اشیا نیستند توضیح داده نشده اند و برای شما ارائه شده است تا به سادگی کپی و پیست کنید.

3. راه اندازی شوید

کد را دانلود کنید

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

فایل فشرده دانلود شده را باز کنید. با این کار یک پوشه ریشه ( odml-pathways-main ) با تمام منابعی که نیاز دارید باز می شود. برای این کد لبه، شما فقط به منابع موجود در زیر شاخه object-detection/codelab2/android نیاز دارید.

زیرشاخه android در مخزن object-detection/codelab2/android شامل دو فهرست است:

  • android_studio_folder.png starter — کد شروعی که برای این Codelab بر اساس آن می سازید.
  • android_studio_folder.png نهایی - کد تکمیل شده برای برنامه نمونه تمام شده.

برنامه شروع را وارد کنید

بیایید با وارد کردن برنامه شروع به Android Studio شروع کنیم.

  1. Android Studio را باز کرده و Import Project (Gradle، Eclipse ADT، و غیره) را انتخاب کنید.
  2. پوشه starter را از کد منبعی که قبلا دانلود کرده اید باز کنید.

7c0f27882a2698ac.png

برای اطمینان از اینکه همه وابستگی‌ها برای برنامه شما در دسترس هستند، باید پروژه خود را با فایل‌های gradle همگام‌سازی کنید، پس از اتمام فرآیند واردات.

  1. انتخاب پروژه همگام سازی با فایل های Gradle ( b451ab2d04d835f9.png ) از نوار ابزار Android Studio. starter/app/build.gradle را وارد کنید

برنامه استارتر را اجرا کنید

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

دستگاه Android خود را از طریق USB به رایانه خود وصل کنید یا شبیه ساز Android Studio را راه اندازی کنید و روی Run کلیک کنید ( execute.png ) در نوار ابزار Android Studio.

4. برنامه شروع را درک کنید

به منظور ساده نگه داشتن این کد لبه و تمرکز بر روی بیت های یادگیری ماشین، برنامه شروع کننده حاوی کدهای دیگ بخار است که چند کار را برای شما انجام می دهد:

  • می تواند با استفاده از دوربین دستگاه عکس بگیرد.
  • این شامل تعدادی تصویر استوک است تا بتوانید تشخیص شی را در شبیه ساز اندروید امتحان کنید.
  • این یک روش راحت برای رسم نتیجه تشخیص شی در بیت مپ ورودی دارد.

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

  • fun runObjectDetection(bitmap: Bitmap) این روش زمانی فراخوانی می شود که یک تصویر از پیش تعیین شده را انتخاب می کنید یا عکس می گیرید. bitmap تصویر ورودی برای تشخیص شی است. بعداً در این Codelab، کد تشخیص شی را به این متد اضافه خواهید کرد.
  • data class DetectionResult(val boundingBoxes: Rect, val text: String) این یک کلاس داده است که یک نتیجه تشخیص شی را برای تجسم نشان می دهد. boundingBoxes مستطیلی است که شی در آن قرار دارد و text رشته نتیجه تشخیص است که همراه با کادر محدود کننده شی نمایش داده می شود.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<DetectionResult>): Bitmap این روش نتایج تشخیص شی را در detectionResults روی bitmap ورودی رسم می کند و کپی اصلاح شده آن را برمی گرداند.

در اینجا نمونه ای از خروجی روش کاربردی drawDetectionResult شده است.

f6b1e6dad726e129.png

5. تشخیص شیء روی دستگاه را اضافه کنید

اکنون با ادغام یک مدل TFLite از پیش آموزش‌دیده که می‌تواند اشیاء رایج را در برنامه استارت شناسایی کند، یک نمونه اولیه بسازید.

دانلود یک مدل از پیش آموزش دیده تشخیص اشیاء TFLite

چندین مدل آشکارساز شی در TensorFlow Hub وجود دارد که می توانید از آنها استفاده کنید. برای این آزمایشگاه کد، مدل تشخیص اشیاء EfficientDet-Lite را دانلود خواهید کرد که بر روی مجموعه داده COCO 2017 آموزش دیده است، برای TFLite بهینه شده و برای عملکرد در CPU، GPU و EdgeTPU موبایل طراحی شده است.

در مرحله بعد، از TFLite Task Library برای ادغام مدل TFLite از پیش آموزش دیده در برنامه شروع خود استفاده کنید. TFLite Task Library ادغام مدل‌های یادگیری ماشینی بهینه‌سازی شده برای موبایل را در یک برنامه تلفن همراه آسان می‌کند. از بسیاری از موارد استفاده از یادگیری ماشینی محبوب، از جمله تشخیص اشیا، طبقه‌بندی تصویر و طبقه‌بندی متن پشتیبانی می‌کند. شما می توانید مدل TFLite را بارگذاری کنید و آن را تنها با چند خط کد اجرا کنید.

مدل را به برنامه شروع اضافه کنید

  1. مدلی را که به تازگی دانلود کرده اید در پوشه assets برنامه استارتر کپی کنید. می توانید پوشه را در پنل پیمایش پروژه در Android Studio پیدا کنید.

c2609599b7d22641.png

  1. نام فایل را model.tflite .

c83e9397177c4561.png

وابستگی های Task Library فایل Gradle را به روز کنید

به فایل app/build.gradle و این خط را به پیکربندی dependencies ها اضافه کنید:

implementation 'org.tensorflow:tensorflow-lite-task-vision:0.3.1'

پروژه خود را با فایل های gradle همگام سازی کنید

برای اطمینان از اینکه همه وابستگی ها برای برنامه شما در دسترس هستند، باید پروژه خود را با فایل های gradle در این مرحله همگام کنید. انتخاب پروژه همگام سازی با فایل های Gradle ( b451ab2d04d835f9.png ) از نوار ابزار Android Studio.

(اگر این دکمه غیرفعال است، مطمئن شوید که فقط starter/app/build.gradle را وارد کرده اید، نه کل مخزن.)

تشخیص شیء در دستگاه را روی یک تصویر تنظیم و اجرا کنید

تنها 3 مرحله ساده با 3 API برای بارگیری و اجرای یک مدل تشخیص شی وجود دارد:

  • تهیه یک تصویر / یک جریان: TensorImage
  • ایجاد یک شی آشکارساز: ObjectDetector
  • 2 شیء بالا را به هم وصل کنید: detect(image)

اینها را در تابع runObjectDetection(bitmap: Bitmap) در فایل MainActivity.kt به دست می آورید.

/**
* TFLite Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
    //TODO: Add object detection code here
}

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

  • org.tensorflow.lite.support.image.TensorImage
  • org.tensorflow.lite.task.vision.detector.ObjectDetector

ایجاد شی تصویر

تصاویری که برای این لبه کد استفاده می‌کنید، از دوربین روی دستگاه یا تصاویر از پیش تعیین‌شده‌ای که در رابط کاربری برنامه انتخاب می‌کنید، می‌آیند. تصویر ورودی به فرمت Bitmap رمزگشایی شده و به روش runObjectDetection می شود.

TFLite یک API ساده برای ایجاد یک TensorImage از Bitmap فراهم می کند. کد زیر را به بالای runObjectDetection(bitmap:Bitmap) اضافه کنید:

// Step 1: create TFLite's TensorImage object
val image = TensorImage.fromBitmap(bitmap)

یک نمونه آشکارساز ایجاد کنید

TFLite Task Library از الگوی طراحی سازنده پیروی می کند. پیکربندی را به سازنده منتقل می‌کنید، سپس یک آشکارساز از آن دریافت می‌کنید. چندین گزینه برای پیکربندی وجود دارد، از جمله مواردی برای تنظیم حساسیت آشکارساز شی:

  • حداکثر نتیجه (حداکثر تعداد اشیایی که مدل باید شناسایی کند)
  • آستانه امتیاز (آشنایی‌گر شی چقدر باید برای برگرداندن یک شی شناسایی شده اطمینان داشته باشد)
  • برچسب مجاز لیست/رد لیست (اجازه/رد کردن اشیاء در یک لیست از پیش تعریف شده)

با تعیین نام فایل مدل TFLite و گزینه های پیکربندی، نمونه آشکارساز شی را راه اندازی کنید:

// Step 2: Initialize the detector object
val options = ObjectDetector.ObjectDetectorOptions.builder()
    .setMaxResults(5)
    .setScoreThreshold(0.5f)
    .build()
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "model.tflite", // must be same as the filename in assets folder
    options
)

تصویر(ها) را به آشکارساز تغذیه کنید

کد زیر را به fun runObjectDetection(bitmap:Bitmap) اضافه کنید. این تصاویر شما را به آشکارساز می‌رساند.

// Step 3: feed given image to the model and print the detection result
val results = detector.detect(image)

پس از تکمیل، آشکارساز فهرستی از Detection را برمی‌گرداند که هر کدام حاوی اطلاعاتی درباره شی‌ای است که مدل در تصویر پیدا کرده است. هر شی با موارد زیر توصیف می شود:

  • boundingBox : مستطیلی که حضور یک شی و مکان آن را در تصویر اعلام می کند
  • categories : چه نوع شی است و مدل چقدر به نتیجه تشخیص اطمینان دارد. مدل چندین دسته را برمی گرداند و مطمئن ترین دسته اول است.
  • label : نام دسته شی.
  • classificationConfidence : شناوری بین 0.0 تا 1.0، با 1.0 نشان دهنده 100٪

کد زیر را به fun runObjectDetection(bitmap:Bitmap) اضافه کنید. این روشی را برای چاپ نتایج تشخیص شی در Logcat فراخوانی می کند.

// Step 4: Parse the detection result and show it
debugPrint(results)

سپس این debugPrint() را به کلاس MainActivity اضافه کنید:

private fun debugPrint(results : List<Detection>) {
    for ((i, obj) in results.withIndex()) {
        val box = obj.boundingBox

        Log.d(TAG, "Detected object: ${i} ")
        Log.d(TAG, "  boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")

        for ((j, category) in obj.categories.withIndex()) {
            Log.d(TAG, "    Label $j: ${category.label}")
            val confidence: Int = category.score.times(100).toInt()
            Log.d(TAG, "    Confidence: ${confidence}%")
        }
    }
} 

اکنون آشکارساز شی شما آماده است! کامپایل و اجرای برنامه با کلیک بر روی Run ( execute.png ) در نوار ابزار Android Studio. هنگامی که برنامه در دستگاه نشان داده شد، روی هر یک از تصاویر از پیش تعیین شده ضربه بزنید تا آشکارساز شی شروع شود. سپس به پنجره Logcat نگاه کنید*(* 16bd6ea224cf8cf1.png *)* در داخل IDE خود، و شما باید چیزی شبیه به این ببینید:

D/TFLite-ODT: Detected object: 0 
D/TFLite-ODT:   boundingBox: (0.0, 15.0) - (2223.0,1645.0)
D/TFLite-ODT:     Label 0: dining table
D/TFLite-ODT:     Confidence: 77%
D/TFLite-ODT: Detected object: 1 
D/TFLite-ODT:   boundingBox: (702.0, 3.0) - (1234.0,797.0)
D/TFLite-ODT:     Label 0: cup
D/TFLite-ODT:     Confidence: 69%

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

  • یک شی در داخل مستطیل (0، 15) - (2223، 1645) است.
  • برچسب میز ناهار خوری است
  • مدل مطمئن است که 1 میز ناهار خوری است (77%)

از نظر فنی این تمام چیزی است که برای به کار انداختن TFLite Task Library نیاز دارید: در این لحظه همه چیز را به دست آورده اید! تبریک میگم

با این حال، در سمت UI، شما هنوز در نقطه شروع هستید. اکنون باید با پس پردازش نتایج شناسایی شده، از نتایج شناسایی شده در رابط کاربری استفاده کنید.

6. نتیجه تشخیص را روی تصویر ورودی رسم کنید

در مراحل قبلی، نتیجه تشخیص را در logcat چاپ کردید: ساده و سریع. در این مرحله، از روش ابزاری که قبلاً برای شما در برنامه استارتر پیاده سازی شده است، استفاده خواهید کرد تا:

  • یک کادر محدود روی یک تصویر بکشید
  • یک نام دسته و درصد اطمینان را در داخل کادر محدود رسم کنید
  1. debugPrint(results) را با قطعه کد زیر جایگزین کنید:
val resultToDisplay = results.map {
    // Get the top-1 category and craft the display text
    val category = it.categories.first()
    val text = "${category.label}, ${category.score.times(100).toInt()}%"

    // Create a data object to display the detection result
    DetectionResult(it.boundingBox, text)
}
// Draw the detection result on the bitmap and show it.
val imgWithResult = drawDetectionResult(bitmap, resultToDisplay)
runOnUiThread {
    inputImageView.setImageBitmap(imgWithResult)
}
  1. حالا روی Run کلیک کنید ( execute.png ) در نوار ابزار Android Studio.
  2. پس از بارگیری برنامه، روی یکی از تصاویر از پیش تعیین شده ضربه بزنید تا نتیجه تشخیص را ببینید.

آیا می خواهید با عکس خود امتحان کنید؟ روی دکمه گرفتن عکس ضربه بزنید و از اشیاء اطراف خود عکس بگیرید.

8b024362b15096a6.png

7. یک مدل تشخیص شی سفارشی را آموزش دهید

در مرحله قبل، یک مدل تشخیص اشیاء TFLite از قبل آموزش دیده را در برنامه اندروید ادغام کردید و خودتان دیدید که می تواند اشیاء معمولی مانند کاسه یا میز غذاخوری را در تصاویر نمونه تشخیص دهد. با این حال، هدف شما تشخیص مواد تشکیل دهنده ظروف در تصویر است، بنابراین تشخیص کلی شی مناسب مورد استفاده شما نیست. شما می خواهید یک مدل تشخیص شی سفارشی را با استفاده از مجموعه داده های آموزشی با اجزایی که می خواهیم شناسایی کنیم، آموزش دهید.

در اینجا مجموعه داده ای حاوی تصاویر و برچسب هایی است که می توانید از آنها برای تمرین مدل سفارشی خود استفاده کنید. با استفاده از تصاویر Open Images Dataset V4 ایجاد شد.

مشارکتی

بعد، بیایید برای آموزش مدل سفارشی به Google Colab برویم.

آموزش مدل سفارشی حدود 30 دقیقه طول می کشد.

اگر عجله دارید می توانید مدلی را که از قبل برای شما آموزش داده ایم در مجموعه داده های ارائه شده دانلود کنید و به مرحله بعد بروید.

8. مدل سفارشی TFLite را با برنامه اندروید ادغام کنید

اکنون که یک مدل تشخیص سالاد را آموزش داده اید، آن را ادغام کنید و برنامه خود را از یک آشکارساز شی معمولی به یک آشکارساز سالاد تبدیل کنید.

  1. مدل سالاد TFLite را در پوشه assets کپی کنید. اسم مدل جدید salad.tflite .

91e8d37c4f78eddb.png

  1. فایل MainActivity.kt را باز کنید و کد اولیه ObjectDetector را پیدا کنید.
  2. مدل EfficientDet-Lite ( model.tflite ) را با مدل سالاد ( salad.tflite ) جایگزین کنید
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "salad.tflite", // must be same as the filename in assets folder
    options
)
  1. روی Run کلیک کنید ( execute.png ) در نوار ابزار اندروید استودیو برای اجرای مجدد برنامه با مدل جدید. Voilà! این برنامه اکنون می تواند پنیر، سالاد، محصولات پخته شده را تشخیص دهد.

b9705235366ae162.png

9. تبریک می گویم!

شما از TFLite برای آموزش یک مدل سفارشی و افزودن قابلیت‌های Object Detection به برنامه خود استفاده کرده‌اید. این تمام چیزی است که برای راه اندازی آن نیاز دارید!

آنچه را پوشش داده ایم

  • نحوه پیدا کردن مدل های از پیش آموزش دیده تشخیص اشیاء TFLite در TensorFlow Hub
  • چگونه با استفاده از TFLite Task Library، مدل‌های تشخیص اعتراض را در برنامه اندروید خود ادغام کنیم
  • نحوه آموزش مدل تشخیص شی سفارشی با TFLite Model Maker

مراحل بعدی

  • از Firebase برای بهبود استقرار مدل TFLite خود استفاده کنید
  • داده های آموزشی را برای آموزش مدل خود جمع آوری کنید
  • تشخیص شی را در برنامه اندروید خود اعمال کنید

بیشتر بدانید