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 el aprendizaje automático a las apps para iOS y Android a través de un paquete eficaz, pero fácil de usar. Independientemente de si eres nuevo o tienes experiencia en el aprendizaje automático, puedes implementar fácilmente la funcionalidad que necesites con solo unas pocas líneas de código. No es necesario que tengas un profundo conocimiento sobre redes neuronales o en optimización de modelos para comenzar.

¿Cómo funciona?

ML Kit facilita la aplicación de técnicas de AA en tus apps incorporando 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 integrados 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, se explica cómo crear tu propia app para iOS que puede 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 ML Kit Text Recognition para detectar texto en imágenes
  • Usa la API de Face Detection de ML Kit para identificar rasgos faciales en imágenes

Imagen de Grace Hopper demostrando la API de Face Recognition de ML KitImagen de un cartel sobre el césped que muestra la API de reconocimiento de texto

Qué aprenderás

  • Cómo usar el SDK de 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 o posterior)
  • Simulador de iOS o un dispositivo iOS físico que ejecute iOS 10.0 o versiones posteriores
  • ML Kit 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 ML Kit. Los conceptos y los bloques de código no relacionados con esos temas se abordan superficialmente 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: Código inicial que usarás como base para compilar en este codelab
  • android_studio_folder.pngfinal: Código completado para la app de ejemplo finalizada

Agrega las dependencias de ML Kit con CocoaPods

CocoaPods se usa para agregar las dependencias de 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 Podfile en tu editor favorito y agrega ML Kit como dependencias:

Podfile

platform :ios, '10.0'
use_frameworks!

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

target 'MLKit-codelab' do
end

Instala CocoaPods de ML Kit

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

Línea de comandos

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

3. Ejecuta la app de partida

Ahora puedes ejecutar la app por primera vez. Haz clic en 98205811bbed9d74.pngEjecutar en Xcode para compilar la app y ejecutarla en el simulador de iOS.

La app debería iniciarse en el 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 el texto en las imágenes.

4. Agrega reconocimiento de texto integrado en el dispositivo

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

Importa el módulo MLVision

Confirma que existan las siguientes importaciones en 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 del 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.pngEjecutar 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 imagen que se muestra a continuación, con 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 el 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 tu app no tiene conectividad a Internet y es lo suficientemente rápido como para usarlo en imágenes fijas y en fotogramas de video en vivo.

5. Se agregó la detección de contorno de rostro integrada en el dispositivo

En este paso, agregaremos funcionalidad a tu app 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 facial 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.

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

Cómo ejecutar la app en el simulador

Ahora haz clic en 98205811bbed9d74.pngEjecutar 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. Ahora, tu app debería verse como la imagen que se muestra a continuación, con 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 integrada en el dispositivo a tu app con el Kit de AA integrado en el dispositivo. La detección de contorno de rostro integrada en el dispositivo es ideal para muchos casos de uso, ya que funciona incluso cuando tu app no tiene conectividad a Internet y es lo suficientemente rápida para usarla en imágenes fijas y en fotogramas de video en vivo.

6. ¡Felicitaciones!

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

Temas abordados

  • Cómo agregar ML Kit a tu app para iOS
  • Cómo usar el reconocimiento de texto en el dispositivo de ML Kit para encontrar texto en imágenes
  • Cómo usar el reconocimiento facial en el dispositivo de 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