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

1. قبل از شروع

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

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

این لبه کد شما را از طریق مراحل ساده برای افزودن تشخیص و ردیابی شی (ODT) برای یک تصویر معین به برنامه اندروید موجود خود راهنمایی می کند. لطفاً توجه داشته باشید که این کد لبه چند میانبر برای برجسته کردن استفاده از کیت ML ODT دارد.

چیزی که خواهی ساخت

در این کد لبه، شما قصد دارید یک برنامه اندروید با ML Kit بسازید. برنامه شما از ML Kit Object Detection and Tracking API برای شناسایی اشیاء در یک تصویر خاص استفاده می کند. در پایان، باید چیزی شبیه به تصویر سمت راست ببینید.

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

  • چگونه ML Kit SDK را در برنامه اندروید خود ادغام کنید
  • ML Kit Object Detection and Tracking API

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

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

این Codelab بر روی ML Kit متمرکز شده است. مفاهیم غیر مرتبط و بلوک‌های کد محو شده‌اند و برای شما ارائه می‌شوند تا به سادگی کپی و جای‌گذاری کنید.

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

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

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

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

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

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

3. ML Kit Object Detection and Tracking API را به پروژه اضافه کنید

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

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

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

7c0f27882a2698ac.png

وابستگی های ML Kit Object Detection و Tracking را اضافه کنید

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

build.gradle

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9ec541980dbe2d31.png8312dde41425ba4b.pngfa8492bfc1914ff0.png

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

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

1dd41b3ec978f1d9.png

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

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

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

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

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

تنها 3 مرحله ساده با 3 API برای راه اندازی ML Kit ODT وجود دارد:

  • یک تصویر آماده کنید: InputImage
  • ایجاد یک شی آشکارساز: ObjectDetection.getClient(options)
  • 2 شیء بالا را به هم وصل کنید: 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

مرحله 1: یک InputImage ایجاد کنید

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) اضافه کنید.

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

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

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

این آزمایشگاه کد برای تک تصویر - تشخیص و طبقه بندی چند شی است. اکنون آن را اضافه کنید:

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

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

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

  • شما یک تصویر را به آشکارساز ارسال می کنید (از طریق 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 (یک شناور بین 0.0 تا 1.0 با 1.0 به معنای 100٪ است.

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

آن را به کلاس 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}")
       }
   }
}

اکنون شما آماده پذیرش تصاویر برای شناسایی هستید!

بیایید با کلیک روی Run ( execute.png ) در نوار ابزار Android Studio. سعی کنید یک تصویر از پیش تعیین شده را انتخاب کنید، یا یک عکس بگیرید، سپس به پنجره 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

... به این معنی که آشکارساز 3 جسم را دید:

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

از نظر فنی این تنها چیزی است که برای کارکردن با ML Kit Object Detection نیاز دارید: شما در این لحظه همه چیز را دریافت کردید! تبریک می گویم!

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

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

در مراحل قبلی، نتیجه شناسایی شده را در 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 ، نتیجه تشخیص را در بالای تصویر ورودی رسم کرده و روی صفحه نمایش می‌دهید.

اجراش کن

حالا روی Run کلیک کنید ( execute.png ) در نوار ابزار Android Studio.

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

a03109cb30d5014d.png

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

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

  • 3 مرحله با 3 API
  • ایجاد تصویر ورودی
  • ایجاد آشکارساز
  • ارسال تصویر به Detector

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

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

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

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

مراحل بعدی

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

بیشتر بدانید