یک مدل سفارشی را در برنامه خود ادغام کنید

1. قبل از شروع

در اولین Codelab در این سری، شما یک برنامه بسیار ساده ایجاد کردید که از Image Labeling برای تجزیه محتوای یک تصویر استفاده می کرد. عکسی از گل مروارید را به آن پاس دادید و به شما نشان داد که چیزهایی مانند گلبرگ یا آسمان را دیده است. سپس، در Codelab دوم، برای آموزش یک مدل جدید و سفارشی که پنج نوع مختلف گل را می‌شناسد، به پایتون تغییر مکان دادید.

در این لبه کد، برنامه را از آزمایشگاه اول با مدل آزمایشگاه دوم به روز می کنید!

شما می توانید کد منبع کامل این آزمایشگاه کد را با شبیه سازی این مخزن دریافت کنید. فهرست های فرعی را برای اندروید و iOS خواهید دید. اگر می‌خواهید ادامه دهید، کد آزمایشگاه کد قبلی به‌عنوان ImageClassifierStep1 در دسترس است. کد تمام شده برای این کد لبه به عنوان ImageClassifierStep2 در دسترس است.

پیش نیازها

  • شما باید دو کد اول را در این مسیر یادگیری تکمیل کرده باشید

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

  • یک مدل سفارشی که در آزمایشگاه قبلی آموزش داده شده است را در یک برنامه اندروید یا iOS ادغام کنید

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

  • Android Studio، موجود در developer.android.com/studio برای بخش Android آزمایشگاه
  • Xcode، موجود در فروشگاه App Apple، برای بخش iOS آزمایشگاه

2. برنامه Starter را دریافت کنید

ابتدا به برنامه Build your first Computer Vision App در Android یا iOS Codelab نیاز دارید. اگر از طریق آزمایشگاه رفته باشید، ImageClassifierStep1 نامیده می شود. اگر نمی خواهید از طریق آزمایشگاه بروید، می توانید نسخه تمام شده را از مخزن کلون کنید

آن را در اندروید استودیو باز کنید، به‌روزرسانی‌هایی را که نیاز دارید انجام دهید و وقتی آماده شد، برنامه را اجرا کنید تا مطمئن شوید که کار می‌کند. شما باید چیزی شبیه به این را ببینید:

f3703d45d1332d1d.png

این یک برنامه کاملاً ابتدایی است، اما عملکرد بسیار قدرتمندی را تنها با یک کد کوچک نشان می دهد. با این حال، اگر می‌خواهید این گل به‌عنوان گل مروارید شناخته شود، و نه فقط به‌عنوان یک گل، باید برنامه را به‌روزرسانی کنید تا از مدل سفارشی‌تان از «ایجاد یک مدل سفارشی برای کد دسته‌بندی‌کننده تصویر» استفاده کنید.

3. برای استفاده از مدل های سفارشی کیت ML، build.gradle را به روز کنید

  1. با استفاده از Android Studio، فایل build.gradle در سطح برنامه را پیدا کنید. ساده ترین راه برای انجام این کار در اکسپلورر پروژه است. مطمئن شوید که Android در بالا انتخاب شده است و در پایین پوشه ای برای Gradle Scripts خواهید دید.
  2. همانطور که در اینجا نشان داده شده است، موردی را که برای ماژول است، با نام برنامه خود و به دنبال آن «.app» باز کنید - (ماژول: ImageClassifierStep1.app):

8fe1d04b40610047.png

  1. در پایین فایل، تنظیمات وابستگی ها را پیدا کنید. در آنجا باید این خط را ببینید:
implementation 'com.google.mlkit:image-labeling:17.0.1'

ممکن است شماره نسخه متفاوت باشد. همیشه آخرین شماره نسخه را از سایت ML Kit در آدرس زیر پیدا کنید: https://developers.google.com/ml-kit/vision/image-labeling/android

  1. این را با مرجع کتابخانه برچسب‌گذاری تصویر سفارشی جایگزین کنید. شماره نسخه برای این را می توانید در: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android پیدا کنید
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. علاوه بر این، یک مدل tflite. را که در آزمایشگاه قبلی ایجاد کرده‌اید، اضافه می‌کنید. وقتی Android Studio برنامه شما را کامپایل می‌کند، نمی‌خواهید این مدل فشرده شود، بنابراین مطمئن شوید که از این تنظیمات در بخش Android همان فایل build.gradle استفاده می‌کنید:
aaptOptions{
    noCompress "tflite"
}

مطمئن شوید که در هیچ تنظیمات دیگری نیست. باید مستقیماً زیر تگ android قرار گیرد. در اینجا یک مثال است:

62d546bff11d2a50.png

4. مدل TFLite را اضافه کنید

در کد لبه قبلی، مدل سفارشی خود را ایجاد کرده و آن را به عنوان model.tflite دانلود کردید.

در پروژه خود، پوشه دارایی خود را پیدا کنید که در حال حاضر حاوی flower1.jpg است. مدل را به صورت زیر در آن پوشه کپی کنید:

  1. روی پوشه Assets در Android Studio کلیک راست کنید. در منوی باز شده، Reveal in Finder را انتخاب کنید. («نمایش در اکسپلورر» در ویندوز و «نمایش در فایل‌ها» در لینوکس.)

db30b47e419a326b.png

  1. شما به دایرکتوری موجود در سیستم فایل هدایت خواهید شد. فایل model.tflite را در کنار flower1.jpg.

36de0c51bec1c19e.png

Android Studio به‌روزرسانی می‌شود تا هر دو فایل را در پوشه دارایی‌های شما نشان دهد:

e9f4e9f394d9b357.png

اکنون آماده به روز رسانی کد خود هستید.

5. کد خود را برای مدل سفارشی به روز کنید

اولین قدم اضافه کردن کد برای بارگذاری مدل سفارشی خواهد بود.

  1. در فایل MainActivity خود، بلافاصله زیر خطی که setContentView(R.layout.activity_main) را می‌خواند، موارد زیر را به onCreate خود اضافه کنید.

این از یک LocalModel برای ساخت از دارایی model.tflite استفاده می کند. اگر Android Studio با قرمز کردن LocalModel شکایت کرد، ALT + Enter را فشار دهید تا کتابخانه وارد شود. باید یک import به com.google.mlkit.common.model.LocalModel برای شما اضافه کند.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

قبلاً، در کنترلر btn.setOnClickListener خود از مدل پیش فرض استفاده می کردید. با این کد راه اندازی شد:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

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

  1. تنظیم یک شی گزینه های سفارشی:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

این گزینه های پیش فرض را با یک مجموعه سفارشی جایگزین می کند. آستانه اطمینان نواری را برای بازگشت کیفیت پیش بینی ها تعیین می کند. اگر به نمونه بالای این کد لبه نگاه کنید، جایی که تصویر یک گل مروارید بود، 4 پیش‌بینی داشتید که هر کدام یک مقدار در کنار آن‌ها داشتند، مانند «آسمان» 0.7632.

با استفاده از آستانه اطمینان بالا می‌توانید نتایج با کیفیت پایین‌تر را به طور موثر فیلتر کنید. برای مثال، تنظیم این روی 0.9 هیچ برچسبی را با اولویت کمتر از آن برنمی‌گرداند. setMaxResultCount() در مدل‌هایی با کلاس‌های زیاد مفید است، اما از آنجایی که این مدل فقط 5 دارد، آن را روی 5 رها می‌کنید.

اکنون که گزینه‌هایی برای برچسب‌گذار دارید، می‌توانید نمونه‌سازی برچسب‌کننده را به:

val labeler = ImageLabeling.getClient(options)

بقیه کد شما بدون تغییر اجرا می شود. آن را امتحان کنید!

dd40c36c4edbb33.png

در اینجا می بینید که این گل اکنون به عنوان یک گل مروارید با احتمال .959 شناسایی شده است!

فرض کنید شما یک تصویر گل دوم را اضافه کرده اید و با آن دوباره اجرا کنید:

8556a5fbea487842.png

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

ممکن است تعجب کنید که چرا به جای فقط "رز" می گوید گل رز . دلیلش این است که در مجموعه داده، برچسب‌ها با نام پوشه‌ها داده می‌شوند و متأسفانه نام‌های آن پوشه‌ها کمی ناسازگار هستند، گاهی اوقات از مفرد (مانند «دیزی») و گاهی اوقات از جمع (مانند «رز» استفاده می‌کنند. این را با مدلی که سعی در شمارش موارد در تصویر دارد اشتباه نگیرید - بسیار ابتدایی تر از آن است و فقط می تواند انواع گل ها را شناسایی کند!

6. برنامه iOS Start را دریافت کنید

  1. ابتدا به برنامه اولین Codelab نیاز دارید. اگر از طریق آزمایشگاه رفته باشید، ImageClassifierStep1 نامیده می شود. اگر نمی خواهید از طریق آزمایشگاه بروید، می توانید نسخه تمام شده را از مخزن کلون کنید. لطفاً توجه داشته باشید که پادها و xcworkspace. در مخزن وجود ندارند، بنابراین قبل از ادامه به مرحله بعدی، مطمئن شوید که "pod install" را از همان دایرکتوری xcproject. اجرا کنید.
  2. ImageClassifierStep1.xcworkspace را در Xcode باز کنید. توجه داشته باشید که باید از .xcworkspace و نه xcproject. استفاده کنید زیرا کیت ML را با استفاده از pods بسته‌بندی کرده‌اید، و فضای کاری آنها را بارگیری می‌کند.

برای بقیه این آزمایشگاه، من برنامه را در شبیه ساز آیفون اجرا می کنم که باید از اهداف ساخت از Codelab پشتیبانی کند. اگر می خواهید از دستگاه خود استفاده کنید، ممکن است لازم باشد هدف ساخت را در تنظیمات پروژه خود تغییر دهید تا با نسخه iOS خود مطابقت داشته باشد.

آن را اجرا کنید و چیزی شبیه به این خواهید دید:

9e151ed18f99fb98.png

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

برای بقیه این نرم افزار کد، به آنچه که برای ارتقای برنامه خود با مدل سفارشی نیاز است نگاه خواهید کرد.

7. از کیت ML Image Labeler Pods استفاده کنید

اولین برنامه از یک فایل پاد برای دریافت کتابخانه ها و مدل های پایه ML Kit Image Labeler استفاده کرد. برای استفاده از کتابخانه های برچسب گذاری تصویر سفارشی، باید آن را به روز کنید.

  1. فایلی به نام podfile در فهرست پروژه خود پیدا کنید. آن را باز کنید، چیزی شبیه به این خواهید دید:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. اعلان pod را از ImageLabeling به ImageLabelingCustom تغییر دهید، مانند این:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. پس از اتمام کار، از ترمینال استفاده کنید تا به دایرکتوری حاوی پادفایل (و همچنین xcworkspace.) بروید و pod install اجرا کنید.

bb5d78eb7c7ab975.png

پس از چند لحظه، کتابخانه‌های MLKitImageLabeling حذف می‌شوند و موارد سفارشی اضافه می‌شوند. اکنون می توانید xcworkspace خود را برای ویرایش کد خود باز کنید.

8. مدل TFLite را به Xcode اضافه کنید

در Codelab قبلی یک مدل سفارشی ایجاد کردید و آن را با عنوان model.tflite دانلود کردید. اگر این را در دسترس ندارید، به عقب برگردید و آن Codelab را اجرا کنید، یا کد colab را در اینجا مرور کنید. اگر به Google Colab دسترسی ندارید، نوت بوک در این لینک موجود است

  1. با فضای کاری باز در Xcode، model.tflite را روی پروژه خود بکشید. باید در پوشه ای مانند بقیه فایل های شما مانند ViewController.swift یا Main.storyboard باشد.
  2. یک گفتگو با گزینه هایی برای اضافه کردن فایل ظاهر می شود. اطمینان حاصل کنید که افزودن به اهداف انتخاب شده است، در غیر این صورت مدل در هنگام استقرار در یک دستگاه با برنامه همراه نمی شود.

توجه داشته باشید که ورودی «افزودن به اهداف» دارای ImageClassifierStep1 خواهد بود، اگر از آن شروع کرده باشید و گام به گام از طریق این آزمایشگاه ادامه دهید یا اگر به کد تمام شده پیش بروید، ImageClassifierStep2 (مانند شکل) خواهد بود.

5b6a7f40c73f0f1f.png

این اطمینان حاصل می کند که می توانید مدل را بارگیری کنید. در مرحله بعدی خواهید دید که چگونه این کار را انجام دهید.

9. کد خود را برای مدل سفارشی به روز کنید

  1. فایل ViewController.swift خود را باز کنید. ممکن است یک خطا در "وارد کردن MLKitImageLabeling" در بالای فایل مشاهده کنید. این به این دلیل است که وقتی فایل پاد خود را به‌روزرسانی کردید، کتابخانه‌های برچسب‌گذاری تصویر عمومی را حذف کردید. این خط را حذف کنید و با موارد زیر به روز رسانی کنید:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

شاید سریع خواندن اینها آسان باشد و فکر کنید که آنها همان کد را تکرار می کنند! اما در پایان "مشترک" و "سفارشی" است!

  1. سپس مدل سفارشی را که در مرحله قبل اضافه کردید بارگیری می کنید. تابع getLabels() را پیدا کنید. زیر خطی که visionImage.orientation = image.imageOrientation را می خواند، این خطوط را اضافه کنید:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. کدی را برای تعیین گزینه های ImageLabeler عمومی پیدا کنید. از آنجایی که این کتابخانه ها حذف شده اند، احتمالاً به شما خطایی می دهد:
let options = ImageLabelerOptions()

برای استفاده از CustomImageLabelerOptions که مدل محلی را مشخص می کند، آن را با این کد جایگزین کنید:

let options = CustomImageLabelerOptions(localModel: localModel)

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

238cd21748a97cf4.png

فرض کنید شما یک تصویر گل دوم را اضافه کرده اید و با آن دوباره اجرا کنید:

75f3970a6b509bfe.png

برنامه با موفقیت تشخیص داد که این تصویر با برچسب "رز" مطابقت دارد!

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

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

البته برنامه به دست آمده بسیار محدود است زیرا به دارایی های تصویر همراه متکی است. با این حال، بخش ML به خوبی کار می کند. برای مثال می‌توانید از دوربین AndroidX برای گرفتن فریم‌ها از یک فید زنده استفاده کنید و آنها را طبقه‌بندی کنید تا ببینید گوشی شما چه گل‌هایی را تشخیص می‌دهد!

از اینجا امکانات بی‌پایان است – و اگر داده‌های خود را برای چیزی غیر از گل‌ها دارید، پایه و اساس آنچه را که برای ساختن برنامه‌ای که آنها را با استفاده از Computer Vision شناسایی می‌کند، در اختیار دارید. اینها فقط چند قدم اول به سوی دنیایی بسیار گسترده تر هستند، و امیدواریم از کار کردن با آنها لذت برده باشید!