میتوانید از کیت ML برای تشخیص نشانههای شناخته شده در یک تصویر استفاده کنید.
قبل از شروع
- اگر قبلاً Firebase را به برنامه خود اضافه نکرده اید، این کار را با دنبال کردن مراحل راهنمای شروع کار انجام دهید.
- کتابخانه های ML Kit را در پادفایل خود قرار دهید:
پس از نصب یا بهروزرسانی Pods پروژه، حتماً پروژه Xcode خود را با استفاده ازpod 'Firebase/MLVision', '6.25.0'
.xcworkspace
آن باز کنید. - در برنامه خود، Firebase را وارد کنید:
سویفت
import Firebase
هدف-C
@import Firebase;
اگر قبلاً API های مبتنی بر Cloud را برای پروژه خود فعال نکرده اید، اکنون این کار را انجام دهید:
- صفحه ML Kit APIs کنسول Firebase را باز کنید.
اگر قبلاً پروژه خود را به طرح قیمت گذاری Blaze ارتقا نداده اید، برای انجام این کار، روی ارتقا کلیک کنید. (فقط اگر پروژه شما در طرح Blaze نباشد، از شما خواسته می شود که ارتقا دهید.)
فقط پروژه های سطح Blaze می توانند از API های مبتنی بر ابر استفاده کنند.
- اگر APIهای مبتنی بر Cloud قبلاً فعال نشدهاند، روی Enable Cloud-based APIs کلیک کنید.
آشکارساز نقطه عطف را پیکربندی کنید
به طور پیش فرض، آشکارساز ابر از نسخه پایدار مدل استفاده می کند و حداکثر 10 نتیجه را برمی گرداند. اگر می خواهید یکی از این تنظیمات را تغییر دهید، آنها را با یک شی VisionCloudDetectorOptions
مانند مثال زیر مشخص کنید:
سویفت
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
هدف-C
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
در مرحله بعد، شی VisionCloudDetectorOptions
را هنگام ایجاد شی Cloud detector ارسال کنید.
آشکارساز نقطه عطف را اجرا کنید
برای تشخیص نشانهها در یک تصویر، تصویر را بهعنوانUIImage
یا CMSampleBufferRef
به روش detect(in:)
VisionCloudLandmarkDetector
ارسال کنید:- یک نمونه از
VisionCloudLandmarkDetector
را دریافت کنید:سویفت
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
هدف-C
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
یک شی
VisionImage
با استفاده ازUIImage
یاCMSampleBufferRef
ایجاد کنید.برای استفاده از
UIImage
:- در صورت لزوم، تصویر را بچرخانید تا ویژگی
imageOrientation
آن.up
باشد. - یک شی
VisionImage
با استفاده ازUIImage
با چرخش صحیح ایجاد کنید. هیچ ابرداده چرخشی را مشخص نکنید—مقدار پیشفرض،.topLeft
باید استفاده شود.سویفت
let image = VisionImage(image: uiImage)
هدف-C
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 } }
هدف-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; } }
سپس، شی فوق داده را ایجاد کنید:
سویفت
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
هدف-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
و ابرداده چرخش ایجاد کنید:سویفت
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
هدف-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- در صورت لزوم، تصویر را بچرخانید تا ویژگی
- سپس تصویر را به متد
detect(in:)
منتقل کنید:سویفت
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
هدف-C
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
اطلاعاتی در مورد نشانه های شناخته شده دریافت کنید
اگر تشخیص نشانه موفقیت آمیز باشد، آرایه ای از اشیاءVisionCloudLandmark
به کنترل کننده تکمیل ارسال می شود. از هر شی، می توانید اطلاعاتی در مورد یک نقطه عطف شناسایی شده در تصویر دریافت کنید.به عنوان مثال:
سویفت
for landmark in landmarks { let landmarkDesc = landmark.landmark let boundingPoly = landmark.frame let entityId = landmark.entityId // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for location in landmark.locations { let latitude = location.latitude let longitude = location.longitude } let confidence = landmark.confidence }
هدف-C
for (FIRVisionCloudLandmark *landmark in landmarks) { NSString *landmarkDesc = landmark.landmark; CGRect frame = landmark.frame; NSString *entityId = landmark.entityId; // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for (FIRVisionLatitudeLongitude *location in landmark.locations) { double latitude = [location.latitude doubleValue]; double longitude = [location.longitude doubleValue]; } float confidence = [landmark.confidence floatValue]; }
مراحل بعدی
- قبل از استقرار برای تولید برنامهای که از Cloud API استفاده میکند، باید اقدامات بیشتری را برای جلوگیری و کاهش تأثیر دسترسی غیرمجاز API انجام دهید.