1. مقدمة
TensorFlow هي عبارة عن إطار عمل متعدد الأغراض لتعلّم الآلة. يمكن استخدام TensorFlow في أي مكان بدءًا من تدريب نماذج ضخمة عبر المجموعات العنقودية في السحابة الإلكترونية، وصولاً إلى تشغيل النماذج محليًا على نظام مضمّن، مثل هاتفك.
يستخدم هذا الدرس التطبيقي حول الترميز TensorFlow Lite لتشغيل نموذج التعرّف على الصور على جهاز iOS.
المحتوى الذي ستتعلّمه
- كيفية تحسين النموذج باستخدام محوّل TFLite.
- كيفية تشغيله في تطبيق iOS معدّ مسبقًا باستخدام أداة الترجمة الفورية في TFLite.
ما ستقوم بإنشائه
هو تطبيق كاميرا بسيط يشغِّل برنامج TensorFlow للتعرّف على الصور لتحديد الزهور.
المتطلبات الأساسية
إذا كنت تقوم بهذا الدرس التطبيقي حول الترميز على أجهزتك الخاصة، يُرجى التأكد من تثبيت ما يلي:
- Xcode 10 أو أعلى
- CocoaPods 1.8.0 أو أحدث
الترخيص: استخدام مجاني
2. تدريب أداة التعرّف على الزهور باستخدام Colab
سيستخدم هذا الدرس التطبيقي حول الترميز Colaboratory وXcode.
افتح Colab الذي يستخدم TensorFlow Lite model Maker لتدريب مصنِّف من أجل التعرّف على الزهور باستخدام تعلُّم النقل، وتصدير نموذج TFLite لاستخدامه في التطبيق للأجهزة الجوّالة.
3- إعداد دليل العمل
استنساخ مستودع Git
سيؤدي الأمر التالي إلى استنساخ مستودع Git الذي يحتوي على الملفات المطلوبة للدرس التطبيقي حول الترميز:
git clone https://github.com/tensorflow/examples.git
الآن cd
إلى جذر مشروع Xcode للنسخة الاستنساخية التي أنشأتها للتو. هذا هو المكان الذي ستعمل فيه في بقية هذا الدرس التطبيقي حول الترميز:
cd examples/lite/examples/image_classification/ios
4. إعداد تطبيق iOS
تثبيت التبعيات
باستخدام CocoaPods، يمكنك تثبيت ملحقات تطبيق iOS (بما في ذلك TensorFlow Lite). بعد انتهاء أمر التثبيت، افتح ImageClassification.xcworkspace
لفتح المشروع في Xcode.
pod install --repo-update open ImageClassification.xcworkspace
5- اختبار تشغيل التطبيق
من أجل استخدام الكاميرا، يجب تشغيل التطبيق على جهاز حقيقي، نظرًا لأن محاكي iOS لا يمكنه الوصول إلى كاميرا جهاز Mac. لإنشاء تطبيق على جهاز iOS، يجب أن تكون مسجّلاً في برنامج مطوّري برامج Apple أو أن تمتلك إمكانية الوصول إلى جهاز قدّمه لك شخص آخر.
إذا أردت تشغيل هذا الدرس التطبيقي حول الترميز في المحاكي، عليك نسخ الصور إلى اللوح من Safari في المحاكي نفسه. في ما يلي خطوات معالجة صورة في المحاكي:
- صمِّم التطبيق وفقًا لهدف محاكي من اختيارك.
- في محاكي iOS، اضغط على Cmd+Shift+H لتصغير التطبيق.
- انقر على Safari في أسفل الشاشة الرئيسية وابحث عن صورة.
- في نتائج بحث "صور Google"، انقر على إحدى النتائج واضغط مع الاستمرار على الصورة. في مربّع الحوار المنبثق، انقر على "نسخ".
- ارجع إلى تطبيق TFL Classify. يجب أن تظهر الصورة المنسوخة تلقائيًا مع نتائج الاستنتاج. وإذا لم يحدث ذلك، فتأكد من نسخ بيانات الصورة نفسها وليس عنوان URL للصورة.
اختبار إنشاء التطبيق وتثبيته
قبل إجراء أي تغييرات على التطبيق، يجب أولاً تشغيل الإصدار المتوفر مع المستودع. حدد جهاز iOS من القائمة المنسدلة في أعلى اليمين:
بعد ذلك، اضغط على Cmd+R أو اضغط على زر التشغيل في Xcode لإنشاء التطبيق على جهازك. سيتم تشغيل التطبيق تلقائيًا بعد تثبيته على جهازك.
يستخدم هذا الإصدار من التطبيق شبكة MobileNet القياسية، التي تم تدريبها مسبقًا على فئات 1000 ImageNet. من المفترض أن تظهر بشكلٍ مشابه لما يلي:
6- تشغيل التطبيق المخصّص
يعمل الإعداد الافتراضي للتطبيق على تصنيف الصور في إحدى فئات ImageNet التي يبلغ عددها 1000 صورة، باستخدام شبكة MobileNet القياسية.
لنقم الآن بتعديل التطبيق لكي يستخدم النموذج الذي تمت إعادة تدريبه لفئات الصور المخصّصة التي تم تدريبها في Colab.
7. تحويل التطبيق لتشغيل النموذج
إضافة ملفات النموذج إلى المشروع
تتوفّر موارد نموذج المشروع في ImageClassification > Model
في أداة التنقّل في مشروع Xcode. لاستبدالها، يجب أولاً حذف الملفين الحاليين في المجموعة Model
. اختَر "نقل إلى المهملات" (Move to Trash) عندما يُطلب منك ذلك:
بعد ذلك، اسحب ملفات model.tflite
وlabels.txt
التي تم تنزيلها من Colab إلى مجموعة النماذج. تأكّد من اختيار Copy items if needed
وAdd to targets
عندما يُطلب منك ذلك.
تعديل رمز التطبيق
لضمان نجاح تطبيقنا، يجب تعديل مسار منطق تحميل النموذج للإشارة إلى النموذج الجديد الذي أضفناه.
افتح ModelDataHandler.swift (مسار التنقّل في Xcode: ImageClassification -> modelDataHandler -> ModelDataHandler.swift) وغيِّر السطر 36 إلى.
// before static let modelInfo: FileInfo = (name: "mobilenet_quant_v1_224", extension: "tflite") // after static let modelInfo: FileInfo = (name: "model", extension: "tflite")
تأكَّد من حفظ جميع التغييرات.
8. تشغيل التطبيق المخصّص
اضغط على Cmd+B أو اضغط على زر التشغيل في Xcode لإنشاء التطبيق على جهازك. بعد تشغيل التطبيق، من المفترض أن يظهر على النحو التالي:
يمكنك الضغط مع الاستمرار على زرَّي التشغيل ورفع الصوت معًا لأخذ لقطة شاشة.
والآن، جرِّب البحث على الويب عن الزهور، ووجّه الكاميرا نحو شاشة الكمبيوتر، لترى ما إذا كانت هذه الصور قد تم تصنيفها بشكل صحيح.
أو اطلب من صديق يلتقط صورة لك ويكتشف نوع TensorFlower أنت
!
9. كيف تعمل هذه الميزة؟
والآن بعد تشغيل التطبيق، لنلقِ نظرة على الرمز المحدد لمنصة TensorFlow Lite.
TensorFlowLiteSwift
يستخدم هذا التطبيق مكتبة TensorFlowLite Swift عبر CocoaPods. مكتبة Swift هي برنامج تضمين سطحي لواجهة TFLite C API، وهي في حد ذاتها برنامج تضمين لمكتبة TFLite C++.
تحصل السطور التالية في ملف Podfile الخاص بالوحدة على أحدث نسخة من مستودع مواصفات CocoaPods العالمية في المجموعة إلى المشروع.
target 'ImageClassification' do
use_frameworks!
# Pods for ImageClassification
pod 'TensorFlowLiteSwift'
end
استخدام واجهة برمجة تطبيقات TensorFlow Lite Swift
وتجدر الإشارة إلى أنّ الرمز الذي يتفاعل مع TensorFlow Lite يتضمّن كلّه في ModelDataHandler.swift.
ضبط إعدادات الجهاز
المجموعة الأولى من الاهتمامات هي أداة تهيئة ModelDataHandler
:
/// A failable initializer for `ModelDataHandler`. A new instance is created if the model and
/// labels files are successfully loaded from the app's main bundle. Default `threadCount` is 1.
init?(modelFileInfo: FileInfo, labelsFileInfo: FileInfo, threadCount: Int = 1) {
let modelFilename = modelFileInfo.name
// Construct the path to the model file.
guard let modelPath = Bundle.main.path(
forResource: modelFilename,
ofType: modelFileInfo.extension
) else {
print("Failed to load the model file with name: \(modelFilename).")
return nil
}
// Specify the options for the `Interpreter`.
self.threadCount = threadCount
var options = InterpreterOptions()
options.threadCount = threadCount
do {
// Create the `Interpreter`.
interpreter = try Interpreter(modelPath: modelPath, options: options)
// Allocate memory for the model's input `Tensor`s.
try interpreter.allocateTensors()
} catch let error {
print("Failed to create the interpreter with error: \(error.localizedDescription)")
return nil
}
// Load the classes listed in the labels file.
loadLabels(fileInfo: labelsFileInfo)
}
هناك بضعة أسطر يجب مناقشتها بمزيد من التفصيل.
ينشئ السطر التالي مترجم TFLite:
interpreter = try Interpreter(modelPath: modelPath, options: options)
المُترجم الفوري مسؤول عن تمرير إدخالات البيانات الأولية من خلال الرسم البياني TensorFlow. ونمرِّر المسار إلى أداة الترجمة في النموذج على القرص، ثم يُحمِّله المُترجم الفوري على أنّه FlatBufferModel.
يُحمِّل السطر الأخير قائمة التصنيفات:
loadLabels(fileInfo: labelsFileInfo)
كل هذا يفعل هو تحميل السلاسل من ملف نصي إلى الذاكرة.
تنفيذ النموذج
المجموعة الثانية محط الاهتمام هي طريقة runModel
. يتم استخدام CVPixelBuffer
كإدخال، ويتم تشغيل ميزة "المترجم الفوري" ويتم عرض النص لطباعته في التطبيق.
try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)
10. ما هي الخطوات التالية؟
إليك بعض الروابط لمزيد من المعلومات:
- يمكنك التعرّف على المزيد من المعلومات حول TFLite من خلال المستندات المتوفّرة على tensorflow.org ومستودع المصادر.
- جرِّب بعض نماذج TFLite المدرّبة مسبقًا، بما في ذلك أداة رصد الكلمات المفتاح للكلام وإصدار الرد الذكي على الجهاز.
- يمكنك التعرّف على المزيد من المعلومات حول TensorFlow بشكل عام من خلال مستندات البدء.