שילוב מזהי אובייקטים

גלאי אובייקטים יכולים לזהות אילו אובייקטים מתוך קבוצה ידועה של אובייקטים עשויים להיות נוכחים, ולספק מידע על המיקומים שלהם בתמונה נתונה או בשידור וידאו. מזהה אובייקטים מאומן לזהות את הנוכחות והמיקום של כמה סוגים של אובייקטים. לדוגמה, יכול להיות שמודל יאומן על תמונות שמכילות פירות שונים, יחד עם תווית שמציינת את סוג הפרי שהן מייצגות (למשל, תפוח, בננה או תות), ונתונים שמציינים איפה כל אובייקט מופיע בתמונה. מידע נוסף על גלאי אובייקטים זמין בדוגמה לזיהוי אובייקטים.

אפשר להשתמש ב-Task Library ObjectDetector API כדי לפרוס את גלאי האובייקטים המותאמים אישית או את אלה שאומנו מראש באפליקציות לנייד.

תכונות עיקריות של ObjectDetector API

  • עיבוד תמונת הקלט, כולל סיבוב, שינוי גודל והמרה של מרחב הצבעים.

  • תווית של מיקום במפה

  • סף הניקוד לסינון התוצאות.

  • תוצאות הזיהוי המובילות (k).

  • רשימת ההיתרים ורשימת הישויות החסומות של התווית.

מודלים נתמכים של גלאי אובייקטים

המודלים הבאים תואמים בוודאות ל-API של 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.

פרטים על הוספת pods לפרויקט Xcode מופיעים במדריך ל-CocoaPods.

מוסיפים את ה-Pod‏ 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

הצגת תיבות התוחמות בתמונת הקלט:

פלט הזיהוי

אפשר לנסות את כלי ההדגמה הפשוט של CLI ל-ObjectDetector עם מודל ונתוני בדיקה משלכם.

דרישות התאימות של המודל

ממשק ה-API‏ ObjectDetector מצפה לקבל מודל TFLite עם מטא-נתונים של מודל TFLite חובה. אפשר לעיין בדוגמאות ליצירת מטא-נתונים לגלאי אובייקטים באמצעות TensorFlow Lite Metadata Writer API.

מודלים תואמים של גלאי אובייקטים צריכים לעמוד בדרישות הבאות:

  • טנזור של תמונת הקלט: (kTfLiteUInt8/kTfLiteFloat32)

    • קלט תמונה בגודל [batch x height x width x channels].
    • אין תמיכה בהסקת מסקנות באצווה (הערך של batch צריך להיות 1).
    • יש תמיכה רק בקלט RGB (הערך של channels חייב להיות 3).
    • אם הסוג הוא kTfLiteFloat32, צריך לצרף NormalizationOptions למטא-נתונים כדי לבצע נורמליזציה של הקלט.
  • טנסורים של פלט חייבים להיות 4 הפלטים של אופרטור DetectionPostProcess, כלומר:

    • טנזור של מיקומים (kTfLiteFloat32)
    • טנזור בגודל [1 x num_results x 4], המערך הפנימי שמייצג תיבות תוחמות בצורה [top, left, right, bottom].
    • חובה לצרף את המאפיינים BoundingBoxProperties למטא-נתונים, וחובה לציין את type=BOUNDARIES ואת coordinate_type=RATIO.
    • טנזור של סיווגים (kTfLiteFloat32)

    • טנזור בגודל [1 x num_results], שכל ערך בו מייצג את האינדקס של מספר שלם של מחלקה.

    • אפשר לצרף מיפוי תוויות (לא חובה, אבל מומלץ) כ-AssociatedFile-s עם סוג TENSOR_VALUE_LABELS, שמכיל תווית אחת בכל שורה. דוגמה לקובץ תוויות הקובץ המשויך הראשון (אם יש כזה) משמש למילוי השדה class_name בתוצאות. השדה display_name מאוכלס מתוך AssociatedFile (אם יש כזה) שהלוקאל שלו תואם לשדה display_names_locale של ObjectDetectorOptions שנעשה בו שימוש בזמן היצירה (ברירת המחדל היא en, כלומר אנגלית). אם אף אחד מהם לא זמין, רק השדה index בתוצאות יאוכלס.

    • טנסור של תוצאות (kTfLiteFloat32)

    • טנזור בגודל [1 x num_results], כל ערך מייצג את הניקוד של האובייקט שזוהה.

    • מספר טנסור הזיהוי (kTfLiteFloat32)

    • מספר שלם num_results כטנזור בגודל [1].