Cree un estilista de IA con IBM Granite usando watsonx.ai

En este tutorial, se le guiará a través de cómo crear un estilista personal impulsado por IA generativa. Este tutorial aprovecha el modelo de lenguaje grande (LLM) IBM® Granite Vision 3.2 para procesar la entrada de imágenes y Granite 3.2 con las últimas capacidades de razonamiento mejoradas para formular ideas de atuendos personalizables.

Introducción

¿Con qué frecuencia se encuentra pensando: “¿Qué me pongo hoy?” ¡Ni siquiera sé por dónde empezar a elegir artículos de mi armario!” Este dilema es uno que muchos de nosotros compartimos. Gracias al uso de modelos de inteligencia artificial (IA) de última generación, esto ya no tiene por qué ser una tarea abrumadora.

Estilo de IA: cómo funciona

Nuestra solución impulsada por IA se compone de las siguientes etapas:

  1. El usuario carga imágenes de su guardarropa actual o incluso artículos en su lista de deseos, un artículo a la vez.
  2. El usuario selecciona los siguientes criterios:   
  • Ocasión: casual o formal.
  • Hora del día: mañana, tarde o noche.
  • Estación del año: invierno, primavera, verano u otoño.
  • Ubicación (por ejemplo, una cafetería).

3. Tras el envío de la entrada, el modelo multimodal Granite Vision 3.2 itera sobre la lista de imágenes y devuelve el siguiente resultado:

  • Descripción del artículo.
  • Categoría: camisa, pantalón o zapatos.
  • Ocasión: casual o formal.

4. El modelo Granite 3.2 con razonamiento mejorado sirve como estilista de moda. El LLM utiliza la salida del modelo Vision para proporcionar una recomendación de vestimenta adecuada para el evento del usuario.

5. La sugerencia de atuendo, un marco de datos de artículos que el usuario cargó y las imágenes en la recomendación personalizada descrita se devuelven al usuario.

Requisitos previos

Necesita una cuenta de IBM Cloud para crear un proyecto watsonx.ai .

Pasos

Para utilizar la interfaz de programación de aplicaciones (API) de watsonx, deberá completar los siguientes pasos.  Tenga en cuenta que también puede acceder a este tutorial en GitHub

Paso 1: Configurar el entorno

  1. Inicie sesión en watsonx.ai mediante su cuenta de IBM Cloud.

  2. Cree un proyecto watsonx.ai.

    Puede obtener su ID de proyecto desde dentro de su proyecto. Haga clic en la pestaña Manage. Luego, copie el ID del proyecto de la sección Details de la página General. Necesita este ID para este tutorial.

Paso 2. Configurar el servicio de tiempo de ejecución de watsonx.ai y la clave de API

  1. Cree una instancia de servicio watsonx.ai Runtime (elija el plan Lite, que es una instancia gratuita).

  2. Genere una clave de API.

  3. Asocie el servicio de watsonx.ai Runtime al proyecto que creó en watsonx.ai.

Paso 3. Clonar el repositorio (opcional)

Para una experiencia más interactiva al usar esta herramienta de IA, clone el repositorio de GitHub y siga las instrucciones de configuración en el archivo README.md dentro del proyecto de estilista de IA para lanzar la aplicación Streamlit en su máquina local. De lo contrario, si prefiere seguir paso a paso, cree un Jupyter Notebook y continúe con este tutorial.

Paso 4. Instalar e importar bibliotecas relevantes y configurar sus credenciales

Necesitamos algunas bibliotecas y módulos para este tutorial. Asegúrese de importar los siguientes; si no están instalados, puede resolver este problema con una instalación rápida de pip.

# Install required packages
!pip install -q image ibm-watsonx-ai
# Required imports
import getpass, os, base64, json
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
from PIL import Image

Para establecer nuestras credenciales, necesitamos el WATSONX_APIKEY  y WATSONX_PROJECT_ID  que generó en el paso 1. También establecemosURL sirviendo como endpoint de la API.

WATSONX_APIKEY = getpass.getpass("Please enter your watsonx.ai Runtime API key (hit enter): ")
WATSONX_PROJECT_ID = getpass.getpass("Please enter your project ID (hit enter): ")
URL = "https://us-south.ml.cloud.ibm.com"

Podemos usar la Credentials  clase para encapsular nuestras credenciales aprobadas.

credentials = Credentials(
    url=URL,
    api_key=WATSONX_APIKEY
)

Paso 5. Configurar la solicitud de API para el modelo Granite Vision

Se llama al augment_api_request_body La función toma la consulta del usuario y la imagen como parámetros y amplía el cuerpo de la solicitud de la API. Usaremos esta función en cada iteración de inferencia del modelo Vision.

def augment_api_request_body(user_query, image):
    messages = [
        {
            "role": "user",
            "content": [{
                "type": "text",
                "text": user_query
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{image}"
                }
            }]
        }
    ]
return messages

También podemos crear una instancia de la interfaz del modelo utilizando la ModelInference  clase.

model = ModelInference(
    model_id="ibm/granite-vision-3-2-2b",
    credentials=credentials,
    project_id=WATSONX_PROJECT_ID,
    params={
        "max_tokens": 400,
        "temperature": 0
    }
)

Paso 6. Codificar imágenes

Para codificar nuestras imágenes de una manera que sea digerible para el LLM, las codificaremos en bytes que luego decodificaremos en representación UTF-8. En este caso, nuestras imágenes se encuentran en el directorio local de imágenes. Puede encontrar imágenes de muestra en el directorio de estilista de IA en nuestro repositorio de GitHub.

directory = "images" #directory name
images = []
filenames = []
for filename in os.listdir(directory):
    if filename.endswith(".jpeg") or filename.endswith(".png"):
        filepath = directory + '/' + filename
        with open(filepath, "rb") as f:
            images.append(base64.b64encode(f.read()).decode('utf-8'))
        filenames.append(filename)

Paso 7. Categorizar la entrada con el modelo Vision

Ahora que hemos cargado y codificado nuestras imágenes, podemos consultar el modelo Vision. Nuestra instrucción es específica de nuestra salida deseada para limitar la creatividad del modelo a medida que buscamos una salida JSON válida. Almacenaremos la descripción, categoría y ocasión de cada imagen en una lista llamada closet .

user_query = """Provide a description, category, and occasion for the clothing item or shoes in this image.
                Classify the category as shirt, pants, or shoes.
                Classify the occasion as casual or formal.
                Ensure the output is valid JSON. Do not create new categories or occasions. Only use the allowed classifications.
                Your response should be in this schema:
                {
                    "description": "<description>",
                    "category": "<category>",
                    "occasion": "<occasion>"
                }
                """

image_descriptions = []
for i in range(len(images)):
    image = images[i]
    message = augment_api_request_body(user_query, image)
    response = model.chat(messages=message)
    result = response['choices'][0]['message']['content']
    print(result)
    image_descriptions.append(result)

Resultado:

{
    "description": "A pair of polished brown leather dress shoes with a brogue detailing on the toe box and a classic oxford design.",
    "category": "shoes",
    "occasion": "formal"
}
{
    "description": "A pair of checkered trousers with a houndstooth pattern, featuring a zippered pocket and a button closure at the waist.",
    "category": "pants",
"occasion": "casual"
}
{
    "description": "A light blue, button-up shirt with a smooth texture and a classic collar, suitable for casual to semi-formal occasions.",
    "category": "shirt",
    "occasion": "casual"
}
{
    "description": "A pair of khaki pants with a buttoned waistband and a button closure at the front.",
    "category": "pants",
    "occasion": "casual"
}
{
    "description": "A blue plaid shirt with a collar and long sleeves, featuring chest pockets and a button-up front.",
    "category": "shirt",
    "occasion": "casual"
}
{
    "description": "A pair of bright orange, short-sleeved t-shirts with a crew neck and a simple design.",
    "category": "shirt",
    "occasion": "casual"
}
{
    "description": "A pair of blue suede sneakers with white laces and perforations, suitable for casual wear.",
    "category": "shoes",
    "occasion": "casual"
}

{
    "description": "A pair of red canvas sneakers with white laces, isolated on a white background.",
    "category": "shoes",
    "occasion": "casual"
}
{
    "description": "A pair of grey dress pants with a smooth texture and a classic design, suitable for formal occasions.",
    "category": "pants",
    "occasion": "formal"
}
{
    "description": "A plain white T-shirt with short sleeves and a crew neck, displayed from the front and back.",
    "category": "shirt",
    "occasion": "casual"
}
{
    "description": "A black short-sleeved t-shirt with a crew neck and a simple design.",
    "category": "shirt",
    "occasion": "casual"
}
{
    "description": "Black pants with a zippered pocket and a buttoned fly, showing the waistband and pocket details.",
    "category": "pants",
    "occasion": "casual"
}
{
    "description": "A pair of tan leather boots with a chunky sole and a high-top design, suitable for casual wear.",
    "category": "shoes",
    "occasion": "casual"
}

Paso 8. Generar conjuntos con el modelo de razonamiento

Ahora que tenemos cada prenda y calzado categorizados, será mucho más fácil para el modelo de razonamiento generar un atuendo para la ocasión seleccionada. Creemos una instancia y consultemos el modelo de razonamiento.

reasoning_model = ModelInference(
    model_id="ibm/granite-3-2-8b-instruct",
    credentials=credentials,
    project_id=WATSONX_PROJECT_ID
)

Para alinear los nombres de archivo con las descripciones de las imágenes, podemos enumerar la lista de descripciones de imágenes y crear una lista de diccionarios en los que almacenamos la descripción, la categoría, la ocasión y el nombre de archivo de cada elemento en los campos respectivos.

# Add filenames to the image descriptions
closet = []
for i, desc in enumerate(image_descriptions):
    desc_dict = json.loads(desc)
    desc_dict['filename'] = filenames[i]
    image_descriptions[i] = json.dumps(desc_dict)

closet = [json.loads(js) for js in image_descriptions]

Ahora, consultemos el modelo Granite 3.2 con razonamiento para producir un atuendo para nuestros criterios especificados utilizando la closet  lista.

occasion = input("Enter the occasion") #casual or formal (e.g. "casual")
time_of_day = input("Enter the time of day") #morning, afternoon or evening (e.g. "morning")
location = input("Enter the location") #any location (e.g. "park")
season = input("Enter the season") #spring, summer, fall or winter (e.g. "fall")

prompt = f"""Use the description, category, and occasion of the clothes in my closet to put together an outfit for a {occasion} {time_of_day} at the {location}. The event takes place in the {season} season. Make sure to return only one shirt, bottoms, and shoes. Use the description, category, and occasion provided. Do not classify the items yourself. Include the file name of each image in your output along with the file extension. Here are the items in my closet: {closet}"""

messages = [
        {"role": "control",
        "content": "thinking"},
        {"role": "user",
        "content": [
                {"type": "text",
                 "text": f"{prompt}"}
            ]}
        ]
outfit = reasoning_model.chat(messages=messages)['choices'][0]['message']['content']
print(outfit)

Resultado

Este es mi proceso de pensamiento:
- El atuendo debe ser adecuado para una mañana informal en el parque durante el otoño.
- Seleccionaré una camisa, un par de pantalones y un par de zapatos que se ajusten a la categoría de ocasión "casual".
- Evitaré prendas formales o demasiado elegantes y elegiré prendas que sean cómodas para las actividades en el parque.

Esta es mi respuesta:

Para una mañana informal en el parque en otoño, sugiero el siguiente atuendo:

1. **Camisa**: una camisa azul a cuadros con cuello y manga larga (archivo: 'image13.jpeg')
- El patrón a cuadros es clásico para el otoño y combina bien con entornos casuales de parques. Las mangas largas ofrecen cierta protección contra las temperaturas más frías de la mañana.

2. **Pantalones**: pantalones caqui con cintura abotonada y cierre de botones en la parte delantera (archivo: 'image7.jpeg')
- El caqui es una opción versátil que puede combinar con el ambiente casual y también proporciona un buen equilibrio con la camisa a cuadros. Son prácticos y cómodos para caminar.

3. **Zapatos**: un par de botas de cuero color canela con suela gruesa y diseño de caña alta (archivo: 'image3.jpeg')
- Las botas de cuero color canela ofrecen una opción elegante, pero cómoda. La suela gruesa proporciona un buen agarre y soporte, ideal para transitar por senderos de parques o terrenos irregulares.

Esta combinación proporciona un aspecto relajado y elegante, adecuado para una salida matutina casual, al tiempo que considera la comodidad y la practicidad.

Con esta descripción de atuendo generada, también podemos mostrar las prendas de vestir que recomienda el modelo. Para hacerlo, simplemente podemos extraer los nombres de archivo. En caso de que el modelo mencione el mismo nombre de archivo dos veces, es importante verificar si la imagen aún no se ha mostrado a medida que iteramos la lista de imágenes. Podemos hacerlo almacenando las imágenes mostradas en la selected_items  lista. Finalmente, podemos mostrar los elementos seleccionados.

selected_items = []
#extract the images of clothing that the model recommends
for item, uploaded_file in zip(closet, images):
    if item['filename'].lower() in outfit.lower() and not any(key['filename'] == item['filename'] for key in selected_items):
        selected_items.append({
            'image': uploaded_file,
            'category': item['category'],
            'filename': item['filename']
        })

#display the selected clothing items
if len(selected_items) > 0:
    for item in selected_items:
        display(Image.open(directory + '/' + item['filename']))

Conclusión

En este tutorial, creó un sistema que utiliza IA para proporcionar consejos de estilo a un evento específico de un usuario. Mediante fotos o capturas de pantalla de la ropa del usuario, los atuendos se personalizan para cumplir con los criterios especificados. El modelo Granite-Vision-3-2-2b fue crítico para etiquetar y categorizar cada elemento. Además, el modelo Granite-3-2-8B-instruct aprovechó sus capacidades de razonamiento para generar ideas de atuendos personalizados.

Algunos siguientes pasos para crear esta aplicación pueden incluir:

  • Personalización de atuendos según el estilo personal de un usuario, tipo de cuerpo, paleta de colores preferida y más.
  • Ampliar los criterios para incluir chaquetas y accesorios. Por ejemplo, el sistema podría proponer un blazer para un usuario que asiste a una conferencia formal además de la camisa, los pantalones y los zapatos seleccionados.
  • Actuar como comprador personal al proporcionar recomendaciones de productos de comercio electrónico y precios que se alineen con el estilo y presupuesto únicos del usuario.
  • Agregar la funcionalidad de chatbot para hacer preguntas al LLM sobre cada atuendo.
  • Proporcionar una experiencia de prueba virtual que utiliza una selfie del usuario para simular el aspecto final.
Soluciones relacionadas
IBM watsonx.ai

Entrene, valide, ajuste y despliegue IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de próxima generación para creadores de IA. Diseñe aplicaciones de IA en menos tiempo y con menos datos.

Descubra watsonx.ai
Soluciones de inteligencia artificial

Ponga la IA a trabajar en su negocio con la experiencia en IA líder en la industria y la cartera de soluciones de IBM a su lado.

Explore las soluciones de IA
Consultoría y servicios de IA

Reinvente los flujos de trabajo y las operaciones críticas añadiendo IA para maximizar las experiencias, la toma de decisiones en tiempo real y el valor empresarial.

Conozca los servicios de IA
Dé el siguiente paso

Obtenga acceso único a capacidades que abarcan el ciclo de vida del desarrollo de IA. Produzca potentes soluciones de IA con interfaces fáciles de usar, flujos de trabajo y acceso a API y SDK estándar de la industria.

Explore watsonx.ai Reserve una demostración en vivo