Datawhale AI 夏令营 “AIGC”方向 Task1:从零入门AI生图原理&实践
holamideiholayo 2024-08-30 10:31:02 阅读 79
Task1:从零入门AI生图原理&实践
提示:本文为对平台文档的解读注释和补充
Task1:从零入门AI生图原理&实践
Task1:从零入门AI生图原理&实践文生图LoRA提示词
模型参数解读和测试模型参数解读提示词(prompt)测试
总结
文生图
文生图是AIGC ( AI Generated Content )框架中的一个关键技术,通过文字描述,将文字转化为图像并展示出来。文生图具有白动化程度高、精度高、可扩展性强、可定制化等优势,具有广泛的应用前景,可以为人们提供更便捷高效的绘图解决方案。本文主要讲解其中应用的LoRA模型。
LoRA
Stable Diffusion中的Lora(LoRA)模型是一种轻量级的微调方法,它代表了“Low-Rank Adaptation”,即低秩适应。Lora不是指单一的具体模型,而是指一类通过特定微调技术应用于基础模型的扩展应用。在Stable Diffusion这一文本到图像合成模型的框架下,Lora被用来对预训练好的大模型进行针对性优化,以实现对特定主题、风格或任务的精细化控制。
众所周知,大模型所涉及的参数都是以10亿起的,往往上百亿千亿级的参数。这些模型进行预训练后的基座模型(Base Model)在具体的应用场景下需要进一步微调。这时面临两种选择:
1.全参数的微调:毫无疑问,这个需要加载所有的参数进行调整训练,费时费力更费钱。
2.部分参数的微调:只针对某些层的权重和参数进行调整训练,能够减少存储空间和加速部署,但存在一些性能和模型质量的损耗。
LoRA在保留基座模型全部参数的同时,拆分出权重矩阵的更新并进行矩阵分解,通过调整训练这个由低秩矩阵乘积表示的更新矩阵来减少存储空间的同时保留了模型的质量和微调速度。
模型具体原理详见:http://t.csdnimg.cn/mm7mK
提示词
提示词的设计和选择直接影响最终生成图像的质量和风格。写出一份比较好的提示词是文生图技术的关键。
要写好一份提示词,遵循原则为尽可能详细并且具体,从不同角度进行详细描述。
常用的正面提示词关键词类别包括如下:
(1) 主体 subject
(2) 媒介 medium
(3) 风格 style
(4) 画家 artist
(5) 网站 website
(6) 分辨率 resolution
(7) 额外细节 additional details
(8) 色调 color
(9) 光影 lighting
当然,输入提示词时,不需要包括到每个类别,只需作为一个列表检查下哪些可以用到。
同样,负面提示词也很重要,即填入不想要的主体或者身体部位,以在采样过程中避免出现。比如说,sd v1 版本不擅长生成手,就可以在负向提示词里输入“hand”或者“extra limbs”来隐藏或修正。主要有 4 个可以使用负面提示词的应用场景,分别是:
(1) 移除物体 removing things
(2) 修改图片 modifying images
(3) 关键词切换 keyword switching
(4) 修改风格 modifying styles
具体介绍详见大佬总结的:http://t.csdnimg.cn/ARjTn
模型参数解读和测试
模型参数解读
在输入这行代码后:
<code>!python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py -h
我们可以看到模型参数输出如下:
-pretrained_unet_path 预训练UNet模型路径
预训练模型的路径 (UNet)。如,models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors
–pretrained_text_encoder_path 预训练文本编码器路径
预训练模型的路径 (文本编码器)。如,
models/kolors/Kolors/text_encoder
–pretrained_fp16_vae_path 预训练VAE模型路径
预训练模型的路径 (VAE)。如,
models/kolors/Kolors/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors
–lora_target_modules LoRA目标模块
包含LoRA模块的层。
–dataset_path 数据集路径
输入数据集的路径。
–output_path 输出路径
保存模型的路径。
–steps_per_epoch 每轮步数
–height 图像高度
–width 图像宽度
–center_crop 中心裁剪
是否将输入图像裁剪到指定分辨率的中心。如果不设置,图像将被随机裁剪。图像将首先调整到指定分辨率,然后再进行裁剪。
–random_flip 随机翻转
是否随机水平翻转图像。
–batch_size 批量大小
训练数据加载器的批量大小(每个设备)。
–dataloader_num_workers 数据加载器子进程数
用于数据加载的子进程数量。0表示数据将在主进程中加载。
–precision {32,16,16-mixed} 训练精度
–learning_rate 学习率
–lora_rank LoRA秩
LoRA更新矩阵的维度。
–lora_alpha LoRA系数
LoRA更新矩阵的权重。
–use_gradient_checkpointing 梯度检查点
是否使用梯度检查点。
–accumulate_grad_batches 梯度累积批次数
–training_strategy 训练策略{auto,deepspeed_stage_1,deepspeed_stage_2,deepspeed_stage_3}
–max_epochs 最大轮数
–modelscope_model_id ModelScope 模型ID
如果提供模型ID,模型将自动上传至ModelScope。
–modelscope_access_token ModelScope访问令牌
ModelScope上的访问密钥。如果希望将模型上传到ModelScope,需要提供访问令牌。
于是,我们便可以根据官方的参数介绍来调整参数模型进行训练,例如:
import os
cmd = """
python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
--pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \
--pretrained_text_encoder_path models/kolors/Kolors/text_encoder \
--pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \
--lora_rank 16 \ # LoRA更新矩阵的秩
--lora_alpha 4.0 \ # LoRA更新矩阵的权重系数
--dataset_path data/lora_dataset_processed \
--output_path ./models \
--max_epochs 1 \
--center_crop \ # 对图像进行中心裁剪
--use_gradient_checkpointing \ # 使用梯度检查点来节省内存
--precision "16-mixed" # 使用混合精度 (FP16 + FP32) 进行训练
""".strip()
os.system(cmd)
提示词(prompt)测试
在首次测试我分别使用中文,英文提示词测试模型效果。
英文提示词如下:
prompt="(flower:1.2),lgirl,Dynamic posture,red eyes,medium balls,dynamic angle, bare feet ,looking at viewer, best quality,realistic, worldmasterpiece,",code>
negative_prompt="animal,baddream,EasyNegative,verybadimagenegative vl.3, censored,lowres, bad anatomy,bad hands, text,error,missing fingers,extradigit,fewer digits,cropped,worst quality, low quality,signature, watermark, username, blurry,missing arms, long neck,humpbacked, bad feet, ",code>
可以看到生成的图片基本涵盖了我全部正面提示词的要求,特别是realistic风格。但bad feet这一问题仍存在,多生成了几次也未能修复。在后续Task的测试中我将通过模型调参和添加数据集来优化。
中文提示词如下:
<code>prompt="二次元,虚拟偶像,紫发紫眼,女仆装,头戴印有紫色船锚标志的白色厨师帽,眼神呆滞",code>
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",code>
可以看到生成的图片也基本涵盖了我全部正面提示词的要求,但忽略了。但“紫色船锚标志”这个点。同时我们可以看出,在使用中文提示词“二次元”时,首先生成的图片是偏2d的人物形象。在其他生成的图片中也印证了这一猜想。
中文提示词2:
<code>prompt="二次元,红色长发少女,身着红色战斗服,站在开阔的操场中央,双手叉腰,眼神中闪烁着不屈的光芒,嘴角挂着自信的微笑",code>
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",code>
总结
本人在此次活动Task1完成了对文生图的初步探索,后续会从模型调参与数据集,提示词等方面进行学习和优化。
最后,推荐给大家一个提示词网站:
http://www.atoolbox.net/Tool.php?Id=1101
上一篇: 【AI】:探索在图像领域的无限可能
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。