(赛题链接:可图Kolors-LoRA风格故事挑战赛_创新应用大赛_天池大赛)
(学习链接:从零入门AI生图原理&实践)
想知道如何得到美美的图吗?
想知道如何免费AI出自己想象的画面吗?
AIGC文生图满足你的需求!
速通指南
一、开通阿里云PAI-DSW试用
二、在魔搭社区进行授权
注:新用户需要先注册 & 绑定阿里云账号
三、在魔搭社区创建PAI实例!(点击即可跳转)
四、30 分钟体验一站式 baseline!
1.输入终端
git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors.git
调整prompt,设置你想要的图片风格,依次修改8张图片的描述(DIY自己喜欢的图片吧)
五、关闭PAI实例!!!!(点击即可跳转)
文生图的介绍、历史和概念
一、介绍
AIGC文生图是指利用人工智能技术,特别是深度学习技术,通过输入文本描述(即“提示词”或“关键词”)来自动生成对应图像的过程。这种技术融合了自然语言处理、计算机视觉等多个领域的知识,使得机器能够理解和生成复杂的视觉内容。
二、历史
发展阶段 | 发展介绍 |
早期探索 (20世纪60年代-20世纪90年代) | 文生图的概念最早出现于计算机视觉和图像处理的早期研究中。 早期的图像生成技术主要依赖于规则和模板匹配,通过预定义的规则将文本转换为简单的图形。 然而,由于计算能力和算法的限制,这一阶段的技术能力非常有限,生成的图像质量较低,应用场景也非常有限。 |
基于统计模型的方法 (2000年代) | 进入2000年代,随着统计模型和机器学习技术的发展,文生图技术开始得到更多关注。 研究者们开始利用概率图模型和统计语言模型来生成图像。尽管这一阶段的技术在生成图像的多样性和质量上有了一定提升,但由于模型的复杂性和计算资源的限制,生成的图像仍然较为粗糙,不够逼真。 |
深度学习的崛起
| 2010年代是文生图技术发展的一个重要转折点。随着深度学习,尤其是卷积神经网络(CNN)和生成对抗网络(GAN)的发展,文生图技术取得了突破性进展。2014年,Goodfellow等人提出的GAN模型通过生成器和判别器的对抗训练,极大地提升了图像生成的质量。随后,各类变种GAN模型被提出,如DCGAN、Pix2Pix等,使得文生图技术在生成逼真图像方面达到了前所未有的高度。 |
大规模预训练模型 (2020年代) | 进入2020年代,大规模预训练模型如OpenAI的CLIP、DALL-E以及Stable Diffusion等的出现,标志着文生图技术进入了一个新的时代。 CLIP通过大规模的文本和图像配对数据训练,能够理解和生成高度一致的文本和图像;DALL-E和Stable Diffusion进一步提升了生成图像的创意和细节表现能力,使得通过简单的文本描述生成高质量、复杂图像成为可能。 这些技术的应用范围从艺术创作、广告设计到辅助医疗诊断,展现了广泛的商业价值和社会影响力。 |
三、知识概念
Lora
Stable Diffusion中的Lora(LoRA)模型是一种轻量级的微调方法,它代表了“Low-Rank Adaptation”,即低秩适应。Lora不是指单一的具体模型,而是指一类通过特定微调技术应用于基础模型的扩展应用。在Stable Diffusion这一文本到图像合成模型的框架下,Lora被用来对预训练好的大模型进行针对性优化,以实现对特定主题、风格或任务的精细化控制。
Baseline代码的解读
1.环境安装
!pip install simple-aesthetics-predictor
!pip install -v -e data-juicer
!pip uninstall pytorch-lightning -y
!pip install peft lightning pandas torchvision
!pip install -e DiffSynth-Studio
安装和配置一些与AI生成内容(AIGC),特别是与图像生成相关的库和框架。
2.下载数据集
from modelscope.msdatasets import MsDataset
ds = MsDataset.load(
'AI-ModelScope/lowres_anime',
subset_name='default',
split='train',
cache_dir="/mnt/workspace/kolors/data"
)
import json, os
from data_juicer.utils.mm_utils import SpecialTokens
from tqdm import tqdm
os.makedirs("./data/lora_dataset/train", exist_ok=True)
os.makedirs("./data/data-juicer/input", exist_ok=True)
with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
for data_id, data in enumerate(tqdm(ds)):
image = data["image"].convert("RGB")
image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
f.write(json.dumps(metadata))
f.write("\n")
该代码片段中,使用modelscope.msdatasets
库来加载一个名为AI-ModelScope/lowres_anime
的数据集,这个数据集包含了一些低分辨率的动漫图片。是图像生成或图像到文本/文本到图像的转换任务时,准备数据以便进行后续处理或训练的一个常见步骤。
3.处理数据集,保存数据处理结果
data_juicer_config = """
# global parameters
project_name: 'data-process'
dataset_path: './data/data-juicer/input/metadata.jsonl' # path to your dataset directory or file
np: 4 # number of subprocess to process your dataset
text_keys: 'text'
image_key: 'image'
image_special_token: '<__dj__image>'
export_path: './data/data-juicer/output/result.jsonl'
# process schedule
# a list of several process operators with their arguments
process:
- image_shape_filter:
min_width: 1024
min_height: 1024
any_or_all: any
- image_aspect_ratio_filter:
min_ratio: 0.5
max_ratio: 2.0
any_or_all: any
"""
with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
file.write(data_juicer_config.strip())
!dj-process --config data/data-juicer/data_juicer_config.yaml
import pandas as pd
import os, json
from PIL import Image
from tqdm import tqdm
texts, file_names = [], []
os.makedirs("./data/lora_dataset_processed/train", exist_ok=True)
with open("./data/data-juicer/output/result.jsonl", "r") as file:
for data_id, data in enumerate(tqdm(file.readlines())):
data = json.loads(data)
text = data["text"]
texts.append(text)
image = Image.open(data["image"][0])
image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg"
image.save(image_path)
file_names.append(f"{data_id}.jpg")
data_frame = pd.DataFrame()
data_frame["file_name"] = file_names
data_frame["text"] = texts
data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig")
data_frame
定义了data_juicer
的配置文件,用于处理图像数据集。使用dj-process
命令来应用,将处理后的结果保存到一个新的JSONL文件中。最后,读取处理后的JSONL文件,将图像保存到新的文件夹中,并将元数据信息提取到Pandas DataFrame中,最终将DataFrame保存为CSV文件。
4.lora微调
# 下载模型
from diffsynth import download_models
download_models(["Kolors", "SDXL-vae-fp16-fix"])
#模型训练
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_alpha 4.0 \
--dataset_path data/lora_dataset_processed \
--output_path ./models \
--max_epochs 1 \
--center_crop \
--use_gradient_checkpointing \
--precision "16-mixed"
""".strip()
os.system(cmd)
使用diffsynth
库的download_models
函数下载了两个模型:Kolors
和SDXL-vae-fp16-fix
。
然后,构建了一个命令行字符串,用于执行DiffSynth-Studio
中的train_kolors_lora.py
脚本来训练一个lora)模型。
5.加载微调好的模型
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"
)
加载预训练的模型(ModelManager
),创建一个SDXLImagePipeline
,并向该管道的unet
部分注入一个lora模型。
6.生成图片
torch.manual_seed(0)
image = pipe(
prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")
就可以通过正反描述词来绘制自己想要的图片啦!!!
我の想法
这个真实一个超级有意思的方向哦,可以通过描述,文生图来构建画面,快来试试吧!!