Los modelos multimodales son arquitecturas que integran y procesan simultáneamente diferentes tipos de datos, como texto, imágenes y audio. Algunos ejemplos incluyen CLIP y DALL-E de OpenAI, ambos lanzados en 2021. CLIP comprende imágenes y texto de forma conjunta, lo que le permite realizar tareas como la clasificación de imágenes de disparo cero. DALL-E, por su parte, genera imágenes a partir de descripciones textuales, permitiendo automatizar y potenciar procesos creativos en juegos, publicidad y literatura, entre otros sectores.
Los modelos de lenguaje visual (VLM) son un caso especial de modelos multimodales. Los VLM generan lenguaje basado en entradas visuales. Un ejemplo destacado es Paligemma, que Google presentó en mayo de 2024. Paligemma se puede utilizar para la respuesta visual a preguntas, la detección de objetos y la segmentación de imágenes.
Algunas publicaciones de blog exploran las capacidades de Paligemma en la detección de objetos, como esta excelente lectura de Roboflow:
Sin embargo, cuando escribí este blog, la documentación existente sobre la preparación de datos para usar Paligemma para la segmentación de objetos era vaga. Por eso quería evaluar si es fácil utilizar Paligemma para esta tarea. Aquí les comparto mi experiencia.
Antes de entrar en detalles sobre el caso de uso, revisemos brevemente el funcionamiento interno de Paligemma.
Paligemma combina un Codificador de visión SigLIP-So400m con un Modelo de lenguaje Gemma para procesar imágenes y texto (ver figura arriba). En la nueva versión de Paligemma lanzada en diciembre de este año, el codificador de visión puede preprocesar imágenes en tres resoluciones diferentes: 224 px, 448 px o 896 px. El codificador de visión preprocesa una imagen y genera una secuencia de tokens de imagen, que se combinan linealmente con tokens de texto de entrada. Esta combinación de tokens es procesada aún más por el modelo de lenguaje Gemma, que genera tokens de texto. El modelo Gemma tiene diferentes tamaños, desde parámetros 2B hasta 27B.
En la siguiente figura se muestra un ejemplo de salida del modelo.
El modelo Paligemma se entrenó en varios conjuntos de datos, como WebLi, abrirImágenes, INGENIOy otros (ver esto Blog de Kaggle para más detalles). Esto significa que Paligemma puede identificar objetos sin necesidad de realizar ajustes. Sin embargo, dichas capacidades son limitadas. Es por eso que Google recomienda ajustar Paligemma en casos de uso específicos de dominio.
Formato de entrada
Para ajustar Paligemma, los datos de entrada deben estar en formato JSONL. Un conjunto de datos en formato JSONL tiene cada línea como un objeto JSON independiente, como una lista de registros individuales. Cada objeto JSON contiene las siguientes claves:
Imagen: El nombre de la imagen.
Prefijo: Esto especifica la tarea que desea que realice el modelo.
Sufijo: Esto proporciona la verdad fundamental que el modelo aprende para hacer predicciones.
Dependiendo de la tarea, debe cambiar el prefijo y el sufijo del objeto JSON en consecuencia. A continuación se muestran algunos ejemplos:
{"image": "some_filename.png",
"prefix": "caption en" (To indicate that the model should generate an English caption for an image),
"suffix": "This is an image of a big, white boat traveling in the ocean."
}
{"image": "another_filename.jpg",
"prefix": "How many people are in the image?",
"suffix": "ten"
}
{"image": "filename.jpeg",
"prefix": "detect airplane",
"suffix": " airplane" (four corner bounding box coords)
}
Si tiene varias categorías para detectar, agregue un punto y coma (;) entre cada categoría en el prefijo y sufijo.
Puede encontrar una explicación completa y clara de cómo preparar los datos para la detección de objetos en Paligemma en esta publicación de Roboflow.
{"image": "filename.jpeg",
"prefix": "detect airplane",
"suffix": " airplane"
}
Tenga en cuenta que para la segmentación, además de las coordenadas del cuadro delimitador del objeto, debe especificar 16 tokens de segmentación adicionales que representen una máscara que quepa dentro del cuadro delimitador. De acuerdo a El repositorio Big Vision de Googleesos tokens son palabras en clave con 128 entradas (…). ¿Cómo obtenemos estos valores? En mi experiencia personal, fue desafiante y frustrante obtenerlos sin la documentación adecuada. Pero daré más detalles más adelante.
Si estás interesado en aprender más sobre Paligemma, te recomiendo estos blogs:
Como se mencionó anteriormente, Paligemma se entrenó en diferentes conjuntos de datos. Por lo tanto, se espera que este modelo sea bueno para segmentar objetos “tradicionales” como automóviles, personas o animales. Pero ¿qué pasa con la segmentación de objetos en imágenes de satélite? Esta pregunta me llevó a explorar las capacidades de Paligemma para segmentar el agua en imágenes de satélite.
Kaggle Imagen satelital del conjunto de datos de cuerpos de agua es adecuado para este propósito. Este conjunto de datos contiene 2841 imágenes con sus correspondientes máscaras.
Algunas máscaras de este conjunto de datos eran incorrectas y otras necesitaban un procesamiento previo adicional. Los ejemplos defectuosos incluyen máscaras con todos los valores establecidos en agua, mientras que solo una pequeña porción estaba presente en la imagen original. Otras máscaras no se correspondían con sus imágenes RGB. Cuando se gira una imagen, algunas máscaras hacen que estas áreas parezcan tener agua.
Dadas estas limitaciones de datos, seleccioné una muestra de 164 imágenes cuyas máscaras no tenían ninguno de los problemas mencionados anteriormente. Este conjunto de imágenes se utiliza para afinar Paligemma.
Preparando el conjunto de datos JSONL
Como se explicó en la sección anterior, Paligemma necesita entradas que representen las coordenadas del cuadro delimitador del objeto en el espacio de imagen normalizado (…) más 16 tokens de segmentación adicionales que representan 128 palabras en clave diferentes (…). Obtener las coordenadas del cuadro delimitador en el formato deseado fue fácil gracias a La explicación de Roboflow. Pero ¿cómo obtenemos las 128 palabras clave de las máscaras? No había documentación ni ejemplos claros en el repositorio de Big Vision que pudiera usar para mi caso de uso. Ingenuamente pensé que el proceso de creación de tokens de segmentación era similar al de creación de cuadros delimitadores. Sin embargo, esto provocó una representación incorrecta de las máscaras de agua, lo que dio lugar a resultados de predicción erróneos.
Cuando escribí este blog (principios de diciembre), Google anunció la segunda versión de Paligemma. Después de este evento, Roboflow publicó una buena descripción general de preparar datos para ajustar Paligemma2 para diferentes aplicaciones, incluida la segmentación de imágenes. Utilizo parte de su código para finalmente obtener las palabras clave de segmentación correctas. ¿Cuál fue mi error? Bueno, en primer lugar, es necesario cambiar el tamaño de las máscaras a un tensor de forma (Ninguno, 64, 64, 1) y luego usar un codificador automático variacional (VAE) previamente entrenado para convertir máscaras de anotación en etiquetas de texto. Aunque el uso de un modelo VAE se mencionó brevemente en el repositorio de Big Vision, no hay ninguna explicación ni ejemplos sobre cómo usarlo.
El flujo de trabajo que utilizo para preparar los datos para ajustar Paligemma se muestra a continuación:
Como se observó, la cantidad de pasos necesarios para preparar los datos para Paligemma es grande, por lo que no comparto fragmentos de código aquí. Sin embargo, si desea explorar el código, puede visitar este repositorio de GitHub. el guión convertir.py tiene todos los pasos mencionados en el flujo de trabajo que se muestra arriba. También agregué las imágenes seleccionadas para que puedas jugar con este script de inmediato.
Al preprocesar las palabras clave de segmentación para convertirlas en máscaras de segmentación, observamos cómo estas máscaras cubren los cuerpos de agua en las imágenes:
Antes de ajustar Paligemma, probé sus capacidades de segmentación en los modelos cargados en Hugging Face. Esta plataforma jauna demostración donde podrás subir imágenes e interactuar con diferentes modelos de Paligemma.
La versión actual de Paligemma es generalmente buena para segmentar agua en imágenes de satélite, pero no es perfecta. ¡Veamos si podemos mejorar estos resultados!
Hay dos formas de ajustar Paligemma, ya sea a través de Biblioteca Transformer de Hugging Face o utilizando Big Vision y JAX. Opté por esta última opción. Big Vision proporciona una Cuaderno de colaboraciónque modifiqué para mi caso de uso. Puedes abrirlo yendo a mi repositorio de GitHub:
usé un tamaño del lote de 8 y un tasa de aprendizaje de 0,003. Ejecuté el ciclo de entrenamiento dos veces, lo que se traduce en 158 pasos de entrenamiento. El tiempo total de ejecución con una máquina GPU T4 fue de 24 minutos.
Los resultados no fueron los esperados. Paligemma no produjo predicciones en algunas imágenes y en otras, las máscaras resultantes estaban lejos de la verdad básica. También obtuve palabras clave de segmentación con más de 16 tokens en dos imágenes.
Cabe mencionar que uso la primera versión de Paligemma. Quizás los resultados mejoren al usar Paligemma2 o ajustando aún más el tamaño del lote o la tasa de aprendizaje. En cualquier caso, estos experimentos están fuera del alcance de este blog.
Los resultados de la demostración muestran que el modelo Paligemma predeterminado es mejor para segmentar el agua que mi modelo ajustado. En mi opinión, UNET es una mejor arquitectura si el objetivo es construir un modelo especializado en segmentar objetos. Para obtener más información sobre cómo entrenar un modelo de este tipo, puede leer mi publicación de blog anterior:
Otras limitaciones:
Quiero mencionar algunos otros desafíos que encontré al ajustar Paligemma usando Big Vision y JAX.
- Configurar diferentes configuraciones de modelos es difícil porque todavía hay poca documentación sobre esos parámetros.
- La primera versión de Paligemma ha sido entrenada para manejar imágenes de diferentes relaciones de aspecto redimensionadas a 224×224. Asegúrese de cambiar el tamaño de sus imágenes de entrada solo con este tamaño. Esto evitará generar excepciones.
- Al realizar ajustes con Big Vision y JAX, es posible que tenga problemas relacionados con la GPU JAX. Las formas de superar este problema son:
a. Reducir las muestras en sus conjuntos de datos de entrenamiento y validación.
b. Aumentar el tamaño del lote de 8 a 16 o más.
- El modelo perfeccionado tiene un tamaño de ~ 5 GB. Asegúrate de tener suficiente espacio en tu Drive para almacenarlo.
Descubrir un nuevo modelo de IA es apasionante, especialmente en esta era de algoritmos multimodales que transforman nuestra sociedad. Sin embargo, trabajar con modelos de última generación a veces puede resultar complicado debido a la falta de documentación disponible. Por lo tanto, el lanzamiento de un nuevo modelo de IA debe ir acompañado de una documentación completa para garantizar su adopción generalizada y sin problemas, especialmente entre los profesionales que aún no tienen experiencia en esta área.
A pesar de las dificultades que encontré para ajustar Paligemma, los modelos pre-entrenados actuales son poderosos para realizar detección de objetos y segmentación de imágenes de disparo cero, lo que se puede usar para muchas aplicaciones, incluido el etiquetado de ML asistido.
¿Estás utilizando Paligemma en tus proyectos de visión por computadora? ¡Comparte tu experiencia ajustando este modelo en los comentarios!
Espero que hayas disfrutado de esta publicación. Una vez más, ¡gracias por leer!
Puedes contactarme a través de LinkedIn en:
https://www.linkedin.com/in/camartinezbarbosa/
Agradecimientos: Quiero agradecer a José Celis-Gil por todas las fructíferas discusiones sobre preprocesamiento y modelado de datos.