احتفِل بالزهور مع TensorFlow Lite على جهاز iOS.

1. مقدمة

657431be3173fa86.png

TensorFlow هي عبارة عن إطار عمل متعدد الأغراض لتعلّم الآلة. يمكن استخدام TensorFlow في أي مكان بدءًا من تدريب نماذج ضخمة عبر المجموعات العنقودية في السحابة الإلكترونية، وصولاً إلى تشغيل النماذج محليًا على نظام مضمّن، مثل هاتفك.

يستخدم هذا الدرس التطبيقي حول الترميز TensorFlow Lite لتشغيل نموذج التعرّف على الصور على جهاز iOS.

المحتوى الذي ستتعلّمه

  • كيفية تحسين النموذج باستخدام محوّل TFLite.
  • كيفية تشغيله في تطبيق iOS معدّ مسبقًا باستخدام أداة الترجمة الفورية في TFLite.

ما ستقوم بإنشائه

هو تطبيق كاميرا بسيط يشغِّل برنامج TensorFlow للتعرّف على الصور لتحديد الزهور.

المتطلبات الأساسية

إذا كنت تقوم بهذا الدرس التطبيقي حول الترميز على أجهزتك الخاصة، يُرجى التأكد من تثبيت ما يلي:

  • Xcode 10 أو أعلى
  • CocoaPods 1.8.0 أو أحدث

c45ecd122998622e.png

الترخيص: استخدام مجاني

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 في المحاكي نفسه. في ما يلي خطوات معالجة صورة في المحاكي:

  1. صمِّم التطبيق وفقًا لهدف محاكي من اختيارك.
  2. في محاكي iOS، اضغط على Cmd+Shift+H لتصغير التطبيق.
  3. انقر على Safari في أسفل الشاشة الرئيسية وابحث عن صورة.
  4. في نتائج بحث "صور Google"، انقر على إحدى النتائج واضغط مع الاستمرار على الصورة. في مربّع الحوار المنبثق، انقر على "نسخ".
  5. ارجع إلى تطبيق TFL Classify. يجب أن تظهر الصورة المنسوخة تلقائيًا مع نتائج الاستنتاج. وإذا لم يحدث ذلك، فتأكد من نسخ بيانات الصورة نفسها وليس عنوان URL للصورة.

اختبار إنشاء التطبيق وتثبيته

قبل إجراء أي تغييرات على التطبيق، يجب أولاً تشغيل الإصدار المتوفر مع المستودع. حدد جهاز iOS من القائمة المنسدلة في أعلى اليمين:

275753d3a77a0df3.png

بعد ذلك، اضغط على Cmd+R أو اضغط على زر التشغيل f96cf117245c0fa6.png في Xcode لإنشاء التطبيق على جهازك. سيتم تشغيل التطبيق تلقائيًا بعد تثبيته على جهازك.

يستخدم هذا الإصدار من التطبيق شبكة MobileNet القياسية، التي تم تدريبها مسبقًا على فئات 1000 ImageNet. من المفترض أن تظهر بشكلٍ مشابه لما يلي:

d11436f0bb5a75db.jpeg

6- تشغيل التطبيق المخصّص

يعمل الإعداد الافتراضي للتطبيق على تصنيف الصور في إحدى فئات ImageNet التي يبلغ عددها 1000 صورة، باستخدام شبكة MobileNet القياسية.

لنقم الآن بتعديل التطبيق لكي يستخدم النموذج الذي تمت إعادة تدريبه لفئات الصور المخصّصة التي تم تدريبها في Colab.

7. تحويل التطبيق لتشغيل النموذج

إضافة ملفات النموذج إلى المشروع

تتوفّر موارد نموذج المشروع في ImageClassification > Model في أداة التنقّل في مشروع Xcode. لاستبدالها، يجب أولاً حذف الملفين الحاليين في المجموعة Model. اختَر "نقل إلى المهملات" (Move to Trash) عندما يُطلب منك ذلك:

cf2f7fefb2e5075f.png

بعد ذلك، اسحب ملفات model.tflite وlabels.txt التي تم تنزيلها من Colab إلى مجموعة النماذج. تأكّد من اختيار Copy items if needed وAdd to targets عندما يُطلب منك ذلك.

281d7eb72635bb5f.png

تعديل رمز التطبيق

لضمان نجاح تطبيقنا، يجب تعديل مسار منطق تحميل النموذج للإشارة إلى النموذج الجديد الذي أضفناه.

افتح 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 أو اضغط على زر التشغيل f96cf117245c0fa6.png في Xcode لإنشاء التطبيق على جهازك. بعد تشغيل التطبيق، من المفترض أن يظهر على النحو التالي:

c45ecd122998622e.png

يمكنك الضغط مع الاستمرار على زرَّي التشغيل ورفع الصوت معًا لأخذ لقطة شاشة.

والآن، جرِّب البحث على الويب عن الزهور، ووجّه الكاميرا نحو شاشة الكمبيوتر، لترى ما إذا كانت هذه الصور قد تم تصنيفها بشكل صحيح.

أو اطلب من صديق يلتقط صورة لك ويكتشف نوع TensorFlower أنت \\uf339 \\uf33b \\uf337!

9. كيف تعمل هذه الميزة؟

والآن بعد تشغيل التطبيق، لنلقِ نظرة على الرمز المحدد لمنصة TensorFlow Lite.

TensorFlowLiteSwift

يستخدم هذا التطبيق مكتبة TensorFlowLite Swift عبر CocoaPods. مكتبة Swift هي برنامج تضمين سطحي لواجهة TFLite C API، وهي في حد ذاتها برنامج تضمين لمكتبة TFLite C++.

تحصل السطور التالية في ملف Podfile الخاص بالوحدة على أحدث نسخة من مستودع مواصفات CocoaPods العالمية في المجموعة إلى المشروع.

ملف Podfile

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

استخدام واجهة برمجة تطبيقات TensorFlow Lite Swift

وتجدر الإشارة إلى أنّ الرمز الذي يتفاعل مع TensorFlow Lite يتضمّن كلّه في ModelDataHandler.swift.

ضبط إعدادات الجهاز

المجموعة الأولى من الاهتمامات هي أداة تهيئة ModelDataHandler:

ModelDataHandler.swift

/// 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:

ModelDataHandler.swift

interpreter = try Interpreter(modelPath: modelPath, options: options)

المُترجم الفوري مسؤول عن تمرير إدخالات البيانات الأولية من خلال الرسم البياني TensorFlow. ونمرِّر المسار إلى أداة الترجمة في النموذج على القرص، ثم يُحمِّله المُترجم الفوري على أنّه FlatBufferModel.

يُحمِّل السطر الأخير قائمة التصنيفات:

loadLabels(fileInfo: labelsFileInfo)

كل هذا يفعل هو تحميل السلاسل من ملف نصي إلى الذاكرة.

تنفيذ النموذج

المجموعة الثانية محط الاهتمام هي طريقة runModel. يتم استخدام CVPixelBuffer كإدخال، ويتم تشغيل ميزة "المترجم الفوري" ويتم عرض النص لطباعته في التطبيق.

ModelDataHandler.swift

try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)

10. ما هي الخطوات التالية؟

إليك بعض الروابط لمزيد من المعلومات:

  • يمكنك التعرّف على المزيد من المعلومات حول TFLite من خلال المستندات المتوفّرة على tensorflow.org ومستودع المصادر.
  • جرِّب بعض نماذج TFLite المدرّبة مسبقًا، بما في ذلك أداة رصد الكلمات المفتاح للكلام وإصدار الرد الذكي على الجهاز.
  • يمكنك التعرّف على المزيد من المعلومات حول TensorFlow بشكل عام من خلال مستندات البدء.