tutoriales.com

¡Desbloquea Core ML! Integrando Modelos de Machine Learning en tus Apps iOS con Swift

Descubre cómo potenciar tus aplicaciones iOS con inteligencia artificial. Este tutorial te guiará paso a paso para integrar modelos de Machine Learning usando Core ML y Swift, desde la conversión de modelos hasta su despliegue en tu app. ¡Prepárate para llevar tus apps al siguiente nivel!

Intermedio18 min de lectura15 views
Reportar error

El Machine Learning (ML) ha transformado la forma en que interactuamos con la tecnología, permitiendo a las aplicaciones ser más inteligentes, personalizadas y predictivas. Si eres desarrollador iOS, integrar capacidades de ML en tus apps ya no es una tarea titánica gracias a Core ML de Apple.

Core ML es un framework que facilita la incorporación de modelos de Machine Learning pre-entrenados directamente en tus aplicaciones. Esto no solo mejora la privacidad al procesar los datos localmente en el dispositivo, sino que también ofrece un rendimiento superior y la capacidad de funcionar sin conexión a internet. En este tutorial, te sumergirás en el mundo de Core ML, aprendiendo a integrar un modelo de clasificación de imágenes en una app iOS desde cero.


🚀 ¿Qué es Core ML y por qué usarlo?

Core ML es el framework de Apple para la inferencia de Machine Learning on-device. Esto significa que, una vez que tienes un modelo de ML (como una red neuronal para clasificación de imágenes, detección de objetos o procesamiento de lenguaje natural) entrenado en una plataforma externa (TensorFlow, PyTorch, scikit-learn), puedes convertirlo a un formato .mlmodel compatible con Core ML.

Ventajas Clave de Core ML:

  • Rendimiento optimizado: Core ML está diseñado para aprovechar al máximo el hardware de los dispositivos Apple (incluyendo la Neural Engine) para una inferencia rápida y eficiente.
  • Privacidad: Los datos del usuario se procesan localmente en el dispositivo, sin necesidad de enviarlos a la nube, lo que mejora la privacidad y reduce la latencia.
  • Funcionalidad Offline: Las apps pueden realizar predicciones incluso sin conexión a internet.
  • Integración sencilla: Se integra perfectamente con otros frameworks de Apple como Vision para el análisis de imágenes, Natural Language para el procesamiento de texto, y Sound Analysis para el audio.
💡 Consejo: Piensa en Core ML como un puente entre tu modelo de ML pre-entrenado y tu aplicación iOS. Se encarga de la ejecución eficiente del modelo sin que tengas que lidiar con los detalles de bajo nivel.

🛠️ Herramientas Necesarias

Para seguir este tutorial, necesitarás:

  • Xcode 15+: El entorno de desarrollo integrado de Apple.
  • Un dispositivo iOS o simulador: Para probar tu aplicación.
  • Python (opcional pero recomendado): Para la conversión de modelos si no usas un modelo ya convertido.
  • coremltools (librería de Python): Para convertir modelos de otros frameworks a .mlmodel. Puedes instalarlo con pip install coremltools.

📖 Paso 1: Obtener y Convertir un Modelo de ML

El primer paso es tener un modelo de Machine Learning listo. Para este tutorial, usaremos un modelo de clasificación de imágenes pre-entrenado. Si ya tienes un archivo .mlmodel, puedes saltar la parte de la conversión. Si no, te mostraremos cómo convertir un modelo popular.

Opción A: Usar un Modelo .mlmodel existente

Apple proporciona varios modelos pre-entrenados y convertidos en su página de Core ML Models. Descargaremos el modelo MobileNetV2 para clasificación de imágenes. Este es un modelo ligero y eficiente, ideal para dispositivos móviles.

  1. Ve a la página de Core ML Models de Apple.
  2. Busca y descarga MobileNetV2.mlmodel.
  3. Guarda el archivo en una ubicación fácil de recordar.

Opción B: Convertir un Modelo (usando coremltools)

Si tuvieras un modelo de TensorFlow, PyTorch o scikit-learn, usarías coremltools para convertirlo. Aquí tienes un ejemplo conceptual para un modelo de Keras/TensorFlow:

import coremltools as ct
import tensorflow as tf

# Cargar un modelo de Keras pre-entrenado (ejemplo)
# model = tf.keras.applications.MobileNetV2(weights='imagenet')

# En este ejemplo, supongamos que 'my_keras_model.h5' es un modelo que entrenaste
# model = tf.keras.models.load_model('my_keras_model.h5')

# Para simplificar, si no tienes uno, crea un modelo dummy para el ejemplo
# Si usaste un modelo de MobileNetV2 de Keras, el siguiente bloque sería más directo

# Cargaremos un modelo de Keras/TensorFlow pre-entrenado para la conversión
model = tf.keras.applications.MobileNetV2(weights='imagenet', input_shape=(224, 224, 3))

# Definir las especificaciones de entrada y salida para Core ML
# La entrada es una imagen de 224x224 píxeles con 3 canales (RGB)
# 'Image' es el nombre que usaremos en Swift para la entrada
image_input = ct.ImageType(shape=(1, 224, 224, 3), bias=[-1,-1,-1], scale=1/127.5)

# Convertir el modelo
mlmodel = ct.convert(
    model,
    inputs=[
        ct.TensorType(shape=(1, 224, 224, 3)) # Puedes usar image_input directamente si es más complejo
    ],
    convert_to="mlprogram" # Usa 'mlprogram' para modelos más recientes y flexibles
)

# Para MobileNetV2, la entrada es de 224x224, RGB, y los valores deben estar en el rango [-1, 1]
# El modelo de Keras espera entradas en este rango si usaste preprocess_input
# Por eso, la escala y el sesgo son importantes.

# Añadir metadatos (opcional pero útil)
mlmodel.author = 'Tu Nombre'
mlmodel.license = 'MIT'
mlmodel.short_description = 'Clasificación de imágenes con MobileNetV2'

# Especificar los nombres de las etiquetas si el modelo las produce
# Para MobileNetV2, las etiquetas son de ImageNet, pero las obtendremos de un archivo.
# Puedes añadir las etiquetas directamente si las tienes en una lista.
# Por ahora, simplemente especificamos la salida como un diccionario de probabilidades.
mlmodel.output_description['predictions_scores'] = 'Probabilidades de clase de imagen'

# Guardar el modelo convertido
mlmodel.save('MobileNetV2.mlmodel')
⚠️ Advertencia: La conversión de modelos puede ser compleja y depende mucho del framework original y la versión del modelo. Asegúrate de que las especificaciones de entrada y salida coincidan con lo que tu modelo espera.

🎯 Paso 2: Integrar el Modelo en tu Proyecto iOS

Ahora que tenemos el archivo MobileNetV2.mlmodel, es hora de llevarlo a Xcode.

  1. Crea un nuevo proyecto Xcode:

    • Abre Xcode y selecciona Create a new Xcode project.
    • Elige la plantilla iOS > App y haz clic en Next.
    • Nombra tu proyecto (ej: CoreMLImageClassifier), selecciona Interface: Storyboard y Language: Swift.
    • Haz clic en Next y guarda el proyecto.
  2. Añade el modelo a tu proyecto:

    • Arrastra el archivo MobileNetV2.mlmodel desde el Finder a la carpeta de tu proyecto en el Project Navigator de Xcode (normalmente, la carpeta con el nombre de tu proyecto).
    • Asegúrate de que la opción Copy items if needed esté marcada y que tu target esté seleccionado en Add to targets.
    • Haz clic en Finish.

Una vez añadido, Xcode generará automáticamente una clase Swift para interactuar con tu modelo. Puedes hacer clic en el archivo .mlmodel dentro de Xcode para ver sus detalles, como las entradas y salidas esperadas. En nuestro caso, verás una entrada de tipo Image y una salida de tipo Dictionary con las probabilidades y la clase principal.

1. Crear proyecto Xcode 2. Descargar MobileNetV2.mlmodel 3. Arrastrar .mlmodel a Xcode 4. Xcode genera clase Swift automáticamente

✨ Paso 3: Configurar la Interfaz de Usuario (UI)

Crearemos una interfaz de usuario sencilla que nos permita seleccionar una imagen de la galería o tomar una foto, mostrarla y luego mostrar la predicción del modelo.

3.1. Diseño en Main.storyboard

  1. Abre Main.storyboard.

  2. Arrastra y suelta los siguientes elementos en tu ViewController:

    • UIImageView: Para mostrar la imagen seleccionada. Dale un tamaño razonable (ej: 300x300) y centra horizontalmente. Configura su Content Mode a Scale Aspect Fit.
    • UILabel: Para mostrar el resultado de la clasificación. Centra el texto y ajusta el tamaño de fuente si es necesario. Inicialmente, puedes ponerle un texto como "Clasificando..."
    • UIButton: Para seleccionar una imagen. Texto: "Seleccionar Imagen".
  3. Configura Auto Layout: Añade restricciones a tus elementos para que se vean bien en diferentes tamaños de pantalla. Por ejemplo:

    • UIImageView: Centro horizontal, altura y anchura fijas (ej: 300x300), y espacio superior al safe area.
    • UILabel: Centro horizontal, espacio debajo de UIImageView.
    • UIButton: Centro horizontal, espacio debajo de UILabel.

3.2. Conexiones en ViewController.swift

  1. Abre ViewController.swift y Main.storyboard en el Assistant Editor.
  2. Crea IBOutlets para el UIImageView y el UILabel arrastrándolos al código:
import UIKit
import CoreML // Necesario para interactuar con Core ML
import Vision // Para el procesamiento de imágenes con Core ML

class ViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var predictionLabel: UILabel!

override func viewDidLoad() {
super.viewDidLoad()
predictionLabel.text = "Toca 'Seleccionar Imagen'"
}

@IBAction func selectImageButtonTapped(_ sender: UIButton) {
// Implementaremos esto en el siguiente paso
}
}
  1. Crea un IBAction para el UIButton y nómbralo selectImageButtonTapped.

🛠️ Paso 4: Implementar la Selección de Imagen

Utilizaremos UIImagePickerController para permitir al usuario elegir una imagen de su galería o tomar una nueva foto.

  1. En ViewController.swift, haz que tu clase conforme a los protocolos UIImagePickerControllerDelegate y UINavigationControllerDelegate:
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// ... (tus IBOutlets y viewDidLoad)
}
  1. Implementa la acción selectImageButtonTapped:
@IBAction func selectImageButtonTapped(_ sender: UIButton) {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .photoLibrary // Puedes cambiar a .camera para tomar fotos
picker.allowsEditing = false // Permite o no editar la imagen antes de seleccionar
present(picker, animated: true, completion: nil)
}
  1. Implementa el método delegado imagePickerController(_:didFinishPickingMediaWithInfo:) para manejar la imagen seleccionada:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true, completion: nil)

guard let selectedImage = info[.originalImage] as? UIImage else {
predictionLabel.text = "Error al cargar la imagen."
return
}

imageView.image = selectedImage
predictionLabel.text = "Clasificando..."
classifyImage(image: selectedImage)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
predictionLabel.text = "Selección de imagen cancelada."
}
  1. Permisos de Privacidad: Para acceder a la galería de fotos, debes añadir una entrada a tu Info.plist:
    • Selecciona el archivo Info.plist en el Project Navigator.
    • Haz clic en el signo + junto a cualquier entrada para añadir una nueva.
    • Busca Privacy - Photo Library Usage Description (o NSPhotoLibraryUsageDescription).
    • Establece el valor en una cadena que explique por qué tu app necesita acceso (ej: "Necesitamos acceso a tus fotos para clasificarlas.").

🔥 Paso 5: Realizar la Clasificación con Core ML y Vision

Aquí es donde la magia de Core ML y Vision ocurre. Vision es un framework de Apple que trabaja en conjunto con Core ML para facilitar el preprocesamiento de imágenes y el manejo de los resultados del modelo.

  1. Define el método classifyImage(image:) que llamamos anteriormente:
func classifyImage(image: UIImage) {
guard let ciImage = CIImage(image: image) else {
predictionLabel.text = "No se pudo convertir UIImage a CIImage."
return
}

// 1. Cargar el modelo Core ML
guard let model = try? MobileNetV2(configuration: MLModelConfiguration()) else {
predictionLabel.text = "Error al cargar el modelo MobileNetV2."
return
}

// 2. Crear una solicitud Vision con el modelo Core ML
let request = VNCoreMLRequest(model: model.model) { [weak self] request, error in
guard let self = self else { return }

if let error = error {
self.predictionLabel.text = "Error al realizar la predicción: \(error.localizedDescription)"
return
}

guard let results = request.results as? [VNClassificationObservation] else {
self.predictionLabel.text = "Resultados inesperados."
return
}

// 3. Procesar los resultados
if let bestResult = results.first {
let confidence = String(format: "%.2f", bestResult.confidence * 100)
DispatchQueue.main.async {
self.predictionLabel.text = "Predicción: \(bestResult.identifier) (\(confidence)%) "
}
} else {
DispatchQueue.main.async {
self.predictionLabel.text = "No se encontraron resultados de clasificación."
}
}
}

// Opcional: Especificar la calidad de la imagen de entrada para Vision
request.imageCropAndScaleOption = .centerCrop

// 4. Ejecutar la solicitud Vision en un hilo de fondo
let handler = VNImageRequestHandler(ciImage: ciImage)
DispatchQueue.global(qos: .userInitiated).async {
do {
try handler.perform([request])
} catch {
print("Fallo al realizar la solicitud de Vision: \(error)")
DispatchQueue.main.async {
self.predictionLabel.text = "Fallo de Vision: \(error.localizedDescription)"
}
}
}
}

Explicación del Código:

  1. Carga del Modelo: MobileNetV2(configuration: MLModelConfiguration()) inicializa la clase generada automáticamente por Xcode a partir de tu archivo .mlmodel. model.model accede a la instancia subyacente de MLModel.
  2. VNCoreMLRequest: Esta es la pieza clave. Crea una solicitud de Vision que usará tu modelo Core ML. El completion handler se ejecuta una vez que Vision ha procesado la imagen y el modelo ha hecho su predicción.
  3. Resultados: Los resultados de una clasificación de imágenes suelen ser VNClassificationObservation, que contienen el identifier (la etiqueta de la clase) y confidence (la probabilidad).
  4. VNImageRequestHandler: Este objeto toma la CIImage y se encarga de realizar la solicitud de Vision en un hilo de fondo, lo cual es crucial para mantener la UI responsiva.
📌 Nota: Usamos `DispatchQueue.global(qos: .userInitiated).async` para ejecutar el procesamiento de Vision en un hilo de fondo. El resultado de la UI se actualiza en el hilo principal con `DispatchQueue.main.async`.

✅ Paso 6: Ejecutar y Probar la Aplicación

¡Es hora de ver tu clasificador de imágenes en acción!

  1. Conecta tu dispositivo iOS o selecciona un simulador en Xcode.
  2. Haz clic en el botón Run (el triángulo) en Xcode.
  3. Una vez que la aplicación se inicie:
    • Toca el botón "Seleccionar Imagen".
    • Selecciona una imagen de tu librería de fotos (intenta con objetos comunes como perros, gatos, tazas, teclados, etc.).
    • La imagen aparecerá en el UIImageView y el UILabel mostrará la predicción del modelo con su nivel de confianza.

Posibles Problemas y Soluciones:

  • Privacy - Photo Library Usage Description no configurado: La app se cerrará al intentar acceder a la galería. Verifica tu Info.plist.
  • Imagen no se carga: Asegúrate de que selectedImage no sea nil y de que CIImage(image: image) funcione correctamente.
  • Predicción incorrecta/inesperada:
    • El modelo MobileNetV2 está entrenado con el dataset ImageNet, que tiene clases específicas. Si le muestras algo fuera de esas clases, la predicción puede ser extraña.
    • Asegúrate de que la imagen de entrada tenga la resolución correcta y sea preprocesada según las expectativas del modelo (Vision se encarga de esto en gran medida con VNCoreMLRequest, pero es bueno saberlo).
¿Cómo puedo añadir mis propias etiquetas de clasificación? Si tu modelo tiene etiquetas personalizadas, `MobileNetV2` tiene una lista interna de etiquetas de ImageNet. Para mostrar tus propias etiquetas, necesitarías un modelo entrenado con ellas, y el `VNClassificationObservation.identifier` coincidiría con esas etiquetas. Si tienes un modelo custom, podrías tener un archivo de texto con las etiquetas ordenadas que cargarías y usarías para mapear los índices de salida del modelo a nombres legibles.
🔥 Importante: Core ML es una herramienta potente, pero la calidad de las predicciones depende directamente de la calidad y el entrenamiento del modelo de Machine Learning subyacente. Un buen modelo es la base de una buena aplicación con ML.

📈 Optimizaciones Avanzadas y Próximos Pasos

Este tutorial te ha proporcionado una base sólida para usar Core ML. Sin embargo, hay muchas más posibilidades y optimizaciones:

1. Modelos Cuantificados y Eficientes

Para aplicaciones móviles, la eficiencia es clave. Considera usar:

  • Modelos ligeros: Como MobileNet, SqueezeNet, EfficientNet.
  • Cuantificación de modelos: Reduce el tamaño del modelo y acelera la inferencia reduciendo la precisión de los números (ej: de float32 a int8). coremltools soporta la cuantificación.

2. Detección de Objetos y Segmentación Semántica

Core ML también es compatible con modelos más complejos como la detección de objetos (localiza y clasifica múltiples objetos en una imagen) y la segmentación semántica (clasifica cada píxel de una imagen).

3. Integración con otros Frameworks de Apple

  • Natural Language (NL): Para procesamiento de texto (análisis de sentimiento, reconocimiento de entidades).
  • Sound Analysis (SA): Para clasificación de audio (detección de sonidos, música).
  • Create ML: Permite entrenar modelos de ML directamente en Xcode con Swift, usando tus propios datos, sin necesidad de Python o frameworks de terceros. Es excelente para tareas personalizadas como clasificación de imágenes o texto.

4. Actualización de Modelos Over-the-Air

Para aplicaciones que necesitan modelos actualizados frecuentemente, puedes descargar nuevos modelos Core ML de un servidor y reemplazarlos en tu aplicación, permitiendo que tu app se adapte a nuevos datos sin tener que enviar una actualización a la App Store.

5. Rendimiento y Depuración

Xcode incluye herramientas de perfilado que te permiten medir el rendimiento de tu modelo Core ML. Puedes ver cuánto tiempo tarda la inferencia y cuántos recursos del dispositivo consume.

90% Completado

Conclusión

Has llegado al final de este tutorial y ahora tienes los conocimientos para integrar modelos de Machine Learning en tus aplicaciones iOS utilizando Core ML y Vision. La capacidad de añadir inteligencia artificial directamente en el dispositivo abre un sinfín de posibilidades para crear experiencias de usuario innovadoras y potentes.

Experimenta con diferentes modelos, explora otros frameworks de Apple como Create ML, y no temas llevar tus ideas más ambiciosas al mundo del desarrollo móvil inteligente. ¡El futuro de las aplicaciones está en tus manos!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!

¡Desbloquea Core ML! Integrando Modelos de Machine Learning en tus Apps iOS con Swift | tutoriales.com