初始化换发型项目:3个微服务代码 + 部署脚本
包含: - hair_service_sd: 换发型/换发色算法服务 (端口 8801) - photo_service: LoRA 训练调度服务 (端口 32678) - stable-diffusion-webui: SD WebUI 推理服务 (端口 57860) - kohya_ss_home: 训练环境代码 - meidaojia: 监控测试脚本 - setup.sh: 一键部署脚本 (conda环境恢复 + 配置生成 + 完整性检查) - start_all_services.sh: 启动3个服务 - configure.ini.template: 路径模板化 (BASE_DIR自动推导) - conda_envs/py310.yml: py310 环境定义 大文件 (weights/, models/, data/, conda_envs/*.tar.gz 等) 通过 .gitignore 排除, 由网盘单独上传。
This commit is contained in:
Executable
+86
@@ -0,0 +1,86 @@
|
||||
import io
|
||||
import cv2
|
||||
import base64
|
||||
import requests
|
||||
from PIL import Image
|
||||
|
||||
class ControlnetRequestImg2Img:
|
||||
def __init__(self, prompt, net_prompt, path, mask):
|
||||
self.url = "http://127.0.0.1:57860/sdapi/v1/img2img"
|
||||
self.prompt = prompt
|
||||
self.neg_prompt = net_prompt
|
||||
self.img_path = path
|
||||
self.mask = mask
|
||||
self.body = None
|
||||
|
||||
def build_body(self):
|
||||
img = cv2.imread(self.img_path)
|
||||
self.body = {
|
||||
"prompt": self.prompt,
|
||||
"negative_prompt": self.neg_prompt,
|
||||
"sampler_name": "DPM++ 2M Karras",
|
||||
"batch_size": 1,
|
||||
"steps": 30,
|
||||
"width": img.shape[1],
|
||||
"height": img.shape[0],
|
||||
"cfg_scale": 7,
|
||||
"seed": -1,
|
||||
"mask_blur": 15,
|
||||
"init_images": [
|
||||
self.read_image()
|
||||
],
|
||||
"inpaint_full_res": True,
|
||||
"inpainting_fill": 1,
|
||||
"inpainting_mask_invert": 1,
|
||||
"mask": self.read_mask(),
|
||||
"denoising_strength": 0.4,
|
||||
"alwayson_scripts": {
|
||||
"controlnet": {
|
||||
"args": [
|
||||
{
|
||||
"enabled": True,
|
||||
"module": "openpose_full",
|
||||
"model": "openpose",
|
||||
"weight": 1.0,
|
||||
"resize_mode": 1,
|
||||
"lowvram": False,
|
||||
"processor_res": 512,
|
||||
"guidance_start": 0.0,
|
||||
"guidance_end": 1.0,
|
||||
"control_mode": 0,
|
||||
"pixel_perfect": True
|
||||
},
|
||||
]
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
def send_request(self):
|
||||
response = requests.post(url=self.url, json=self.body)
|
||||
return response.json()
|
||||
|
||||
def read_image(self):
|
||||
img = cv2.imread(self.img_path)
|
||||
retval, bytes = cv2.imencode('.png', img)
|
||||
encoded_image = base64.b64encode(bytes).decode('utf-8')
|
||||
return encoded_image
|
||||
|
||||
def read_mask(self):
|
||||
img = cv2.imread(self.mask)
|
||||
retval, bytes = cv2.imencode('.png', img)
|
||||
encoded_image = base64.b64encode(bytes).decode('utf-8')
|
||||
return encoded_image
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
path = '/home/chinatszrn/Downloads/user1_hr.png'
|
||||
mask_path = '/home/chinatszrn/Downloads/user1_hr_mask.png'
|
||||
prompt = 'a woman with long blonde hair and a blue shirt on a gray background with a gray background and a gray background, lyco art, An Gyeon, realistic face, a character portrait'
|
||||
neg_prompt = '(nsfw:1.5), ng_deepnegative_v1_75t, (badhandv4:1.2), (worst quality:2), (low quality:2), (normal quality:2), lowres, bad anatomy, bad hands, ((monochrome)), ((grayscale)) watermark, moles, large breast, big breast, bad_pictures,easynegative'
|
||||
|
||||
control_net = ControlnetRequestImg2Img(prompt, neg_prompt, path, mask_path)
|
||||
control_net.build_body()
|
||||
output = control_net.send_request()
|
||||
result = output['images'][0]
|
||||
image = Image.open(io.BytesIO(base64.b64decode(result.split(",", 1)[0])))
|
||||
image.save('save2.png')
|
||||
Reference in New Issue
Block a user