数据缓存系列分享(三):通过 StableDiffusion 扩展插件实现网红爆款文字光影图

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 在文章《23秒完成从零开始搭建StableDiffusion》中我们详细讲解了通过ECI的数据缓存快速搭建StableDiffusion应用,用户通过模型网站选择好自己需要的模型,然后创建ECI数据缓存,即可快速部署自己的StableDiffusion应用。本文将基于StableDiffusion + 扩展插件 ControlNet 来完成实现网红爆款文字光影图

背景

最近网上流行各种文字光影图,即在图片中非常巧妙的融入一些自定义的文字,非常炫酷,本来将分享如何通过StableDiffusion + 扩展插件的方式量产这种类型的图片。

StableDiffusion 扩展插件

在文章 23秒完成从零开始搭建StableDiffusion 中我们详细讲解了通过ECI的数据缓存快速搭建StableDiffusion应用,用户通过模型网站选择好自己需要的模型,然后创建ECI数据缓存,即可快速部署自己的StableDiffusion应用。

其实StableDiffusion的应用还支持扩展插件的方式来丰富绘图功能:

cdcbf3e1-4add-499e-82f4-b19cfe1a8584.png

前面提到的这些网络上流传的炫酷的文字图都是基于StableDiffusion + 扩展插件 ControlNet来完成的。

ECI提供的StableDiffusion标准镜像已经集成了ControlNet插件,用户无需再手动通过webui安装、下载新模型、重启应用等复杂流程,直接可以开箱即用。

StableDiffusion 模型选择

StableDiffusion模型与StableDiffusion应用是解耦的,可以自由选择任何标准的绘图模型。本文继续使用前文中使用的模型,即 hanafuusen2001/BeautyProMix,其他绘图模型也可以,比如比较常用的模型有:

casque/beautifulRealistic_v60

XpucT/Deliberate

Lykon/DreamShaper

cyberdelia/CyberRealistic

hanafuusen2001/ReVAnimated

digiplay/MeinaMix_v11

等,更多模型可以在 https://huggingface.co/https://civitai.com/ 上了解。

ControlNet 模型选择

同样,ControlNet模型与ControlNet 也是解耦的,本样例的光影文字效果会选择用模型 ioclab/ioc-controlnet



准备模型

分别创建前面提到的两个模型缓存,移步控制台

hanafuusen2001/BeautyProMix:(前文已经创建过,可以无需创建)

bucket: huggingFace-model

bucket path: /models/huggingface-model/hanafuusen2001/BeautyProMix

repoId: hanafuusen2001/BeautyProMix

repoSource: HuggingFace/Model

a0edffe3-e3dd-430e-9975-a1c1e08d5f20.png

ioclab/ioc-controlnet:

bucket: huggingFace-model

bucket path: /models/huggingface-model/ioclab/ioc-controlnet

repoId: ioclab/ioc-controlnet

repoSource: HuggingFace/Model

06326c28-ba61-4e5c-aaa3-5d66f23a860b.png



更多关于数据缓存的介绍可以参考:

openAPI:https://help.aliyun.com/document_detail/2391452.html

k8s AP:https://help.aliyun.com/document_detail/2412299.html

部署ECI

1、使用ECI已经制作好的镜像:registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.1

2、hanafuusen2001/BeautyProMix 模型挂载到/stable-diffusion-webui/models/Stable-diffusion/目录,ioclab/ioc-controlnet 模型挂载到/stable-diffusion-webui/extensions/sd-webui-controlnet/models/目录,如果想替换成其他模型也只需挂载进对应的目录即可。

k8s api 参考:

{
"metadata": {
"annotations": {
"k8s.aliyun.com/eci-image-cache": "true",
"k8s.aliyun.com/eci-with-eip": "true",
"k8s.aliyun.com/eci-use-specs": "ecs.gn7i-c8g1.2xlarge",
"k8s.aliyun.com/eci-data-cache-bucket": "huggingFace-model",
        },
"name": "sd-webui",
"namespace": "default"    },
"spec": {
"containers": [
            {
"args": [
"-c",
"python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half"                ],
"command": [
"/bin/sh"                ],
"image": "registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.1",
"imagePullPolicy": "IfNotPresent",
"name": "sd-webui",
"resources": {
"requests": {
"nvidia.com/gpu": "1"                    }
                },
"volumeMounts": [
                    {
"mountPath": "/stable-diffusion-webui/models/Stable-diffusion/",
"name": "model"                    },
                    {
"mountPath": "/stable-diffusion-webui/extensions/sd-webui-controlnet/models/",
"name": "model2"                    }
                ]
            }
        ],
"restartPolicy": "Never",
"volumes": [
            {
"hostPath": {
"path": "/models/huggingFace-model/hanafuusen2001/BeautyProMix"                },
"name": "model"            },
            {
"hostPath": {
"path": "/models/huggingFace-model/ioclab/ioc-controlnet"                },
"name": "model2"            }
        ]
    }

阿里云openAPI 参考:

publicclassEciApi {
privateCreateContainerGroupResponsecreateEci() throwsClientException {
CreateContainerGroupRequestrequest=newCreateContainerGroupRequest();
request.setRegionId(RG);
request.setSecurityGroupId(getSg());
request.setVSwitchId(getVsw());
request.setContainerGroupName("sd-webui");
request.setInstanceType("ecs.gn7i-c8g1.2xlarge");
request.setAutoCreateEip(true);
request.setDataCacheBucket("huggingFace-model");
CreateContainerGroupRequest.Containercontainer=newCreateContainerGroupRequest.Container();
container.setName("sd-webui");
container.setImage("registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.1");
container.setGpu(1);
container.setCommands(Arrays.asList("/bin/sh"));
container.setArgs(Arrays.asList("-c", "python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half"));
CreateContainerGroupRequest.Container.VolumeMountvolumeMount=newCreateContainerGroupRequest.Container.VolumeMount();
volumeMount.setName("model");
volumeMount.setMountPath("/stable-diffusion-webui/models/Stable-diffusion/");
CreateContainerGroupRequest.Container.VolumeMountvolumeMount2=newCreateContainerGroupRequest.Container.VolumeMount();
volumeMount2.setName("model2");
volumeMount2.setMountPath("/stable-diffusion-webui/extensions/sd-webui-controlnet/models/");
container.setVolumeMounts(Arrays.asList(volumeMount, volumeMount2));
request.setContainers(Arrays.asList(container));
CreateContainerGroupRequest.Volumevolume=newCreateContainerGroupRequest.Volume();
volume.setName("model");
volume.setType("HostPathVolume");
volume.setHostPathVolumePath("/models/huggingFace-model/hanafuusen2001/BeautyProMix");
CreateContainerGroupRequest.Volumevolume2=newCreateContainerGroupRequest.Volume();
volume2.setName("model2");
volume2.setType("HostPathVolume");
volume2.setHostPathVolumePath("/models/huggingFace-model/ioclab/ioc-controlnet");
request.setVolumes(Arrays.asList(volume, volume2));
returnPopHelper.getAcsResponse(client, request);
    }
}

SDK版本

<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-eci --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-eci</artifactId><version>1.4.4</version></dependency>


控制台参考:

进入ECI售卖页

1、选择gpu规格

ecs.gn7i-c8g1.2xlarge

1f4d738a-5346-4413-8109-11e16ee51c77.png



2、选择stable-diffusion容器镜像

容器配置 -> 选择容器镜像 -> 常用镜像->stable-diffusion

如果是非杭州地域,直接填入镜像,效果是一样的。

registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion

版本:1.0.1

371ac612-8bb6-4d70-a7c3-38017f85022c.png

3、分别挂载两个模型缓存进容器

fb6ca570-fd08-48b7-99c0-9ebd28a966cd.png


4、打开公网(如果通过公网地址访问webui)

ce7ee247-92af-4509-adfb-06637c6bb73f.png


通过ip:8888就可以访问webui了

668c9290-5257-4fbc-bce5-e708cd07ce22.png

可以看到扩展插件已经自动安装好了,可以直接使用。


测试

1、选择img2img

2、正向咒语、反向咒语用法基本不变,根据自己的需求描述

3、上传文字照片(黑底白字)

da697b07-6f2f-44c0-a394-1a0d6fd52a60.png

点击展开下面的ControlNet

fb2d3b94-bba5-4d8a-8464-1922a0f28bf2.png

然后就可以生成图了:

01ac3d26-e986-4082-9d67-81ecbef3f6b8.png



基本参数说明:

Control Weight:ControlNet影响的比重。

Starting Control Step:ControlNet介入的时间,越早介入绘画自由发挥的空间就越小,文字就越明显。

Ending Control Step:ControlNet介入结束时间,结束越早融合的就越好,但也可能文字不明显。

CFG Scale:值越大创作空间越大,搭配Denoising strength使用。

Denoising strength:值越小CFG Scale的影响就越小,越接近原图。

基本没有经验值,不同的图和不同的光影搭配效果差异很大,根据实际出图结果可以自行根据需求进行微调。

其他样例

d571a7df-2b21-4305-954d-a35813e7a19d.pngd571a7df-2b21-4305-954d-a35813e7a19d.png

0092e7e2-2579-4d61-af63-03eea8dc4818.png0092e7e2-2579-4d61-af63-03eea8dc4818.png
3f5e40ed-271f-42dc-b6e8-21d21d585275.png
3f5e40ed-271f-42dc-b6e8-21d21d585275.png

9d3b4c8d-f883-4c45-ad66-7b13b615effc.png9d3b4c8d-f883-4c45-ad66-7b13b615effc.png

a2564904-0181-42bf-b187-3bb2028ad8ff.pnga2564904-0181-42bf-b187-3bb2028ad8ff.png

8d96336a-0909-4c15-aca1-711ff919c056.png


附录

数据缓存系列分享(一):打开大模型应用的另一种方式

数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion

数据缓存系列分享(三):通过 StableDiffusion 扩展插件实现网红爆款文字光影图

数据缓存系列分享(四):开源大语言模型通义千问快速体验

数据缓存系列分享(五):零代码搭建妙鸭相机

数据缓存系列分享(六):通义千问Qwen-14B大模型快速体验

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
1天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
4天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
22天前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
35 2
|
25天前
|
缓存 弹性计算 应用服务中间件
如何使用 Wordpress?托管, 网站, 插件, 缓存
如何使用 Wordpress?托管, 网站, 插件, 缓存
|
27天前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
46 2
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
117 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
3月前
|
缓存 NoSQL 算法
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
|
3月前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中数据的问题如何解决