初始化换发型项目: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:
colomi
2026-07-11 18:11:49 +08:00
commit 0eb61f3e60
628 changed files with 120882 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
#coding:utf-8
import torch
from uuid import uuid4
import base64
import os
import random
import shutil
import requests
import time
import json
import os.path as osp
from gen_super_image import webui_img2img
from gen_super_image import webui_img2img_diy
import urllib.request
import hashlib
import cv2
from datetime import datetime
import numpy as np
from core.hairstyle_model import HairStyle_Model
import configparser
from common.logger import config
hairstyle_process = HairStyle_Model(gpu=True,use_enhance=True)
user_img_save_dir = config.get('default', 'userDir')
user_img_tmp_dir = config.get('default', 'tmp_dir')
user_img_res_dir = config.get('default', 'res_dir')
def download_img(img_url, userId, isfix=False, ismask=False):
try:
img_name = osp.basename(img_url)
tmp_dir = osp.join(user_img_tmp_dir, img_name)
# if osp.exists(tmp_dir):
# os.remove(tmp_dir)
print(img_url)
download_success = False
for i in range(3):
hairstyle_process.oss2.download_img(img_url, tmp_dir)
if osp.exists(tmp_dir) and osp.getsize(tmp_dir) > 0:
download_success = True
break
if download_success:
file_r = open(tmp_dir, 'rb')
md5_img = hashlib.md5(file_r.read()).hexdigest()
if isfix:
target_dir = osp.join(user_img_save_dir, userId, md5_img)
else:
target_dir = osp.join(user_img_save_dir, userId, md5_img)
os.makedirs(target_dir, exist_ok=True)
if ismask:
dst_file = osp.join(target_dir, md5_img + '.png')
else:
dst_file = osp.join(target_dir, md5_img + '.jpg')
shutil.move(tmp_dir, dst_file)
else:
return None, None
return dst_file, md5_img
except Exception as e:
print(e)
return None,None
def download_img_new(img_url, userId, isfix=False, ismask=False):
try:
img_name = osp.basename(img_url)
tmp_dir = osp.join(user_img_tmp_dir, img_name)
# if osp.exists(tmp_dir):
# os.remove(tmp_dir)
print(img_url)
r = requests.get(img_url)
# 写入图片
with open(tmp_dir, "wb") as f:
f.write(r.content)
return tmp_dir, None
except Exception as e:
print(e)
return None,None
def hair_enhance():
try:
# print('\n + hairEnhance input :', input)
img_path = "/home/data/hair/data/tmp/diy/1723090924587-1725452391390.jpg"
mask_path = "/home/data/hair/data/1/f1ae43b3-4788-45a6-8867-49f1458b3a08_mask.png"
# req_id = input['req_id']
gender = "girl"
# user_id = input['user_id']
# 发型图
final_img = cv2.imread(img_path)
# mask图
mask_dilate = cv2.imread(mask_path)
# 获取性别
in_gender = gender
sd_result = webui_img2img_diy(img=final_img, mask_img=mask_dilate, in_gender=in_gender, task_id="", tag="")
sd_save_path = "/home/data/hair/data/1/sd_res.png"
cv2.imwrite(sd_save_path, sd_result)
# cv2.imshow("sd_result", sd_result)
# cv2.waitKey(0)
except Exception as e:
print(e)
if __name__ == '__main__':
hair_diy()