این آموزش به شما نشان می دهد که چگونه با استفاده از TensorFlow Lite یک برنامه اندروید بسازید تا با استفاده از حداقل مقدار کد، فید دوربین زنده را تجزیه و تحلیل کنید و اشیاء را با استفاده از مدل یادگیری ماشینی شناسایی کنید. اگر یک پروژه موجود را به روز می کنید، می توانید از نمونه کد به عنوان مرجع استفاده کنید و به دستورالعمل های اصلاح پروژه خود بروید .
تشخیص اشیا با یادگیری ماشینی
مدل یادگیری ماشین در این آموزش تشخیص اشیا را انجام می دهد. یک مدل تشخیص شی، دادههای تصویر را در قالب خاصی میگیرد، آنها را تجزیه و تحلیل میکند و سعی میکند موارد موجود در تصویر را به عنوان یکی از مجموعهای از کلاسهای شناختهشده طبقهبندی کند که برای تشخیص آموزش دیده است. سرعتی که یک مدل با آن می تواند یک شی شناخته شده را شناسایی کند (که پیش بینی یا استنتاج شی نامیده می شود) معمولاً در میلی ثانیه اندازه گیری می شود. در عمل، سرعت استنتاج بر اساس سخت افزار میزبان مدل، اندازه داده های در حال پردازش و اندازه مدل یادگیری ماشینی متفاوت است.
راه اندازی و اجرای مثال
برای قسمت اول این آموزش، نمونه را از گیت هاب دانلود کرده و با استفاده از اندروید استودیو اجرا کنید. بخشهای بعدی این آموزش بخشهای مربوطه از نمونه کد را بررسی میکند، بنابراین میتوانید آنها را در برنامههای اندرویدی خود اعمال کنید. شما باید نسخه های زیر از این ابزارها را نصب کنید:
- اندروید استودیو 4.2.2 یا بالاتر
- Android SDK نسخه 31 یا بالاتر
کد نمونه را دریافت کنید
یک کپی محلی از کد نمونه ایجاد کنید. از این کد برای ایجاد پروژه در اندروید استودیو و اجرای نمونه برنامه استفاده خواهید کرد.
برای شبیه سازی و تنظیم کد مثال:
- مخزن git
git clone https://github.com/android/camera-samples.git
را کلون کنید نمونه git خود را برای استفاده از پرداخت پراکنده پیکربندی کنید، بنابراین فقط فایلهای مربوط به برنامه نمونه تشخیص شی را داشته باشید:
cd camera-samples git sparse-checkout init --cone git sparse-checkout set CameraXAdvanced
پروژه را وارد و اجرا کنید
یک پروژه از کد نمونه دانلود شده ایجاد کنید، پروژه را بسازید و سپس آن را اجرا کنید.
برای وارد کردن و ساخت نمونه پروژه کد:
- Android Studio را راه اندازی کنید.
- از صفحه خوش آمدگویی Android Studio، Import Project را انتخاب کنید یا File > New > Import Project را انتخاب کنید.
- به فهرست کد نمونه حاوی فایل build.gradle (
.../android/camera-samples/CameraXAdvanced/build.gradle
) بروید و آن دایرکتوری را انتخاب کنید.
اگر دایرکتوری صحیح را انتخاب کنید، Android Studio یک پروژه جدید ایجاد می کند و آن را می سازد. این فرآیند بسته به سرعت کامپیوتر شما و اگر از اندروید استودیو برای پروژه های دیگر استفاده کرده اید، ممکن است چند دقیقه طول بکشد. پس از اتمام ساخت، Android Studio یک پیام BUILD SUCCESSFUL
را در پانل وضعیت Build Output نمایش می دهد.
اختیاری: برای رفع خطاهای ساخت با به روز رسانی نسخه افزونه اندروید:
- فایل build.gradle را در دایرکتوری پروژه باز کنید.
نسخه ابزار اندروید را به صورت زیر تغییر دهید:
// from: classpath 'com.android.tools.build:gradle:4.2.2' // to: classpath 'com.android.tools.build:gradle:4.1.2'
پروژه را با انتخاب: File > Sync Project with Gradle Files همگام سازی کنید.
برای اجرای پروژه:
- از Android Studio، پروژه را با انتخاب Run > Run… و CameraActivity اجرا کنید.
- برای آزمایش برنامه، یک دستگاه Android متصل با دوربین را انتخاب کنید.
بخش های بعدی تغییراتی را که باید در پروژه موجود خود انجام دهید تا این قابلیت را به برنامه خود اضافه کنید، با استفاده از این برنامه مثال به عنوان نقطه مرجع به شما نشان می دهد.
وابستگی های پروژه را اضافه کنید
در برنامه خود، باید وابستگیهای پروژه خاصی را برای اجرای مدلهای یادگیری ماشینی TensorFlow Lite اضافه کنید و به توابع ابزاری دسترسی داشته باشید که دادههایی مانند تصاویر را به یک قالب داده تانسور تبدیل میکنند که میتواند توسط مدلی که استفاده میکنید پردازش شود.
برنامه مثال از چندین کتابخانه TensorFlow Lite برای فعال کردن اجرای مدل یادگیری ماشینی تشخیص اشیا استفاده می کند:
- کتابخانه اصلی TensorFlow Lite - کلاس های ورودی داده های مورد نیاز، اجرای مدل یادگیری ماشین و نتایج خروجی از پردازش مدل را ارائه می دهد.
- کتابخانه پشتیبان TensorFlow Lite - این کتابخانه یک کلاس کمکی برای ترجمه تصاویر از دوربین به یک شی داده
TensorImage
ارائه می دهد که می تواند توسط مدل یادگیری ماشین پردازش شود. - کتابخانه TensorFlow Lite GPU - این کتابخانه برای تسریع اجرای مدل با استفاده از پردازندههای GPU روی دستگاه، در صورت موجود بودن، پشتیبانی میکند.
دستورالعملهای زیر نحوه افزودن وابستگیهای پروژه و ماژول مورد نیاز را به پروژه برنامه Android خود توضیح میدهند.
برای افزودن وابستگی های ماژول:
در ماژولی که از TensorFlow Lite استفاده می کند، فایل
build.gradle
ماژول را به روز کنید تا وابستگی های زیر را شامل شود. در کد نمونه، این فایل در اینجا قرار دارد:.../android/camera-samples/CameraXAdvanced/tflite/build.gradle
( مرجع کد )... dependencies { ... // Tensorflow lite dependencies implementation 'org.tensorflow:tensorflow-lite:2.8.0' implementation 'org.tensorflow:tensorflow-lite-gpu:2.8.0' implementation 'org.tensorflow:tensorflow-lite-support:2.8.0' ... }
در Android Studio، وابستگیهای پروژه را با انتخاب: File > Sync Project with Gradle Files همگامسازی کنید.
مفسر مدل ML را راه اندازی کنید
در برنامه اندروید خود، قبل از اجرای پیشبینیها با مدل، باید مفسر مدل یادگیری ماشینی TensorFlow Lite را با پارامترها مقداردهی کنید. این پارامترهای اولیه به مدلی که استفاده می کنید بستگی دارد و می تواند شامل تنظیماتی مانند حداقل آستانه دقت برای پیش بینی ها و برچسب ها برای کلاس های شی شناسایی شده باشد.
یک مدل TensorFlow Lite شامل یک فایل .tflite
. حاوی کد مدل و اغلب شامل یک فایل برچسب حاوی نام کلاسهای پیشبینیشده توسط مدل است. در مورد تشخیص اشیا، کلاس ها اشیایی مانند شخص، سگ، گربه یا ماشین هستند. مدلها معمولاً در دایرکتوری src/main/assets
ماژول اصلی ذخیره میشوند، مانند نمونه کد:
- CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_quant.tflite
- CameraXAdvanced/tflite/src/main/assets/coco_ssd_mobilenet_v1_1.0_labels.txt
برای راحتی و خوانایی کد، مثال یک شیء همراه را اعلام می کند که تنظیمات مدل را تعریف می کند.
برای مقداردهی اولیه مدل در برنامه خود:
یک شیء همراه برای تعریف تنظیمات مدل ایجاد کنید: ( مرجع کد )
companion object { private val TAG = CameraActivity::class.java.simpleName private const val ACCURACY_THRESHOLD = 0.5f private const val MODEL_PATH = "coco_ssd_mobilenet_v1_1.0_quant.tflite" private const val LABELS_PATH = "coco_ssd_mobilenet_v1_1.0_labels.txt" }
از تنظیمات این شی برای ساختن یک شی مترجم TensorFlow Lite استفاده کنید که حاوی مدل است: ( مرجع کد )
private val tflite by lazy { Interpreter( FileUtil.loadMappedFile(this, MODEL_PATH), Interpreter.Options().addDelegate(nnApiDelegate)) }
پیکربندی شتاب دهنده سخت افزاری
هنگام راه اندازی یک مدل TensorFlow Lite در برنامه خود، می توانید از ویژگی های شتاب سخت افزاری برای سرعت بخشیدن به محاسبات پیش بینی مدل استفاده کنید. مثال کد بالا از NNAPI Delegate برای مدیریت شتاب سخت افزاری اجرای مدل استفاده می کند:
Interpreter.Options().addDelegate(nnApiDelegate)
نمایندگان TensorFlow Lite ماژولهای نرمافزاری هستند که اجرای مدلهای یادگیری ماشین را با استفاده از سختافزار پردازش تخصصی روی یک دستگاه تلفن همراه، مانند GPU، TPU، یا DSP سرعت میبخشند. استفاده از نمایندگان برای اجرای مدلهای TensorFlow Lite توصیه میشود، اما الزامی نیست.
برای اطلاعات بیشتر در مورد استفاده از نمایندگان با TensorFlow Lite، به TensorFlow Lite Delegates مراجعه کنید.
داده ها را به مدل ارائه دهید
در برنامه Android شما، کد شما با تبدیل دادههای موجود مانند تصاویر به قالب دادههای Tensor که میتواند توسط مدل شما پردازش شود، دادهها را برای تفسیر در اختیار مدل قرار میدهد. داده ها در یک Tensor باید ابعاد یا شکل خاصی داشته باشند که با قالب داده های مورد استفاده برای آموزش مدل مطابقت داشته باشد.
برای تعیین شکل تانسور مورد نیاز برای یک مدل:
همانطور که در قطعه کد زیر نشان داده شده است، از شی Interpreter اولیه برای تعیین شکل تانسور مورد استفاده توسط مدل خود استفاده کنید: ( مرجع کد )
private val tfInputSize by lazy { val inputIndex = 0 val inputShape = tflite.getInputTensor(inputIndex).shape() Size(inputShape[2], inputShape[1]) // Order of axis is: {1, height, width, 3} }
مدل تشخیص اشیاء مورد استفاده در کد مثال، تصاویر مربعی با اندازه 300 در 300 پیکسل را انتظار دارد.
قبل از اینکه بتوانید تصاویری از دوربین ارائه دهید، برنامه شما باید تصویر را بگیرد، آن را با اندازه مورد انتظار مطابقت دهد، چرخش آن را تنظیم کند و داده های تصویر را عادی کند. هنگام پردازش تصاویر با مدل TensorFlow Lite، می توانید از کلاس TensorFlow Lite Support Library ImageProcessor برای مدیریت پیش پردازش داده ها استفاده کنید، همانطور که در زیر نشان داده شده است.
برای تبدیل داده های تصویر برای یک مدل:
از پشتیبانی کتابخانه ImageProcessor برای ایجاد یک شی برای تبدیل داده های تصویر به قالبی استفاده کنید که مدل شما بتواند از آن برای اجرای پیش بینی ها استفاده کند: ( مرجع کد )
private val tfImageProcessor by lazy { val cropSize = minOf(bitmapBuffer.width, bitmapBuffer.height) ImageProcessor.Builder() .add(ResizeWithCropOrPadOp(cropSize, cropSize)) .add(ResizeOp( tfInputSize.height, tfInputSize.width, ResizeOp.ResizeMethod.NEAREST_NEIGHBOR)) .add(Rot90Op(-imageRotationDegrees / 90)) .add(NormalizeOp(0f, 1f)) .build() }
داده های تصویر را از سیستم دوربین اندروید کپی کنید و آن را برای تجزیه و تحلیل با شی ImageProcessor خود آماده کنید: ( مرجع کد )
// Copy out RGB bits to the shared buffer image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer) } // Process the image in Tensorflow val tfImage = tfImageProcessor.process(tfImageBuffer.apply { load(bitmapBuffer) })
پیش بینی ها را اجرا کنید
در برنامه Android خود، هنگامی که یک شی TensorImage با دادههای تصویر در قالب درست ایجاد کردید، میتوانید مدل را با آن دادهها اجرا کنید تا یک پیشبینی یا استنتاج ایجاد کنید. کد مثال برای این آموزش از یک کلاس ObjectDetectionHelper استفاده می کند که این کد را در یک متد predict()
predict کپسوله می کند.
برای اجرای یک پیشبینی روی مجموعهای از دادههای تصویر:
پیشبینی را با ارسال دادههای تصویر به تابع پیشبینی خود اجرا کنید: ( مرجع کد )
// Perform the object detection for the current frame val predictions = detector.predict(tfImage)
برای ایجاد پیشبینی، متد اجرا را در نمونه شی
tflite
خود با دادههای تصویر فراخوانی کنید: ( مرجع کد )fun predict(image: TensorImage): List<ObjectPrediction> { tflite.runForMultipleInputsOutputs(arrayOf(image.buffer), outputBuffer) return predictions }
شئ TensorFlow Lite Interpreter این داده ها را دریافت می کند، آن را بر اساس مدل اجرا می کند و فهرستی از پیش بینی ها را تولید می کند. برای پردازش مداوم داده ها توسط مدل، از runForMultipleInputsOutputs()
استفاده کنید تا اشیای Interpreter ایجاد و سپس توسط سیستم برای هر اجرای پیش بینی حذف نشود.
خروجی مدل دسته
در برنامه Android شما، پس از اجرای دادههای تصویر در برابر مدل تشخیص شی، فهرستی از پیشبینیها را ایجاد میکند که کد برنامه شما باید با اجرای منطق تجاری اضافی، نمایش نتایج به کاربر یا انجام اقدامات دیگر انجام دهد.
خروجی هر مدل TensorFlow Lite از نظر تعداد پیشبینیهایی که تولید میکند (یک یا چند)، و اطلاعات توصیفی برای هر پیشبینی متفاوت است. در مورد یک مدل تشخیص شی، پیشبینیها معمولاً شامل دادههایی برای یک کادر محدود میشوند که نشان میدهد یک شی در کجای تصویر شناسایی شده است. در کد مثال، داده های برگردانده شده به صورت لیستی از اشیاء ObjectPrediction فرمت می شوند، همانطور که در زیر نشان داده شده است: ( مرجع کد )
val predictions get() = (0 until OBJECT_COUNT).map {
ObjectPrediction(
// The locations are an array of [0, 1] floats for [top, left, bottom, right]
location = locations[0][it].let {
RectF(it[1], it[0], it[3], it[2])
},
// SSD Mobilenet V1 Model assumes class 0 is background class
// in label file and class labels start from 1 to number_of_classes + 1,
// while outputClasses correspond to class index from 0 to number_of_classes
label = labels[1 + labelIndices[0][it].toInt()],
// Score is a single value of [0, 1]
score = scores[0][it]
)
}
برای مدل مورد استفاده در این مثال، هر پیشبینی شامل یک مکان جعبه مرزی برای شی، یک برچسب برای شی، و یک امتیاز پیشبینی بین 0 تا 1 بهعنوان یک شناور است که نشاندهنده اطمینان پیشبینی است، که 1 بالاترین رتبه اطمینان است. . به طور کلی، پیشبینیهایی با امتیاز زیر 50 درصد (0.5) غیرقطعی در نظر گرفته میشوند. با این حال، نحوه مدیریت نتایج پیشبینی کم ارزش به شما و نیازهای برنامه شما بستگی دارد.
هنگامی که مدل یک نتیجه پیش بینی را برگرداند، برنامه شما می تواند با ارائه نتیجه به کاربر یا اجرای منطق اضافی، بر اساس آن پیش بینی عمل کند. در مورد کد مثال، برنامه یک کادر محدود در اطراف شی شناسایی شده ترسیم می کند و نام کلاس را روی صفحه نمایش می دهد. برای جزئیات، تابع CameraActivity.reportPrediction()
را در کد مثال مرور کنید.
مراحل بعدی
- کاربردهای مختلف TensorFlow Lite را در مثالها کاوش کنید.
- در مورد استفاده از مدلهای یادگیری ماشین با TensorFlow Lite در بخش Models بیشتر بیاموزید.
- در راهنمای برنامهنویس TensorFlow Lite درباره پیادهسازی یادگیری ماشین در برنامه تلفن همراه خود بیشتر بیاموزید.