LoRA-水墨风图片生成

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

1、安装依赖

环境要求是用V100或A100,并保证显存有32GB,不然训练会爆显存

注意!!!安装完依赖,记得点一下上方得“重启内核”按钮,否则后面还是会找不到 ppdiffusers 模块

!pip install paddlenlp --user
!pip install ppdiffusers==0.11.1 --user

2、解压水墨风数据集

import os
if not os.path.exists('img'):
    os.mkdir('img')
if not os.path.exists('img/painting'):
    os.system('unzip data/data180682/painting.zip -d img/ink_cn')
# if not os.path.exists('img/2d_head'):
#     os.system('unzip data/data183241/extra_data.zip -d img/2d_head')
# if not os.path.exists('img/2d_person'):
#     os.system('unzip data/data159362/gallary.zip -d img/2d_person')

3、加载初始模型 (初次5分钟)

import os
# 如果之前下载过模型,就加载一下,防止重新下载
if not os.path.exists('.paddlenlp'):
    os.mkdir('.paddlenlp')
    !cp -r work/* /home/aistudio/.paddlenlp/
from ppdiffusers import DiffusionPipeline, DPMSolverMultistepScheduler
import paddle
import PIL
from random import random

# 初次下载模型,大约5分钟
pipe = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

# 备份模型文件,防止下次打开重新下载,大约1分钟
# !cp -r /home/aistudio/.paddlenlp/* /home/aistudio/work/

# # 原始模型保存为LoRA模型
# from ppdiffusers.models.cross_attention import LoRACrossAttnProcessor
# from ppdiffusers.modeling_utils import freeze_params, unwrap_model
# lora_attn_procs = {}
# for name in unet.attn_processors.keys():
#     cross_attention_dim = None if name.endswith("attn1.processor") else unet.config.cross_attention_dim
#     if name.startswith("mid_block"):
#         hidden_size = unet.config.block_out_channels[-1]
#     elif name.startswith("up_blocks"):
#         block_id = int(name[len("up_blocks.")])
#         hidden_size = list(reversed(unet.config.block_out_channels))[block_id]
#     elif name.startswith("down_blocks"):
#         block_id = int(name[len("down_blocks.")])
#         hidden_size = unet.config.block_out_channels[block_id]

#     lora_attn_procs[name] = LoRACrossAttnProcessor(
#         hidden_size=hidden_size, cross_attention_dim=cross_attention_dim, rank=4
#     )
# # freeze_params(unet.parameters())
# pipe.unet.set_attn_processor(lora_attn_procs)
# unwrap_model(pipe.unet).save_attn_procs("src")

4、查看初始效果

初始模型生成的会偏照片一点

import os
def go(prompt, seed=42, steps=10):
    paddle.seed(seed)
    image = pipe(prompt, num_inference_steps=steps).images[0]
    name = prompt[:20]
    if not os.path.exists('result'):
        os.mkdir('result')
    print('prompt:', prompt)
    print('seed:', seed, 'steps:', steps)
    image.save(f"result/se{seed}_st{steps}_{name}_demo2.png")
    image.show()
go('a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.', seed=7434, steps=15)
  0%|          | 0/15 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 7434 steps: 15

在这里插入图片描述

go('mountain', seed=6, steps=20)
  0%|          | 0/20 [00:00<?, ?it/s]


prompt: mountain
seed: 6 steps: 20

在这里插入图片描述

go('fuchun river', seed=8, steps=30)
  0%|          | 0/30 [00:00<?, ?it/s]


prompt: fuchun river
seed: 8 steps: 30

在这里插入图片描述

5、训练模型 (10分钟)

这一步可以改数据集,把 --instance_data_dir 这个参数对应的值改为包含待训练图片的文件夹目录即可

import os
if not os.path.exists('out'):
    print('开始训练LoRA模型,大约10分钟')
    instance_data_dir = '/home/aistudio/img/ink_cn/painting/trainB/'
    # instance_data_dir = '/home/aistudio/img/2d_head/extra_data/images/'
    # instance_data_dir = '/home/aistudio/img/2d_person/gallary/'
    num_train_epochs = 1
    os.system(f'python /home/aistudio/train_dreambooth_lora.py --num_train_epochs="{num_train_epochs}" --pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5"    --instance_data_dir="{instance_data_dir}"   --output_dir="/home/aistudio/out/"   --instance_prompt="a photo of sks dog"   --resolution=512   --train_batch_size=1   --gradient_accumulation_steps=1   --checkpointing_steps=100   --learning_rate=1e-4   --report_to="visualdl"   --lr_scheduler="constant"   --lr_warmup_steps=0   --max_train_steps=500   --validation_prompt="A photo of sks dog in a bucket"   --validation_epochs=50   --lora_rank=4   --seed=0')
else:
    print('已训练过模型')

已训练过模型

加载一下训练好的lora

# 加载训练好的lora
pipe.unet.load_attn_procs("out", from_hf_hub=True)

6、生成水墨风图片~

steps为100时:V100 20秒1张,A100 10秒1张,结果会保存在 result 文件夹下

参数解释:

prompt: 提示词,代表你想要AI生成的东西

seed: 种子,固定的 prompt+seed 可以生成固定的图片

steps: 迭代次数,次数越多耗时越长,效果越好,一般建议在10~50之间

先跑几张步数少的,看到风格还喜欢的,就增加到步数,输入对应 种子+步数 来精修

prompt = 'a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.'
for i in range(10):
    seed = int(random()*10000)
    go(prompt, seed)

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 1104 steps: 10

在这里插入图片描述

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 1322 steps: 10

在这里插入图片描述

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 7157 steps: 10

在这里插入图片描述

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 994 steps: 10

[

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 460 steps: 10

在这里插入图片描述

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 669 steps: 10

在这里插入图片描述

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 689 steps: 10

在这里插入图片描述

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 5119 steps: 10

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqJ0WHIu-1682037746670)(main_files/main_19_23.png)](https://img-blog.csdnimg.cn/82094789d82043a6b4f25c014a67004a.png)

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 8500 steps: 10

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QN2L8FTL-1682037746670)(main_files/main_19_26.png)]

  0%|          | 0/10 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 3466 steps: 10

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vVF5eJTn-1682037746670)(main_files/main_19_29.png)]

7、最终效果

个人试了下,小狗、山水画效果还是不错的,欢迎fork尝试画其他水墨画😜

(画人有点恐怖,谨慎尝试;如果prompt学得好,还能画出来全黑的图😂)

go(prompt, seed=7434, steps=15)
  0%|          | 0/15 [00:00<?, ?it/s]


prompt: a portrait of shiba inu with a green cap growing on its head. intricate. lifelike. soft light.
seed: 7434 steps: 15

在这里插入图片描述

go('mountain', seed=6, steps=20)
  0%|          | 0/20 [00:00<?, ?it/s]


prompt: mountain
seed: 6 steps: 20

在这里插入图片描述

go('fuchun river', seed=8, steps=10)
  0%|          | 0/10 [00:00<?, ?it/s]


prompt: fuchun river
seed: 8 steps: 10

hun river
seed: 8 steps: 10

在这里插入图片描述

此文章为搬运
原项目链接

### Kolors-LoRA 模型调用方法 Kolors-LoRA 模型作为一种基于 LoRA 技术的扩展应用,主要用于在 Stable Diffusion 或其他类似的文本到图像生成框架中实现格迁移或个性化定制。以下是关于如何调用 Kolors-LoRA 模型的方法: #### 1. 准备环境 为了成功加载和运行 Kolors-LoRA 模型,需要确保安装并配置好支持 LoRA深度学习框架以及相关依赖库。通常情况下,这包括但不限于 PyTorch 和 Transformers 库。 ```bash pip install torch transformers accelerate diffusers ``` 上述命令会帮助设置必要的 Python 环境以处理模型文件[^3]。 #### 2. 下载预训练模型 获取官方发布的 Kolors 基础模型及其对应的 LoRA 权重文件(通常是 `.pt` 或 `.bin` 文件)。这些权重文件包含了针对不同艺术格(如水墨画、水彩画等)所调整的参数集合[^4]。 #### 3. 加载基础模型与LoRA模块 利用编程接口来组合主干网络同附加上的LoRA组件一起工作。下面给出了一段Python脚本作为示范用途展示怎样完成这项操作: ```python from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler import torch # 定义设备类型 (GPU优先) device = "cuda" if torch.cuda.is_available() else "cpu" # 初始化Stable Diffusion管道对象 model_id = "runwayml/stable-diffusion-v1-5" pipe = StableDiffusionPipeline.from_pretrained(model_id).to(device) # 替换默认调度器为更高效的版本 pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config) # 将LoRA权重融入现有pipeline之中 lora_path = "./path_to_lora_weight_file.pt" pipe.unet.load_attn_procs(lora_path) def generate_image(prompt): image = pipe(prompt=prompt).images[0] return image # 测试生成图片功能 test_prompt = "A beautiful landscape painting with cyberpunk elements." output_img = generate_image(test_prompt) output_img.save("generated_artwork.png") ``` 此代码片段展示了如何将预先下载下来的LoRA权重集成进入标准版Stable Diffusion流水线里去,并执行简单的文字转图形任务过程[^1]。 #### 4. 自定义样式转换 如果希望进一步探索更多独特视觉效果,则可以通过调节超参或者尝试混合多个不同的LoRA插件达成目标。例如,在同一个项目里面同时加载两个甚至更多的独立LoRA实例从而创造出前所未有的复合美学特征[^2]。 --- ### 注意事项 当实际部署过程中遇到任何异常状况时,请仔细核查以下几个方面可能存在的问题: - **硬件资源不足**: 如果显存容量不足以支撑整个推理流程顺利开展的话,那么就极有可能触发OOM错误; - **路径指向失误**: 对于本地存储位置设定不当时也会引发找不到对应数据集之类的情况发生; - **兼容性冲突**: 不同版本间的差异有时会造成某些特性无法正常使用等问题出现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值