这一篇文章是在上篇文章后的继续研究,上一篇文章桌宠1.0,微信连接gpt-CSDN博客。
大致要求:实现微信发送图片的功能,图片是虚拟女友的人物形象和环境背景。
大致思路:首先定制一个逼真的虚拟人物形象,然后根据聊天内容,虚拟人物不同的表情在不同的地方做不同的事情。尽可能的细节,还原一个逼真的虚拟女友形象。
先看效果,这一张的提示词:一个美女穿着白色衣服在海边散步。
之后的每一张都有这个效果,anywhere,anythin。
一.逼真的虚拟人物形象,我使用当前热门的AI 图像模型软件,stable Diffusion webui。
1.本地部署stable Diffusion webui,请参考一键整合包,运行软件,在软件中设置提示词和相应的模型参数。整合包和模型参数的讲解在下面。因为有一键整合包,本地部署十分方便。模型参数的使用则十分复杂,不同的参数不同的效果。关键参数说明如下。【AI绘画·24年3月最新】Stable Diffusion整合包v4.7发布!解压即用 防爆显存 三分钟入门AI绘画 ☆更新 ☆训练 ☆汉化 秋叶整合包_哔哩哔哩_bilibili
Stable Diffusion系列课程上:安装、提示词入门、常用模型(checkpoint、embedding、LORA)、放大算法、局部重绘、常用插件_stable diffusion checkpoint-CSDN博客基础模型大致有三种,动漫风,真实风,介于他们之间的一种风格。我选择了后者。
lora模型,人物我选择了喜欢的动漫人物模型,身材模型。背景模型我选择了喜欢的插画模型。
Embeddings模型我选择了EasyNegative作为反向提示词,这是一个通用选择,专门处理2d动画人物的脸和手脚
采样方法我选择了Euler a,比较适合插画,变化更大。DPM++ 2M SDE Karras细节更多。
一定启用人物修脸,启用 After Detailer,如果不启用远景人物脸直接就花了。After Detailer 模型我选用face_yolov8n_v2.pt这是一个专门修2d动漫的模型。并添加提示词<lora:凉冰_1.0:1>,LiangBing。After Detailer的原理是在图片中找到人物的脸,然后根据After Detailer模型和你的提示词lora模型,把设定的人物脸再修复一遍。脸才是人物的灵魂,只有脸相似,才是同一个人物。
2.python调用stable Diffusion webui api。我不是专业的p图师,上述参数已经满足我的要求,下面要求在python代码中实现调用api文生图,参考下面的api调用说明。文章中人物修脸使用的是"restore_faces": True ,实际使用修成了千篇一律的网红脸,十分讨厌。问题,如何在api中使用After Detailer。alwayson_scripts是stable Diffusion本身的一种脚本,通过其启动ADetailer。Stable-diffusion-WebUI 的API调用(内含文生图和图生图实例)_stable-diffusion-webui api-CSDN博客
#coding=utf-8
import json
import requests
import io
import base64
from PIL import Image
url = "http://127.0.0.1:7860"
prompt0 = "you_lara"
prompt1 = "you_人物在什么地方做什么事情"
prompt = prompt0 + prompt1
negative_prompt = "EasyNegative"
payload = {
# 模型设置
"override_settings": {
"sd_model_checkpoint": "Z_mixnm_real3ab_V3ab",
"CLIP_stop_at_last_layers": 2,
# "sd_vae": "animevae.pt", # 我没用sd_vae,类似于一种滤镜
},
# 基本参数
"prompt": prompt,
"negative_prompt": negative_prompt,
"steps": 20,
"sampler_name": "Euler a",
"width": 448,
"height": 640,
"batch_size": 1,
"n_iter": 1,
"seed": -1,
"CLIP_stop_at_last_layers": 2,
# 面部修复 face fix
# "restore_faces": False,
"alwayson_scripts": {
"ADetailer": {
"args": [
{
"ad_model": "face_yolov8n_v2.pt",
"ad_prompt": "<lora:lb:1.0>",
"ad_confidence": 0.5,
"ad_controlnet_weight": 0.25
# "ad_controlnet_model": "None",
# "ad_inpaint_width": 512,
# "ad_inpaint_height": 768,
# "ad_denoising_strength": 0.4,
# "ad_use_steps": True,
# "ad_steps": 28,
}
]
}
}
# 高清修复 highres fix
# "enable_hr": True,
# "denoising_strength": 0.4,
# "hr_scale": 2,
# "hr_upscaler": "Latent",
}
response = requests.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
r = response.json()
image = Image.open(io.BytesIO(base64.b64decode(r['images'][0])))
image.show()
二.根据聊天内容,虚拟人物不同的表情在不同的地方做不同的事情。
这部分仅简要说明,聊天内容储存在json文件中,模拟记忆,根据记忆生成提示词,关键在于写好提示词。我在实际使用中将提示词人物交给了不同的AI角色,不同的AI角色通过初始化文本实现,然后像流水线一样不同的工作任务,实际并不复杂,关键在于写好提示词。如下是stable Diffusion webui的chatgpt官方提示词。
StableDiffusion是一款利用深度学习的文生图模型,支持通过使用提示词来产生新的图像,描述要包含或省略的元素。
我在这里引入StableDiffusion算法中的Prompt概念,又被称为提示符。
下面的prompt是用来指导AI绘画模型创作图像的。它们包含了图像的各种细节,如人物的外观、背景、颜色和光线效果,以及图像的主题和风格。这些prompt的格式经常包含括号内的加权数字,用于指定某些细节的重要性或强调。例如,"(masterpiece:1.5)"表示作品质量是非常重要的,多个括号也有类似作用。此外,如果使用中括号,如"{blue hair:white hair:0.3}",这代表将蓝发和白发加以融合,蓝发占比为0.3。
以下是用prompt帮助AI模型生成图像的例子:masterpiece,(bestquality),highlydetailed,ultra-detailed,cold,solo,(1girl),(detailedeyes),(shinegoldeneyes),(longliverhair),expressionless,(long sleeves),(puffy sleeves),(white wings),shinehalo,(heavymetal:1.2),(metaljewelry),cross-lacedfootwear (chain),(Whitedoves:1.2)
仿照例子,给出一套详细描述以下内容的prompt。直接开始给出prompt不需要用自然语言描述:
三.实现难点,三个问题,简要说明。
如果只是聊天是比较简单的,你一句我一句。
加上图片发送,需要解决模拟鼠标点击打架的问题,我通过给def程序上锁是实现。
图片发送,不能每段文字都发送图片,通过给def计数实现,并且发送图片中计数停止。设置随机数,那就是随机回复一张图片,也可以通过特定提示词,回复一张图片。
文字和图片功能,是两条不同的流水线且速度不一致,通过多线程实现。
四.未来展望
尽可能的细节,还原一个逼真的虚拟女友形象。添加更多的lora模型实现人物服装和脸部表情的丰富。我觉得现在的挺好的,不准备继续研究,毕竟也不能太沉迷虚拟的。
云服务器部署。stable Diffusion webui api不使用本地部署,使用网络api,即可在一台没什么性能的服务器上部署项目。这个有空再研究吧。云部署项目在GitHub - dognamepander/windows_pet_v2_yun: 虚拟女友微信聊天,根据聊天内容生成女友图片(一位虚拟女友不同的表情在不同的地方做不同的事情),主打一个陪伴。