یادگیری ماشین در اندروید با ML Kit برای فایربیس – از صفر تا صد


آن روزها که استفاده از قابلیتهای یادگیری ماشین تنها روی کلود امکان داشت و این مسئله نیازمند توان محاسباتی بالا، سختافزار پیشرفته و مواردی از این دست بود، گذشته است. امروزه دستگاههای موبایل بسیار قدرتمندتر شدهاند و الگوریتمهای ما نیز کارایی بالاتری یافتهاند. همه این موارد منجر به این نتیجه شده است که بهرهگیری از یادگیری ماشین روی دستگاههای همراه امکان یافته است و دیگر صرفاً یک نظریه عملی-تخیلی محسوب نمیشود. در این نوشته به بررسی عملی یک پروژه یادگیری ماشین در اندروید با استفاده از ML Kit برای «فایربیس» (Firebase) میپردازیم.
مقدمه
یادگیری ماشین امروزه روی دستگاههای گوناگون در همه جا استفاده میشود. نمونههایی از این مسئله به شرح زیر هستند:
- دستیار هوشمند: کورتانا، Siri و دستیار گوگل نمونههایی از این دستیارها هستند. دستیار گوگل در کنفرانس IO امسال یک بهروزرسانی عمده دریافت کرده است و عمده توجه بر روی افزایش ظرفیتهای یادگیری ماشین آن روی دستگاههای همراه بوده است.
- فیلترهای اسنپچت: اسنپچت از یادگیری ماشین برای تشخیص چهرههای انسان و قرار دادن فیلترهای 3 بعدی مانند عینک، کلاه، و.. روی آنها استفاده میکند.
- پاسخ هوشمند: پاسخ هوشمند (Smart Replay) یک از قابلیتهای بسیاری از دستگاههای امروزی است و در اپلیکیشنهای چت مانند واتس اپ و غیره استفاده میشود؛ هدف آن ارائه پیغامهای از پیش تعریف شدهای است که میتوانید از آنها را در پاسخ به پیامهای دریافتی گوناگون خود بهره بگیرید.
- گوگل لنز: با این که این سرویس همچنان در مراحل ابتدایی خود است، اما از مدلهای یادگیری ماشین برای شناسایی و برچسبگذاری اشیا استفاده میکند.
این فهرست را میتوان بسیار ادامه داد، بنابراین به این مقدار اکتفا میکنیم. در این مقاله به بررسی شیوههای استفاده از یادگیری ماشین در اپلیکیشنهای اندروید و هوشمندتر ساختن آنها میپردازیم.
ML Kit برای فایربیس چیست؟
ML Kit برای فایربیس یک SDK موبایل است که گنجاندن ظرفیتهای یادگیری ماشین در اپلیکیشنها را برای توسعهدهندگان موبایل آسانتر ساخته است. این کیت شامل API های پیشساخته زیر است:
- بازشناسی متن: این API برای بازشناسی و استخراج متن از تصاویر استفاده میشود.
- تشخیص چهره: برای تشخیص چهره و نشانهگذاری بخشهای مختلف چهره همراه با مرزهای آن استفاده میشود.
- تشخیص و ردگیری شیء: برای تشخیص، ردگیری و طبقهبندی اشیا در تصاویر دوربین و عکسهای از پیش ثبت شده استفاده میشود.
- برچسبگذاری تصویر: شناسایی اشیا، مکانها، فعالیتها، گونههای حیوانات و مواردی از این دست.
- اسکن بارکد: برای اسکن و پردازش بارکدها استفاده میشود.
- تشخیص مکان: برای شناسایی امکان معروف و شناخته شده در تصاویر به کار میرود.
- شناسه زبان: برای تشخیص زبان یک متن استفاده میشود.
- ترجمه روی دستگاه: متن نمایش داده شده روی یک دستگاه را از یک زبان به زبانی دیگر ترجمه میکند.
- پاسخ هوشمند: پاسخهای متنی هوشمندانهای بر مبنای پیامهای قبلی تولید میکند.
ML Kit در اصل و به زبان ساده، راهکاری است که با آن میتوانید از پیچیدگیها بهرهگیری از یادگیری ماشین در اپلیکیشنهای خود برای تلفنهای هوشمند بکاهید.
چه چیزی خواهیم ساخت؟
ما در این مقاله از ظرفیت تشخیص چهره ML Kit برای شناسایی چهرهها در یک تصویر استفاده میکنیم. بدین منظور تصاویر را از طریق دوربین میگیریم و اینترفیس را روی آن اجرا میکنیم.
برای استفاده از ML Kit لازم است که یک حساب «فایربیس» (Firebase) داشته باشید. اگر چنین حسابی ندارید به این صفحه (+) مراجعه کنید و یک حساب باز کنید. توجه داشته باشید در زمان نگارش مقاله، این حساب برای دسترسی ایرانیان مسدود بوده است و برای دسترسی به آن نیاز به استفاده از پراکسی وجود دارد.
ایجاد یک پروژه روی فایربیس
زمانی که یک حساب کاربری روی فایربیس باز کردید، به این صفحه (+) بروید و روی add project کلیک کنید.
یک نام به پروژه خود بدهید و روی Create کلیک کنید. ممکن است چند ثانیه طول بکشد تا پروژه شما آماده شود. سپس در ادامه یک اپلیکیشن اندروید به پروژه خود اضافه میکنیم.
افزودن اپلیکیشن
اندروید استودیو را باز کنید و یک پروژه جدید با یک اکتیویتی خالی اضافه کنید. سپس روی Tools -> Firebase کلیک کنید. بدین ترتیب دستیار فایربیس در پنل سمت راست باز میشود. در فهرست گزینهها، ML Kit را انتخاب کرده و روی گزینه زیر کلیک کنید:
Use ML Kit to detect faces in images and video
احتمالاً از شما درخواست میشود که اندروید استودیو خود را به یک اپلیکیشن در فایربیس وصل کنید. روی connect کلیک کرده و در پروژه فایربیس خود sign in کنید. زمانی که اندروید استودیو اجازه دسترسی به پروژه فایربیس را داد، از شما خواسته میشود که یک پروژه انتخاب کنید. پروژهای را که در گام قبلی ایجاد کردید انتخاب کنید. پس از آن باید ML Kit را به اپلیکیشن خود اضافه کنید که یک فرایند تک کلیکی محسوب میشود. زمانی که کار اضافه کردن وابستگیها به پایان رسید، آماده هستید که اپلیکیشن خود را ایجاد کنید.
پیکربندی AndroidManifest.xml
شما باید فایل AndroidManifest.xml خود را طوری ویرایش کنید که امکان یادگیری ماشین آفلاین در اپلیکیشن اندروید خود را داشته باشید. متا-تگ زیر را درست زیر تگ اپلیکیشن خود وارد کنید.
ضمناً قصد داریم یک قابلیت دوربین به اپلیکیشن خود اضافه کنیم و از این رو یک تگ permission در مانیفست اضافه میکنیم.
افزودن یک دوربین به اپلیکیشن
برای افزودن دوربین به اپلیکیشن باید CameraKit مربوط به WonderKiln را اضافه کنیم. برای استفاده از CameraKit وابستگیهای زیر را در فایل build.gradle سطح اپلیکیشن اضافه میکنیم.
نکته: اگر میخواهید از کاتلین در اپلیکیشن اندروید خود استفاده کنید، باید وابستگیهای کاتلین نیز در آن گنجانده شوند.
پروژه را Sync کنید تا وابستگیها دانلود شوند. سپس یک CameraKitView در فایل لیآوت activity_main.xml اضافه میکنیم. به این منظور کد زیر را در فایل لیآوت اضافه کنید.
همچنین یک دکمه به زیر صفحه اضافه میکنیم تا به وسیله آن عکس بگیریم.
پیکربندی دوربین
ما دوربین را در فایل MainActivity.kt مقداردهی میکنیم. به این منظور برخی متدهای چرخه عمر را override خواهیم کرد و درون این متدها، متدهای چرخه عمر را برای دوربین فراخوانی میکنیم:
از اندروید نسخه M به بعد باید مجوزهای زمان اجرا را نیز تقاضا کنیم. این وضعیت از سوی خود کتابخانه CameraKit مربوط به WonderKiln مدیریت میشود. به این منظور کافی است متد زیر را override کنیم:
عکس گرفتن
ما با فشردن دکمه یک عکس میگیریم و آن را به دتکتور ارسال میکنیم. سپس یک مدل یادگیری ماشین روی تصویر اعمال میکنیم تا چهره را شناسایی کنیم. یک onclicklistener روی دکمه و درون تابع onClick تنظیم میکنیم و درون آن تابع captureImage مربوط به ویوی Camera را فراخوانی میکنیم.
در ادامه مقدار byteArray دریافتی را در یک bitmap دیکود میکنیم و سپس bitmap را به یک اندازه معقول مقیاسبندی مینماییم. این اندازه اساساً باید به اندازه camera_view ما باشد.
اکنون زمان آن فرا رسیده است که دتکتور ما روی bitmap اجرا شود. به این منظور تابع جداگانه runDetector() اجرا میکنیم.
شروع تشخیص
این بخش اصلی اپلیکیشن ما است. ما یک دتکتور روی تصویر ورودی اجرا میکنیم. ابتدا یک FirebaseVisionImage از bitmap دریافتی تهیه میکنیم.
سپس نوبت آن میرسد که برخی گزینهها مانند performanceMode ،countourMode ،landmarkMode و غیره را اضافه کنیم.
اکنون دتکتور خود را با استفاده از گزینهها میسازیم.
در نهایت، نوبت آن میرسد که فرایند شناسایی را شروع کنیم. ما با استفاده از این دتکتور تابع detectInImage را فراخوانی کرده و تصویر را به آن ارسال میکنیم. در ادامه callback-هایی برای موفقیت یا شکست دریافت میکنیم.
طرز کار تابع runDetector به صورت زیر است:
ایجاد کادر پیرامونی
برای ایجاد یک کادر پیرامونی که چهرههای شناساییشده را احاطه کند، باید دو view ایجاد کنیم. ویوی اول یک ویوی رویی شفاف است که روی آن کادر را رسم میکنیم. سپس کادر واقعی را روی تصویر قرار میدهیم. برای این کار از عنصر Canvas استفاده شده است.
فایل GraphicOverlay.java به صورت زیر است:
کادر مستطیلی واقعی به صورت زیر است:
اینک زمان آن رسیده که این ویوی graphicOverlay را در فایل لیآوت activity_main.xml خود اضافه کنیم.
در نهایت فایل activity_main.xml به صورت زیر درمیآید:
اینک زمان آن است که کادر پیرامونی چهرههای شناسایی شده را رسم کنیم. ما با استفاده از دتکتور چهرهها را در تابع ()processFaceResult دریافت کردهایم.
در ادامه حلقهای روی همه چهرهها تعریف کرده و یک کادر روی هر چهره به صورت زیر اضافه میکنیم:
سخن پایانی
در نهایت اپلیکیشن ما چیزی مانند تصویر زیر خواهد بود:
شما میتوانید سورس کد این اپلیکیشن را از این صفحه گیتهاب (+) دانلود کنید. روی این کد کار کنید و ایدههای مختلفی که برای پیادهسازی یادگیری ماشین در اپلیکیشنهای اندرویدی دارید امتحان نمایید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای داده کاوی و یادگیری ماشین
- گنجینه آموزشهای یادگیری ماشین و دادهکاوی
- مجموعه آموزشهای برنامهنویسی اندروید
- یادگیری ماشین (Machine Learning) چیست؟ — راهنمای کامل
- آموزش یادگیری ماشین با مثال های کاربردی — مجموعه مقالات جامع وبلاگ فرادرس
==