يمكنك استخدام Firebase ML لتسمية الكائنات التي تم التعرف عليها في الصورة. راجع النظرة العامة للحصول على معلومات حول ميزات واجهة برمجة التطبيقات هذه.
قبل ان تبدأ
- إذا لم تكن قد أضفت Firebase بالفعل إلى تطبيقك ، فقم بذلك باتباع الخطوات الواردة في دليل البدء .
- في Xcode ، مع فتح مشروع التطبيق الخاص بك ، انتقل إلى ملف> إضافة حزم .
- عند المطالبة ، أضف مستودع SDK لأنظمة Apple الأساسية لـ Firebase:
- اختر مكتبة Firebase ML.
- عند الانتهاء ، سيبدأ Xcode تلقائيًا في حل وتنزيل التبعيات الخاصة بك في الخلفية.
- في تطبيقك ، استورد Firebase:
سويفت
import FirebaseMLModelDownloader
ج موضوعية
@import FirebaseMLModelDownloader;
إذا لم تكن قد قمت بالفعل بتمكين واجهات برمجة التطبيقات المستندة إلى السحابة لمشروعك ، فقم بذلك الآن:
- افتح صفحة Firebase ML APIs بوحدة تحكم Firebase.
إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze ، فانقر فوق ترقية للقيام بذلك. (ستتم مطالبتك بالترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)
يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.
- إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة ممكّنة بالفعل ، فانقر فوق تمكين واجهات برمجة التطبيقات المستندة إلى السحابة .
استخدم Swift Package Manager لتثبيت وإدارة تبعيات Firebase.
https://github.com/firebase/firebase-ios-sdk
بعد ذلك ، قم بإجراء بعض الإعداد داخل التطبيق:
أنت الآن جاهز لتسمية الصور.
1. تحضير صورة الإدخال
قم بإنشاء كائن VisionImage
باستخدام UIImage
أو CMSampleBufferRef
.
لاستخدام صورة UIImage
:
- إذا لزم الأمر ، قم بتدوير الصورة بحيث تكون
imageOrientation
هي.up
. - قم بإنشاء كائن
VisionImage
باستخدامUIImage
تم تدويره بشكل صحيح. لا تحدد أي بيانات وصفية للتناوب - يجب استخدام القيمة الافتراضية ،.topLeft
.سويفت
let image = VisionImage(image: uiImage)
ج موضوعية
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
لاستخدام CMSampleBufferRef
:
قم بإنشاء كائن
VisionImageMetadata
يحدد اتجاه بيانات الصورة الموجودة في المخزن المؤقتCMSampleBufferRef
.للحصول على اتجاه الصورة:
سويفت
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 } }
ج موضوعية
- (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; } }
ثم قم بإنشاء كائن البيانات الوصفية:
سويفت
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
ج موضوعية
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
وبيانات تعريف الدوران:سويفت
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
ج موضوعية
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. تكوين وتشغيل أداة تسمية الصورة
لتسمية كائنات في صورة ما ، قم بتمرير كائنVisionImage
إلى طريقة VisionImageLabeler
's processImage()
.أولاً ، احصل على مثيل لـ
VisionImageLabeler
:سويفت
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)
ج موضوعية
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()
:سويفت
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
ج موضوعية
[labeler processImage:image completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. الحصول على معلومات حول الكائنات المسمى
إذا نجحت تسمية الصورة ، فسيتم تمرير مصفوفة من كائناتVisionImageLabel
إلى معالج الإكمال. من كل كائن ، يمكنك الحصول على معلومات حول الميزة التي تم التعرف عليها في الصورة.علي سبيل المثال:
سويفت
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
ج موضوعية
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
الخطوات التالية
- قبل أن تنشر تطبيقًا يستخدم Cloud API لإنتاج تطبيق ، يجب عليك اتخاذ بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المصرح به إلى واجهة برمجة التطبيقات .