Распознавание текста и черт лица ML Kit: iOS

1. Введение

ML Kit — это мобильный SDK, который переносит опыт Google в области машинного обучения в приложения для Android и iOS в мощном, но простом в использовании пакете. Независимо от того, новичок вы или опытный специалист в области машинного обучения, вы можете легко реализовать необходимую функциональность всего несколькими строками кода. Для начала работы не требуется глубоких знаний нейронных сетей или оптимизации моделей.

Как это работает?

ML Kit упрощает применение методов машинного обучения в ваших приложениях, объединяя технологии машинного обучения Google, такие как Mobile Vision и TensorFlow Lite , в одном SDK. Независимо от того, нужны ли вам возможности обработки данных в реальном времени, предоставляемые моделями Mobile Vision, работающими на устройстве, или гибкость пользовательских моделей классификации изображений TensorFlow Lite, ML Kit позволяет реализовать это всего несколькими строками кода.

В этом практическом занятии вы научитесь создавать собственное iOS-приложение, способное автоматически распознавать текст и черты лица на изображении.

Что вы построите

В этом практическом занятии вы создадите iOS-приложение с помощью ML Kit . Ваше приложение будет:

  • Используйте API распознавания текста ML Kit для обнаружения текста на изображениях.
  • Используйте API ML Kit для распознавания лиц на изображениях.

Image of Grace Hopper demonstrating ML KIt Face Recognition APIImage of sign on grass demonstrating text recognition API

Что вы узнаете

  • Как использовать SDK ML Kit для простого добавления расширенных возможностей машинного обучения, таких как распознавание текста и определение черт лица, в любое приложение iOS.

Что вам понадобится

  • Последняя версия Xcode (v12.4+)
  • Симулятор iOS или физическое устройство iOS с операционной системой iOS 10.0 и выше.
  • ML Kit поддерживает только две 64-битные архитектуры: x86_64 и arm64
  • Пример кода
  • Базовые знания разработки iOS на Swift.
  • Базовое понимание моделей машинного обучения.

Данный практический урок посвящен ML Kit. Несущественные концепции и блоки кода опущены и предоставлены для простого копирования и вставки.

2. Настройка

Скачать код

Чтобы скачать весь код для этого практического занятия, перейдите по следующей ссылке:

Распакуйте загруженный zip-файл. Это создаст корневую папку ( mlkit-ios-codelab ) со всеми необходимыми ресурсами. Для этого практического занятия вам понадобятся только ресурсы из подкаталога vision .

Подкаталог vision в репозитории mlkit-ios-codelab содержит два каталога:

  • android_studio_folder.png Стартовый код — это начальный код, на основе которого вы будете строить дальнейшую работу в этом практическом занятии.
  • android_studio_folder.png Завершенный код — код готового демонстрационного приложения.

Добавьте зависимости для ML Kit с помощью CocoaPods.

CocoaPods используется для добавления зависимостей ML Kit в ваше приложение. Если у вас не установлен CocoaPods, инструкции по его установке можно найти здесь . После установки откройте Podfile в вашем любимом редакторе и добавьте ML Kit в качестве зависимостей:

Podfile

platform :ios, '10.0'
use_frameworks!

pod 'GoogleMLKit/FaceDetection'
pod 'GoogleMLKit/TextRecognition'

target 'MLKit-codelab' do
end

Установите капсулы ML Kit Cocoa Pods.

Чтобы убедиться в доступности всех зависимостей для вашего приложения, следует использовать командную строку для установки Cocoa Pods из ML Kit.

Командная строка

# Make sure you are in the root of your app
pod install
xed .

3. Запустите стартовое приложение.

Теперь вы готовы запустить приложение в первый раз. Нажмите 98205811bbed9d74.png Запустите команду в Xcode, чтобы скомпилировать приложение и запустить его в симуляторе iOS.

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

4. Добавить функцию распознавания текста на устройстве.

На этом этапе мы добавим в ваше приложение функцию распознавания текста на изображениях.

Импортируйте модуль MLVision.

Убедитесь, что следующие импорты в ваш класс ViewController существуют.

ViewController.swift

import MLKit

Создайте VisionTextRecognizer

Добавьте следующие ленивые свойства в класс ViewController .

ViewController.swift

private lazy var textRecognizer = TextRecognizer.textRecognizer()

Настройка и запуск функции распознавания текста на изображении непосредственно на устройстве.

Добавьте следующее в метод runTextRecognition класса ViewController :

ViewController.swift

func runTextRecognition(with image: UIImage) {
  let visionImage = VisionImage(image: image)
  textRecognizer.process(visionImage) { features, error in
    self.processResult(from: features, error: error)
  }
}

Приведённый выше код настраивает детектор распознавания текста и вызывает функцию processResult(from:, error:) с полученным ответом.

Обработайте ответ на запрос распознавания текста.

Добавьте следующий код в processResult в классе ViewController , чтобы проанализировать результаты и отобразить их в вашем приложении.

ViewController.swift

 func processResult(from text: Text?, error: Error?) {
    removeDetectionAnnotations()
    guard error == nil, let text = text else {
      let errorString = error?.localizedDescription ?? Constants.detectionNoResultsMessage
      print("Text recognizer failed with error: \(errorString)")
      return
    }

    let transform = self.transformMatrix()

    // Blocks.
    for block in text.blocks {
      drawFrame(block.frame, in: .purple, transform: transform)

      // Lines.
      for line in block.lines {
        drawFrame(line.frame, in: .orange, transform: transform)

        // Elements.
        for element in line.elements {
          drawFrame(element.frame, in: .green, transform: transform)

          let transformedRect = element.frame.applying(transform)
          let label = UILabel(frame: transformedRect)
          label.text = element.text
          label.adjustsFontSizeToFitWidth = true
          self.annotationOverlayView.addSubview(label)
        }
      }
    }
  }

Запустите приложение на симуляторе.

Теперь нажмите 98205811bbed9d74.png Запустите приложение в Xcode. После загрузки приложения убедитесь, что в окне выбора выбрано Image 1 , и нажмите кнопку Find Text .

Теперь ваше приложение должно выглядеть как на изображении ниже, показывая результаты распознавания текста и ограничивающие рамки, наложенные поверх исходного изображения.

7269fd8fcb4dc793.png

Фото: Кай Шрайбер / Wikimedia Commons / CC BY-SA 2.0

Поздравляем, вы только что добавили в свое приложение функцию распознавания текста на устройстве с помощью ML Kit! Распознавание текста на устройстве отлично подходит для многих сценариев использования, поскольку оно работает даже при отсутствии подключения к интернету и достаточно быстро для обработки как статичных изображений, так и кадров видео в реальном времени.

5. Добавить функцию распознавания контуров лица непосредственно на устройстве.

На этом этапе мы добавим в ваше приложение функциональность для распознавания контуров лиц на изображениях.

Создать детектор лиц

Добавьте следующие ленивые свойства в класс ViewController .

ViewController.swift

private lazy var faceDetectorOption: FaceDetectorOptions = {
  let option = FaceDetectorOptions()
  option.contourMode = .all
  option.performanceMode = .fast
  return option
}()
private lazy var faceDetector = FaceDetector.faceDetector(options: faceDetectorOption)

Настройте и запустите на устройстве функцию распознавания контуров лица на изображении.

Добавьте следующее в метод runFaceContourDetection класса ViewController :

ViewController.swift

  func runFaceContourDetection(with image: UIImage) {
    let visionImage = VisionImage(image: image)
    faceDetector.process(visionImage) { features, error in
      self.processResult(from: features, error: error)
    }
  }

Приведённый выше код настраивает детектор распознавания текста и вызывает функцию processResult(from:, error:) с полученным ответом.

Обработайте ответ детектора лиц.

Добавьте следующий код в processResult в классе ViewController , чтобы проанализировать результаты и отобразить их в вашем приложении.

ViewController.swift

  func processResult(from faces: [Face]?, error: Error?) {
    removeDetectionAnnotations()
    guard let faces = faces else {
      return
    }

    for feature in faces {
      let transform = self.transformMatrix()
      let transformedRect = feature.frame.applying(transform)
      UIUtilities.addRectangle(
        transformedRect,
        to: self.annotationOverlayView,
        color: UIColor.green
      )
      self.addContours(forFace: feature, transform: transform)
    }
  }

Наконец, добавьте вспомогательный метод addContours в класс ViewController для отрисовки точек контура.

ViewController.swift

 private func addContours(forFace face: Face, transform: CGAffineTransform) {
    // Face
    if let faceContour = face.contour(ofType: .face) {
      for point in faceContour.points {
        drawPoint(point, in: .blue, transform: transform)
      }
    }

    // Eyebrows
    if let topLeftEyebrowContour = face.contour(ofType: .leftEyebrowTop) {
      for point in topLeftEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }
    if let bottomLeftEyebrowContour = face.contour(ofType: .leftEyebrowBottom) {
      for point in bottomLeftEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }
    if let topRightEyebrowContour = face.contour(ofType: .rightEyebrowTop) {
      for point in topRightEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }
    if let bottomRightEyebrowContour = face.contour(ofType: .rightEyebrowBottom) {
      for point in bottomRightEyebrowContour.points {
        drawPoint(point, in: .orange, transform: transform)
      }
    }

    // Eyes
    if let leftEyeContour = face.contour(ofType: .leftEye) {
      for point in leftEyeContour.points {
        drawPoint(point, in: .cyan, transform: transform)
      }
    }
    if let rightEyeContour = face.contour(ofType: .rightEye) {
      for point in rightEyeContour.points {
        drawPoint(point, in: .cyan, transform: transform)
      }
    }

    // Lips
    if let topUpperLipContour = face.contour(ofType: .upperLipTop) {
      for point in topUpperLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }
    if let bottomUpperLipContour = face.contour(ofType: .upperLipBottom) {
      for point in bottomUpperLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }
    if let topLowerLipContour = face.contour(ofType: .lowerLipTop) {
      for point in topLowerLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }
    if let bottomLowerLipContour = face.contour(ofType: .lowerLipBottom) {
      for point in bottomLowerLipContour.points {
        drawPoint(point, in: .red, transform: transform)
      }
    }

    // Nose
    if let noseBridgeContour = face.contour(ofType: .noseBridge) {
      for point in noseBridgeContour.points {
        drawPoint(point, in: .yellow, transform: transform)
      }
    }
    if let noseBottomContour = face.contour(ofType: .noseBottom) {
      for point in noseBottomContour.points {
        drawPoint(point, in: .yellow, transform: transform)
      }
    }
  }

Запустите приложение на симуляторе.

Теперь нажмите 98205811bbed9d74.png Запустите приложение в Xcode. После загрузки приложения убедитесь, что в палитре выбрано Image 2 , и нажмите кнопку « Find Face Contour . Теперь ваше приложение должно выглядеть как на изображении ниже, показывая контуры лица Грейс Хоппер в виде точек, наложенных поверх исходного изображения.

a5169b50dafbcb2f.png

Поздравляем, вы только что добавили в свое приложение функцию распознавания контуров лица на устройстве с помощью On-device ML Kit. Распознавание контуров лица отлично подходит для многих сценариев использования, поскольку работает даже при отсутствии подключения к интернету и достаточно быстро для обработки как статичных изображений, так и кадров видео в реальном времени.

6. Поздравляем!

Вы использовали ML Kit для простого добавления расширенных возможностей машинного обучения в ваше приложение.

Что мы рассмотрели

  • Как добавить ML Kit в ваше iOS-приложение
  • Как использовать встроенную функцию распознавания текста в ML Kit для поиска текста на изображениях
  • Как использовать встроенную функцию распознавания лиц в ML Kit для идентификации черт лица на изображениях

Следующие шаги

  • Используйте ML Kit в своем iOS-приложении.

Узнать больше

  • https://g.co/mlkit