دمج أدوات رصد الكائنات

يمكن لأدوات رصد العناصر تحديد العناصر التي قد تكون متوفرة من مجموعة معروفة من العناصر وتقديم معلومات حول مواضعها ضمن الصورة المحدّدة أو بث الفيديو. يتم تدريب أداة رصد الأجسام على رصد وجود عدة فئات من الأجسام وموقعها الجغرافي. على سبيل المثال، يمكن تدريب نموذج باستخدام صور تحتوي على أنواع مختلفة من الفاكهة، بالإضافة إلى تصنيف يحدّد فئة الفاكهة التي تمثّلها (مثل تفاحة أو موزة أو فراولة)، وبيانات تحدّد موضع كل عنصر في الصورة. يمكنك الاطّلاع على مثال على رصد الكائنات للحصول على مزيد من المعلومات حول أدوات رصد الكائنات.

استخدِم واجهة برمجة التطبيقات Task Library ObjectDetector لنشر أدوات رصد العناصر المخصّصة أو تلك التي تم تدريبها مسبقًا في تطبيقاتك على الأجهزة الجوّالة.

الميزات الرئيسية في ObjectDetector API

  • معالجة الصور المدخلة، بما في ذلك التدوير وتغيير الحجم وتحويل مساحة الألوان

  • لغة خريطة التصنيفات

  • الحد الأدنى للنتيجة لفلترة النتائج.

  • أهم k نتائج رصد.

  • القائمة المسموح بها والقائمة المرفوضة للتصنيفات

طُرز أدوات رصد الأجسام المتوافقة

نضمن توافق الطُرز التالية مع واجهة برمجة التطبيقات ObjectDetector.

تشغيل الاستنتاج في Java

اطّلِع على تطبيق مرجعي خاص بميزة "رصد الأجسام" للحصول على مثال حول كيفية استخدام ObjectDetector في تطبيق Android.

الخطوة 1: استيراد تبعية Gradle والإعدادات الأخرى

انسخ ملف نموذج .tflite إلى دليل مواد العرض الخاص بوحدة Android التي سيتم تشغيل النموذج فيها. حدِّد أنّه يجب عدم ضغط الملف، وأضِف مكتبة TensorFlow Lite إلى ملف build.gradle الخاص بالوحدة:

android {
    // Other settings

    // Specify tflite file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }
}

dependencies {
    // Other dependencies

    // Import the Task Vision Library dependency
    implementation 'org.tensorflow:tensorflow-lite-task-vision'
    // Import the GPU delegate plugin Library for GPU inference
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin'
}

الخطوة 2: استخدام النموذج

// Initialization
ObjectDetectorOptions options =
    ObjectDetectorOptions.builder()
        .setBaseOptions(BaseOptions.builder().useGpu().build())
        .setMaxResults(1)
        .build();
ObjectDetector objectDetector =
    ObjectDetector.createFromFileAndOptions(
        context, modelFile, options);

// Run inference
List<Detection> results = objectDetector.detect(image);

يمكنك الاطّلاع على رمز المصدر وjavadoc لمعرفة المزيد من الخيارات لإعداد ObjectDetector.

تنفيذ الاستدلال في نظام التشغيل iOS

الخطوة 1: تثبيت التبعيات

تتيح "مكتبة المهام" إمكانية التثبيت باستخدام CocoaPods. تأكَّد من تثبيت CocoaPods على نظامك. يُرجى الاطّلاع على دليل تثبيت CocoaPods للحصول على التعليمات.

يُرجى الاطّلاع على دليل CocoaPods لمعرفة تفاصيل حول إضافة وحدات إلى مشروع Xcode.

أضِف مجموعة الإعلانات المتسلسلة TensorFlowLiteTaskVision في ملف Podfile.

target 'MyAppWithTaskAPI' do
  use_frameworks!
  pod 'TensorFlowLiteTaskVision'
end

تأكَّد من أنّ نموذج .tflite الذي ستستخدمه للاستدلال مضمّن في حِزمة تطبيقك.

الخطوة 2: استخدام النموذج

Swift

// Imports
import TensorFlowLiteTaskVision

// Initialization
guard let modelPath = Bundle.main.path(forResource: "ssd_mobilenet_v1",
                                            ofType: "tflite") else { return }

let options = ObjectDetectorOptions(modelPath: modelPath)

// Configure any additional options:
// options.classificationOptions.maxResults = 3

let detector = try ObjectDetector.detector(options: options)

// Convert the input image to MLImage.
// There are other sources for MLImage. For more details, please see:
// https://developers.google.com/ml-kit/reference/ios/mlimage/api/reference/Classes/GMLImage
guard let image = UIImage (named: "cats_and_dogs.jpg"), let mlImage = MLImage(image: image) else { return }

// Run inference
let detectionResult = try detector.detect(mlImage: mlImage)

Objective-C

// Imports
#import <TensorFlowLiteTaskVision/TensorFlowLiteTaskVision.h>

// Initialization
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"ssd_mobilenet_v1" ofType:@"tflite"];

TFLObjectDetectorOptions *options = [[TFLObjectDetectorOptions alloc] initWithModelPath:modelPath];

// Configure any additional options:
// options.classificationOptions.maxResults = 3;

TFLObjectDetector *detector = [TFLObjectDetector objectDetectorWithOptions:options
                                                                     error:nil];

// Convert the input image to MLImage.
UIImage *image = [UIImage imageNamed:@"dogs.jpg"];

// There are other sources for GMLImage. For more details, please see:
// https://developers.google.com/ml-kit/reference/ios/mlimage/api/reference/Classes/GMLImage
GMLImage *gmlImage = [[GMLImage alloc] initWithImage:image];

// Run inference
TFLDetectionResult *detectionResult = [detector detectWithGMLImage:gmlImage error:nil];

يمكنك الاطّلاع على رمز المصدر لمعرفة المزيد من الخيارات لإعداد TFLObjectDetector.

تشغيل الاستنتاج في Python

الخطوة 1: تثبيت حزمة pip

pip install tflite-support

الخطوة 2: استخدام النموذج

# Imports
from tflite_support.task import vision
from tflite_support.task import core
from tflite_support.task import processor

# Initialization
base_options = core.BaseOptions(file_name=model_path)
detection_options = processor.DetectionOptions(max_results=2)
options = vision.ObjectDetectorOptions(base_options=base_options, detection_options=detection_options)
detector = vision.ObjectDetector.create_from_options(options)

# Alternatively, you can create an object detector in the following manner:
# detector = vision.ObjectDetector.create_from_file(model_path)

# Run inference
image = vision.TensorImage.create_from_file(image_path)
detection_result = detector.detect(image)

يمكنك الاطّلاع على رمز المصدر لمعرفة المزيد من الخيارات لإعداد ObjectDetector.

تشغيل الاستدلال في C++‎

// Initialization
ObjectDetectorOptions options;
options.mutable_base_options()->mutable_model_file()->set_file_name(model_path);
std::unique_ptr<ObjectDetector> object_detector = ObjectDetector::CreateFromOptions(options).value();

// Create input frame_buffer from your inputs, `image_data` and `image_dimension`.
// See more information here: tensorflow_lite_support/cc/task/vision/utils/frame_buffer_common_utils.h
std::unique_ptr<FrameBuffer> frame_buffer = CreateFromRgbRawBuffer(
      image_data, image_dimension);

// Run inference
const DetectionResult result = object_detector->Detect(*frame_buffer).value();

يمكنك الاطّلاع على رمز المصدر لمعرفة المزيد من الخيارات لإعداد ObjectDetector.

أمثلة النتائج

في ما يلي مثال على نتائج رصد ssd mobilenet v1 من TensorFlow Hub.

كلاب

Results:
 Detection #0 (red):
  Box: (x: 355, y: 133, w: 190, h: 206)
  Top-1 class:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1 (green):
  Box: (x: 103, y: 15, w: 138, h: 369)
  Top-1 class:
   index       : 17
   score       : 0.73047
   class name  : dog

عرض المربّعات المحيطة على الصورة المُدخَلة:

نتائج الرصد

جرِّب أداة العرض التوضيحي البسيطة لواجهة سطر الأوامر الخاصة بـ ObjectDetector باستخدام النموذج وبيانات الاختبار الخاصة بك.

متطلبات التوافق مع الطراز

تتوقّع واجهة برمجة التطبيقات ObjectDetector نموذج TFLite يتضمّن بيانات وصفية إلزامية لنموذج TFLite. يمكنك الاطّلاع على أمثلة حول إنشاء بيانات وصفية لأدوات رصد العناصر باستخدام TensorFlow Lite Metadata Writer API.

يجب أن تستوفي نماذج رصد العناصر المتوافقة المتطلبات التالية:

  • موتر الصورة المدخَلة: (kTfLiteUInt8/kTfLiteFloat32)

    • إدخال صورة بحجم [batch x height x width x channels]
    • لا تتوفّر الاستدلالات المجمّعة (يجب أن تكون قيمة batch هي 1).
    • يُسمح فقط بإدخال قيم RGB (يجب أن تكون قيمة channels هي 3).
    • إذا كان النوع kTfLiteFloat32، يجب إرفاق NormalizationOptions بالبيانات الوصفية لتسوية الإدخال.
  • يجب أن تكون موترات الإخراج هي المخرجات الأربعة لعملية DetectionPostProcess، أي:

    • متّجه المواقع الجغرافية (kTfLiteFloat32)
    • موتر بحجم [1 x num_results x 4]، وهو عبارة عن مصفوفة داخلية تمثّل مربّعات محيطة بالشكل [أعلى، يمين، يسار، أسفل].
    • يجب إرفاق BoundingBoxProperties بالبيانات الوصفية، ويجب تحديد type=BOUNDARIES وcoordinate_type=RATIO.
    • متّجه الفئات (kTfLiteFloat32)

    • موتر بحجم [1 x num_results]، وتمثّل كل قيمة فيه الفهرس الصحيح لفئة.

    • يمكن إرفاق خرائط التصنيفات الاختيارية (ولكن يُنصح بها) كملفات AssociatedFile-s من النوع TENSOR_VALUE_LABELS، مع تضمين تصنيف واحد لكل سطر. اطّلِع على مثال لملف التصنيفات. يتم استخدام أول AssociatedFile (إن وُجد) لملء الحقل class_name في النتائج. يتم ملء الحقل display_name من AssociatedFile (إذا كان متاحًا) الذي تتطابق لغته مع الحقل display_names_locale الخاص بـ ObjectDetectorOptions المستخدَم في وقت الإنشاء (القيمة التلقائية هي "en"، أي الإنجليزية). إذا لم يتوفّر أيّ من هذه الحقول، سيتم ملء الحقل index فقط في النتائج.

    • متّجه النتائج (kTfLiteFloat32)

    • موتر بالحجم [1 x num_results]، تمثّل كل قيمة فيه نتيجة الكائن الذي تم رصده.

    • عدد متّجه الرصد (kTfLiteFloat32)

    • عدد صحيح num_results كمتّجه بحجم [1].