تشخیص اشیاء در تصاویر با ML Kit: Android

۱. قبل از شروع

کیت ML یک SDK موبایل است که تخصص یادگیری ماشینی گوگل روی دستگاه را به برنامه‌های اندروید و iOS می‌آورد. شما می‌توانید از APIهای قدرتمند اما ساده‌ی Vision و Natural Language برای حل چالش‌های رایج در برنامه‌های خود یا ایجاد تجربیات کاربری کاملاً جدید استفاده کنید. همه این موارد توسط بهترین مدل‌های ML گوگل پشتیبانی می‌شوند و بدون هیچ هزینه‌ای در اختیار شما قرار می‌گیرند.

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

این آزمایشگاه کد، شما را در مراحل ساده‌ای برای افزودن تشخیص و ردیابی شیء (ODT) برای یک تصویر مشخص به برنامه اندروید موجودتان راهنمایی می‌کند. لطفاً توجه داشته باشید که این آزمایشگاه کد، میانبرهایی را برای برجسته کردن کاربرد ODT کیت ML ارائه می‌دهد.

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

در این آزمایشگاه کد، شما قصد دارید یک برنامه اندروید با ML Kit بسازید. برنامه شما از API تشخیص و ردیابی اشیاء ML Kit برای تشخیص اشیاء در یک تصویر مشخص استفاده خواهد کرد. در نهایت، باید چیزی شبیه به تصویر سمت راست ببینید.

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

  • چگونه ML Kit SDK را در برنامه اندروید خود ادغام کنیم؟
  • API تشخیص و ردیابی شیء ML Kit

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

  • نسخه جدید اندروید استودیو (نسخه ۴.۱.۲ به بالا)
  • شبیه‌ساز اندروید استودیو یا یک دستگاه اندروید فیزیکی
  • کد نمونه
  • آشنایی اولیه با توسعه اندروید با زبان کاتلین

این آزمایشگاه کد بر روی کیت یادگیری ماشین (ML Kit) تمرکز دارد. مفاهیم و بلوک‌های کد نامربوط، حذف شده‌اند و برای کپی و پیست ساده در اختیار شما قرار گرفته‌اند.

۲. آماده شوید

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

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

فایل زیپ دانلود شده را از حالت فشرده خارج کنید. این کار یک پوشه ریشه ( mlkit-android-main ) را با تمام منابع مورد نیاز شما از حالت فشرده خارج می‌کند. برای این codelab، فقط به منابع موجود در زیرشاخه object-detection نیاز خواهید داشت.

زیرشاخه‌ی تشخیص شیء در مخزن mlkit-android شامل دو دایرکتوری است:

  • پوشه android_studio.png کد آغازین - کدی که برای این آزمایشگاه کد بر اساس آن کد می‌نویسید.
  • پوشه android_studio.png نهایی - کد تکمیل‌شده برای برنامه نمونه نهایی.

۳. API تشخیص و ردیابی شیء ML Kit را به پروژه اضافه کنید

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

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

اندروید استودیو را باز کنید، گزینه‌ی Import Project (Gradle، Eclipse ADT و غیره) را انتخاب کنید و پوشه‌ی starter را از کد منبعی که قبلاً دانلود کرده‌اید، انتخاب کنید.

7c0f27882a2698ac.png

وابستگی‌های مربوط به تشخیص و ردیابی شیء ML Kit را اضافه کنید

وابستگی‌های ML Kit به شما امکان می‌دهند ML Kit ODT SDK را در برنامه خود ادغام کنید. خطوط زیر را به انتهای فایل app/build.gradle پروژه خود اضافه کنید:

ساخت.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

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

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

پروژه همگام‌سازی با فایل‌های Gradle را انتخاب کنید ( b451ab2d04d835f9.png ) از نوار ابزار اندروید استودیو.

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

۴. برنامه‌ی آغازین را اجرا کنید

اکنون که پروژه را به اندروید استودیو وارد کرده‌اید و وابستگی‌های مربوط به ML Kit Object Detection and Tracking را اضافه کرده‌اید، آماده‌اید تا برنامه را برای اولین بار اجرا کنید.

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

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

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

اول، یک دکمه ( c6d965d639c3646.png ) در پایین به:

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

دکمه‌ی «عکس گرفتن» را امتحان کنید، دستورالعمل‌ها را برای گرفتن عکس دنبال کنید، عکس را بپذیرید و مشاهده کنید که در برنامه‌ی اولیه نمایش داده می‌شود.

چند بار تکرار کنید تا ببینید چطور کار می‌کند:

9ec541980dbe2d31.png8312dde41425ba4b.pngfa8492bfc1914ff0.png

دوم، ۳ تصویر از پیش تعیین‌شده وجود دارد که می‌توانید از بین آنها انتخاب کنید. اگر کد را روی شبیه‌ساز اندروید اجرا می‌کنید، می‌توانید بعداً از این تصاویر برای آزمایش کد تشخیص شیء استفاده کنید.

یک تصویر از بین ۳ تصویر از پیش تعیین‌شده انتخاب کنید. ببینید که تصویر در نمای بزرگتر نمایش داده می‌شود:

1dd41b3ec978f1d9.png

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

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

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

در این مرحله، کدی را به متد runObjectDetection اضافه خواهید کرد تا تشخیص شیء را انجام دهد!

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

فقط ۳ مرحله ساده با ۳ API برای راه‌اندازی ML Kit ODT وجود دارد:

  • آماده‌سازی یک تصویر: InputImage
  • یک شیء آشکارساز ایجاد کنید: ObjectDetection.getClient(options)
  • دو شیء بالا را به هم وصل کنید: process(image)

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

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

در حال حاضر تابع خالی است. برای پیاده‌سازی ML Kit ODT به مراحل زیر بروید! در طول مسیر، اندروید استودیو از شما می‌خواهد که ایمپورت‌های لازم را اضافه کنید:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

مرحله ۱: ایجاد یک تصویر ورودی

ML Kit یک API ساده برای ایجاد یک InputImage از یک Bitmap ارائه می‌دهد. سپس می‌توانید یک InputImage به APIهای ML Kit وارد کنید.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

کد بالا را به بالای runObjectDetection(bitmap:Bitmap) اضافه کنید.

مرحله ۲: ایجاد یک نمونه آشکارساز

کیت ML از الگوی طراحی Builder پیروی می‌کند. شما پیکربندی را به سازنده منتقل می‌کنید، سپس یک آشکارساز از آن دریافت می‌کنید. 3 گزینه برای پیکربندی وجود دارد (گزینه‌های پررنگ در این codelab استفاده شده‌اند):

  • حالت آشکارساز ( تصویر واحد یا جریان )
  • حالت تشخیص ( تشخیص یک یا چند شیء)
  • حالت طبقه‌بندی ( روشن یا خاموش )

این کدلب برای تشخیص و طبقه‌بندی تک تصویر - چند شیء است. حالا این را هم اضافه کنید:

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

مرحله ۳: تصویر (یا تصاویر) را به آشکارساز بدهید

تشخیص و طبقه‌بندی اشیاء، پردازش ناهمزمان است:

  • شما یک تصویر را به آشکارساز (از طریق process() ) ارسال می‌کنید.
  • آشکارساز روی آن خیلی سخت کار می‌کند.
  • آشکارساز نتیجه را از طریق یک فراخوانی مجدد به شما گزارش می‌دهد.

کد زیر دقیقاً همین کار را انجام می‌دهد (آن را کپی کرده و به کد موجود درون fun runObjectDetection(bitmap:Bitmap)):

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

پس از اتمام، آشکارساز به شما اطلاع می‌دهد:

  • تعداد کل اشیاء شناسایی شده. هر شیء شناسایی شده با موارد زیر توصیف می‌شود:
  • trackingId : یک عدد صحیح که برای ردیابی آن در فریم‌های متقاطع استفاده می‌کنید (در این آزمایشگاه کد استفاده نمی‌شود).
  • boundingBox : کادر احاطه‌کننده‌ی شیء.
  • labels: فهرستی از برچسب‌ها برای شیء شناسایی‌شده (فقط زمانی که طبقه‌بندی فعال باشد):
  • index (فهرست این برچسب را دریافت کنید)
  • text (متن این برچسب شامل «کالاهای مد»، «غذا»، «کالاهای خانگی»، «مکان»، «گیاه» را دریافت کنید)
  • confidence (مقدار اعشاری بین ۰.۰ تا ۱.۰ که ۱.۰ به معنی ۱۰۰٪ است)

احتمالاً متوجه شده‌اید که کد با استفاده از debugPrint() پردازشی از نوع printf برای نتیجه‌ی شناسایی‌شده انجام می‌دهد.

آن را به کلاس MainActivity اضافه کنید:

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

حالا شما آماده‌اید تا تصاویر را برای تشخیص بپذیرید!

بیایید codelab را با کلیک روی Run ( اجرا کنیم. اجرا.png ) در نوار ابزار اندروید استودیو. سعی کنید یک تصویر از پیش تعیین‌شده را انتخاب کنید، یا یک عکس بگیرید، سپس به پنجره logcat نگاه کنید ( 16bd6ea224cf8cf1.png ) درون IDE.

شما باید چیزی شبیه به این را ببینید:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

... که یعنی فلزیاب ۳ شیء را دیده است:

  • این دسته‌ها عبارتند از غذا و لوازم خانگی .
  • هیچ دسته‌ای برای مورد دوم برگردانده نشده است زیرا یک کلاس ناشناخته است.
  • بدون trackingId (زیرا این حالت تشخیص تک تصویر است).
  • موقعیت درون مستطیل boundingBox (مثلاً (481، 2021) – (2426، 3376))
  • آشکارساز کاملاً مطمئن است که اولی یک غذا است (۹۰٪ اطمینان - سالاد بود ).

از نظر فنی، این تمام چیزی است که برای راه‌اندازی تشخیص شیء ML Kit نیاز دارید: شما در این لحظه همه چیز را یاد گرفته‌اید! تبریک می‌گویم!

در سمت رابط کاربری، شما هنوز در مرحله‌ای هستید که شروع کردید، اما می‌توانید از نتایج شناسایی‌شده در رابط کاربری مانند ترسیم کادر محدوده برای ایجاد یک تجربه بهتر استفاده کنید: بیایید به مرحله بعدی برویم - پس‌پردازش نتایج شناسایی‌شده!

۶. پس‌پردازش نتایج تشخیص

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

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

  • کادر محدوده را روی تصویر رسم کنید
  • نام دسته و ضریب اطمینان را درون کادر محصورکننده رسم کنید

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

تعدادی کد آماده در داخل codelab وجود دارد که به شما در تجسم نتیجه تشخیص کمک می‌کند. از این ابزارها برای ساده‌سازی کد تجسم خود استفاده کنید:

  • data class BoxWithText(val box: Rect, val text: String) این یک کلاس داده برای ذخیره نتیجه تشخیص شیء برای تجسم است. box کادر محدوده‌ای است که شیء در آن قرار دارد و text رشته نتیجه تشخیص است که به همراه کادر محدوده شیء نمایش داده می‌شود.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap این متد نتایج تشخیص شیء را در detectionResults روی bitmap ورودی رسم کرده و نسخه اصلاح‌شده آن را برمی‌گرداند.

در اینجا مثالی از خروجی متد کاربردی drawDetectionResult آورده شده است:

58c6f1d4ddb00dfa.png

نتیجه تشخیص کیت ML را تجسم کنید

از ابزارهای مصورسازی برای ترسیم نتیجه تشخیص شیء ML Kit روی تصویر ورودی استفاده کنید.

به جایی که debugPrint() را فراخوانی می‌کنید بروید و قطعه کد زیر را در زیر آن اضافه کنید:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • شما با تجزیه DetectedObject کیت ML و ایجاد لیستی از اشیاء BoxWithText برای نمایش نتیجه تجسم شروع می‌کنید.
  • سپس با استفاده از متد کاربردی drawDetectionResult ، نتیجه تشخیص را روی تصویر ورودی رسم کرده و آن را روی صفحه نمایش می‌دهید.

اجراش کن

حالا روی اجرا کلیک کنید ( اجرا.png ) در نوار ابزار اندروید استودیو.

پس از بارگذاری برنامه، دکمه با نماد دوربین را فشار دهید، دوربین خود را به سمت یک شیء بگیرید، عکس بگیرید، عکس را بپذیرید (در برنامه دوربین) یا می‌توانید به راحتی روی هر تصویر از پیش تعیین شده ضربه بزنید. باید نتایج تشخیص را ببینید؛ دوباره دکمه را فشار دهید یا تصویر دیگری را انتخاب کنید تا چند بار تکرار شود تا آخرین کیت ML ODT را تجربه کنید!

a03109cb30d5014d.png

۷. تبریک می‌گویم!

شما از کیت ML برای افزودن قابلیت‌های تشخیص شیء به برنامه خود استفاده کرده‌اید:

  • ۳ مرحله با ۳ رابط برنامه‌نویسی کاربردی (API)
  • ایجاد تصویر ورودی
  • ایجاد آشکارساز
  • ارسال تصویر به آشکارساز

این تمام چیزی است که برای راه‌اندازی و اجرای آن نیاز دارید!

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

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

  • نحوه اضافه کردن تشخیص و ردیابی شیء ML Kit به برنامه اندروید شما
  • نحوه استفاده از تشخیص و ردیابی اشیاء روی دستگاه در کیت ML برای تشخیص اشیاء در تصاویر

مراحل بعدی

  • با ML Kit ODT و تصاویر و ویدیوهای زنده بیشتر، کاوش‌های بیشتری انجام دهید تا دقت و عملکرد تشخیص و طبقه‌بندی را تجربه کنید.
  • برای یادگیری نحوه آموزش یک مدل سفارشی، مسیر یادگیری تشخیص شیء - یادگیری ماشین روی دستگاه را بررسی کنید.
  • ML Kit ODT را در برنامه اندروید خود اعمال کنید

اطلاعات بیشتر