Reconoce texto y rasgos faciales. Kit de AA: iOS

1. Introducción

ML Kit es un SDK para dispositivos móviles que lleva la experiencia de Google en aprendizaje automático a las apps para iOS y Android en un paquete potente y fácil de usar. Independientemente de si eres nuevo o tienes experiencia en el aprendizaje automático, puedes implementar fácilmente la funcionalidad que necesitas con solo unas pocas líneas de código. No es necesario tener conocimientos profundos sobre redes neuronales ni sobre optimización de modelos para comenzar.

¿Cómo funciona?

El kit de AA facilita la aplicación de técnicas de AA en tus apps, ya que reúne las tecnologías de AA de Google, como Mobile Vision y TensorFlow Lite, en un solo SDK. Ya sea que necesites la potencia de las capacidades en tiempo real de los modelos en el dispositivo de Mobile Vision o la flexibilidad de los modelos personalizados de clasificación de imágenes de TensorFlow Lite, ML Kit lo hace posible con solo unas pocas líneas de código.

En este codelab, te ayudaremos a crear tu propia app para iOS que pueda detectar automáticamente texto y rasgos faciales en una imagen.

Qué compilarás

En este codelab, compilarás una app para iOS con ML Kit. Tu app hará lo siguiente:

  • Usa la API de reconocimiento de texto del Kit de AA para detectar texto en imágenes
  • Usa la API de detección de rostro del Kit de AA para identificar rasgos faciales en imágenes

Imagen de Grace Hopper que demuestra la API de ML KIt Face RecognitionImagen de una señal en el césped que demuestra la API de reconocimiento de texto

Qué aprenderás

  • Cómo usar el SDK del ML Kit para agregar fácilmente capacidades avanzadas de aprendizaje automático, como el reconocimiento de texto y la detección de rasgos faciales a cualquier app para iOS

Requisitos

  • Una versión reciente de Xcode (v12.4 y versiones posteriores)
  • Simulador de iOS o dispositivo iOS físico que ejecute iOS 10.0 o una versión posterior
  • El Kit de AA solo admite estas dos arquitecturas de 64 bits: x86_64 y arm64
  • El código de muestra
  • Conocimientos básicos sobre el desarrollo para iOS en Swift
  • Conocimientos básicos sobre los modelos de aprendizaje automático

Este codelab se enfoca en el ML Kit. Los conceptos y los bloques de código no relevantes se pasan por alto y se proporcionan para que simplemente los copies y pegues.

2. Cómo prepararte

Descarga el código

Haz clic en el siguiente vínculo a fin de descargar todo el código de este codelab:

Descomprime el archivo zip descargado. Esto creará una carpeta raíz (mlkit-ios-codelab) con todos los recursos que necesitarás. Para este codelab, solo necesitarás los recursos del subdirectorio vision.

El subdirectorio vision del repositorio mlkit-ios-codelab contiene dos directorios:

  • android_studio_folder.pngstarter: Inicio del código en el que se basa este codelab
  • android_studio_folder.pngfinal: Código completo para la app de ejemplo finalizada

Agrega las dependencias para el ML Kit con CocoaPods.

CocoaPods se usa para agregar las dependencias del ML Kit a tu app. Si no tienes CocoaPods instalado en tu máquina, consulta las instrucciones de instalación aquí. Una vez instalado, abre el Podfile en tu editor favorito y agrega el ML Kit como dependencias:

Podfile

platform :ios, '10.0'
use_frameworks!

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

target 'MLKit-codelab' do
end

Instala Pods de cacao del Kit de AA

Para asegurarte de que todas las dependencias estén disponibles para tu app, debes usar la línea de comandos para instalar los Pods de Cocoa del Kit de AA.

Línea de comandos

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

3. Ejecuta la app de partida

Ya está todo listo para que ejecutes la app por primera vez. Haz clic en 98205811bbed9d74.pngRun en Xcode para compilar la app y ejecutarla en el simulador de iOS.

La app debería iniciarse en tu simulador. En este punto, deberías ver un diseño básico con un selector que te permite elegir entre 2 imágenes. En la siguiente sección, agregarás reconocimiento de texto a tu app para identificar texto en las imágenes.

4. Cómo agregar reconocimiento de texto integrado en el dispositivo

En este paso, agregaremos a tu app funcionalidad para reconocer texto en imágenes.

Importa el módulo MLVision

Confirma que existan las siguientes importaciones a tu clase ViewController.

ViewController.swift

import MLKit

Crea un VisionTextRecognizer

Agrega las siguientes propiedades diferidas a tu clase ViewController.

ViewController.swift

private lazy var textRecognizer = TextRecognizer.textRecognizer()

Configura y ejecuta el reconocimiento de texto integrado en el dispositivo en una imagen

Agrega lo siguiente al método runTextRecognition de la clase 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)
  }
}

El código anterior configura el detector de reconocimiento de texto y llama a la función processResult(from:, error:) con la respuesta.

Procesa la respuesta de reconocimiento de texto

Agrega el siguiente código a processResult en la clase ViewController para analizar los resultados y mostrarlos en tu app.

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)
        }
      }
    }
  }

Ejecuta la app en el simulador

Ahora, haz clic en 98205811bbed9d74.pngRun en Xcode. Una vez que se cargue la app, asegúrate de que Image 1 esté seleccionado en el selector y haz clic en el botón Find Text.

Ahora, tu app debería verse como la siguiente imagen, que muestra los resultados del reconocimiento de texto y los cuadros delimitadores superpuestos sobre la imagen original.

7269fd8fcb4dc793.png

Foto: Kai Schreiber / Wikimedia Commons / CC BY-SA 2.0

¡Felicitaciones! Acabas de agregar reconocimiento de texto en el dispositivo a tu app con ML Kit. El reconocimiento de texto integrado en el dispositivo es ideal para muchos casos de uso, ya que funciona incluso cuando la app no tiene conexión a Internet y es lo suficientemente rápido para usarse en imágenes estáticas y fotogramas de video en vivo.

5. Agrega la detección de contorno de rostro en el dispositivo

En este paso, agregaremos a tu app funcionalidad para detectar los contornos de los rostros en las imágenes.

Crea un FaceDetector

Agrega las siguientes propiedades diferidas a tu clase 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)

Configura y ejecuta la detección de contorno de rostro integrada en el dispositivo en una imagen

Agrega lo siguiente al método runFaceContourDetection de la clase 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)
    }
  }

El código anterior configura el detector de reconocimiento de texto y llama a la función processResult(from:, error:) con la respuesta.

Cómo procesar la respuesta del detector de rostros

Agrega el siguiente código a processResult en la clase ViewController para analizar los resultados y mostrarlos en tu app.

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)
    }
  }

Por último, agrega el método de ayuda addContours en la clase ViewController para dibujar los puntos de contorno.

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)
      }
    }
  }

Ejecuta la app en el simulador

Ahora, haz clic en 98205811bbed9d74.pngRun en Xcode. Una vez que se cargue la app, asegúrate de que Image 2 esté seleccionado en el selector y haz clic en el botón Find Face Contour. Tu app debería verse como la siguiente imagen, que muestra los contornos del rostro de Grace Hopper como puntos superpuestos sobre la imagen original.

a5169b50dafbcb2f.png

¡Felicitaciones! Acabas de agregar la detección de contorno de rostro en el dispositivo a tu app con el uso de la detección de contorno de rostro del ML Kit en el dispositivo, que es excelente para muchos casos de uso, ya que funciona incluso cuando la app no tiene conexión a Internet y es lo suficientemente rápida como para usarla en imágenes fijas y fotogramas de video en vivo.

6. ¡Felicitaciones!

Usaste el Kit de AA para agregar fácilmente capacidades avanzadas de aprendizaje automático a tu app.

Temas abordados

  • Cómo agregar el Kit de AA a tu app para iOS
  • Cómo usar el reconocimiento de texto integrado en el dispositivo con el ML Kit para encontrar texto en imágenes
  • Cómo usar el reconocimiento facial en el dispositivo en ML Kit para identificar rasgos faciales en imágenes

Próximos pasos

  • Usa ML Kit en tu propia app para iOS.

Más información

  • https://g.co/mlkit