این صفحه به شما نشان می دهد که چگونه با TensorFlow Lite یک برنامه اندروید بسازید تا فید دوربین زنده را تجزیه و تحلیل کنید و اشیا را شناسایی کنید. این مورد استفاده از یادگیری ماشینی، تشخیص شی نامیده می شود. برنامه نمونه از کتابخانه وظیفه TensorFlow Lite برای بینایی از طریق سرویس های Google Play استفاده می کند تا اجرای مدل یادگیری ماشینی تشخیص اشیا را فعال کند، که رویکرد توصیه شده برای ساخت یک برنامه ML با TensorFlow Lite است.
مثال را راه اندازی و اجرا کنید
برای قسمت اول این تمرین، کد نمونه را از GitHub دانلود کرده و با استفاده از Android Studio اجرا کنید. بخشهای بعدی این سند، بخشهای مربوط به نمونه کد را بررسی میکند، بنابراین میتوانید آنها را در برنامههای Android خود اعمال کنید. شما باید نسخه های زیر از این ابزارها را نصب کنید:
- اندروید استودیو 4.2 یا بالاتر
- Android SDK نسخه 21 یا بالاتر
کد نمونه را دریافت کنید
یک کپی محلی از کد نمونه ایجاد کنید تا بتوانید آن را بسازید و اجرا کنید.
برای شبیه سازی و تنظیم کد مثال:
- مخزن git
git clone https://github.com/tensorflow/examples.git
را کلون کنید - نمونه git خود را برای استفاده از تسویه حساب پراکنده پیکربندی کنید، بنابراین فقط فایلهای برنامه نمونه تشخیص شی را داشته باشید:
cd examples git sparse-checkout init --cone git sparse-checkout set lite/examples/object_detection/android_play_services
پروژه را وارد و اجرا کنید
از Android Studio برای ایجاد یک پروژه از کد نمونه دانلود شده، ساخت پروژه و اجرای آن استفاده کنید.
برای وارد کردن و ساخت نمونه پروژه کد:
- Android Studio را راه اندازی کنید.
- از صفحه خوش آمدگویی Android Studio، Import Project را انتخاب کنید یا File > New > Import Project را انتخاب کنید.
- به فهرست کد نمونه حاوی فایل build.gradle (
...examples/lite/examples/object_detection/android_play_services/build.gradle
) بروید و آن دایرکتوری را انتخاب کنید.
پس از انتخاب این دایرکتوری، Android Studio یک پروژه جدید ایجاد کرده و آن را می سازد. پس از اتمام ساخت، Android Studio یک پیام BUILD SUCCESSFUL
را در پانل وضعیت Build Output نمایش می دهد.
برای اجرای پروژه:
- از Android Studio، پروژه را با انتخاب Run > Run… و MainActivity اجرا کنید.
- برای آزمایش برنامه، یک دستگاه Android متصل با دوربین را انتخاب کنید.
برنامه نمونه چگونه کار می کند
برنامه مثال از مدل تشخیص اشیاء از پیش آموزش دیده مانند mobilenetv1.tflite در قالب TensorFlow Lite برای جستجوی اشیاء در جریان ویدیوی زنده از دوربین دستگاه Android استفاده می کند. کد این ویژگی در درجه اول در این فایل ها است:
- ObjectDetectorHelper.kt - محیط زمان اجرا را راهاندازی میکند، شتاب سختافزاری را فعال میکند و مدل تشخیص شی ML را اجرا میکند.
- CameraFragment.kt - جریان داده های تصویر دوربین را می سازد، داده ها را برای مدل آماده می کند و نتایج تشخیص شی را نمایش می دهد.
بخشهای بعدی اجزای کلیدی این فایلهای کد را به شما نشان میدهند، بنابراین میتوانید یک برنامه اندروید را برای افزودن این قابلیت تغییر دهید.
برنامه را بسازید
بخشهای زیر مراحل کلیدی ساخت برنامه اندرویدی خود و اجرای مدل نشان داده شده در برنامه مثال را توضیح میدهند. این دستورالعملها از برنامه مثالی که قبلاً نشان داده شد به عنوان یک نقطه مرجع استفاده میکنند.
وابستگی های پروژه را اضافه کنید
در برنامه اصلی Android خود، وابستگیهای پروژه را برای اجرای مدلهای یادگیری ماشینی TensorFlow Lite و دسترسی به عملکردهای ابزار داده ML اضافه کنید. این توابع ابزار، داده هایی مانند تصاویر را به قالب داده های تانسور تبدیل می کنند که می تواند توسط یک مدل پردازش شود.
برنامه نمونه از کتابخانه TensorFlow Lite Task برای دید از سرویسهای Google Play استفاده میکند تا اجرای مدل یادگیری ماشینی تشخیص اشیا را فعال کند. دستورالعملهای زیر نحوه افزودن وابستگیهای کتابخانه مورد نیاز را به پروژه برنامه Android خود توضیح میدهند.
برای افزودن وابستگی های ماژول:
در ماژول برنامه Android که از TensorFlow Lite استفاده میکند، فایل
build.gradle
ماژول را بهروزرسانی کنید تا وابستگیهای زیر را شامل شود. در کد نمونه، این فایل در اینجا قرار دارد:...examples/lite/examples/object_detection/android_play_services/app/build.gradle
... dependencies { ... // Tensorflow Lite dependencies implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2' implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0' ... }
در Android Studio، وابستگیهای پروژه را با انتخاب: File > Sync Project with Gradle Files همگامسازی کنید.
سرویس های Google Play را راه اندازی کنید
وقتی از سرویسهای Google Play برای اجرای مدلهای TensorFlow Lite استفاده میکنید، قبل از اینکه بتوانید از آن استفاده کنید، باید سرویس را مقداردهی اولیه کنید. اگر می خواهید از پشتیبانی شتاب سخت افزاری با این سرویس استفاده کنید، مانند شتاب GPU، آن پشتیبانی را نیز به عنوان بخشی از این مقداردهی اولیه فعال کنید.
برای راهاندازی TensorFlow Lite با سرویسهای Google Play:
یک شی
TfLiteInitializationOptions
ایجاد کنید و آن را تغییر دهید تا پشتیبانی GPU فعال شود:val options = TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build()
از روش
TfLiteVision.initialize()
برای فعال کردن استفاده از زمان اجرا سرویس Play استفاده کنید و شنونده را تنظیم کنید تا تأیید کند که بارگیری با موفقیت انجام شده است:TfLiteVision.initialize(context, options).addOnSuccessListener { objectDetectorListener.onInitialized() }.addOnFailureListener { // Called if the GPU Delegate is not supported on the device TfLiteVision.initialize(context).addOnSuccessListener { objectDetectorListener.onInitialized() }.addOnFailureListener{ objectDetectorListener.onError("TfLiteVision failed to initialize: " + it.message) } }
مفسر مدل ML را راه اندازی کنید
با بارگیری فایل مدل و تنظیم پارامترهای مدل، مفسر مدل یادگیری ماشینی TensorFlow Lite را راهاندازی کنید. یک مدل TensorFlow Lite شامل یک فایل .tflite
. حاوی کد مدل است. شما باید مدل های خود را در دایرکتوری src/main/assets
پروژه توسعه خود ذخیره کنید، به عنوان مثال:
.../src/main/assets/mobilenetv1.tflite`
برای مقداردهی اولیه مدل:
- یک فایل مدل
.tflite
. را به دایرکتوریsrc/main/assets
پروژه توسعه خود اضافه کنید، مانند ssd_mobilenet_v1 . متغیر
modelName
را برای تعیین نام فایل مدل ML خود تنظیم کنید:val modelName = "mobilenetv1.tflite"
گزینه هایی را برای مدل تنظیم کنید، مانند آستانه پیش بینی و اندازه مجموعه نتایج:
val optionsBuilder = ObjectDetector.ObjectDetectorOptions.builder() .setScoreThreshold(threshold) .setMaxResults(maxResults)
شتاب GPU را با گزینهها فعال کنید و اگر شتاب در دستگاه پشتیبانی نمیشود، اجازه دهید کد بهخوبی از کار بیفتد:
try { optionsBuilder.useGpu() } catch(e: Exception) { objectDetectorListener.onError("GPU is not supported on this device") }
از تنظیمات این آبجکت برای ساختن یک شیء
ObjectDetector
Lite ObjectDetector استفاده کنید که حاوی مدل است:objectDetector = ObjectDetector.createFromFileAndOptions( context, modelName, optionsBuilder.build())
برای اطلاعات بیشتر در مورد استفاده از نمایندگیهای شتاب سختافزار با TensorFlow Lite، به TensorFlow Lite Delegates مراجعه کنید.
داده ها را برای مدل آماده کنید
شما داده ها را برای تفسیر توسط مدل با تبدیل داده های موجود مانند تصاویر به قالب داده Tensor آماده می کنید، بنابراین می تواند توسط مدل شما پردازش شود. داده ها در یک Tensor باید ابعاد یا شکل خاصی داشته باشند که با قالب داده های مورد استفاده برای آموزش مدل مطابقت داشته باشد. بسته به مدلی که استفاده میکنید، ممکن است لازم باشد دادهها را برای مطابقت با آنچه مدل انتظار دارد تغییر دهید. برنامه مثال از یک شی ImageAnalysis
برای استخراج فریم های تصویر از زیر سیستم دوربین استفاده می کند.
برای آماده سازی داده ها برای پردازش توسط مدل:
یک شی
ImageAnalysis
تا تصاویر را با فرمت مورد نیاز استخراج کنید:imageAnalyzer = ImageAnalysis.Builder() .setTargetAspectRatio(AspectRatio.RATIO_4_3) .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888) .build() ...
تحلیلگر را به زیرسیستم دوربین وصل کنید و یک بافر بیت مپ ایجاد کنید تا حاوی داده های دریافتی از دوربین باشد:
.also { it.setAnalyzer(cameraExecutor) { image -> if (!::bitmapBuffer.isInitialized) { bitmapBuffer = Bitmap.createBitmap( image.width, image.height, Bitmap.Config.ARGB_8888 ) } detectObjects(image) } }
داده های تصویر خاص مورد نیاز مدل را استخراج کنید و اطلاعات چرخش تصویر را ارسال کنید:
private fun detectObjects(image: ImageProxy) { // Copy out RGB bits to the shared bitmap buffer image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer) } val imageRotation = image.imageInfo.rotationDegrees objectDetectorHelper.detect(bitmapBuffer, imageRotation) }
همانطور که در روش
ObjectDetectorHelper.detect()
در برنامه مثال نشان داده شده است، هرگونه تبدیل داده نهایی را تکمیل کنید و داده های تصویر را به یک شیTensorImage
اضافه کنید:val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build() // Preprocess the image and convert it into a TensorImage for detection. val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
پیش بینی ها را اجرا کنید
هنگامی که یک شی TensorImage با داده های تصویر در قالب درست ایجاد کردید، می توانید مدل را در برابر آن داده ها اجرا کنید تا یک پیش بینی یا استنتاج ایجاد کنید. در برنامه مثال، این کد در ObjectDetectorHelper.detect()
موجود است.
برای اجرای یک مدل و ایجاد پیشبینی از دادههای تصویر:
پیش بینی را با ارسال داده های تصویر به تابع پیش بینی خود اجرا کنید:
val results = objectDetector?.detect(tensorImage)
خروجی مدل دسته
پس از اجرای دادههای تصویر در برابر مدل تشخیص شی، فهرستی از نتایج پیشبینی را تولید میکند که کد برنامه شما باید با اجرای منطق تجاری اضافی، نمایش نتایج به کاربر یا انجام اقدامات دیگر، آنها را مدیریت کند. مدل تشخیص شی در برنامه مثال، فهرستی از پیشبینیها و جعبههای محدودکننده برای اشیاء شناساییشده تولید میکند. در برنامه مثال، نتایج پیشبینی برای پردازش بیشتر و نمایش به کاربر به یک شی شنونده ارسال میشود.
برای رسیدگی به نتایج پیشبینی مدل:
از یک الگوی شنونده برای ارسال نتایج به کد برنامه یا اشیاء رابط کاربری خود استفاده کنید. برنامه نمونه از این الگو برای ارسال نتایج تشخیص از شی
ObjectDetectorHelper
به شیCameraFragment
استفاده می کند:objectDetectorListener.onResults( // instance of CameraFragment results, inferenceTime, tensorImage.height, tensorImage.width)
بر روی نتایج عمل کنید، مانند نمایش پیش بینی به کاربر. برنامه مثال روی شی
CameraPreview
یک پوشش میکشد تا نتیجه را نشان دهد:override fun onResults( results: MutableList<Detection>?, inferenceTime: Long, imageHeight: Int, imageWidth: Int ) { activity?.runOnUiThread { fragmentCameraBinding.bottomSheetLayout.inferenceTimeVal.text = String.format("%d ms", inferenceTime) // Pass necessary information to OverlayView for drawing on the canvas fragmentCameraBinding.overlay.setResults( results ?: LinkedList<Detection>(), imageHeight, imageWidth ) // Force a redraw fragmentCameraBinding.overlay.invalidate() } }
مراحل بعدی
- درباره APIهای Task Library بیشتر بیاموزید
- درباره APIهای مترجم بیشتر بیاموزید.
- کاربردهای TensorFlow Lite را در مثالها کاوش کنید.
- در مورد استفاده و ساخت مدل های یادگیری ماشینی با TensorFlow Lite در بخش Models بیشتر بیاموزید.
- در راهنمای برنامهنویس TensorFlow Lite درباره پیادهسازی یادگیری ماشین در برنامه تلفن همراه خود بیشتر بیاموزید.