赛题介绍
可图Kolors-LoRA风格故事挑战赛_创新应用大赛_天池大赛-阿里云天池的团队 (aliyun.com)
-
参赛者需在可图Kolors 模型的基础上训练LoRA 模型,生成无限风格,如水墨画风格、水彩风格、赛博朋克风格、日漫风格......
-
基于LoRA模型生成 8 张图片组成连贯故事,故事内容可自定义;基于8图故事,评估LoRA风格的美感度及连贯性
样例展示:偶像少女养成日记
评分标准
本次比赛通过客观评分判断提交作品的有效性,但最终评分以主观评分为准。
主观评分
评审标准从技术运用(40%)、组图风格连贯性(30%)、整体视觉效果(30%)几方面进行评判投票。
客观评分
美学分数仅作评价提交是否有效的标准,其中美学分数小于6(的提交被视为无效提交,无法参与主观评分。
美学分数可以使用以下代码获得:
pip install simple-aesthetics-predictor
import torch, os
from PIL import Image
from transformers import CLIPProcessor
from aesthetics_predictor import AestheticsPredictorV2Linear
from modelscope import snapshot_download
model_id = snapshot_download('AI-ModelScope/aesthetics-predictor-v2-sac-logos-ava1-l14-linearMSE', cache_dir="models/")
predictor = AestheticsPredictorV2Linear.from_pretrained(model_id)
processor = CLIPProcessor.from_pretrained(model_id)
device = "cuda"
predictor = predictor.to(device)
def get_aesthetics_score(image):
inputs = processor(images=image, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()}
with torch.no_grad():
outputs = predictor(**inputs)
prediction = outputs.logits
return prediction.tolist()[0][0]
def evaluate(folder):
scores = []
for file_name in os.listdir(folder):
if os.path.isfile(os.path.join(folder, file_name)):
image = Image.open(os.path.join(folder, file_name))
scores.append(get_aesthetics_score(image))
if len(scores) == 0:
return 0
else:
return sum(scores) / len(scores)
score = evaluate("./images")
print(score)
需提交训练的LoRA 模型文件、LORA 模型的介绍、以及使用该模型生成的至少8张图片和对应 prompt以便复现结果。
Baseline跑通
参考教程:Docshttps://datawhaler.feishu.cn/wiki/CMYkwKow0ihxOikg1G9cd9Zhnng?from=from_copylink
环境搭建
魔搭社区个人云账号授权,绑定阿里云账号,创建实例:
启动实例,在终端使用 git clone 命令克隆baseline项目。
git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors.git
Baseline运行
运行第一个代码块,安装 Data-Juicer 和 DiffSynth-Studio
安装完成后需要重启kernel
之后按照代码顺序依次运行每个代码块,进行数据集下载、LoRA微调、加载LoRA权重、图片生成,最终得到生成的图像。
模型加载和图像生成代码:
'''
模型加载
'''
from diffsynth import ModelManager, SDXLImagePipeline
from peft import LoraConfig, inject_adapter_in_model
import torch
def load_lora(model, lora_rank, lora_alpha, lora_path):
lora_config = LoraConfig(
r=lora_rank,
lora_alpha=lora_alpha,
init_lora_weights="gaussian",
target_modules=["to_q", "to_k", "to_v", "to_out"],
)
model = inject_adapter_in_model(lora_config, model)
state_dict = torch.load(lora_path, map_location="cpu")
model.load_state_dict(state_dict, strict=False)
return model
# Load models
model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
file_path_list=[
"models/kolors/Kolors/text_encoder",
"models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
"models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
])
pipe = SDXLImagePipeline.from_model_manager(model_manager)
# Load LoRA
pipe.unet = load_lora(
pipe.unet,
lora_rank=16, # This parameter should be consistent with that in your training script.
lora_alpha=2.0, # lora_alpha can control the weight of LoRA.
lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
)
'''
图像生成
'''
torch.manual_seed(0)
image = pipe(
prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")
在图像生成时可以修改prompt和negative_prompt
prompt是正向提示词,描述想要生成的图片应该包含的内容
negative_prompt是反向提示词,表示不希望生成的图片的内容
模型发布
使用Bash命令将输出的图片和微调的模型权重复制到output文件夹下:
mkdir /mnt/workspace/kolors/output & cd
cp /mnt/workspace/kolors/models/lightning_logs/version_0/checkpoints/epoch\=0-step\=500.ckpt /mnt/workspace/kolors/output/
cp /mnt/workspace/kolors/1.jpg /mnt/workspace/kolors/output/
下载图片和LoRA权重,在魔搭中创建模型,上传图片和LoRA权重并发布。
注意模型的中文名称需要遵循格式:队伍名称-可图Kolors训练-xxxxxx
到这里Baseline就跑完了,整个流程大约1h左右,中间没有遇到报错,十分顺利。
最后不要忘记关闭实例,否则不会停止扣费。
一些想法
1. 除LoRA微调外,是否可以增加一些额外模块来提升模型性能。
2. 生成图像时,模型似乎只根据输入的prompt和negative_prompt,连贯性仅由文字内容体现。能否提取历史生成图片的信息,将它作为先验知识引导之后的图片生成?这样生成图片的连贯性应该会有提升。
3.数据集获取,除了当前风格,是否还可以采用其他风格的数据集进行微调。