---
title: LoRA-treenaus
---

[takaisin](/) | [LoRA-kuvatekstien korjaus](/amytrainerkorjaus)

# Identity-LoRA Z-Image Base

OneTrainerilla koulutetaan henkilön identity-LoRA [**Z-Image Base**](https://huggingface.co/Tongyi-MAI/Z-Image) -malliin. Esimerkkihenkilönä on aikuinen näyttelijä, ikäluokka noin 36–42. Sama työnkulku toimii kenelle tahansa henkilölle, kunhan dataset ja maskit ovat laadukkaita ja asetukset pidetään samanlaisina. Menetelmällä voi kouluttaa muutakin kuin henkilöitä, kuten sijainteja, tavaroita tai tyylisuuntia.

[valmiit LoRAt](/z_image_base_training_final/loras/), [generoituja esimerkkikuvia](/z_image_base_training_final/krita_ai_test/?layout=grid), [materiaalit](/z_image_base_training_final/)

## Lyhyesti

1. Kerää 40–70 terävää, erilaisista kulmista otettua kuvaa samasta henkilöstä.
2. Rajaa kuvat oikeaan kuvasuhteeseen, mieluiten 1024 pikselin luokkaan.
3. Kirjoita jokaiselle kuvalle kuvateksti `.txt`, joka sisältää saman triggerin.
4. Luo jokaiselle kuvalle maski `*-masklabel.png` (henkilö valkoisena, tausta mustana).
5. Asenna OneTrainer ja lataa Z-Image Base **diffusers-kansiona**, ei yhtenä `.safetensors`-tiedostona.
6. Aseta LoRA rank/alpha 32, Prodigy_ADV, LR 1.0, masked training, resoluutio 1024.
7. Treenaa noin 5000-5500 steppiä. Seuraa näytekuvia.
8. Testaa valmis LoRA esim. RES multistep sampler, CFG 3.5, 40 step.

## 1. Kuva-aineisto

Lähdekuvien aineisto eli *dataset* tai *concepts*.

Kelpaa:

- terävä pysäytyskuva, ei liikesumennusta
- kasvot näkyvät selvästi
- vaihtelevat kulmat, valot ja ilmeet
- yksi päähenkilö kuvassa

Älä käytä:

- sumea, raskas meikki joka peittää piirteet kaikissa kuvissa
- sama kaulakoru tai asu kymmenessä kuvassa (se tarttuu LoRAan)
- toinen henkilö etualalla

Rajaukseen toimi hyvin [Dataset Preparation](https://huggingface.co/spaces/malcolmrey/dataset-preparation) ja [Crop Images to Any Aspect Ratio](https://cropforme.com/crop-aspect-ratio).

**Esimerkkikuvia toimivasta aineistosta**

![half body](/z_image_base_training_final/datasets/amyadams-axad/half_body_neutral_2.png)
A half body photograph of axad woman looking aside with a slight smile. She has shoulder-length wavy hair and is wearing a pale grey blouse, in indoor light.

![sitting](/z_image_base_training_final/datasets/amyadams-axad/sitting_6.jpg)
A full body photograph of axad woman sitting with her legs crossed. She is looking aside and smiling with teeth. She has long wavy hair and is wearing a white pinstripe shirt dress with black heeled sandals, in studio light.

![standing](/z_image_base_training_final/datasets/amyadams-axad/standing_beanie_1.png)
A three-quarter photograph of axad woman standing and holding a folded newspaper. She is looking aside with a serious expression and her mouth slightly open. She has wavy hair and is wearing a knit beanie, a scarf, and a coat, in outdoor light.

![walking](/z_image_base_training_final/datasets/amyadams-axad/walking_trench_1.png)
A full body photograph of axad woman walking. She is looking aside with a serious expression. She has wavy hair and is wearing a beige trench coat over a grey skirt with heels, in outdoor light.

## 2. Kuvatekstit

Kohde: aikuinen nainen, trigger `axad woman `  
Pohjamalli: Z-Image / SD3.5 / Flux (Qwen/T5 -enkooderit)  
Työkalu: OneTrainer, masked training  
Metodi: Hybrid Natural Language (Tarkat kategoriat upotettuna englanninkielisiin lauseisiin)

**Yleiset säännöt**

1. Syntaksi (Hybrid Natural Language)  
 Modernit enkooderit ymmärtävät kontekstin lauserakenteista.  
 Älä käytä pelkkiä pilkuilla erotettuja tageja. Kirjoita lyhyitä, selkeitä englanninkielisiä lauseita.  
 Trigger-sana `axad woman` on sijoitettava heti ensimmäiseen lauseeseen.

2. Yhtenäisyys  
 Käytä samoja vakiotermejä koko aineistossa.  
 Älä käytä synonyymejä samoille asennoille tai ilmeille (esim. aina `looking aside`, ei koskaan `gazing away`).

3. Fakta ja kohinan minimointi  
 Kirjoita vain se mitä kuva näyttää. Älä arvaa tai täydennä puuttuvaa tietoa.  
 Ei subjektiivisia sanoja tai laatutageja (`beautiful`, `sexy`, `masterpiece`, `8k`, `photorealistic`).  
 Älä nimeä henkilöä (`Amy Adams`, `actress`, `celebrity`).  
 Kohde on aina: `axad woman`.

4. Vakiopiirteiden kielto  
 Älä koskaan kuvaile henkilön staattisia anatomisia ominaisuuksia. Nämä opitaan lähdekuvien pikseleistä.  
 Kielletty: silmien väri, ihon sävy, pisamat, nenän muoto, ikä.  
 Hiusten VÄRI mainitaan vain jos se poikkeaa normaalista. Hiusten RAKENNE (`wavy`, `curly`, `bun`) kirjoitetaan aina.

5. Muuttuvien piirteiden erottelu  
 Kuvan rajaus, asento, katse, ilme, hiustyyli, vaate, näkyvät asusteet, valaistus ja lokaatio on merkittävä tekstiin.  
 Kaikki muuttuva on irrotettava identiteetistä.


**Vakiotermit**

Kuvan rajaus (Pakollinen ensimmäiseen lauseeseen)  
 `tight close-up`, `close-up`, `headshot`, `waist-up`, `half body`, `three-quarter`, `full body`

Katse (Kriittinen: zoomaa iirikseen)  
 `looking at the camera`, `looking aside` (iiris sivuun kasvojen suunnasta riippumatta), `looking past the camera` (iiris ohi kamerasta), `looking up`, `looking down`, `looking over her shoulder`

Ilme (Pakollinen)  
 `neutral expression`, `serious expression`, `slight smile`, `smiling with teeth` (suu kiinni), `wide smile showing teeth`, `laughing with her mouth open`, `mouth open`, `talking` (suu auki ilman naurua), `mouth slightly open`

Hiukset (Malli, ei väriä)  
 `wavy hair`, `straight hair`, `curly hair`, `long hair`, `shoulder-length`, `hair in a low bun`, `hair in a ponytail`, `hair in an updo`, `hair in rollers`, `hair tucked behind the ears`, `wet hair`

Asennot ja kuvakulmat  
 `rear view`, `side view`, `three-quarter view`, `standing`, `sitting in a chair`, `bending forward at the waist`, `arms crossed`, `one hand on her chest`, `walking`

Vaatteet ja asusteet  
 Lyhyt tunnistettava kuvaus (esim. `short grey dress`, `black top with a white v-neck`).  
 Näkyvät hallitsevat korut on merkittävä (`drop earrings`, `thin necklace`, `hoop earrings`), jotta niitä ei leivota anatomiaan.  
 Näkyvä paljas iho (`cleavage`, `bare shoulders`, `bare legs`).


**Esimerkkejä rakenteesta**

Hyvä (Hybrid Natural Language):  
`A full body photograph of axad woman bending forward at the waist with one hand on her chest. She is looking aside with her mouth open, talking. She has curly hair and is wearing a short grey dress with heels and bare legs, in indoor light.`

Hyvä (Hybrid Natural Language):  
`A close-up photograph of axad woman looking at the camera with a serious expression and her mouth slightly open. She has long wavy hair and is wearing a green jacket over a collared shirt, with a brown leather strap over her shoulder, in indoor light.`

Hyvä (Hybrid Natural Language):  
`A waist-up photograph of axad woman standing with her arms crossed. She is looking past the camera with a neutral expression. She has her hair in rollers and is wearing a sheer black robe over dark lingerie, illuminated by window light.`

Huono (Vanhentunut CLIP-tagilista, ei Z-Imagelle):  
`axad woman, full body, bending forward, looking aside, mouth open, talking, curly hair, short grey dress, heels, indoor light.`

Huono (Vakiopiirteitä ja subjektiivisia laatutageja):  
`A masterpiece 8k portrait of axad woman. She has auburn hair, hazel eyes, and a detailed natural face. She is looking at the camera with a beautiful smile.`


## 3. Maskit

*Masked training* pitää identiteetin henkilössä, ei sohvassa tai aidassa.

OneTrainer odottaa nimeä `kuvanimi-masklabel.png`. Valkoinen = treenataan enemmän, musta = jätetään vähemmälle.

Riittävä tapa tässä ajossa oli `rembg` ja `u2net`.

OneTrainerissa on valmis rembg/maskityökalu (`caption_ui`). Alla oleva `make_masks.py` on vaihtoehto sille, jos haluat luoda maskeja ilman OneTraineria.

```bash
pip install rembg pillow numpy
python3 make_masks.py /polku/datasettiin
```

<details>
<summary>make_masks.py</summary>

```python
#!/usr/bin/env python3
"""
Create OneTrainer *-masklabel.png masks with rembg + u2net.

    pip install rembg pillow numpy
    python3 make_masks.py /path/to/concept-folder
    python3 make_masks.py /path/to/concept-folder --overwrite
"""

import argparse
import sys
from pathlib import Path

import numpy as np
from PIL import Image
from rembg import new_session, remove

IMAGE_EXTS = {".png", ".jpg", ".jpeg", ".webp"}


def make_mask(img_pil, session):
    result = remove(img_pil, session=session)
    alpha = np.array(result.split()[-1])
    mask = (alpha &gt; 30).astype(np.uint8) * 255
    return Image.fromarray(mask, mode="L")


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("folder")
    parser.add_argument("--overwrite", action="store_true")
    args = parser.parse_args()

    src_dir = Path(args.folder).expanduser().resolve()
    if not src_dir.is_dir():
        sys.exit(f"Folder not found: {src_dir}")

    session = new_session("u2net")
    images = [
        p for p in sorted(src_dir.iterdir())
        if p.suffix.lower() in IMAGE_EXTS and not p.name.endswith("-masklabel.png")
    ]

    for path in images:
        out_path = src_dir / f"{path.stem}-masklabel.png"
        if out_path.exists() and not args.overwrite:
            print(f"SKIP  {path.stem}")
            continue
        img = Image.open(path).convert("RGB")
        mask = make_mask(img, session)
        mask.save(out_path)
        arr = np.array(mask)
        cov = (arr &gt; 127).sum() / arr.size * 100
        print(f"{path.stem}  coverage {cov:.1f}%")


if __name__ == "__main__":
    main()

```

</details>

Tarkista maskit silmämääräisesti. Aita, toinen henkilö tai iso rekvisiitta maskissa pilaa koulutuksen. Korjaa tarvittaessa kuvanmuokkausohjelmassa. Maski on vain joko täysin mustaa (`#000000`) tai valkoista (`#ffffff`). Älä käytä valkoisen eri sävyjä jos et ole varma, että työkalu tukee. Pelkkä musta ja valkoinen on turvallisin vaihtoehto. Jos muokkaat, poimi oikea väri naapuripikselistä.

Bash-tarkistus, että joka kuvalla on tasan kolme tiedostoa:

```bash
find . -maxdepth 1 -type f \( -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.webp' -o -iname '*.txt' \) \
  | sed -E 's|^\./||; s/(-masklabel)?\.(png|jpg|jpeg|webp|txt)$//' \
  | sort | uniq -c | awk '$1!=3{print}'
```

## 4. OneTrainer

Virallinen projekti: [Nerogar/OneTrainer](https://github.com/Nerogar/OneTrainer)  
Dokumentit: [Training](https://github.com/Nerogar/OneTrainer/wiki/Training), [Concepts](https://github.com/Nerogar/OneTrainer/wiki/Concepts), [Captioning and masking](https://github.com/Nerogar/OneTrainer/blob/master/docs/CaptioningAndMasking.md)

`training_concepts/`[`amyadams-axad.json`](/z_image_base_training_final/training_concepts/amyadams-axad.json)  
`training_configs/`[`zb_amyadams_axad.json`](/z_image_base_training_final/training_configs/zb_amyadams_axad.json)  
`training_samples/`[`zb_amyadams_axad.json`](/z_image_base_training_final/training_samples/zb_amyadams_axad.json)  
`workspace/zb_amyadams_axad`  
`workspace-cache/zb_amyadams_axad`

Tämä ajo tehtiin Intel Arc Pro B70:llä (32 GB VRAM, XPU). Kesti noin kuusi tuntia.

OneTrainer **ei avaa** Z-Image Basea yhtenä `.safetensors`-tiedostona. Käytä Hugging Face -repon diffusers-kansiota.

```bash
mkdir -p ~/ai/models/diffusers/Z-Image
HF_XET_HIGH_PERFORMANCE=1 hf download Tongyi-MAI/Z-Image \
  --local-dir ~/ai/models/diffusers/Z-Image
```

Base Model -kenttään:

```text
/oma/koti/ai/models/diffusers/Z-Image
```

Vaihtoehtoisesti voit kirjoittaa pelkästään `Tongyi-MAI/Z-Image`, jolloin OneTrainer noutaa tiedostot itse. Aseta *Hugging Face Token*.

<details>
<summary>General-, Model- ja Data-välilehdet tästä ajosta</summary>

![general](/z_image_base_training_final/onetrainer_general.png)

![model](/z_image_base_training_final/onetrainer_model.png)

![data](/z_image_base_training_final/onetrainer_data.png)

</details>

## 5. Konseptit

- Path: kuva-aineiston hakemisto
- Prompt source: text file per sample
- Balancing / Repeats: `2.0`
- Masked training: päällä

*Repeats 2* tarkoittaa, että jokainen kuva nähdään kahdesti epochissa. Yhdellä konseptilla se vahvistaa identiteettiä. Liian iso arvo ylisovittaa (overfit), jolloin kuvissa oleva sisältö vahvistuu liikaa ja lopputulos on heikkolaatuinen tai täysin rikkinäinen LoRA.

<details>
<summary>Concepts-välilehden kuvat tästä ajosta</summary>

![concepts](/z_image_base_training_final/onetrainer_concepts.png)

![concept general](/z_image_base_training_final/onetrainer_concept_general.png)

![image aug](/z_image_base_training_final/onetrainer_concept_image_augmentation.png)

![text aug](/z_image_base_training_final/onetrainer_concept_text_augmentation.png)

![tilastot](/z_image_base_training_final/onetrainer_concept_statistics_1.png)

![tilastot 2](/z_image_base_training_final/onetrainer_concept_statistics_2.png)

</details>

## 6. Treenausasetukset

| Asetus | Arvo |
|--------|------|
| Optimizer | PRODIGY_ADV |
| Stochastic rounding | päällä |
| Learning rate | **1.0** (Prodigy, ei 1e-4) |
| Scheduler | CONSTANT |
| Warmup | 0 |
| Epochs | 50 (batch 1, repeats 2 ≈ noin 5000-5500 steppiä) |
| Local batch size | 1 |
| Gradient checkpointing | päällä, jos VRAM loppuu |
| Resolution | 1024 |
| Train dtype | bfloat16 |
| Masked training | päällä |
| Unmasked probability | 0.1 |
| Layer filter | attn-mlp |
| EMA | pois |
| SVDQuant / fp8 | pois |

LoRA-välilehti:

| Asetus | Arvo |
|--------|------|
| Rank | 32 |
| Alpha | 32 |
| Dropout | 0.05 |
| Weight dtype | bfloat16 |
| DoRA | pois |

Intel B70:llä batch 2 1024:lla antoi `UR_RESULT_ERROR_OUT_OF_RESOURCES`, eli oli liikaa ja VRAM täyttyi. Batch 1 + checkpointing käytti noin 18 GB.

<details>
<summary>Training- ja LoRA-välilehdet tästä ajosta</summary>

![training](/z_image_base_training_final/onetrainer_training.png)

![optimizer](/z_image_base_training_final/onetrainer_training_optimizer_settings.png)

![timestep](/z_image_base_training_final/onetrainer_training_timestep_distribution.png)

![lora](/z_image_base_training_final/onetrainer_lora.png)

</details>

## 7. Näytekuvat treenin aikana

Kaksi eri näytettä riittää: kasvot ja vartalo.

```text
axad woman, close-up portrait, looking at camera, soft light, detailed eyes
```

```text
axad woman, standing, three-quarter view, natural pose, detailed face
```

Base-samplessa CFG 3.5 ja 28 step. Turbo-samplen CFG 1.0 / 8 step on liian kevyt Baseen.

Paras checkpoint ei ole aina viimeinen. Tässä ajossa ajettiin noin 5000 steppiin.

OneTrainerin näytekuvien asetuksia voi muuttaa kesken treenin, ilman että sitä tarvitsee ensin pysäyttää. Kun olet tehnyt muutokset Sampling-välilehteen, ne tulevat voimaan seuraavassa sample-välissä.

<details>
<summary>Treenin sampleja (1000 → 5000 step)</summary>

![1000](/z_image_base_training_final/seed_42_2026-08-24_18-18-58-training-sample-1000-8-104.jpg)

![2250](/z_image_base_training_final/seed_42_2026-08-24_19-41-09-training-sample-2250-20-10.jpg)

![3250](/z_image_base_training_final/seed_42_2026-08-24_20-46-49-training-sample-3250-29-2.jpg)

![3500](/z_image_base_training_final/seed_42_2026-08-24_21-03-16-training-sample-3500-31-28.jpg)

![5000](/z_image_base_training_final/seed_42_2026-08-24_22-41-45-training-sample-5000-44-72.jpg)

</details>

<details>
<summary>Sampling-välilehti tästä ajosta</summary>

![sampling](/z_image_base_training_final/onetrainer_sampling.png)

![sample 1](/z_image_base_training_final/onetrainer_sampling_sample_1.png)

![sample 2](/z_image_base_training_final/onetrainer_sampling_sample_2.png)

</details>

## 8. Generointi valmiilla LoRAlla

Z-Image Base ei ole Turbo. Väärät näytteistäjät (sampler) tekevät sumean kuvan vaikka LoRA olisi hyvä.

Krita AI Diffusionissa toimi:

- checkpoint / diffusion model: Z-Image Base (`z_image_bf16.safetensors` generointiin, treeniin silti diffusers-kansio)
- LoRA strength 80–90 %
- sampler: **RES multistep simple**
- steps: 40
- CFG: 5.0
- resoluutio: vähintään 1024

Testikehote näytteenottojen vertailuun:

```text
axad woman, one woman only, solo, half body portrait, standing, facing camera, looking at camera, arms relaxed at her sides, natural pose, indoor soft light, photorealistic, sharp focus, detailed face, natural skin
```

Negative (Base tukee negatiivia, Turbo ei käytännössä):

```text
two people, extra limbs, extra fingers, extra arms, deformed hands, blurry, lowres, cropped head, ugly, cartoon, text, watermark
```

Älä käytä Turbo/Lightning/LCM/Hyper-preset-asetuksia Base-laatuun.

Vertailu ilman LoRAa samalla kehotteella tuottaa eri henkilön. Jos identiteetti näkyy vain LoRA päällä, koulutus on onnistunut.

<details>
<summary>vertailukuva ilman LoRAa</summary>

![Flux - Euler simple reference without LoRA](/z_image_base_training_final/krita_ai_test/Flux%20-%20Euler%20simple%20%28reference%20without%20LoRA%29.png)
Flux - Euler simple

</details>

<details>
<summary>generoidut kuvat LoRA:lla</summary>

![Alternative - Euler A](/z_image_base_training_final/krita_ai_test/Alternative%20-%20Euler%20A.png)
Alternative - Euler A

![Creative - DPM++ 2M SDE](/z_image_base_training_final/krita_ai_test/Creative%20-%20DPM++%202M%20SDE.png)
Creative - DPM++ 2M SDE

![ER-SDE - Beta](/z_image_base_training_final/krita_ai_test/ER-SDE%20-%20Beta.png)
ER-SDE - Beta

![ER-SDE - Flux 2](/z_image_base_training_final/krita_ai_test/ER-SDE%20-%20Flux%202.png)
ER-SDE - Flux 2

![ER-SDE - Simple](/z_image_base_training_final/krita_ai_test/ER-SDE%20-%20Simple.png)
ER-SDE - Simple

![Euler beta](/z_image_base_training_final/krita_ai_test/Euler%20beta.png)
Euler beta

![Flux - Euler simple.png](/z_image_base_training_final/krita_ai_test/Flux%20-%20Euler%20simple.png)
Flux - Euler simple

![RES multistep simple](/z_image_base_training_final/krita_ai_test/RES%20multistep%20simple.png)
RES multistep simple

</details>

## Z-Image Turbo -treenaus

[**Z-Image Turbo**](https://huggingface.co/Tongyi-MAI/Z-Image-Turbo) LoRAn koulutus on sama dataset + samat maskit. Erot OneTrainerissa:

| | Base | Turbo |
|--|------|-------|
| Pohjamalli | `Tongyi-MAI/Z-Image` <br> **diffusers**-kansio | Turbo + de-distill / training adapter <br> `.safetensors`-tiedosto <br>(esim. [ostris](https://huggingface.co/ostris/Z-Image-De-Turbo/resolve/main/z_image_de_turbo_v1_bf16.safetensors?download=true)) |
| Sample CFG / step | 3.5 / 28 | 1.0 / 8 |
| Generointi | RES / Euler, 36–48 step | er_sde, 8 step |
| Tavoite | laatu, CFG, negative | nopeus |

Älä treenaa suoraan tislattuun Turbo-checkpointiin ilman adapteria. Se hajottaa distillaation.

Turbo- ja Base-LoRAt kannattaa pitää erillisinä tiedostoina.

`training_concepts/`[`amyadams-axad.json`](/z_image_base_training_final/training_concepts/amyadams-axad.json)  
`training_configs/`[`zt_amyadams_axad.json`](/z_image_base_training_final/training_configs/zt_amyadams_axad.json)  
`training_samples/`[`zt_amyadams_axad.json`](/z_image_base_training_final/training_samples/zt_amyadams_axad.json)  
`workspace/zt_amyadams_axad`  
`workspace-cache/zt_amyadams_axad`

<details>
<summary>Turbo-ajon erot</summary>

![turbo model](/z_image_base_training_final/onetrainer_zt_model.png)

![turbo sample](/z_image_base_training_final/onetrainer_zt_sample.png)

</details>

## SDXL-treenaus

`training_concepts/`[`amyadams-axad.json`](/z_image_base_training_final/training_concepts/amyadams-axad.json)  
`training_configs/`[`xl_amyadams_axad.json`](/z_image_base_training_final/training_configs/xl_amyadams_axad.json)  
`training_samples/`[`xl_amyadams_axad.json`](/z_image_base_training_final/training_samples/xl_amyadams_axad.json)  
`workspace/xl_amyadams_axad`  
`workspace-cache/xl_amyadams_axad`

## Uusien kuvien lisäys

Muutama uusi kuva: jatka olemassa olevaa LoRAa lyhyesti, pidä vanha data mukana.

Isompi korjaus tai uusi piirre: lisää kuvat koko settiin ja kouluta uudestaan `v2`:ksi. Älä ylikirjoita toimivaa `v1`:tä.

## Linkit

- [OneTrainer](https://github.com/Nerogar/OneTrainer)
- [Z-Image Base](https://huggingface.co/Tongyi-MAI/Z-Image)
- [Z-Image Turbo](https://huggingface.co/Tongyi-MAI/Z-Image-Turbo)
- [De-distilled Z-Image Turbo](https://huggingface.co/ostris/Z-Image-De-Turbo)
- [Dataset Preparation](https://huggingface.co/spaces/malcolmrey/dataset-preparation)
- [Crop Images to Any Aspect Ratio](https://cropforme.com/crop-aspect-ratio)
- [Tämän ajon tiedostot](/z_image_base_training_final/)

*päivitetty 5.9.2026 | [lähdekoodi](/amytrainer.md)*
