nyako_style / scripts /prepare.py
ACCC1380's picture
Anima base Nyako LoRA: rank16 alpha16, 50 epochs, training artifacts and final resume state
f927ea3 verified
Raw History Blame Contribute Delete
1.76 kB
from pathlib import Path
import shutil,json,hashlib
from PIL import Image
root=Path('/data/nyako-training');src=root/'source_dataset';dst=root/'artifacts/dataset';dst.mkdir(exist_ok=True)
prefix=b'@nyako, '; rows=[]
for p in sorted(src.rglob('*.jpg')):
c=p.with_suffix('.txt'); assert c.exists(), 'Missing caption'
rel=p.relative_to(src); target=dst/rel;target.parent.mkdir(parents=True,exist_ok=True);shutil.copy2(p,target)
# Opaque byte operation only: caption text is never printed or interpreted.
original=c.read_bytes(); amended=prefix+original
target.with_suffix('.txt').write_bytes(amended)
assert target.with_suffix('.txt').read_bytes()[len(prefix):]==original
with Image.open(p) as im: size=im.size
rows.append({'image':str(rel),'size':size,'original_caption_sha256':hashlib.sha256(original).hexdigest(),'prefixed_caption_sha256':hashlib.sha256(amended).hexdigest()})
assert rows
(root/'artifacts/config/dataset_manifest.json').write_text(json.dumps({'repo':'ACCC1380/Nyako','revision':'f1048ee38473bc253ebdc4b4eba3b0c2dcebacb3','prefix':'@nyako, ','count':len(rows),'files':rows},indent=2))
print('Prepared image/caption pairs:',len(rows)); print('Image dimensions range:',[min(r['size'][i] for r in rows) for i in (0,1)],[max(r['size'][i] for r in rows) for i in (0,1)])
folders=sorted(set(str((dst/r['image']).parent) for r in rows))
text='[general]\ncaption_extension = ".txt"\nshuffle_caption = false\n\n[[datasets]]\nresolution = 1024\nbatch_size = 2\nenable_bucket = true\nmin_bucket_reso = 256\nmax_bucket_reso = 2048\nbucket_reso_steps = 64\nbucket_no_upscale = false\n'
for folder in folders:text+='\n[[datasets.subsets]]\nimage_dir = '+json.dumps(folder)+'\nnum_repeats = 1\n'
(root/'artifacts/config/dataset.toml').write_text(text)