背景
最近网上流行各种文字光影图,即在图片中非常巧妙的融入一些自定义的文字,非常炫酷,本来将分享如何通过StableDiffusion + 扩展插件的方式量产这种类型的图片。
StableDiffusion 扩展插件
在文章 23秒完成从零开始搭建StableDiffusion 中我们详细讲解了通过ECI的数据缓存快速搭建StableDiffusion应用,用户通过模型网站选择好自己需要的模型,然后创建ECI数据缓存,即可快速部署自己的StableDiffusion应用。
其实StableDiffusion的应用还支持扩展插件的方式来丰富绘图功能:
前面提到的这些网络上流传的炫酷的文字图都是基于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
ioclab/ioc-controlnet:
bucket: huggingFace-model
bucket path: /models/huggingface-model/ioclab/ioc-controlnet
repoId: ioclab/ioc-controlnet
repoSource: HuggingFace/Model
更多关于数据缓存的介绍可以参考:
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
2、选择stable-diffusion容器镜像
容器配置 -> 选择容器镜像 -> 常用镜像->stable-diffusion
如果是非杭州地域,直接填入镜像,效果是一样的。
registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion
版本:1.0.1
3、分别挂载两个模型缓存进容器
4、打开公网(如果通过公网地址访问webui)
通过ip:8888就可以访问webui了
可以看到扩展插件已经自动安装好了,可以直接使用。
测试
1、选择img2img栏
2、正向咒语、反向咒语用法基本不变,根据自己的需求描述
3、上传文字照片(黑底白字)
点击展开下面的ControlNet
然后就可以生成图了:
基本参数说明:
Control Weight:ControlNet影响的比重。
Starting Control Step:ControlNet介入的时间,越早介入绘画自由发挥的空间就越小,文字就越明显。
Ending Control Step:ControlNet介入结束时间,结束越早融合的就越好,但也可能文字不明显。
CFG Scale:值越大创作空间越大,搭配Denoising strength使用。
Denoising strength:值越小CFG Scale的影响就越小,越接近原图。
基本没有经验值,不同的图和不同的光影搭配效果差异很大,根据实际出图结果可以自行根据需求进行微调。
其他样例
附录
数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion