۱. قبل از شروع
در اولین Codelab در این مجموعه، شما یک برنامه بسیار ساده ایجاد کردید که از برچسبگذاری تصویر برای تجزیه محتوای یک تصویر استفاده میکرد. شما تصویری از یک گل مروارید را به آن میدادید و برنامه به شما میگفت که چیزهایی مانند گلبرگ یا آسمان را میبیند. سپس، در Codelab دوم، شما به پایتون سوئیچ کردید تا یک مدل جدید و سفارشی را آموزش دهید که پنج نوع مختلف گل را تشخیص میدهد.
در این آزمایشگاه کد، برنامهی آزمایشگاه اول را با مدل آزمایشگاه دوم بهروزرسانی خواهید کرد!
شما میتوانید با کپی کردن این مخزن، کد منبع کامل این آزمایشگاه کد را دریافت کنید. زیرشاخههای اندروید و iOS را مشاهده خواهید کرد. اگر میخواهید ادامه مطلب را دنبال کنید، کد آزمایشگاه کد قبلی با عنوان ImageClassifierStep1 در دسترس است. کد نهایی این آزمایشگاه کد با عنوان ImageClassifierStep2 در دسترس است.
پیشنیازها
- شما باید دو آزمایشگاه کد اول را در این مسیر یادگیری تکمیل کرده باشید
آنچه خواهید ساخت و یاد خواهید گرفت
- یک مدل سفارشی که در آزمایشگاه قبلی آموزش داده شده است را در یک برنامه اندروید یا iOS ادغام کنید.
آنچه نیاز دارید
- اندروید استودیو، برای بخش اندروید آزمایشگاه، در developer.android.com/studio موجود است.
- Xcode، موجود در فروشگاه اپل اپ، برای بخش iOS آزمایشگاه
۲. اپلیکیشن شروعکننده را دریافت کنید
ابتدا به برنامهای که از بخش «اولین برنامه بینایی کامپیوتر خود را در اندروید یا iOS بسازید» در Codelab نیاز دارید. اگر بخش آزمایشی را گذرانده باشید، نام آن ImageClassifierStep1 خواهد بود. اگر نمیخواهید بخش آزمایشی را بگذرانید، میتوانید نسخه نهایی را از مخزن کلون کنید.
آن را در اندروید استودیو باز کنید، هر بهروزرسانی که نیاز دارید را انجام دهید و وقتی آماده شد، برنامه را اجرا کنید تا مطمئن شوید که کار میکند. باید چیزی شبیه به این را ببینید:

این یک برنامه کاملاً ابتدایی است، اما با کمی کدنویسی، قابلیتهای بسیار قدرتمندی را نشان میدهد. با این حال، اگر میخواهید این گل به عنوان یک گل مروارید و نه فقط یک گل معمولی شناخته شود، باید برنامه را بهروزرسانی کنید تا از مدل سفارشی شما از بخش «ایجاد یک مدل سفارشی برای کد کلاسهبندی تصویر» در آزمایشگاه کد استفاده کند.
۳. برای استفاده از مدلهای کیت ML سفارشی، build.gradle را بهروزرسانی کنید
- با استفاده از اندروید استودیو، فایل
build.gradleدر سطح برنامه را پیدا کنید. سادهترین راه برای انجام این کار در پنجرهی project explorer است. مطمئن شوید که Android در بالا انتخاب شده است، در این صورت پوشهای برای Gradle Scripts در پایین خواهید دید. - فایلی که مربوط به ماژول است را باز کنید، به این صورت که نام برنامه شما به همراه '.app' باشد، همانطور که در اینجا نشان داده شده است - (ماژول: ImageClassifierStep1.app):

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

۴. مدل TFLite را اضافه کنید
در codelab قبلی، مدل سفارشی خود را ایجاد و آن را با نام model.tflite دانلود کردید.
در پروژه خود، پوشه assets را که در حال حاضر حاوی flower1.jpg است، پیدا کنید. مدل را به صورت زیر در آن پوشه کپی کنید:
- روی پوشه Assets در اندروید استودیو کلیک راست کنید. در منویی که باز میشود، گزینه Reveal in Finder را انتخاب کنید. (در ویندوز «نمایش در اکسپلورر» و در لینوکس «نمایش در فایلها»).

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

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

اکنون آمادهاید تا کد خود را بهروزرسانی کنید.
۵. کد خود را برای مدل سفارشی بهروزرسانی کنید
اولین قدم اضافه کردن کدی برای بارگذاری مدل سفارشی خواهد بود.
- در فایل
MainActivityخود، کد زیر را بهonCreateخود، بلافاصله زیر خطی کهsetContentView(R.layout.activity_main)را میخواند، اضافه کنید.
این از یک LocalModel برای ساخت از دارایی model.tflite استفاده میکند. اگر اندروید استودیو با قرمز کردن 'LocalModel' مشکل را نشان داد، ALT + Enter را فشار دهید تا کتابخانه وارد شود. باید یک ورودی به com.google.mlkit.common.model.LocalModel برای شما اضافه شود.
val localModel = LocalModel.Builder()
.setAssetFilePath("model.tflite")
.build()
قبلاً، در هندلر btn.setOnClickListener خود از مدل پیشفرض استفاده میکردید. این مدل با این کد تنظیم شده بود:
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
برای استفاده از مدل سفارشی، آن را جایگزین خواهید کرد.
- یک شیء گزینههای سفارشی تنظیم کنید:
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
این گزینهها، گزینههای پیشفرض را با مجموعهای سفارشی جایگزین میکند. آستانه اطمینان، معیاری برای کیفیت پیشبینیهای برگشتی تعیین میکند. اگر به نمونه بالای این آزمایشگاه کد، که تصویر یک گل مروارید بود، نگاه کنید، ۴ پیشبینی داشتید که هر کدام مقداری در کنار خود داشتند، مانند «آسمان» که ۰.۷۶۳۲ بود.
شما میتوانید با استفاده از یک آستانه اطمینان بالا، نتایج با کیفیت پایینتر را فیلتر کنید. برای مثال، تنظیم این مقدار روی ۰.۹ هیچ برچسبی با اولویت کمتر از آن را برنمیگرداند. تابع setMaxResultCount() در مدلهایی با کلاسهای زیاد مفید است، اما از آنجایی که این مدل فقط ۵ کلاس دارد، آن را روی ۵ نگه میدارید.
حالا که گزینههایی برای برچسبگذار دارید، میتوانید نمونهسازی برچسبگذار را به صورت زیر تغییر دهید:
val labeler = ImageLabeling.getClient(options)
بقیه کد شما بدون تغییر اجرا خواهد شد. امتحانش کنید!

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

آن را به عنوان گل رز معرفی میکند.
شاید تعجب کنید که چرا به جای « گل رز» نوشته شده است. دلیلش این است که در مجموعه دادهها، برچسبها توسط نام پوشهها داده میشوند و متأسفانه این نام پوشهها کمی متناقض هستند، گاهی اوقات از مفرد (مانند «گل مروارید») و گاهی اوقات از جمع (مانند «گلهای رز») استفاده میکنند. این را با مدلی که سعی در شمارش موارد موجود در تصویر دارد اشتباه نگیرید - این مدل بسیار ابتداییتر از این است و فقط میتواند انواع گلها را شناسایی کند!
۶. برنامه شروع iOS را دریافت کنید
- ابتدا به برنامه از Codelab اول نیاز دارید. اگر آزمایشگاه را گذرانده باشید، نام آن ImageClassifierStep1 خواهد بود. اگر نمیخواهید آزمایشگاه را طی کنید، میتوانید نسخه نهایی را از مخزن کلون کنید. لطفاً توجه داشته باشید که podها و .xcworkspace در مخزن وجود ندارند، بنابراین قبل از ادامه به مرحله بعدی، حتماً 'pod install' را از همان دایرکتوری .xcproject اجرا کنید.
-
ImageClassifierStep1.xcworkspaceدر Xcode باز کنید. توجه داشته باشید که باید از .xcworkspace استفاده کنید و نه .xcproject، زیرا شما ML Kit را با استفاده از podها بستهبندی کردهاید و فضای کاری آنها را بارگذاری خواهد کرد.
در ادامهی این آزمایش، برنامه را در شبیهساز آیفون اجرا خواهم کرد که باید از اهداف ساخت (build target) ارائه شده در codelab پشتیبانی کند. اگر میخواهید از دستگاه خودتان استفاده کنید، ممکن است لازم باشد هدف ساخت (build target) را در تنظیمات پروژه خود تغییر دهید تا با نسخه iOS شما مطابقت داشته باشد.
آن را اجرا کنید و چیزی شبیه به این را خواهید دید:

به طبقهبندیهای بسیار کلی توجه کنید - گلبرگ، گل، آسمان. مدلی که در آزمایشگاه کد قبلی ایجاد کردید، برای تشخیص ۵ نوع گل، از جمله این یکی - گل مینا - آموزش داده شده بود.
در ادامهی این آزمایشگاه کد، بررسی خواهید کرد که برای ارتقاء برنامهتان با مدل سفارشی، به چه چیزهایی نیاز خواهید داشت.
۷. از پادهای برچسبگذار تصویر کیت یادگیری ماشین سفارشی استفاده کنید
برنامه اول از یک فایل pod برای دریافت کتابخانهها و مدل پایه ML Kit Image Labeler استفاده کرد. برای استفاده از کتابخانههای برچسبگذاری تصویر سفارشی، باید آن را بهروزرسانی کنید.
- فایلی به نام
podfileدر دایرکتوری پروژه خود پیدا کنید. آن را باز کنید، چیزی شبیه به این خواهید دید:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- تعریف پاد را از
ImageLabelingبهImageLabelingCustomبه صورت زیر تغییر دهید:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- پس از اتمام کار، از ترمینال برای رفتن به دایرکتوری حاوی podfile (و همچنین فضای کاری .xc) استفاده کنید و
pod installاجرا کنید.

پس از چند لحظه، کتابخانههای MLKitImageLabeling حذف و کتابخانههای سفارشی اضافه میشوند. اکنون میتوانید فضای کاری .xc خود را برای ویرایش کد باز کنید.
۸. مدل TFLite را به Xcode اضافه کنید
در codelab قبلی، شما یک مدل سفارشی ایجاد کردید و آن را با نام model.tflite دانلود کردید. اگر این را در دسترس ندارید، به عقب برگردید و codelab را اجرا کنید، یا کد colab را از اینجا بررسی کنید. اگر به Google Colab دسترسی ندارید، دفترچه یادداشت در این لینک موجود است.
- با باز کردن فضای کاری در Xcode، فایل model.tflite را به پروژه خود بکشید. این فایل باید در همان پوشهای باشد که بقیه فایلهای شما مانند
ViewController.swiftیاMain.storyboardدارند. - یک پنجره با گزینههایی برای افزودن فایل ظاهر میشود. مطمئن شوید که گزینه «افزودن به اهداف» انتخاب شده باشد، در غیر این صورت مدل هنگام استقرار در دستگاه، همراه با برنامه نخواهد بود.
توجه داشته باشید که اگر از «افزودن به اهداف» شروع کرده باشید و بخواهید این آزمایش را گام به گام ادامه دهید، ورودی «ImageClassifierStep1» خواهد داشت و اگر به کد نهایی بروید، «ImageClassifierStep2» (مطابق شکل) خواهد داشت.

این کار تضمین میکند که میتوانید مدل را بارگذاری کنید. در مرحله بعدی خواهید دید که چگونه این کار را انجام دهید.
۹. کد خود را برای مدل سفارشی بهروزرسانی کنید
- فایل
ViewController.swiftخود را باز کنید. ممکن است در بالای فایل، در قسمت 'import MLKitImageLabeling' خطایی مشاهده کنید. این به این دلیل است که هنگام بهروزرسانی فایل pod خود، کتابخانههای عمومی برچسبگذاری تصویر را حذف کردهاید. میتوانید این خط را حذف کرده و با کد زیر بهروزرسانی کنید:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
شاید با خواندن سریع این کدها فکر کنید که آنها همان کد را تکرار میکنند! اما در انتها «معمولی» و «سفارشی» وجود دارد!
- در مرحله بعد، مدل سفارشی که در مرحله قبل اضافه کردید را بارگذاری خواهید کرد. تابع
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!)
- کد مربوط به مشخص کردن گزینههای مربوط به ImageLabeler عمومی را پیدا کنید. احتمالاً به دلیل حذف آن کتابخانهها، خطایی به شما میدهد:
let options = ImageLabelerOptions()
آن را با این کد جایگزین کنید تا از CustomImageLabelerOptions استفاده کند و مدل محلی را مشخص کند:
let options = CustomImageLabelerOptions(localModel: localModel)
...و تمام! حالا برنامهتان را اجرا کنید! وقتی سعی میکنید تصویر را طبقهبندی کنید، باید دقیقتر باشد - و با احتمال بالا به شما بگوید که به یک گل مروارید نگاه میکنید!

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

برنامه با موفقیت تشخیص داد که این تصویر با برچسب «گل رز» مطابقت دارد!
۱۰. تبریک میگویم!
اکنون شما از ساخت برنامهای که از یک مدل عمومی برای تشخیص محتوای یک تصویر استفاده میکرد، به ایجاد مدل یادگیری ماشین خودتان برای تشخیص موارد خاص، مانند گلها، و سپس بهروزرسانی برنامهتان برای استفاده از مدل سفارشی خود، رسیدهاید.
البته برنامهی نهایی بسیار محدود است زیرا به تصاویر ضمیمهشده متکی بوده است. با این حال، بخش یادگیری ماشین به خوبی کار میکند. برای مثال، میتوانید از دوربین AndroidX برای گرفتن فریم از یک فید زنده و طبقهبندی آنها استفاده کنید تا ببینید تلفن شما چه گلهایی را تشخیص میدهد!
از اینجا به بعد، احتمالات بیپایان هستند - و اگر دادههای خودتان را برای چیزی غیر از گلها دارید، پایههای لازم برای ساخت برنامهای که آنها را با استفاده از بینایی کامپیوتر تشخیص میدهد، در اختیار دارید. اینها تنها چند قدم اول به سوی دنیایی بسیار گستردهتر هستند و امیدواریم از کار کردن با آنها لذت برده باشید!