Вы можете использовать Firebase ML для маркировки объектов, распознанных на изображении. Подробнее о возможностях этого API см. в обзоре .
Прежде чем начать
-  Если вы еще не добавили Firebase в свое приложение, сделайте это, следуя инструкциям в руководстве по началу работы .
- В Xcode откройте проект приложения и перейдите в Файл > Добавить пакеты .
- При появлении запроса добавьте репозиторий Firebase Apple Platforms SDK:
- Выберите библиотеку Firebase ML .
-  Добавьте флаг -ObjCв раздел «Другие флаги компоновщика» настроек сборки вашей целевой системы.
- После завершения Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.
-  В вашем приложении импортируйте Firebase: Быстрыйimport FirebaseMLModelDownloader Objective-C@import FirebaseMLModelDownloader; 
- Если вы еще не включили облачные API для своего проекта, сделайте это сейчас: - Откройте страницу Firebase ML API в консоли Firebase .
- Если вы ещё не перевели свой проект на тарифный план Blaze с оплатой по мере использования , нажмите «Обновить» , чтобы сделать это. (Вам будет предложено обновиться, только если ваш проект не входит в тарифный план Blaze.) - Облачные API могут использовать только проекты на тарифном плане Blaze. 
- Если облачные API еще не включены, нажмите Включить облачные API .
 
Используйте Swift Package Manager для установки и управления зависимостями Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Далее выполните некоторые настройки в приложении:
Теперь вы готовы маркировать изображения.
1. Подготовьте входное изображение.
 Создайте объект VisionImage , используя UIImage или CMSampleBufferRef .
 Чтобы использовать UIImage :
-  При необходимости поверните изображение так, чтобы его свойство imageOrientationбыло равно.up.
-  Создайте объект VisionImage, используя правильно повёрнутыйUIImage. Не указывайте метаданные поворота — необходимо использовать значение по умолчанию,.topLeft.Быстрыйlet image = VisionImage(image: uiImage) Objective-CFIRVisionImage *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 } } - 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; } } - Затем создайте объект метаданных: - Быстрый- 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и метаданные поворота:Быстрыйlet image = VisionImage(buffer: sampleBuffer) image.metadata = metadata Objective-CFIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata; 
2. Настройте и запустите маркировщик изображений.
Чтобы маркировать объекты на изображении, передайте объектVisionImage методу processImage() объекта VisionImageLabeler .- Сначала получите экземпляр - 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)- 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():- Быстрый- 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 будет передан обработчику завершения. Из каждого объекта можно получить информацию о распознанном на изображении элементе.Например:
Быстрый
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;
}
Следующие шаги
- Перед тем как развернуть в рабочей среде приложение, использующее облачный API, следует предпринять некоторые дополнительные шаги для предотвращения и минимизации последствий несанкционированного доступа к API .