Releases: akalavol/LoRA-Dataset-Coach
v1.0.13 — Multiple reference photos (robust identity)
The reference field now accepts a single photo OR a folder of photos (face, 3/4, full-body...). With a folder, the analyzer builds an identity centroid (mean face embedding) for a much more robust 'right person / wrong person' check. New 📁 folder picker; preview shows first ref + count; no-face refs are skipped. Body-shape matching stays out of scope (face识别 via InsightFace; CLIP body sim stays indicative).
v1.0.12 — Valid Kohya dataset_config.toml
Fixes 'Invalid user config: extra keys not allowed @ data[model]' when loading the generated Kohya config. Now generates a valid sd-scripts dataset_config.toml (for Kohya's Dataset Config field) + kohya_GUI_SETTINGS.txt with the recommended GUI values, and documents the no-toml folder method.
v1.0.11 — Cache write fix (float32) — cache finally persists
Cache now actually persists
Echec ecriture cache : Object of type float32 is not JSON serializable
Some analysis fields are numpy float32 / int64, which json.dumps can't
write — so the cache file was never saved, and every run re-analyzed
everything (no duplicate-skipping). save_cache (and the live preview
messages) now serialize numpy types correctly.
Answer to "shouldn't it read the JSONs first to avoid duplicates?": it already
does — load_cache runs at the start of every analysis. The write was the
broken part. Now that it persists, re-scanning a folder reuses the unchanged
photos and only analyzes new/modified ones.
Updating
- In-app updater now works (fixed in 1.0.10): ⚙ Config → 🔄 Check → ⬇ Install
- Or
git pull
v1.0.10 — Fix the in-app updater (it copied 0 files)
The updater is finally fixed
If you clicked "Install update" and were still on the old version after
restarting — that's this bug. The updater downloaded the new release but
copied 0 files because:
- the file-exclusion check looked at the absolute path, which always contains
the temp-folder name_update_tmp, so every file was skipped; - the extracted folder could be mistaken for the downloaded
release.zip.
Both fixed and verified against the live GitHub release (23 files copied,
VERSION bumped correctly, success message now shows the new version).
⚠️ One manual update required this time
Because the broken updater is what ships in v1.0.8 / v1.0.9, those versions
cannot self-update to this fix. Do ONE manual update:
- Download the Source code (zip) from this release.
- Extract it, replacing your current folder (your
config.jsonis kept; it's
gitignored and the updater also protects it). - Launch
run.bat.
After that, the in-app updater (⚙ Config → 🔄 Check now → ⬇ Install) works for
all future versions.
Tip: keep ONE copy
If you have several extracted folders (1.0.1, 1.0.3, 1.0.7, main…), delete the
old ones and keep a single folder to avoid launching a stale version by mistake.
v1.0.9 — Analysis cache now persists (no more full re-scans)
Cache fix
The .analyzer_cache.json wasn't being reused — every run re-scanned
everything. Root cause: on versions ≤ 1.0.5 the analysis crashed at the very
end (the summary_verdict bug, fixed in 1.0.6) before the cache was
written, so the cache file was never created.
What's new in 1.0.9
- Incremental cache saving — the cache is flushed every 10 images during
the analysis (and during phase-2 captioning), not only at the end. If a run
is interrupted (app closed, crash, power loss), the already-analyzed photos
are remembered and skipped next time. - Explicit cache log at the start of each run:
Cache trouvé : N photo(s) déjà analysée(s)orAucun cache (1er scan).
How the cache works (verified correct)
Each photo is keyed by name | size | modification-time:
- Unchanged file → reused instantly (no re-analysis)
- Modified or replaced file → re-analyzed
- New file added to the folder → only it gets analyzed
So: add 5 photos to a 200-photo set, re-scan → only the 5 new ones are processed.
Updating
- Zip users: ⚙ Config → 🔄 Check now → ⬇ Install update
- Git users:
git pull
v1.0.8 — Fix PDF crash + clear 'what photos are missing' panel
Two fixes from your feedback
1. PDF export no longer crashes 📄
FPDFUnicodeEncodingException: Character "→" ... not supported by helvetica.
The PDF core font is latin-1 only, and arrows / degree signs / emoji broke it.
All text written to the PDF is now sanitized centrally — known symbols become
ASCII (→ → ->, ≥ → >=, ° → deg, emoji → tags), anything else is
replaced. PDF export works on any dataset now.
2. Much clearer "what photos are missing" 📸
New coverage panel in the verdict, showing present vs missing shot types
at a glance, each count colour-coded (green = covered, yellow = thin, red = absent):
📸 Couverture du dataset (photos viables) :
Angles : face 70 · 3/4 8 · profil 0 ❗ aucun profil
Cadrage : gros plan 75 · mi-corps 5 · plein pied 0 ❗ aucun plein pied
Expressions : sourire (60), neutre (20) ❗ peu varié
📷 Photos à générer pour compléter :
➕ Genere 2-3 photos de profil (yaw 60-80°)
➕ Genere 5-8 plans moyens (visage + corps)
The same coverage + to-generate list is also written to _analysis_report.txt.
Updating
- Zip users: ⚙ Config → 🔄 Check now → ⬇ Install update
- Git users:
git pull
v1.0.7 — Auto-save reports + grade in summary + fix empty table
What you asked for
1. Auto-save after every analysis 💾
Two files are now written automatically into the dataset folder at the end of
each analysis:
_analysis_report.json— the full result (re-loadable, shareable)_analysis_report.txt— a readable summary: global grade, action plan,
per-target scores, recommendations, and the per-image table
Your results are never lost again, even if you close the app.
2. The grade is shown in the bottom summary 🏆
The lower panel now leads with 🏆 NOTE : A (EXCELLENT) — in addition to the
big colored verdict block above the table.
Also fixed (important)
A regression where the results table and bottom summary were never filled
after an analysis. That display code had drifted into the "move rejects"
button handler, so it only ran when you moved rejects. It's now in its own
method, called at the end of every analysis.
Updating
- Zip users: ⚙ Config → 🔄 Check now → ⬇ Install update
- Git users:
git pull
v1.0.6 — Critical fix: analysis no longer crashes at the end
Critical bug fix
From a real 215-photo run, two issues:
1. Every analysis crashed at the very end 🛑
UnboundLocalError: summary_verdict — the summary was built referencing the
verdict before it was computed, so the run crashed after processing all
images, losing the entire result. Fixed: the verdict is now injected after
the grade is computed.
2. JoyCaption was disabled without bitsandbytes
If bitsandbytes wasn't installed, JoyCaption's INT4 mode failed at model
load and the captioner was skipped entirely. Now:
- bitsandbytes is detected up-front
- without it, JoyCaption loads in BF16 (~8 GB VRAM) instead of being skipped
- a hard INT4 failure also auto-falls back to BF16
Bonus
This release also bundles the v1.0.4 GPU acceleration — insightface face
detection and CLIP now run on your GPU instead of CPU.
Updating
- Zip download users: ⚙ Config → 🔄 Check now → ⬇ Install update, or
re-download this release zip. - Git users:
git pull
If you want INT4 (half the VRAM for JoyCaption):
<ComfyUI>/python_embeded/python.exe -m pip install bitsandbytes
v1.0.5 — Two-phase captioning (caption only viable photos)
Your idea, made even smarter
You suggested: in "All" mode, do WD14 → Florence → JoyCaption in order.
That's exactly the new pipeline — but with a key improvement: the heavy
captions run last AND only on photos worth keeping.
The problem with the old behavior
In "All" mode, every image went face → CLIP → WD14 → Florence → JoyCaption
before moving to the next. JoyCaption (~30-120s/image) ran on every photo,
including the ones about to be rejected (blurry, wrong person, duplicates).
New two-phase pipeline
- Phase 1 — fast analysis on all images: face detection, CLIP, quality,
WD14 tags, AI detection, artifacts → computes the viability verdict. - Phase 2 — Florence-2 / JoyCaption run only on viable / borderline
photos. Rejects are skipped entirely.
Impact
On a 200-photo dataset with ~80 viable, JoyCaption now runs on 80 images
instead of 200 — roughly 60% less time on the slow step.
Bonus:
- Phase 2 has its own progress bar + live preview, so you see the fast
analysis results (and the dataset verdict) before the slow captioning. - The cache stores phase-2 captions, so if you later keep more photos, only
the newly-kept ones get captioned. - Per-target scores correctly reflect the captions.
Updating
- Git:
git pull - In-app: ⚙ Config → 🔄 Check now → ⬇ Install update
v1.0.4 — GPU acceleration for face + CLIP, device selector
Performance: now actually uses your GPU
You asked about coupling CPU+GPU. The honest answer: true data-parallel
splitting gives only ~1.25× (the CPU is ~4× slower than the GPU on these
models) for double the memory and a lot of fragile code — not worth it.
But the investigation found the real problem: two models that run on every
single image were pinned to CPU even when a GPU was available:
- insightface face detection
- CLIP (body + expression analysis)
This release puts them on the GPU when one is present → ~3-5× faster
on those stages, for every analysis.
New: device selector (⚙ Config tab)
- Auto (GPU if available) — default, the smart choice
- Force GPU (CUDA) — falls back to CPU safely if no GPU detected
- Force CPU — hides the GPU from the whole subprocess (torch +
onnxruntime + every captioner). Handy when ComfyUI is busy on the GPU.
The chosen device is shown in the progress log, and is honored by both the
analyzer and the LoRA evaluator.
Real-world impact
Combined with v1.0.3 (no more 10-min timeout) and the WD14-first workflow,
a 200-photo dataset is now far quicker:
- WD14 mode on GPU: a few minutes
- JoyCaption still benefits because face + CLIP no longer bottleneck on CPU
before each caption.
Updating
- Git:
git pull - In-app: ⚙ Config → 🔄 Check now → ⬇ Install update