אתם יכולים להשתמש ב-Firebase ML כדי להוסיף תוויות לאובייקטים שזוהו בתמונה. מידע על התכונות של ה-API הזה מופיע בסקירה הכללית.
לפני שמתחילים
-
אם עדיין לא הוספתם את Firebase לאפליקציה, אתם צריכים לעשות זאת לפי השלבים במדריך תחילת העבודה.
- ב-Xcode, כשפרויקט האפליקציה פתוח, עוברים אל File > Add Packages (קובץ > הוספת חבילות).
- כשמוצגת בקשה, מוסיפים את מאגר Firebase Apple platforms SDK:
- בוחרים את הספרייה Firebase ML.
- מוסיפים את הדגל
-ObjC
לקטע Other Linker Flags בהגדרות הבנייה של יעד הקישור. - אחרי שתסיימו, פלטפורמת Xcode תתחיל באופן אוטומטי לטפל ביחסי התלות ולהוריד אותם ברקע.
- באפליקציה, מייבאים את Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
אם עדיין לא הפעלתם ממשקי API מבוססי-Cloud בפרויקט, עכשיו הזמן לעשות זאת:
- פותחים את Firebase ML הדף APIs במסוף Firebase.
-
אם עדיין לא שדרגתם את הפרויקט לתוכנית התמחור Blaze עם תשלום לפי שימוש, לוחצים על שדרוג כדי לעשות זאת. (ההצעה לשדרוג תוצג רק אם הפרויקט לא נמצא בתוכנית התמחור Blaze).
רק פרויקטים בתוכנית התמחור Blaze יכולים להשתמש בממשקי API מבוססי-Cloud.
- אם ממשקי API מבוססי-ענן לא מופעלים כבר, לוחצים על הפעלת ממשקי API מבוססי-ענן.
משתמשים ב-Swift Package Manager כדי להתקין ולנהל יחסי תלות ב-Firebase.
https://github.com/firebase/firebase-ios-sdk.git
עכשיו מבצעים הגדרה באפליקציה:
עכשיו אפשר לתייג תמונות.
1. הכנת תמונת הקלט
יוצרים אובייקט VisionImage
באמצעות UIImage
או CMSampleBufferRef
.
כדי להשתמש ב-UIImage
:
- אם צריך, מסובבים את התמונה כך שהמאפיין
imageOrientation
שלה יהיה.up
. - יוצרים אובייקט
VisionImage
באמצעותUIImage
מסובב בצורה נכונה. לא מציינים מטא-נתונים של סיבוב – צריך להשתמש בערך ברירת המחדל,.topLeft
.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
כדי להשתמש ב-CMSampleBufferRef
:
-
יוצרים אובייקט
VisionImageMetadata
שמציין את האוריינטציה של נתוני התמונה שכלולים במאגרCMSampleBufferRef
.כדי לקבל את כיוון התמונה:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
לאחר מכן, יוצרים את אובייקט המטא-נתונים:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- יוצרים אובייקט
VisionImage
באמצעות האובייקטCMSampleBufferRef
ומטא-הנתונים של הסיבוב:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. הגדרה והרצה של הכלי לתוויות תמונות
כדי להוסיף תוויות לאובייקטים בתמונה, מעבירים את האובייקטVisionImage
לשיטה processImage()
של VisionImageLabeler
.
קודם כל, צריך ליצור מכונה של
VisionImageLabeler
:Swift
let labeler = Vision.vision().cloudImageLabeler() // Or, to set the minimum confidence required: // let options = VisionCloudImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().cloudImageLabeler(options: options)
Objective-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionCloudImageLabelerOptions *options = // [[FIRVisionCloudImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] cloudImageLabelerWithOptions:options];
לאחר מכן, מעבירים את התמונה לשיטה
processImage()
:Swift
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Objective-C
[labeler processImage:image completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. קבלת מידע על אובייקטים עם תוויות
אם התיוג של התמונה יצליח, מערך שלVisionImageLabel
אובייקטים יועבר ל-completion handler. מכל אובייקט אפשר לקבל מידע על תכונה שזוהתה בתמונה.
לדוגמה:
Swift
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
Objective-C
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
השלבים הבאים
- לפני שפורסים בסביבת הייצור אפליקציה שמשתמשת ב-Cloud API, כדאי לבצע כמה שלבים נוספים כדי למנוע גישה לא מורשית ל-API ולצמצם את ההשפעה שלה.