Crea uno stylist AI con IBM Granite utilizzando watsonx.ai

In questo tutorial ti guideremo attraverso la creazione di uno stylist personale basato su AI generativa. Questo tutorial utilizza il modello linguistico di grandi dimensioni (LLM) IBM® Granite Vision 3.2 per elaborare l'input delle immagini e Granite 3.2 con le ultime funzionalità di ragionamento avanzate per formulare idee personalizzabili di outfit.

Introduzione

Quante volte ti ritrovi a pensare: "Cosa mi metto oggi? Non so nemmeno da dove cominciare a scegliere tra quello che ho nell'armadio!" Questo è un dilemma che abbiamo entrambi. Ma, utilizzando modelli di intelligenza artificiale (IA ) all'avanguardia, non sarà più un problema.

Styling AI: Come funziona

La nostra soluzione basata sull'AI è composta dalle seguenti fasi:

  1. L'utente carica immagini del proprio guardaroba attuale o anche degli oggetti nella sua wishlist, un oggetto alla volta.
  2. L'utente seleziona i seguenti criteri:   
  • Occasione: informale o formale.
  • Ora del giorno: mattina, pomeriggio o sera.
  • Stagione dell'anno: inverno, primavera, estate o autunno.
  • Location (ad esempio, una caffetteria).

3. Al momento dell'invio dell'input, il modello multimodale Granite Vision 3.2 itera sulla lista delle immagini e restituisce il seguente output:

  • Descrizione dell'oggetto.
  • Categorie: maglietta, pantaloni o scarpe.
  • Occasione: informale o formale.

4. Il modello Granite 3.2 con ragionamento avanzato funge quindi da fashion stylist. L'LLM utilizza l'output del modello Vision per fornire una raccomandazione di abbigliamento adatta all'evento dell'utente.

5. Il suggerimento di abbigliamento, un frame di dati degli articoli che l'utente ha caricato e le immagini nella raccomandazione personalizzata descritta vengono tutti restituiti all'utente.

Prerequisiti

Per creare un progetto  watsonx.ai è necessario un account IBM® Cloud.

Passaggi

Per utilizzare l'application programming interface (API) watsonx, è necessario completare i seguenti passaggi.  Nota: puoi accedere a questo tutorial anche su GitHub

Passaggio 1. Configura il tuo ambiente

  1. Accedi a watsonx.ai utilizzando il tuo account IBM Cloud.

  2. Crea un progetto watsonx.ai.

    Puoi ottenere l'ID del tuo progetto dall'interno del tuo progetto. Clicca sulla scheda Gestisci. Quindi, copia l'ID del progetto dalla sezione Dettagli della pagina Generali. Per questo tutorial ti serve questo ID.

Passaggio 2: configura un servizio watsonx.ai runtime e una chiave API

  1. Crea un'istanza di servizio watsonx.ai Runtime (scegli il piano Lite, che è un'istanza gratuita).

  2. Genera una chiave API.

  3. Associa il servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.

Passaggio 3. Clona il repository (facoltativo)

Per un'esperienza più interattiva nell'uso di questo strumento AI, clona il repository GitHub e segui le istruzioni di configurazione nel file README.md all'interno del progetto di stylist AI per avviare l'applicazione Streamlit sulla tua macchina locale. In alternativa, se preferisci procedere passo dopo passo, crea un Jupyter Notebook e continua con questo tutorial.

Passaggio 4. Installa e importa le librerie pertinenti e configura le tue credenziali

Abbiamo bisogno di alcune librerie e moduli per questo tutorial. Assicurati di importare le seguenti e, se non sono installate, puoi risolvere il problema con una rapida installazione 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

Per impostare le nostre credenziali, abbiamo bisogno del WATSONX_APIKEY  e WATSONX_PROJECT_ID  che hai generato nel passaggio 1. Imposteremo ancheURL che funge da endpoint dell'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"

Possiamo usare Credentials  la classe per incapsulare le credenziali trasmesse.

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

Passaggio 5. Imposta la richiesta API per il modello Granite Vision

Il wrapper augment_api_request_body  la funzione prende la query utente e l'immagine come parametri e completa il corpo della richiesta API. Utilizzeremo questa funzione in ogni iterazione dell'inferenza del modello 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

Possiamo anche istanziare l'interfaccia del modello usando la ModelInference  classe.

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

Passaggio 6. Codifica le immagini

Per codificare le nostre immagini in un modo che sia digeribile per l'LLM, le codificheremo in byte che poi decodificheremo in una rappresentazione UTF-8. In questo caso, le nostre immagini si trovano nella directory di immagini locale. Puoi trovare immagini di esempio nella directory degli stylist AI nel nostro repository 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)

Passaggio 7. Categorizza l'input con il modello Vision

Ora che abbiamo caricato e codificato le nostre immagini, possiamo interrogare il modello Vision. Il nostro prompt è specifico per l'output desiderato, per limitare la creatività del modello mentre cerchiamo un output JSON valido. Memorizzeremo la descrizione, la categoria e l'occasione di ogni immagine in un elenco chiamato 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)

Output

{
    "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"
}

Passaggio 8. Genera gli outfit con il modello di ragionamento

Ora che abbiamo categorizzato ogni articolo di abbigliamento e di scarpe, sarà molto più facile per il modello di ragionamento generare un outfit per l'occasione selezionata. Istanziamo e interroghiamo il modello di ragionamento.

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

Per allineare i nomi dei file con le descrizioni delle immagini, possiamo enumerare la lista delle descrizioni delle immagini e creare una lista di dizionari in cui archiviare la descrizione, la categoria, l'occasione e il nome del file di ogni elemento nei rispettivi campi.

# 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]

Ora, interroghiamo il modello Granite 3.2 con il ragionamento per produrre un abito per i criteri da noi specificati, utilizzando closet  l'elenco.

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)

Output

Ecco il mio ragionamento:
- L'outfit deve essere adatto a una mattina informale al parco in autunno.
- Selezionerò una camicia, un paio di pantaloni e un paio di scarpe adatti alla categoria "casual".
- Eviterò capi formali o troppo eleganti e sceglierò capi comodi per le attività del parco.

Ecco la mia risposta:

Per una mattinata informale al parco in autunno, ti suggerisco il seguente abbigliamento:

1. **Camicia**: una camicia a quadri blu con colletto e maniche lunghe (file: 'image13.jpeg')
- Il motivo a quadri è un classico dell'autunno e si abbina bene a un'uscita casual nel parco. Le maniche lunghe offrono una certa protezione dalle temperature più fresche del mattino.

2. **Pantaloni**: Pantaloni kaki con cintura e abbottonatura sul davanti (file: 'image7.jpeg')
- Il kaki è una scelta versatile che si adatta all'atmosfera casual e offre anche un bel equilibrio con la camicia a quadri. Sono pratici e comodi per camminare.

3. **Scarpe**: Un paio di stivali in pelle marrone con suola spessa (file: 'image3.jpeg')
- Gli stivali in pelle marrone offrono un'opzione elegante e confortevole. La suola robusta offre una buona aderenza e un buon sostegno, ideale per percorrere i sentieri del parco o i terreni irregolari.

Questa combinazione offre un look rilassato e completo, adatto a un'uscita mattutina informale, tenendo conto anche del comfort e della praticità.

Con questa descrizione dell'outfit, possiamo anche mostrare i capi di abbigliamento consigliati dal modello! Per farlo, possiamo semplicemente estrarre i nomi dei file. Nel caso in cui il modello menzioni due volte lo stesso nome del file, è importante verificare che l'immagine non sia già stata visualizzata mentre iteriamo la lista delle immagini. Possiamo farlo memorizzando le immagini visualizzate  selected_items  nell'elenco. Infine, mostriamo gli elementi selezionati.

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']))

Conclusione

In questo tutorial, hai costruito un sistema che utilizza l'AI per fornire consigli di stile a un evento specifico di un utente. Utilizzando foto o schermate degli abiti dell'utente, gli abiti vengono personalizzati per soddisfare i criteri specificati. Il modello Granite-Vision-3-2-2b è stato critico per etichettare e categorizzare ogni articolo. Inoltre, il modello Granite-3-2-8B-instruct ha utilizzato le sue funzionalità per creare idee di outfit personalizzate.

I prossimi passaggi da compiere per sviluppare questa applicazione possono essere i seguenti:

  • Personalizzare gli outfit in base allo stile personale, al tipo di corpo, alla palette di colori preferita e altro ancora.
  • Ampliare i criteri per includere giacche e accessori. Ad esempio, il sistema può proporre un blazer a un utente che partecipa a una conferenza formale, oltre alla camicia, ai pantaloni e alle scarpe selezionati.
  • Serve come personal shopper, fornendo raccomandazioni di prodotti di e-commerce e prezzi in linea con lo stile unico e il budget dell'utente.
  • Aggiungere la funzionalità chatbot per porre domande al LLM su ogni outfit.
  • Offre un'esperienza di prova virtuale che utilizza un selfie dell'utente per simulare l'aspetto finale.
Soluzioni correlate
IBM watsonx.ai

Addestra, convalida, adatta e implementa le funzionalità di AI generativa, foundation model e machine learning con IBM watsonx.ai, uno studio aziendale di nuova generazione per builder AI. Crea applicazioni AI in tempi ridotti e con una minima quantità di dati.

Scopri watsonx.ai
Soluzioni di intelligenza artificiale

Metti l'AI al servizio della tua azienda grazie all'esperienza leader di settore e alla gamma di soluzioni di IBM nel campo dell'AI.

Esplora le soluzioni AI
Consulenza e servizi sull'AI

Reinventa i flussi di lavoro e le operazioni critiche aggiungendo l'AI per massimizzare le esperienze, il processo decisionale in tempo reale e il valore di business.

Esplora i servizi AI
Fai il passo successivo

Ottieni l'accesso completo a funzionalità che coprono l'intero ciclo di vita dello sviluppo dell'AI. Crea soluzioni AI all'avanguardia con interfacce intuitive, workflow e accesso alle API e agli SDK standard di settore.

Esplora watsonx.ai Prenota una demo live