شناسایی اشیاء در تصاویر برای ایجاد یک جستجوی محصول بصری با ML Kit: Android

1. قبل از شروع

727608486a28395d.png

آیا دموی Google Lens را دیده‌اید، که در آن می‌توانید دوربین تلفن خود را به سمت یک شی بگیرید و پیدا کنید که کجا می‌توانید آن را آنلاین بخرید؟ اگر می خواهید یاد بگیرید که چگونه می توانید همان ویژگی را به برنامه خود اضافه کنید، این کد لبه برای شما مناسب است. این بخشی از یک مسیر یادگیری است که به شما می آموزد چگونه یک ویژگی جستجوی تصویر محصول را در یک برنامه تلفن همراه بسازید.

در این نرم افزار کد، اولین گام برای ایجاد ویژگی جستجوی تصویر محصول را خواهید آموخت: چگونه اشیاء را در تصاویر شناسایی کنید و به کاربر اجازه دهید اشیایی را که می خواهد جستجو کند را انتخاب کند. برای ساخت این ویژگی از ML Kit Object Detection و Tracking استفاده خواهید کرد.

می‌توانید در مسیر یادگیری درباره مراحل باقی‌مانده، از جمله نحوه ساخت پشتیبان جستجوی محصول با جستجوی محصول Vision API آشنا شوید.

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

  • در این کد لبه، شما قصد دارید یک برنامه اندروید با 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. راه اندازی شوید

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

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

فایل فشرده دانلود شده را باز کنید. با این کار یک پوشه ریشه ( odml-pathways-main ) با تمام منابعی که نیاز دارید باز می شود. برای این کد لبه، شما فقط به منابع موجود در فهرست فرعی product-search/codelab1/android نیاز دارید.

زیر شاخه تشخیص اشیا در مخزن 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، و غیره) را انتخاب کنید و پوشه شروع را از کد منبعی که قبلا دانلود کرده اید انتخاب کنید.

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 را اضافه کرده اید، برای اولین بار آماده اجرای برنامه هستید.

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

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

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

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

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

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

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

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

1290481786af21b9.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 گزینه برای پیکربندی وجود دارد (یکی که پررنگ است در Codelab استفاده می شود):

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

این کد برای یک تصویر است - تشخیص و طبقه بندی چند شیء، بیایید این کار را انجام دهیم:

// 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())
   }

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

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

احتمالاً متوجه شده اید که کد نتایج شناسایی شده را در Logcat با 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: Fashion good
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))
  • آشکارساز کاملاً مطمئن است که اولی یک کالای مد است (90٪) ( این یک لباس است )

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

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

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

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

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

  • کادر مرزی را روی تصویر بکشید
  • نام دسته و اعتماد به نفس را در کادر محدود بکشید

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

مقداری کد دیگ بخار در داخل Codelab وجود دارد که به شما کمک می کند تا نتیجه تشخیص را تجسم کنید. از این ابزارها برای ساده کردن کد تجسم ما استفاده کنید:

  • class ImageClickableView این یک کلاس نمای تصویر است که برخی از ابزارهای مناسب را برای تجسم و تعامل با نتیجه تشخیص فراهم می کند.
  • fun drawDetectionResults(results: List<DetectedObject>) این روش دایره های سفیدی را در مرکز هر شی شناسایی شده ترسیم می کند.
  • fun setOnObjectClickListener(listener: ((objectImage: Bitmap) -> Unit)) این یک تماس برای دریافت تصویر برش خورده است که فقط شامل شیئی است که کاربر روی آن ضربه زده است. شما این تصویر برش‌خورده را به پشتیبان جستجوی تصویر در آزمایشگاه کد بعدی ارسال می‌کنید تا از نظر بصری نتیجه‌ای مشابه داشته باشید. در این کد لبه، شما هنوز از این روش استفاده نخواهید کرد.

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

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

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

runOnUiThread {
    viewBinding.ivPreview.drawDetectionResults(it)
}

اجراش کن

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

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

5027148750dc0748.png

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

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

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

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

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

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

مراحل بعدی

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

بیشتر بدانید