ai_swap_cloth.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import json
  2. import random
  3. import websocket
  4. from PIL import Image
  5. from datetime import datetime
  6. from backend.modules.comfyui.image_tools import upload_image, show_gif
  7. from backend.modules.comfyui.network_tools import get_images
  8. from backend.utils.logger_config import setup_logger
  9. from backend.utils.system_config import Config
  10. from backend.config.prompt_config import FACE_PROMPT, CLOTH_PROMPT, PROMPT_PROMPT
  11. system_config = Config('./backend/config/ai_swap_cloth_config.json')
  12. logger = setup_logger(__name__)
  13. def parse_workflow(raw_img, cloth_img, config) -> dict:
  14. try:
  15. # 上传图片
  16. logger.info('开始上传原始图片...')
  17. input_raw_img = upload_image(raw_img, config)
  18. logger.info('原始图片上传成功')
  19. # 上传衣服图片
  20. logger.info('开始上传衣服图片...')
  21. input_cloth_img = upload_image(cloth_img, config)
  22. logger.info('衣服图片上传成功')
  23. logger.info(f'Work flow args config: workflow-{config.workflowfile}, seed-{config.seed}')
  24. # 加载工作流配置
  25. try:
  26. with open(config.workflowfile, 'r', encoding='utf-8') as workflow:
  27. workflow_config = json.load(workflow)
  28. except FileNotFoundError:
  29. logger.error(f'工作流配置文件不存在: {config.workflowfile}')
  30. raise RuntimeError(f'工作流配置文件不存在: {config.workflowfile}')
  31. except json.JSONDecodeError as e:
  32. logger.error(f'工作流配置文件格式错误: {str(e)}')
  33. raise RuntimeError(f'工作流配置文件格式错误: {str(e)}')
  34. # 更新工作流参数(旧版)
  35. # workflow_config["307"]["inputs"]["image"] = input_raw_img
  36. # workflow_config["174"]["inputs"]["image"] = input_cloth_img
  37. # workflow_config["157"]["inputs"]["seed"] = config.seed
  38. # 更新工作流参数(1014版本)
  39. workflow_config["284"]["inputs"]["image"] = input_raw_img
  40. workflow_config["289"]["inputs"]["image"] = input_cloth_img
  41. workflow_config["286"]["inputs"]["seed"] = config.seed
  42. # 更新工作流参数(1028版本)
  43. # workflow_config["284"]["inputs"]["image"] = input_raw_img
  44. # workflow_config["289"]["inputs"]["image"] = input_cloth_img
  45. logger.info("开始执行工作流...")
  46. return get_images(workflow_config, config)
  47. except Exception as e:
  48. logger.error(f"工作流解析失败: {str(e)}")
  49. raise RuntimeError(f"工作流解析失败: {str(e)}")
  50. def ai_swap_cloth_process(raw_img, cloth_img) -> list:
  51. ws = websocket.WebSocket()
  52. host_url = f"ws://{system_config.server_address}/ws?clientID={system_config.client_id}"
  53. try:
  54. ws.connect(host_url)
  55. logger.info(f'Request to: {host_url}')
  56. except Exception as e:
  57. logger.error(f"无法连接到ComfyUI服务器:{host_url}, 错误:{str(e)}")
  58. raise RuntimeError(f"ComfyUI服务器连接失败: {str(e)}")
  59. try:
  60. images, history_prompt = parse_workflow(raw_img, cloth_img, system_config)
  61. logger.info(f"工作流解析完成,获取到{len(images)}个节点输出")
  62. except Exception as e:
  63. logger.error(f"工作流解析失败: {str(e)}")
  64. raise RuntimeError(f"工作流解析失败: {str(e)}")
  65. images_cc = []
  66. if not images:
  67. logger.error("没有获取到任何图片输出,请检查ComfyUI服务器状态和工作流配置")
  68. raise RuntimeError("AI处理未返回任何结果,请检查服务器状态")
  69. for node_id in images:
  70. logger.info(f"处理节点 {node_id},包含 {len(images[node_id])} 张图片")
  71. for image_data in images[node_id]:
  72. timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
  73. GIF_LOCATION = f"{system_config.output_dir}/{system_config.idx}_{system_config.seed}_{timestamp}.png"
  74. try:
  75. with open(GIF_LOCATION, "wb") as binary_file:
  76. binary_file.write(image_data)
  77. show_gif(GIF_LOCATION)
  78. system_config.idx += 1
  79. images_cc.append(Image.open(GIF_LOCATION))
  80. logger.info(f"图片保存成功: {GIF_LOCATION}")
  81. except Exception as e:
  82. logger.error(f"图片保存失败: {str(e)}")
  83. raise RuntimeError(f"图片保存失败: {str(e)}")
  84. logger.info(f'Prompt queue finished! The return result: {len(images_cc)} images')
  85. # 检查是否有处理结果
  86. if not images_cc:
  87. logger.error("没有生成任何图片结果")
  88. raise RuntimeError("AI处理未生成任何图片结果,请检查输入参数和服务器状态")
  89. return images_cc[0], history_prompt
  90. if __name__ == "__main__":
  91. import numpy as np
  92. raw_img = np.array(Image.open('backend/data/02.jpg'))
  93. cloth_img = np.array(Image.open('backend/data/cloth.jpg'))
  94. images, history_prompt = ai_swap_cloth_process(raw_img, cloth_img)
  95. print("历史提示词:", history_prompt)