Z-Imageで「イラスト風」のLoRAを作ってみる

今回は、Z-Imageをベースにして、qingman_style というトリガーワードで呼び出せるイラスト風LoRAを作る設定について、ざっくり話していきます。

結果:

今回の目的は、キャラクターそのものを覚えさせるというより、絵柄を覚えさせることです。なので、設定の中でも content_or_style: "style" になっています。ここがけっこう大事で、「この子を再現したい」ではなく、「この雰囲気の絵を出したい」という方向ですね。

---
job: "extension"
config:
  name: "zimage-newqingman"
  process:
    - type: "diffusion_trainer"
      training_folder: "D:\\lora\\ai-toolkit\\output"
      sqlite_db_path: "./aitk_db.db"
      device: "cuda"
      trigger_word: "qingman_style"
      performance_log_every: 10
      network:
        type: "lora"
        linear: 64
        linear_alpha: 64
        conv: 32
        conv_alpha: 32
        lokr_full_rank: true
        lokr_factor: -1
        network_kwargs:
          ignore_if_contains: []
      save:
        dtype: "bf16"
        save_every: 250
        max_step_saves_to_keep: 4
        save_format: "diffusers"
        push_to_hub: false
      datasets:
        - folder_path: "D:\\lora\\ai-toolkit\\datasets/qingman"
          mask_path: null
          mask_min_value: 0.1
          default_caption: ""
          caption_ext: "txt"
          caption_dropout_rate: 0.15
          cache_latents_to_disk: false
          is_reg: false
          network_weight: 1
          resolution:
            - 1024
          controls: []
          shrink_video_to_frames: true
          num_frames: 1
          flip_x: false
          flip_y: false
          num_repeats: 1
      train:
        batch_size: 1
        bypass_guidance_embedding: false
        steps: 4500
        gradient_accumulation: 1
        train_unet: true
        train_text_encoder: false
        gradient_checkpointing: true
        noise_scheduler: "flowmatch"
        optimizer: "adamw8bit"
        timestep_type: "weighted"
        content_or_style: "style"
        optimizer_params:
          weight_decay: 0.0001
        unload_text_encoder: false
        cache_text_embeddings: false
        lr: 0.00002
        ema_config:
          use_ema: false
          ema_decay: 0.99
        skip_first_sample: false
        force_first_sample: false
        disable_sampling: false
        dtype: "bf16"
        diff_output_preservation: false
        diff_output_preservation_multiplier: 1
        diff_output_preservation_class: "person"
        switch_boundary_every: 1
        loss_type: "mse"
      logging:
        log_every: 1
        use_ui_logger: true
      model:
        name_or_path: "Tongyi-MAI/Z-Image"
        quantize: true
        qtype: "qfloat8"
        quantize_te: true
        qtype_te: "qfloat8"
        arch: "zimage"
        low_vram: true
        model_kwargs: {}
        layer_offloading: false
        layer_offloading_text_encoder_percent: 1
        layer_offloading_transformer_percent: 1
      sample:
        sampler: "flowmatch"
        sample_every: 250
        width: 1024
        height: 1024
        samples:
          - prompt: "qingman_style, portrait, 1girl, looking at viewer, soft light, clean background"
          - prompt: "qingman_style, simple lineart, flat color, soft color, low contrast, minimal shading, illustration, 1girl, solo, smile, open_mouth, short_hair,"
          - prompt: "qingman_style, simple lineart, clean lines, thin lines, flat color, soft color, low contrast, minimal shading, illustration,1girl, holding flowers, soft light, indoor"
          - prompt: "qingman_style, simple lineart,  flat color, soft color, low contrast, minimal shading, illustration,1girl, solo, looking_at_viewer, blush, smile, open_mouth, short_hair, simple_background, shirt, white_background, upper_body, short_sleeves, :d, striped_clothes, black_eyes, hands_up, own_hands_together, yellow_shirt, striped_shirt"
          - prompt: "qingman_style, photo of a man"
          - prompt: "qingman_style, a random scene, unknown character, indoor"
          - prompt: "qingman_style, simple lineart, clean lines, flat color, soft color, low contrast, minimal shading, illustration,1girl, solo, smile, open_mouth, short_hair, simple_background, shirt, brown_hair, white_background, full_body, short_sleeves, :d, shoes, pants, medium_hair, striped_clothes, from_side, profile, white_footwear, denim, sneakers, yellow_shirt, running, striped_shirt, jeans, blue_pants"
          - prompt: "qingman_style, simple lineart, soft color, flat shading,low contrast, illustration, photo of a man, medium shot, modeling clothing, studio lighting, white backdrop"
          - prompt: "qingman_style, simple lineart, soft color, flat shading,low contrast, illustration, open_mouth, short_hair, shirt, skirt, multiple_girls, brown_hair, holding, 2girls, sitting, closed_eyes, indoors, window, chair, plant, desk, brown_skirt, paper, office_lady, id_card, computer, monitor, lanyard, swivel_chair, office_chair, office"
          - prompt: "qingman_style, simple lineart, soft color, flat shading,low contrast, illustration,  1girl, solo, blush, smile, short_hair, simple_background, brown_hair, long_sleeves, white_background, holding, closed_mouth, upper_body, closed_eyes, sweater, phone, cellphone, smartphone, holding_phone, pink_sweater"
        neg: ""
        seed: 42
        walk_seed: false
        guidance_scale: 4
        sample_steps: 30
        num_frames: 1
        fps: 1
meta:
  name: "[name]"
  version: "1.0"

データセットは D:\lora\ai-toolkit\datasets/qingman に置いていて、解像度は 1024。Z-Imageは高解像度のイラスト表現とも相性を見たいので、最初から1024で学習する形になっています。キャプションは .txt を読む設定で、caption_dropout_rate は 0.15。つまり、たまにキャプションを落として、モデルがテキストに頼りすぎないようにしている感じです。

LoRAのネットワーク設定は、linear: 64conv: 32。わりとしっかりめにスタイルを入れる設定ですね。軽いLoRAというより、「ちゃんと絵柄を乗せたい」方向です。linear_alpha も 64、conv_alpha も 32 なので、ランクとアルファを揃えています。スタイルLoRAとしては、けっこう素直で扱いやすい設定だと思います。

学習ステップは 4500。保存は 250ステップごとで、サンプルも同じく250ステップごとに出します。これはかなり見やすいです。途中で「まだ薄いな」とか、「あ、ちょっと覚えすぎてきたかも」とか判断しやすいので、スタイルLoRAを作るときには便利ですね。

学習率は 0.00002、つまり 2e-5。そこまで攻めた学習率ではなく、比較的じわじわ覚えさせるタイプです。オプティマイザは adamw8bit なので、VRAMを節約しながら学習できます。さらにモデル側も qfloat8 で量子化していて、low_vram: true も入っているので、全体的に「重いモデルをなんとか現実的な環境で回す」ための設定になっています。

サンプルプロンプトを見ると、かなり意図がはっきりしています。

simple lineartclean linesflat colorsoft colorlow contrastminimal shading みたいな言葉が何度も入っています。つまり、狙っているのは、線がきれいで、色が柔らかくて、影が少なめの、すっきりしたイラストスタイルですね。

人物だけじゃなくて、室内シーンやオフィス、花を持っている女の子、スマホを持っている女の子、走っている全身絵などもテストしています。これはかなり良いです。顔アップだけで確認すると、LoRAがちゃんと汎用的に効いているのか分かりにくいので、全身、複数人、背景あり、男性、ランダムシーンまで入れているのは実用的です。

特に photo of a man みたいなプロンプトを混ぜているのも面白いところです。これは、LoRAが女の子イラストだけに寄りすぎていないか確認するために使えます。もし男性や写真系のプロンプトでも強制的に同じ女の子っぽい絵になってしまうなら、少し学習が強すぎる可能性があります。

ネガティブプロンプトは空です。これは一度、モデルとLoRAの素の出方を見るには良いと思います。最初からネガティブを盛りすぎると、LoRA自体のクセが分かりにくくなるので、確認用としてはシンプルでいいですね。

全体的に見ると、この設定は「軽く雰囲気だけ乗せるLoRA」というより、qingman_style という特定の柔らかいイラストスタイルを、かなりしっかり覚えさせる方向です。線画、低コントラスト、フラットカラー、ミニマルな影。このあたりがうまく出てくれば成功だと思います。

ただし、4500ステップまで回す場合は、途中のサンプル確認がかなり大事です。たとえば 1500、2500、3500、4500 あたりを比べて、どの段階が一番自然か見るのがおすすめです。スタイルLoRAは、最後のステップが必ず一番良いとは限りません。途中のほうが絵柄は乗っているけど、自由度も残っていて使いやすい、ということもよくあります。

個人的には、まず250ステップごとの出力を見ながら、線の安定感、色の柔らかさ、顔の固定され具合、背景への影響をチェックします。もし顔が毎回似すぎるなら少し過学習気味。逆に、色や線があまり変わらないなら、まだ学習が足りないか、キャプションやデータセット側を見直す必要があります。

まとめると、この設定はかなり実戦向けです。VRAMを意識しつつ、Z-Imageで1024解像度のスタイルLoRAを作るための、バランスの取れた構成になっています。qingman_style を入れたときに、柔らかい色、きれいな線、控えめな影、すっきりしたイラスト感が安定して出るようになれば、このLoRAはかなり使いやすいものになるはずです。

コメントを残す

必須項目 *