42 Punkte von xguru 2025-02-03 | 5 Kommentare | Auf WhatsApp teilen
  • Ich habe ein Projekt ausprobiert, bei dem ich über ein paar Stunden hinweg mein eigenes KI-Bildmodell trainiert habe, um Fotos zu erzeugen, die aussehen, als hätte ich sie selbst aufgenommen.
    • Beispiel: ein Bild von mir im „Superman“-Kostüm
  • Warum ich es ausprobiert habe: Es klang nach Spaß, war gut geeignet, um mit den Kindern damit zu spielen, und ich konnte mehr über Custom-Modelle und den fortgeschritteneren KI-Bereich lernen
  • Vor 12–18 Monaten war dieser Vorgang noch ziemlich kompliziert, inzwischen ist er aber sehr einfach geworden
  • Ich habe das Modell in weniger als 2 Stunden erstellt und die gewünschten Bilder bekommen; der Schlüssel war, schnell die richtigen Tools zu finden

Auswahl von Modell/Trainingsmuster

  • Benötigte Bestandteile
    • Basismodell (base model)
    • Trainings-/Fine-Tuning-Technik
    • Trainingsdatensatz (ein paar Fotos von sich selbst usw.)
  • Viele AIs empfehlen Stable Diffusion, aber weil das von Pieter Levels verwendete Modell Flux bessere Leistung liefern soll, habe ich mich für Flux entschieden
    • Es ist zwar nicht das allerneueste SOTA-Modell, aber mehr als gut genug
  • Als Trainingsmethode habe ich LoRA (Low-Rank Adaptation) verwendet
    • Dabei wird nicht das gesamte Modell neu trainiert, sondern nur der Teil, der mit einem bestimmten „magischen Wort“ verknüpft ist
    • Beispiel: Dem Modell wird ein seltenes Wort wie „czue“ beigebracht; wenn dieses Wort im Prompt verwendet wird, spiegelt das Ergebnis die Merkmale des entsprechenden Datensatzes wider

Erstellen des Trainingssatzes

  • Man muss mehrere Fotos des zu lernenden Motivs vorbereiten (etwa 10–15 Stück)
    • Je abwechslungsreicher Gesichtsausdrücke, Hintergründe, Licht und Perspektiven sind, desto besser
    • Idealerweise ist nur eine Person pro Foto zu sehen
  • Für das Training wird eine Textbeschreibung benötigt, und darin muss das magische Wort enthalten sein
    • Beispiel: "a photo of czue on the beach, wearing a blue shirt"
  • Neuere Tools erzeugen Bildbeschriftungen aber automatisch, sodass man die Beschreibungen nicht selbst eingeben muss

Das Modell trainieren

  • Anfangs wollte ich lokal trainieren, aber wegen zu wenig GPU und RAM war das schwierig
  • Man kann den Code auch direkt auf einem GPU-Cloud-Server ausführen, letztlich habe ich aber Replicate verwendet
    • Das ist ein GPU-Mietservice, bei dem sich bereits vorbereitete Rezepte sofort nutzen lassen
  • In diesem Fall habe ich das Rezept ostris/flux-dev-lora-trainer verwendet
    • Nach dem Erstellen eines Replicate-Kontos muss man die Abrechnungsinformationen einrichten
  • Wichtige Parameter
    • input_images: Trainingsfotos (zip)
    • trigger_word: magisches Wort, z. B. „czue“
    • hf_repo_id, hf_token: Hugging Face Repository/Token
    • autocaption_prefix: Text, der vor automatisch erzeugte Captions gesetzt wird (z. B. "A photo of czue,")

Das Modell in Hugging Face speichern

  • Hugging Face ist eine Plattform zum Speichern und Teilen von Modellen
  • Replicate speichert das trainierte Modell zwar ebenfalls irgendwo, aber wenn man es auf Hugging Face hochlädt, lässt es sich leichter mit anderen Tools integrieren
  • Nach dem Erstellen von Konto und Modell übergibt man hf_repo_id
  • Nach Abschluss des Trainings wird eine große Datei namens lora.safetensors (ca. 180 MB) zu Hugging Face hochgeladen

Bilder mit dem Modell erzeugen

  • Nach dem Training folgt der Inference-Schritt, bei dem man Text in das Modell eingibt, um Bilder zu erzeugen
  • Man könnte das auch lokal ausprobieren, ich habe aber erneut Replicate verwendet
    • Bei lucataco/flux-dev-lora muss nur das Feld hf_lora gesetzt werden
      • öffentliche Hugging Face-Repository-ID oder Link zum in Replicate hochgeladenen trainierten Modell
  • Beispiel: Wenn man "a photo of czue surfing" eingibt, erhält man ein Bild von sich selbst beim Surfen

Das Modell programmatisch ausführen

  • Wenn man verschiedene Prompts ausprobieren und die Ergebnisse automatisch speichern will, ist die Nutzung per API-Aufruf praktisch
  • Dazu wurde das folgende Python-Skript als Beispiel geschrieben (der vollständige Code ist auf Github zu finden)
    # /// script  
    # requires-python = ">=3.12"  
    # dependencies = [  
    #     "replicate",  
    # ]  
    # ///  
    import argparse  
    import os  
    import re  
    import replicate  
    import uuid  
    
    DEFAULT_MODEL = "czue/me-v1"  
    DEFAULT_COUNT = 1  
    
    def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT):  
        return {  
            "prompt": prompt,  
            "hf_lora": model,  
            "num_outputs": count  
        }  
    
    def main():  
        parser = argparse.ArgumentParser()  
        parser.add_argument("prompt", help="Prompt for the photo")  
        parser.add_argument("--model", default=DEFAULT_MODEL,  
                          help="Model to use (default: %(default)s)")  
        parser.add_argument("--count", default=DEFAULT_COUNT,  
                          help="Number of photos to generate (default: %(default)s)", type=int)  
        args = parser.parse_args()  
    
        input = get_input(args.prompt, args.model, args.count)  
        output = replicate.run(  
            "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3",  
            input=input  
        )  
    
        output_dir = "output"  
        os.makedirs(output_dir, exist_ok=True)  
    
        prompt_slug = "-".join(args.prompt.split(" ")[-3:])  
        prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower()  
    
        for index, item in enumerate(output):  
            file_id = uuid.uuid4().hex[:5]  
            output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp")  
            with open(output_path, "wb") as file:  
                file.write(item.read())  
                print(f"Saved photo {output_path}")  
    
    if __name__ == "__main__":  
        main()  
    
  • Beispiel für die Verwendung
    uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \  
     --model="czue/me-v1" \  
     --count=4  
    

Ergebnis

  • Die Modellleistung ist schwankend
    • Es trifft die Merkmale der Person teilweise recht gut, erzeugt aber manchmal auch eine andere Person
    • Wenn man ein bestimmtes Alter, Geschlecht usw. zusätzlich im Prompt angibt, wird es etwas genauer
  • Zum Beispiel erzeugt "a photo of czue, a 40 year old man, writing a blog post" relativ konsistente Bilder
  • Dagegen waren die Ergebnisse bei "a photo of czue writing a blog post" viel uneinheitlicher
  • Wenn man andere Personen mit hinein nimmt, treten Probleme wie vermischte Gesichter auf
    • Als ich versuchte, ein Bild zusammen mit Barack Obama zu erzeugen, wurden Teile meines Gesichts auf Obama übertragen und umgekehrt
  • Trotzdem war es ausreichend unterhaltsam und nützlich, sodass ich zusammen mit den Kindern viele verschiedene Dinge ausprobieren konnte

Kosten

  • Es ist nicht kostenlos, aber auch nicht besonders teuer
  • Ich habe insgesamt 3 Modelle für mich und meine Kinder trainiert; jedes kostete etwa ~$2.50
  • Die Bildgenerierung kostet ungefähr $0.03 pro Bild, also etwa $1 für 30 Bilder
  • Für das gesamte Experiment habe ich weniger als $10 ausgegeben und war zufrieden, dass die Kosten geringer waren als erwartet
  • Wenn man sich für KI-Modelltraining und Bildgenerierung interessiert, lässt sich das leichter ausprobieren, als man denkt, und ist einen Versuch wert

5 Kommentare

 
cladio 2025-02-04

Ich habe das aus Spaß nachgemacht, und es ist wirklich einfach.
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
Ich habe allerlei Dinge erstellt und mich eine ganze Weile köstlich amüsiert...

 
botplaysdice 2025-02-04

Werden wir am Ende nicht versuchen, bevor wir sterben, ein Modell, das wie ich trainiert wurde, ins Netzwerk hochzuladen und dann zu sterben? Wie ein Überlebensinstinkt ... Auch wenn das nicht das „Ich“ ist.

 
sollscherr 2025-02-03

Als ich die Technologie gesehen habe, musste ich an einen Roman denken, den ich deshalb gern empfehlen möchte. Es handelt sich um die Kurzgeschichte „Chronos“ aus dem Erzählband Bisutbangul Pong der Schriftstellerin Lee Yu-ri. Darin geht es um einen KI, der einen Menschen behandelt – also um eine KI, die die eigenen Daten speichert und daraus lernt. So wie die Katze in jenem Kommentar. Eine an Demenz erkrankte Mutter nutzt das, bevor ihre Symptome schlimmer werden. Und die Kinder geraten darüber in Konflikt. Sie finden darin Trost und empfinden zugleich Schuldgefühle. Wenn Sie sich für die Technologie hier oder auch für die Geschichte dieser Katze interessieren, lesen Sie es einmal.

 
xguru 2025-02-03

Ein Hacker-News-Kommentar fällt ins Auge

  • Ich habe das für meine geliebte verstorbene Katze ausprobiert. Mit dem Ergebnis war ich zufrieden, aber irgendwann bekam ich plötzlich eine Gänsehaut bei dem, was ich da eigentlich tat
    • Das könnte ein großes Business werden. Ich habe vermutlich Hunderttausende E-Mails, SMS, Chats usw. verschickt; es ist durchaus machbar, den Kommunikationskorpus eines geliebten Menschen zu trainieren, damit man auch nach seinem Tod mit „ihm“ chatten kann
    • Nachdem mein Vater gestorben war, habe ich das mit seiner Stimme gemacht und die Möglichkeit eingerichtet, mit einem Assistenten zu sprechen, der von einem LLM unterstützt wird und in der Stimme und auf die Art meines Vaters antwortet. Das war eine sehr seltsame Art, in einer Zeit der Trauer damit umzugehen, und irgendwann kam es mir wirklich merkwürdig vor, was ich da tat
    • Das ist ähnlich wie die Black-Mirror-Episode „Be Right Back“

Es gibt auch einen informativen Kommentar

  • Bei Flux hat der Text-Encoder deutlich mehr Fähigkeiten, und man kann mit wesentlich aussagekräftigeren und umfassenderen Sätzen prompten
    • Daher kann man die früher bei Stable Diffusion üblichen knappen, durch Kommas getrennten Formulierungen reduzieren
  • Außerdem sollte man bei den Trainingsbildern dasselbe tun. Alles, woran das Modell sich nicht als „ich“ erinnern soll (was man gerade tut, welche Kleidung man trägt, mit wem man zusammen ist, Accessoires usw.), sollte man mit einer Caption versehen
 
humblebee 2025-02-03

„Jede hinreichend fortschrittliche Technologie ist von Magie nicht zu unterscheiden.“ – Arthur C. Clarke

Noch vor gerade einmal zwei Jahren hätte man so etwas nur in einem SF-Film gesehen, und jetzt erleben wir tatsächlich in Echtzeit, wie Magie Wirklichkeit wird 😳