Einen virtuellen KI-Stylisten basierend auf IBM Granite und watsonx.ai erstellen

In diesem Tutorial werden Sie durch die Entwicklung eines generativen KI-gestützten persönlichen Stylisten geführt. Dieses Tutorial nutzt das IBM® Granite Vision 3.2 Large Language Models (LLM) für die Verarbeitung von Bildeingabe und Granite 3.2 mit den neuesten erweiterten Funktionen für die Formulierung anpassbarer Outfit-Ideen.

Einführung

Wie oft erwischen Sie sich dabei zu denken: „Was soll ich heute anziehen? Ich weiß gar nicht, wo ich bei der Auswahl in meinem Kleiderschrank anfangen soll!“ Dieses Dilemma kennen viele von uns. Dank modernster Modelle der Künstlichen Intelligenz (KI) muss diese Entscheidung jedoch keine Herausforderung mehr sein.

KI-Styling: Wie es funktioniert

Unsere KI-gestützte Lösung umfasst die folgenden Phasen:

  1. Der Nutzer lädt Bilder seiner aktuellen Garderobe oder auch von Artikeln auf seiner Wunschliste hoch, jeweils einen Artikel nach dem anderen.
  2. Der Benutzer wählt die folgenden Kriterien aus:   
  • Anlass: lässig oder formell.
  • Tageszeit: morgens, nachmittags oder abends.
  • Jahreszeit: Winter, Frühling, Sommer oder Herbst.
  • Ort (zum Beispiel ein Café).

3. Nach Übermittlung der Eingabe iteriert das multimodale Granite Vision 3.2-Modell die Liste der Bilder und gibt die folgende Ausgabe zurück:

  • Beschreibung des Gegenstands.
  • Kategorie: Hemd, Hose oder Schuhe.
  • Anlass: lässig oder formell.

4. Das Granite 3.2-Modell mit erweiterter Logik dient dann als Modestylist. Das LLM nutzt die Ausgabe des Vision-Modells, um eine Outfit-Empfehlung zu geben, die für die Veranstaltung des Benutzers geeignet ist.

5. Der Outfit-Vorschlag, ein Datenrahmen mit Artikeln, die der Benutzer hochgeladen hat, und die Bilder in der beschriebenen personalisierten Empfehlung werden alle an den Nutzer zurückgegeben.

Voraussetzungen

Sie benötigen ein IBM Cloud-Konto, um für das Erstellen eines  watsonx.ai™-Projekts.

Schritte

Um die watsonx Programmierschnittstelle (API) nutzen zu können, müssen Sie die folgenden Schritte ausführen.  Hinweis: Sie können dieses Tutorial auch auf GitHub aufrufen. 

Schritt 1. Einrichten Ihrer Umgebung

  1. Melden Sie sich bei watsonx.ai mit Ihrem IBM Cloud-Konto an.

  2. Erstellen Sie ein watsonx.ai-Projekt.

    Sie können Ihre Projekt-ID in Ihrem Projekt abrufen. Klicken Sie auf die Registerkarte Verwalten. Kopieren Sie dann die Projekt-ID aus dem Abschnitt Details der Seite Allgemein. Sie benötigen diese ID für dieses Tutorial.

Schritt 2. Einrichtung von watsonx.ai Runtime Service und API-Schlüssel

  1. Erstellen Sie eine Instanz des watsonx.ai Runtime Service (wählen Sie den Lite-Plan als kostenlose Instanz).

  2. Generieren Sie einen API-Schlüssel.

  3. Verknüpfen Sie den watsonx.ai Runtime Service mit dem Projekt, das Sie in watsonx.ai erstellt haben.

Schritt 3. Das Repository klonen (optional)

Für ein interaktiveres Erlebnis bei der Verwendung dieses KI-Tools klonen Sie das GitHub-Repository und folgen Sie den Einrichtungsanweisungen in der README.md-Datei innerhalb des KI-Stylisten-Projekts, um die Streamlit-Anwendung auf Ihrem lokalen Computer zu starten. Wenn Sie lieber Schritt für Schritt vorgehen möchten, erstellen Sie ein Jupyter Notebook und fahren Sie mit diesem Tutorial fort.

Schritt 4. Installieren und importieren relevanter Bibliotheken und Einrichten Ihrer Zugangsdaten.

Für dieses Tutorial benötigen wir einige Bibliotheken und Module. Stellen Sie sicher, dass Sie Folgendes importieren; wenn diese nicht installiert sind, können Sie das Problem mit einer schnellen PIP-Installation beheben.

# 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

Um unsere Zugangsdaten festzulegen, benötigen wir die WATSONX_APIKEY  und WATSONX_PROJECT_ID  die Sie in Schritt 1 erstellt haben. Wir legen außerdem dieURL fest, die als API-Endgerät dient.

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"

Wir können die Credentials  Klasse verwenden, um unsere übergebenen Anmeldedaten zu kapseln.

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

Schritt 5. Einrichten der API-Anfrage für das Granite Vision-Modell

Dann augment_api_request_body  Die Funktion nimmt die Benutzeranfrage und das Bild als Parameter entgegen und erweitert den Body der API-Anfrage. Wir werden diese Funktion in jeder Iteration der Inferenz des Vision-Modells verwenden.

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

Wir können die Modellschnittstelle auch mithilfe der ModelInference  Klasse instanziieren.

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

Schritt 6. Kodieren der Bilder

Um unsere Bilder so zu kodieren, dass sie für das LLM verständlich sind, kodieren wir sie in Bytes, die wir dann in eine UTF-8-Darstellung dekodieren. In diesem Fall befinden sich unsere Bilder im lokalen Bilderverzeichnis. Sie finden Beispielbilder im Verzeichnis KI-Stylist in unserem GitHub-Repository.

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)

Schritt 7. Kategorisieren des Inputs mit dem Vision-Modell

Nachdem wir unsere Bilder geladen und kodiert haben, können wir das Vision-Modell abfragen. Unser Prompt ist spezifisch auf unsere gewünschte Ausgabe ausgerichtet, um die Kreativität des Modells einzuschränken, da wir eine gültige JSON-Ausgabe erhalten möchten. Wir speichern die Beschreibung, die Kategorie und den Anlass jedes Bildes in einer Liste namens 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"
}

Schritt 8. Generieren der Outfits mithilfe des Entscheidungsmodells

Nachdem wir nun jedes Kleidungsstück und jeden Schuh kategorisiert haben, wird es für das Modell viel einfacher sein, ein Outfit für den ausgewählten Anlass zu generieren. Lassen Sie uns das Argumentationsmodell instanziieren und abfragen.

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

Um die Dateinamen mit den Bildbeschreibungen abzugleichen, können wir die Liste der Bildbeschreibungen auflisten und eine Liste von Wörterbüchern erstellen, in denen wir die Beschreibung, die Kategorie, den Anlass und den Dateinamen jedes Elements in den jeweiligen Feldern speichern.

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

Nun fragen wir das Granite 3.2-Modell mit Argumentation ab, um ein Outfit für unsere angegebenen Kriterien unter Verwendung der closet  Liste speichern.

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)

Ausgabe: 

Hier ist mein Gedankengang:
Das Outfit sollte für einen entspannten Vormittag im Park im Herbst geeignet sein.
– Ich wähle ein Hemd, eine Hose und ein Paar Schuhe aus, die in die Anlasskategorie „Leger“ passen.
- Ich vermeide formelle oder übermäßig elegante Kleidung und wähle Kleidung, die für die Aktivitäten im Park bequem ist.

Hier ist meine Antwort:

Für einen ungezwungenen Morgen im Park im Herbst schlage ich das folgende Outfit vor:

1. **Hemd**: Ein blaues kariertes Hemd mit Kragen und langen Ärmeln (Datei: 'image13.j')
- Das Karomuster ist ein Klassiker für den Herbst und passt gut zu einer ungezwungenen Parkatmosphäre. Die langen Ärmel bieten einen gewissen Schutz vor kühleren Morgentemperaturen.

2. **Hose**: Khakifarbene Hose mit geknöpftem Bund und Knopfverschluss vorne (Datei: 'image7.jpeg')
- Khaki ist eine vielseitige Wahl, die sowohl zum lässigen Stil passt als auch einen schönen Kontrast zum karierten Hemd bildet. Sie ist praktisch und bequem zum Spazierengehen.

3. **Schuhe**: Ein Paar hellbraune Lederstiefel mit klobiger Sohle und hohem Schaft (Datei: 'image3.jpeg')
- Hellbraune Lederstiefel bieten eine stilvolle und gleichzeitig bequeme Option. Die klobige Sohle bietet guten Halt und Stabilität und ist ideal für die Begehung von Parkwegen oder unebenem Gelände.

Diese Kombination sorgt für einen entspannten, gepflegten Look, der sich für einen legeren Morgenausflug eignet und gleichzeitig Komfort und Praktikabilität berücksichtigt.

Mithilfe dieser generierten Outfitbeschreibung können wir auch die Kleidungsstücke anzeigen, die das Model empfiehlt! Dazu können wir einfach die Dateinamen extrahieren. Falls das Model denselben Dateinamen zweimal erwähnt, ist es wichtig zu überprüfen, ob das Bild nicht bereits angezeigt wurde, während wir die Liste der Bilder wiederholen. Dies können wir erreichen, indem wir die angezeigten Bilder in der selected_items  Liste speichern. Schließlich können wir die ausgewählten Elemente anzeigen.

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

Zusammenfassung

In diesem Tutorial haben Sie ein System entwickelt, das mithilfe von KI Stilberatung für einen bestimmten Anlass bietet. Anhand von Fotos oder Screenshots der Kleidung des Nutzers werden Outfits individuell an die vorgegebenen Kriterien angepasst. Das Granite-Vision-3-2-2b-Modell war für die Kennzeichnung und Kategorisierung der einzelnen Elemente von entscheidender Bedeutung. Darüber hinaus nutzte das Granite-3-2-8B-instruct-Modell seine Funktionen, um personalisierte Outfit-Ideen zu generieren.

Mögliche nächste Schritte zur Weiterentwicklung dieser Anwendung sind:

  • Anpassen von Outfits an den persönlichen Stil, den Körpertyp, die bevorzugte Farbpalette und mehr.
  • Erweiterung der Kriterien um Jacken und Accessoires. Das System könnte einem Benutzer, der an einer formellen Konferenz teilnimmt, zusätzlich zu Hemd, Hose und Schuhen einen Blazer vorschlagen.
  • Als persönlicher Einkaufsberater bieten wir E-Commerce-Produktempfehlungen und Preisgestaltung, die dem individuellen Stil und Budget des Nutzers entsprechen.
  • Hinzufügen einer Chatbot-Funktionalität, um dem LLM Fragen zu jedem Outfit zu stellen.
  • Bereitstellung einer virtuellen Erfahrung, bei der ein Selfie des Nutzers verwendet wird, um den endgültigen Look zu simulieren.
Weitere Lösungen
IBM watsonx.ai

Trainieren, validieren, optimieren und implementieren Sie generative KI, Foundation Models und maschinelle Lernfunktionen mit IBM watsonx.ai, einem Studio der nächsten Generation für AI Builder in Unternehmen. Erstellen Sie KI-Anwendungen mit einem Bruchteil der Zeit und Daten.

Entdecken sie watsonx.ai
Lösungen im Bereich künstlicher Intelligenz

Setzen Sie KI in Ihrem Unternehmen ein – mit branchenführendem Fachwissen im Bereich KI und dem Lösungsportfolio von IBM an Ihrer Seite.

Erkunden Sie KI-Lösungen
KI-Beratung und -Services

Erfinden Sie kritische Workflows und Abläufe neu, indem Sie KI einsetzen, um Erfahrungen, Entscheidungsfindung in Echtzeit und den geschäftlichen Nutzen zu maximieren.

KI-Services entdecken
Machen Sie den nächsten Schritt

Profitieren Sie von einem einheitlichen Zugriff auf Funktionen, die den gesamten Lebenszyklus der KI-Entwicklung abdecken. Erstellen Sie leistungsstarke KI-Lösungen mit benutzerfreundlichen Oberflächen, Workflows und Zugriff auf branchenübliche APIs und SDKs.

watsonx.ai erkunden Live-Demo buchen