Trained based on NAI final model using 55 images including some koikatsu and game screenshot. Anyway it works well for me when drawing with AOM3A3. (Expect the shobofuku, it seems impossible to draw asymmetrical clothing. And AI likes her shoulder very much. Even I put the "off_shoulder" tag in negative prompt in weight 2. AI still wants to draw her shoulder.)
Sample images information:
Steps: 20, Sampler: DPM++ SDE Karras, CFG scale: 7, Seed: 1089767602, Size: 512x512, Model hash: eb4099ba9c, Denoising strength: 0.7, Clip skip: 2, ENSD: 31337, AddNet Enabled: True, AddNet Module 1: LoRA, AddNet Model 1: mejiro_ramonuv1_adam8bit_NAIfin(16adf996c8fa), AddNet Weight A 1: 0.65, AddNet Weight B 1: 0.65, Hires upscale: 2, Hires upscaler: Latent
hires.fix up 512X512 to 1024X1024
I suggest using this lora at weight 0.6-0.7. Larger weight may blur the face , or you can try it at higher resolution.
Before training I mirrored the images and tagged them with deepbooru at 0.35 Threshold. I put these images into differnet folder separately.
In terms of the tags of images, I only preserved the “replaceable” tags, like clothes and gesture. Removed all the tags related to the character like horse_ear, two tone hair, eyes, moles, etc. See more details in Lora人物训练(多concept)导论 - 哔哩哔哩 (bilibili.com).
Below are some settings I used in training. The script I used is LoRA_Easy_Training_Scripts. The imporant thing is the setting of "keep_token" parameter. It ensures the trigger word to function.
# Optimizer args
self.optimizer_type: str = "AdamW8bit" # options are AdamW, AdamW8bit, Lion, SGDNesterov,
self.optimizer_args: Union[dict[str:str], None] = {"weight_decay": "0.1",
"betas": "0.9,0.99"}
# scheduler args
self.scheduler: str = "cosine_with_restarts"
self.cosine_restarts: Union[int, None] = 1 # OPTIONAL, represents the number of times it restarts.
self.scheduler_power: Union[float, None] = 1 # OPTIONAL, represents the power of the polynomial.
# learning rate args
self.learning_rate: Union[float, None] = 1e-4
self.unet_lr: Union[float, None] = None # OPTIONAL, Sets a specific lr for the unet, this overwrites
# the base lr in AdamW
self.text_encoder_lr: Union[float, None] = None
self.warmup_lr_ratio: Union[float, None] = None
self.unet_only: bool = False # OPTIONAL, set it to only train the unet
self.net_dim: int = 128 # network dimension, 32 is default, but some people train at higher dims
self.alpha: float = 64 # represents the scalar for training. default is half of dim.
self.train_resolution: int = 768
self.batch_size: int = 1 # The number of images that get processed at one time, this is directly proportional
self.clip_skip: int = 2 # If you are training on a model that is anime based
# steps args
self.num_epochs: int = 10 # The number of epochs, if you set max steps this value is
# ignored as it doesn't calculate steps.
self.save_every_n_epochs: Union[int, None] = 1
# tag args
self.shuffle_captions: bool = True
self.keep_tokens: Union[int, None] = 4