Check out what’s new from Firebase at Google I/O 2022. Learn more

Надежно маркируйте изображения с помощью Cloud Vision, используя аутентификацию и функции Firebase на платформах Apple

Чтобы вызывать Google Cloud API из своего приложения, вам необходимо создать промежуточный REST API, который обрабатывает авторизацию и защищает секретные значения, такие как ключи API. Затем вам нужно написать код в своем мобильном приложении для аутентификации и связи с этой промежуточной службой.

Одним из способов создания этого REST API является использование проверки подлинности и функций Firebase, что дает вам управляемый бессерверный шлюз к Google Cloud API, который обрабатывает аутентификацию и может быть вызван из вашего мобильного приложения с предварительно созданными SDK.

В этом руководстве показано, как использовать этот метод для вызова API Cloud Vision из вашего приложения. Этот метод позволит всем аутентифицированным пользователям получать доступ к платным услугам Cloud Vision через ваш облачный проект, поэтому подумайте, достаточно ли этого механизма аутентификации для вашего варианта использования, прежде чем продолжить.

Прежде чем вы начнете

Настройте свой проект

Если вы еще не добавили Firebase в свое приложение, сделайте это, следуя инструкциям в руководстве по началу работы.

Используйте Swift Package Manager для установки и управления зависимостями Firebase.

  1. В Xcode при открытом проекте приложения перейдите в File > Add Packages .
  2. При появлении запроса добавьте репозиторий SDK Firebase для платформ Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Выберите библиотеку Firebase ML.
  5. Когда закончите, Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.

Затем выполните некоторые настройки в приложении:

  1. В вашем приложении импортируйте Firebase:

    Быстрый

    import FirebaseMLModelDownloader

    Цель-C

    @import FirebaseMLModelDownloader;

Еще несколько шагов настройки, и мы готовы к работе:

  1. Если вы еще не включили облачные API для своего проекта, сделайте это сейчас:

    1. Откройте страницу API Firebase ML в консоли Firebase.
    2. Если вы еще не обновили свой проект до тарифного плана Blaze, нажмите « Обновить », чтобы сделать это. (Вам будет предложено обновиться, только если ваш проект не входит в план Blaze.)

      Только проекты уровня Blaze могут использовать облачные API.

    3. Если облачные API еще не включены, щелкните Включить облачные API .
  2. Настройте существующие ключи Firebase API, чтобы запретить доступ к Cloud Vision API:
    1. Откройте страницу учетных данных облачной консоли.
    2. Для каждого ключа API в списке откройте режим редактирования и в разделе «Ограничения ключей» добавьте в список все доступные API, кроме Cloud Vision API.

Разверните вызываемую функцию

Затем разверните облачную функцию, которую вы будете использовать для соединения вашего приложения и API Cloud Vision. Репозиторий functions-samples содержит пример, который вы можете использовать.

По умолчанию при доступе к Cloud Vision API через эту функцию только прошедшие проверку подлинности пользователи вашего приложения получат доступ к Cloud Vision API. Вы можете изменить функцию для различных требований.

Чтобы развернуть функцию:

  1. Клонируйте или загрузите репозиторий functions-samples и перейдите в каталог vision-annotate-image :
    git clone https://github.com/firebase/functions-samples
    cd vision-annotate-image
    
  2. Установить зависимости:
    cd functions
    npm install
    cd ..
    
  3. Если у вас нет Firebase CLI, установите его .
  4. Инициализируйте проект Firebase в каталоге vision-annotate-image . При появлении запроса выберите свой проект в списке.
    firebase init
  5. Разверните функцию:
    firebase deploy --only functions:annotateImage

Добавьте аутентификацию Firebase в свое приложение

Вызываемая функция, развернутая выше, отклонит любой запрос от пользователей вашего приложения, не прошедших проверку подлинности. Если вы еще этого не сделали, вам нужно будет добавить Firebase Auth в свое приложение.

Добавьте необходимые зависимости в ваше приложение

Используйте диспетчер пакетов Swift для установки библиотеки Cloud Functions for Firebase.

Теперь вы готовы маркировать изображения.

1. Подготовьте входное изображение

Чтобы вызвать Cloud Vision, изображение должно быть отформатировано как строка в кодировке base64. Чтобы обработать UIImage :

Быстрый

guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
let base64encodedImage = imageData.base64EncodedString()

Цель-C

NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
NSString *base64encodedImage =
  [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

2. Вызовите вызываемую функцию, чтобы пометить изображение.

Чтобы пометить объекты на изображении, вызовите вызываемую функцию, передав запрос JSON Cloud Vision .

  1. Сначала инициализируйте экземпляр Cloud Functions:

    Быстрый

    lazy var functions = Functions.functions()
    

    Цель-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. Создайте запрос с типом , установленным на LABEL_DETECTION :

    Быстрый

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["maxResults": 5, "type": "LABEL_DETECTION"]
    ]
    

    Цель-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"}
    };
    
  3. Наконец, вызовите функцию:

    Быстрый

    functions.httpsCallable("annotateImage").call(requestData) { (result, error) in
      if let error = error as NSError? {
        if error.domain == FunctionsErrorDomain {
          let code = FunctionsErrorCode(rawValue: error.code)
          let message = error.localizedDescription
          let details = error.userInfo[FunctionsErrorDetailsKey]
        }
        // ...
      }
      // Function completed succesfully
    }
    

    Цель-C

    [[_functions HTTPSCallableWithName:@"annotateImage"]
                              callWithObject:requestData
                                  completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
            if (error) {
              if (error.domain == FIRFunctionsErrorDomain) {
                FIRFunctionsErrorCode code = error.code;
                NSString *message = error.localizedDescription;
                NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
              }
              // ...
            }
            // Function completed succesfully
            // Get information about labeled objects
    
          }];
    

3. Получить информацию о помеченных объектах

Если операция маркировки изображения прошла успешно, в результате задачи будет возвращен ответ JSON BatchAnnotateImagesResponse . Каждый объект в массиве labelAnnotations представляет что-то, что было помечено на изображении. Для каждой метки вы можете получить текстовое описание метки, ее идентификатор объекта сети знаний (если доступен) и показатель достоверности совпадения. Например:

Быстрый

if let labelArray = (result?.data as? [String: Any])?["labelAnnotations"] as? [[String:Any]] {
  for labelObj in labelArray {
    let text = labelObj["description"]
    let entityId = labelObj["mid"]
    let confidence = labelObj["score"]
  }
}

Цель-C

NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
  NSString *text = labelObj[@"description"];
  NSString *entityId = labelObj[@"mid"];
  NSNumber *confidence = labelObj[@"score"];
}