يمكنك استخدام حزمة تعلّم الآلة لتسمية العناصر التي يتم التعرّف عليها في صورة، وذلك باستخدام نموذج على الجهاز فقط أو نموذج سحابة. يمكنك الاطّلاع على نظرة عامة للتعرّف على مزايا لكل نهج.
قبل البدء
- إذا لم يسبق لك إضافة Firebase إلى تطبيقك، يمكنك إجراء ذلك من خلال اتّباع الخطوات الأولى في دليل البدء.
- تضمين مكتبات ML Kit في Podfile:
بعد تثبيت مجموعات مشروعك الصغيرة أو تحديثها، احرص على فتح ملف Xcode باستخدامpod 'Firebase/MLVision', '6.25.0'
# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
. - في تطبيقك، استورد Firebase:
Swift
import Firebase
Objective-C
@import Firebase;
-
إذا أردت استخدام النموذج المستند إلى السحابة الإلكترونية، ولم يسبق لك تفعيل لواجهات برمجة التطبيقات القائمة على السحابة الإلكترونية لمشروعك، عليك القيام بذلك الآن:
- فتح ML Kit صفحة واجهات برمجة التطبيقات في وحدة تحكُّم Firebase.
-
إذا لم تكن قد أجريت ترقية لمشروعك إلى خطة أسعار Blaze، انقر على يجب الترقية لإجراء ذلك. (ستتم مطالبتك بالترقية فقط إذا كان مشروعك ليس على خطة Blaze).
يمكن للمشروعات على مستوى Blaze فقط استخدام واجهات برمجة التطبيقات المستنِدة إلى السحابة الإلكترونية.
- إذا لم تكن واجهات برمجة التطبيقات المستنِدة إلى السحابة الإلكترونية مُفعَّلة، انقر على تفعيل البيانات المستندة إلى السحابة الإلكترونية. API.
إذا كنت تريد استخدام النموذج على الجهاز فقط، يمكنك تخطّي هذه الخطوة.
أنت الآن جاهز لتسمية الصور باستخدام إما نموذج على الجهاز فقط أو نموذج يستند إلى السحابة الإلكترونية.
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().onDeviceImageLabeler() // Or, to set the minimum confidence required: // let options = VisionOnDeviceImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().onDeviceImageLabeler(options: options)
Objective-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionOnDeviceImageLabelerOptions *options = // [[FIRVisionOnDeviceImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
إذا أردت استخدام أداة تصنيف الصور في السحابة الإلكترونية، اتّبِع الخطوات التالية:
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
سيتم تمرير العناصر إلى معالج الإكمال. من كل كائن، يمكنك الحصول على
معلومات حول ميزة تم التعرف عليها في الصورة.
على سبيل المثال:
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;
}
نصائح لتحسين الأداء في الوقت الفعلي
إذا أردت تصنيف الصور في تطبيق في الوقت الفعلي، فاتبع هذه الإرشادات لتحقيق أفضل معدلات عرض الإطارات:
- تقييد الطلبات إلى مصنِّف الصور إذا أصبح إطار فيديو جديد المتاحة أثناء تشغيل أداة تصنيف الصور، أفلِت الإطار.
- إذا كنت تستخدم مخرجات أداة تصنيف الصور لتراكب الرسومات على الصورة المدخلة، والحصول أولاً على النتيجة من ML Kit، ثم عرض الصورة وتراكبها في خطوة واحدة. ومن خلال القيام بذلك، يمكنك العرض على سطح الشاشة مرة واحدة فقط لكل إطار إدخال اطّلع على previewOverlayView وFIRDetectionOverlayView الفئات في نموذج تطبيق العرض كمثال.
الخطوات التالية
- قبل نشر تطبيق يستخدم Cloud API في قناة الإصدار العلني، يجب إجراء بعض الخطوات الإضافية لمنع وتخفيف تأثير الوصول غير المُصرح به إلى واجهة برمجة التطبيقات.