גלאי אובייקטים יכולים לזהות אילו אובייקטים מתוך קבוצה ידועה של אובייקטים עשויים להיות נוכחים, ולספק מידע על המיקומים שלהם בתמונה נתונה או בשידור וידאו. מזהה אובייקטים מאומן לזהות את הנוכחות והמיקום של כמה סוגים של אובייקטים. לדוגמה, יכול להיות שמודל יאומן על תמונות שמכילות פירות שונים, יחד עם תווית שמציינת את סוג הפרי שהן מייצגות (למשל, תפוח, בננה או תות), ונתונים שמציינים איפה כל אובייקט מופיע בתמונה. מידע נוסף על גלאי אובייקטים זמין בדוגמה לזיהוי אובייקטים.
אפשר להשתמש ב-Task Library ObjectDetector API כדי לפרוס את גלאי האובייקטים המותאמים אישית או את אלה שאומנו מראש באפליקציות לנייד.
תכונות עיקריות של ObjectDetector API
עיבוד תמונת הקלט, כולל סיבוב, שינוי גודל והמרה של מרחב הצבעים.
תווית של מיקום במפה
סף הניקוד לסינון התוצאות.
תוצאות הזיהוי המובילות (k).
רשימת ההיתרים ורשימת הישויות החסומות של התווית.
מודלים נתמכים של גלאי אובייקטים
המודלים הבאים תואמים בוודאות ל-API של ObjectDetector.
מודלים שנוצרו על ידי AutoML Vision Edge Object Detection.
מודלים שנוצרו על ידי TensorFlow Lite Model Maker for object detector.
מודלים בהתאמה אישית שעומדים בדרישות התאימות למודלים.
הסקת מסקנות ב-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].