当前位置: 首页 > news >正文

AI绘画风格化实战

在社交软件和短视频平台上,我们时常能看到各种特色鲜明的视觉效果,比如卡通化的图片和中国风的视频剪辑。这些有趣的风格化效果其实都是图像风格化技术的应用成果。

风格化效果举例

MidLibrary 这个网站提供了不同的图像风格,每一种都带有鲜明的特色。
MidLibrary

它总共包含了以下几大类别的样式:

  • 艺术技法(Artistic Techniques):367种
  • 艺术流派和题材(Genres + Art Movements):286种
  • 标题(Titles):256种
  • 画家(Painters):1308种
  • 插画师(Illustrators):820种
  • 摄影师(Photographers):637种
  • 各种艺术家(Various Artists):254种
  • 雕塑家和装置艺术家(Sculptors + Installation Artists):212种
  • 设计师(Designers):145种
  • 时装设计师(Fashion Designers):125种
  • 导演(Filmmakers):104种
  • 建筑师(Architects):100种
  • 街头艺术家(Street Artists):57种
  • 版画家(Printmakers):34种

总共有4705种不同的艺术风格被收录在这个库中。从具体的艺术家,画派,题材等多个维度对 Midjourney 的图片风格进行了分类和汇总,可以说是非常全面和系统的一个Midjourney样式参考库。这对使用Midjourney的用户来说可以提供很大的便利和灵感。
https://midlibrary.io/styles/sandra-boynton
在这里插入图片描述
在这里插入图片描述

图生图代码实战

关于图生图背后的原理,前面文章有讲过。在 ControlNet 提出之前,我们在各种短视频平台上看到的图像风格化效果,大多是使用图生图的方法来完成的。我们简单回顾一下图生图背后的原理。在图生图中,我们对原始图像进行加噪,通过重绘强度这个参数控制加噪的步数,并把加噪的结果作为图像生成的初始潜在表示,然后使用你提供的 prompt 来引导输出图像的风格。

AI绘画Stable Diffusion关键技术解析

import requests
import torch
from PIL import Image
from io import BytesIOfrom diffusers import StableDiffusionImg2ImgPipelinedevice = "cuda"
pipe = StableDiffusionImg2ImgPipeline.from_pretrained("zhyemmmm/ToonYou")
pipe = pipe.to(device)url = "https://ice.frostsky.com/2023/08/26/2c809fbfcb030dd8a97af3759f37ee29.png"#
response = requests.get(url)
init_image = Image.open(BytesIO(response.content)).convert("RGB")
init_image = init_image.resize((512, 512))prompt = "1girl, fashion photography"images = []# 我们的重绘强度分别设置为0.05, 0.15, 0.25, 0.35, 0.5, 0.75
for strength in [0.05, 0.15, 0.25, 0.35, 0.5, 0.75]:image = pipe(prompt=prompt, image=init_image, strength=strength, guidance_scale=7.5).images[0]images.append(image)

1.导入需要的库:requests用于网络请求,torch为深度学习框架,PIL用于图像处理,BytesIO用于在内存中读取网络图片。

2.初始化Stable Diffusion的图片到图片模型,加载一个预训练的卡通化模型。

3.定义设备为GPU。将模型加载到GPU上。

4.定义网络图片URL,发送请求获取图片,读取为PIL Image格式。调整图片大小为512x512。

5.定义prompt,表示目标风格,这里是"1girl, fashion photography",意为单人女性时尚照。

6.定义一个空列表images,用于保存生成图片。

7.循环生成图片:分别设置不同的strength参数,代表噪声重绘强度,值越大表示风格迁移越完整。调用模型pipe生成图片,添加到images中。

8.循环结束后,images列表中即为不同程度风格迁移的图片。

在这里插入图片描述

ControlNet-使用边缘轮廓条件

我们仍旧以蒙娜丽莎的图片为例,分别使用 SDXL 模型的 Canny 控制模式和 SD1.5 模型的指令级修图控制模式。
首先,我们可以加载蒙娜丽莎的图片,并使用 Canny 算子提取图片的轮廓线。

# 加载原始图片,这里你也可以使用自己的图片
original_image = load_image("https://ice.frostsky.com/2023/08/26/2c809fbfcb030dd8a97af3759f37ee29.png").convert('RGB')# 提取Canny边缘
image = np.array(original_image)
image = cv2.Canny(image, 100, 200)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
image = Image.fromarray(image)

在这里插入图片描述
然后,我们使用 SDXL-1.0 模型和 Canny 控制条件的 ControlNet 模型。

# 加载ControlNet模型
controlnet = ControlNetModel.from_pretrained("diffusers/controlnet-Canny-sdxl-1.0-mid", torch_dtype=torch.float16)  # 加载VAE模型  
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)# 创建StableDiffusionXLControlNetPipeline管道
pipe = StableDiffusionXLControlNetPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", controlnet=controlnet, vae=vae, torch_dtype=torch.float16)# 启用CPU卸载加速
pipe.enable_model_cpu_offload()# 后面可以通过pipe生成控制网络图

完成这些准备工作后,我们就可以通过prompt来控制生成图像的风格了。例如可以使用下面4条prompt,依次将蒙娜丽莎图像转换为卡通风格、梵高风格、赛博朋克风格和机器人风格。当然,也建议你发挥创造力,实现更多有趣的风格转换。

# 结合ControlNet进行文生图# 这里可以更换为你想要的风格,只需要修改prompt即可
prompt = "a smiling woman, winter backbround, cartoon style"
# prompt = "a smiling woman, summer backbround, van gogh style"
# prompt = "a smiling woman, busy city, cyberpunk style"
# prompt = "a smiling robot"# 设置随机种子
generator = torch.manual_seed(1025) # 设置负prompt,避免生成不合需求的内容
negative_prompt = "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, Normal quality, jpeg artifacts, signature, watermark, username, blurry"# 设置ControlNet条件缩放参数  
controlnet_conditioning_scale = 0.6  # 生成图像
images = pipe([prompt]*2, # 提示 num_inference_steps=50, negative_prompt=[negative_prompt]*2, image=image, controlnet_conditioning_scale=controlnet_conditioning_scale,generator = generator
).images

在这里插入图片描述

ControlNet-使用指令级修图模式

指令修图模式下,只需提供指令式提示,说明执行的转换操作,ControlNet 即可生成目标图像。比如让图像着火,无需添加复杂信息,在指令修图模式中说明“add fire”,整个画面立即燃起火焰。显然,指令修图模式更加灵活高效,无需额外控制条件输入(如轮廓线等),即可生成新图像。这种能力是否可用于图像风格化?当然可以。
我们仍以蒙娜丽莎画像为例,先加载 SD1.5 基础模型和对应的 ControlNet 指令修图模型。

# 加载ControlNet模型
checkpoint = "lllyasviel/control_v11e_sd15_ip2p"
controlnet = ControlNetModel.from_pretrained(checkpoint, torch_dtype=torch.float16)# 创建StableDiffusionControlNetPipeline管道
pipe = StableDiffusionControlNetPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16) # 启用CPU卸载加速
pipe.enable_model_cpu_offload()  # 定义prompt
prompt = "make it spring"
prompt = "make it summer" 
prompt = "make it autumn"
prompt = "make it winter"# 设置随机种子
generator = torch.manual_seed(0)# 生成图像  
image_style1 = pipe(prompt, num_inference_steps=30, generator=generator, image=original_image).images[0]# 通过pipe和prompt控制生成不同季节风格图片

在这里插入图片描述

模型融合的技巧

实际上,除了使用自己训练的模型进行风格化,使用不同SD模型进行融合也是一种常见技巧,可以快速调制出特色鲜明的AI绘画风格。

模型融合本质上是对多个模型进行加权混合,得到一个合并后的新模型。比如希望将Anything V5和ToonYou两个模型进行融合,只需给每个模型的权重分别乘以一个系数,然后相加。在WebUI中,可以选择Checkpoint Merger窗口完成模型融合。例如在Weighted sum模式下,融合后模型权重计算方式如下:
Anything V5模型
ToonYou

*新模型权重 = 模型A (1 - M) + 模型B * M

其中M为加权系数。通过调节系数大小可以控制不同模型在融合模型中的贡献度。
在这里插入图片描述
在 Add difference 这个模式下,我们需要提供三个模型,将模型 B 和模型 C 的权重差值以一定的权重加到原始模型 A 上。融合后模型权重的计算方式你可以看后面的公式,公式中的 M 仍是加权系数。

新模型权重 = 模型 A + (模型 B - 模型 C) * M

在这里插入图片描述
我们可以分别测试一下融合模型的生成效果。对于 Weighted sum 模式,我们将 Anything V5 模型和 ToonYou 模型按照加权系数 0.5 的方式进行融合。你可以点开图片查看我的参数设置。
在这里插入图片描述
在这里插入图片描述

Prompt:1girl, fashion photography [女生形象]
Prompt:1boy, fashion photography  [男生形象]
Negative Prompt:EasyNegative 
采样器:Eular a
随机种子:603579160
采样步数:20
分辨率:512x512
CFG Scale: 7

结语

人生如朝露,醒时同放光。众生平等贵,固然艺术家。执笔挥毫处,情怀高下立。非有天分休,谈何尽绚烂。

欢迎留言讨论!

我们分别以图生图、ControlNet 边缘条件和 ControlNet 指令修图为例,完成了图像风格化的项目实战,并探讨了多模型融合调制新模型的原理和 WebUI 操作技巧。

我是李孟聊AI,独立开源软件开发者,SolidUI作者,对于新技术非常感兴趣,专注AI和数据领域,如果对我的文章内容感兴趣,请帮忙关注点赞收藏,谢谢!

相关文章:

AI绘画风格化实战

在社交软件和短视频平台上,我们时常能看到各种特色鲜明的视觉效果,比如卡通化的图片和中国风的视频剪辑。这些有趣的风格化效果其实都是图像风格化技术的应用成果。 风格化效果举例 MidLibrary 这个网站提供了不同的图像风格,每一种都带有鲜…...

008定点小数、奇偶校验码

...

一、二进制方式 安装部署K8S

目录 一、操作系统初始化 1、关闭防火墙 2、关闭 SELinu 3、 关闭 swap 4、添加hosts 5、同步系统时间 二、集群搭建 —— 使用外部Etcd集群 1、自签证书 2、自签 Etcd SSL 证书 ① 创建 CA 配置文件:ca-config.json ② 创建 CA 证书签名请求文件&#xff…...

【simple-admin】FMS模块如何快速接入阿里云oss 腾讯云cos 服务 实现快速上传文件功能落地

让我们一起支持群主维护simple-admin 社群吧!!! 不能加入星球的朋友记得来点个Star!! https://github.com/suyuan32/simple-admin-core 一、前提准备 1、goctls版本 goctls官方git:https://github.com/suyuan32/goctls 确保 goctls是最新版本 v1.6.19 goctls -v goct…...

数据结构.线性表(2)

一、模板 例子: a: b: 二、基本操作的实现 (1)初始化 (2)销毁和清空 (3)求长度和判断是否为空 (4)取值 (5)查找 (6)插入 &…...

【计算机网络】TCP原理 | 可靠性机制分析(三)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌 目…...

【昕宝爸爸小模块】线程的几种状态,状态之间怎样流转

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…...

ChatGPT网站小蜜蜂AI更新了

ChatGPT网站小蜜蜂AI更新了 前阶段郭震兄弟刚开发小蜜蜂AI网站的的时候,写了一篇关于ChatGPT的网站小蜜蜂AI的博文[https://blog.csdn.net/weixin_41905135/article/details/135297581?spm1001.2014.3001.5501]。今天听说小蜜蜂网站又增加了新的功能——在线生成思…...

瑞_Java开发手册_(二)异常日志

文章目录 异常日志的意义(一) 错误码(二) 异常处理(三) 日志规约附:错误码列表 🙊前言:本文章为瑞_系列专栏之《Java开发手册》的异常日志篇,本篇章主要介绍异常日志的错误码、异常处理、日志规约。由于博主是从阿里的《Java开发手…...

Elasticsearch:Search tutorial - 使用 Python 进行搜索 (四)

在本节中,你将了解另一种机器学习搜索方法,该方法利用 Elastic Learned Sparse EncodeR 模型或 ELSER,这是一种由 Elastic 训练来执行语义搜索的自然语言处理模型。这是继之前的文章 “Elasticsearch:Search tutorial - 使用 Pyth…...

Python之Matplotlib绘图调节清晰度

Python之Matplotlib绘图调节清晰度 文章目录 Python之Matplotlib绘图调节清晰度引言解决方案dpi是什么?效果展示总结 引言 使用python中的matplotlib.pyplot绘图的时候,如果将图片显示出来,或者另存为图片,常常会出现清晰度不够的…...

pygame.error: video system not initialized

错误处理方式: pygame.init() 增加此行...

java面试题2024

前言 准备换工作了,给自己定个目标,每天至少整理出一道面试题。题型会比较随机,感觉这样更容易随机到面试官要问的东西。整理时我会把我认为正确的回答写出来,比较复杂的也尽量把原理贴出来,争取做到无论为了应付面试&…...

配置git服务器

第一步: jdk环境配置 (1)搜索【高级系统设置】,选择【高级】选项卡,点【环境变量】 (2)在【系统变量】里面,点击【新建】 (3)添加JAVA_HOME环境变量JAVA_HO…...

vue3环境下,三方组件中使用echarts,无法显示问题

问题描述: vue3中,使用了三方组件primevue的侧边栏Sidebar,在其中注册echarts dom节点,无法显示,提示dom不存在 问题分析: 使用原生div,通过document.getElementById(),将echarts…...

FAST OS DOCKER 可视化Docker管理工具

介绍 FAST OS DOCKER 界面直观、简洁,非常适合新手使用,方便大家轻松上手 docker部署运行各类有趣的容器应用,同时 FAST OS DOCKER 为防止服务器负载过高,进行了底层性能优化;其以服务器安全为基础,对其进…...

MOJO基础语法

文章目录 打印变量及方法声明结构体python集成 打印 print("Hello Mojo!")变量及方法声明 变量: 使用’ var ‘创建一个可变的值,或者用’ let 创建一个不可变的值。 方法: 方法可以使用python中的def 方法声明,也引…...

java基础之IO流之字符流

字符流 传输char和String类型的数据 输入流 抽象父类:Reader 节点流:FileReader 常用方法 int read():读取一个字符,读取到达末尾,返回-1 package com.by.test2; ​ import java.io.FileNotFoundException; import…...

chromium通信系统-ipcz系统(十一)-mojo binding

关于mojo binding的官方文档为mojo docs。 由于比较复杂,这里只做简单源码分析。 我们知道要实现rpc,必须实现客户端和服务端。 mojo 实现了一套领域语言,通过领域语言描述接口和数据, 再通过特有编译器编译成c代码。 这个过程会…...

鸿蒙开发基础-Web组件之cookie操作

使用ArkTS语言实现一个简单的免登录过程,向大家介绍基本的cookie管理操作。主要包含以下功能: 获取指定url对应的cookie的值。设置cookie。清除所有cookie。免登录访问账户中心。 cookie读写操作 首次打开应用时,应用首页的Web组件内呈现的…...

什么是k8s和声明式编程?

认识k8s之后,他的操作模式对我来说是一种很不错的体验。他提供了更接近现实世界的面向对象接口。 什么是k8s? Kubernetes(K8s)是一种开源容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它简化了容器化应用…...

Fluids —— MicroSolvers DOP

目录 Gas SubStep —— 重复执行对应的子步 Switch Solver —— 切换解算器 Gas Attribute Swap —— 交换、复制或移动几何体属性 Gas Intermittent Solve —— 固定时间间隔计算子解算器 Gas External Forces —— 计算外部力并更新速度或速度场 Gas Particle Separate…...

工业智能网关:HiWoo Box远程采集设备数据

工业智能网关:HiWoo Box远程采集设备数据 在工业4.0和智能制造的浪潮下,工业互联网已成为推动产业升级、提升生产效率的关键。而在这其中,工业智能网关扮演着至关重要的角色。今天,我们就来深入探讨一下工业智能网关。 一、什么…...

Apollo之原理和使用讲解

文章目录 1 Apollo1.1 简介1.1.1 背景1.1.2 简介1.1.3 特点 1.2 基础模型1.3 Apollo 四个维度1.3.1 application1.3.2 environment1.3.3 cluster1.3.4 namespace 1.4 本地缓存1.5 客户端设计1.5.1 客服端拉取原理1.5.2 配置更新推送实现 1.6 总体设计1.7 可用性考虑 2 操作使用…...

魅族MX4pro系统升级、降级

网上的教程都是按住开机键音量上或者下键,但是我按了没用,还是直接点击压缩包管用。 下载系统 官网地址(所有手机固件):https://flyme.cn/firmware.html 官方魅族mx4Pro系统:https://flyme.cn/firmwarelis…...

【Docker】快速入门之Docker的安装及使用

一、引言 1、什么是Docker Docker是一个开源的应用容器引擎,它让开发者可以将他们的应用及其依赖打包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之…...

记录汇川:H5U于Factory IO测试13

主程序: 子程序: IO映射 子程序: 辅助出料 子程序: 模式选择 子程序: 示教程序 子程序: 手动程序 子程序: 统计程序 子程序: 异常报警 子程序: 自动程序: F…...

PYTHON通过跳板机巡检CENTOS的简单实现

实现的细节和引用的文件和以前博客记录的基本一致 https://shaka.blog.csdn.net/article/details/106927633 差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份 1.需要在跳板机相应的路径放置PYTHON的脚本resc.py resc.py这个脚本中有引用的文件(pm.sh,diskpn…...

网络配置以及命令详解

传统linux中,网络接口为eth0,eth1,eth2,..... RHEL 7以上版本默认命名是基于分配上的固定名称,ens33 接口类型: en:以太网有线接口 wl:无线局域网接口 ww:无线广域网 dmesg:显示开机信息 适配器类型: s:热插拔插槽 o:板载 p:pci类型 ifconfig ens160(命令行配置,临时生效):查…...

商务外语MR混合现实仿真情景实训教学

MR混合现实技术是一种将虚拟世界与真实世界相结合的技术。通过MR设备,我们可以将虚拟的场景、人物、物品等元素实时地呈现在真实的环境中,实现真实与虚拟的完美融合。在商务外语的实训教学中,MR技术可以为我们提供丰富的场景资源,…...