From 863d9287dc582b680cec8076991cfc57eeded078 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 14:49:57 +0800 Subject: [PATCH 01/33] =?UTF-8?q?fix:=20=E5=8F=82=E6=95=B0=E5=AF=B9?= =?UTF-8?q?=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit ddef6af1cfe3a07819949e6e2e8f29a28e9e1ee3) --- app/core/config.py | 2 ++ app/service/brand_dna/service.py | 4 ++-- app/service/clothing_seg/service.py | 4 ++-- app/service/prompt_generation/chatgpt_for_translation.py | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 584c873..59c9820 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -128,6 +128,8 @@ OLLAMA_URL = f"http://{settings.A6000_SERVICE_HOST}:11434/api/embeddings" # Design DESIGN_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10000' DESIGN_MODEL_NAME = 'seg_knet' +# Seg Product +SEG_PRODUCT_MODEL_URL = f'{settings.B_4_X_4090_SERVICE_HOST}:3000' # Generate Image GI_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10061' GI_MODEL_NAME = 'flux' diff --git a/app/service/brand_dna/service.py b/app/service/brand_dna/service.py index 148e1e9..350f395 100644 --- a/app/service/brand_dna/service.py +++ b/app/service/brand_dna/service.py @@ -9,7 +9,7 @@ import torch.nn.functional as F import tritonclient.http as httpclient from minio import Minio -from app.core.config import DESIGN_MODEL_URL +from app.core.config import DESIGN_MODEL_URL, SEG_PRODUCT_MODEL_URL from app.core.config import settings from app.schemas.brand_dna import BrandDnaModel from app.service.attribute.config import const @@ -29,7 +29,7 @@ class BrandDna: self.attr_type = pd.read_csv(settings.CATEGORY_PATH) # self.attr_type = pd.read_csv(r"E:\workspace\trinity_client_aida\app\service\attribute\config\descriptor\category\category_dis.csv") self.att_client = httpclient.InferenceServerClient(url=DESIGN_MODEL_URL) - self.seg_client = httpclient.InferenceServerClient(url='10.1.1.243:30000') + self.seg_client = httpclient.InferenceServerClient(url=SEG_PRODUCT_MODEL_URL) self.const = const # self.const = local_debug_const diff --git a/app/service/clothing_seg/service.py b/app/service/clothing_seg/service.py index e3cf83c..66f911c 100644 --- a/app/service/clothing_seg/service.py +++ b/app/service/clothing_seg/service.py @@ -23,7 +23,7 @@ class ClothingSeg: def __init__(self, request_data): self.image_data = request_data.image_data self.user_id = request_data.user_id - self.triton_client = grpcclient.InferenceServerClient(url="10.1.1.243:10071") + self.triton_client = grpcclient.InferenceServerClient(url=f"{settings.B_4_X_4090_SERVICE_HOST}:10071") @RunTime def get_result(self): @@ -139,7 +139,7 @@ def get_bounding_box(mask): if __name__ == "__main__": test_data = ClothingSegModel( - user_id=89, + user_id="89", image_data=[ # { # "image_url": "test/clothing_seg/dress.jpg", diff --git a/app/service/prompt_generation/chatgpt_for_translation.py b/app/service/prompt_generation/chatgpt_for_translation.py index 79d17b6..2214241 100644 --- a/app/service/prompt_generation/chatgpt_for_translation.py +++ b/app/service/prompt_generation/chatgpt_for_translation.py @@ -148,7 +148,7 @@ def get_translation_from_llama3(text): def get_prompt_from_image(image_path, text): start_time = time.time() # url = "http://localhost:11434/api/generate" - url = "http://10.1.1.243:11434/api/generate" + url = f"http://{settings.B_4_X_4090_SERVICE_HOST}:11434/api/generate" image_base64 = minio_util.minio_url_to_base64(image_path.img) # image_base64 = minio_url_to_base64(image_path) From cdaeb6daaccee0d8d9cc9b40327505a7fafb7589 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 15:19:28 +0800 Subject: [PATCH 02/33] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eto=20product=20?= =?UTF-8?q?img=20flux2=20=E7=89=88,=E5=81=9C=E7=94=A8sdxl=E7=89=88=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_generate_image.py | 94 ++++++++++++++++++++++++----------- app/schemas/generate_image.py | 7 +++ 2 files changed, 71 insertions(+), 30 deletions(-) diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index 14271c6..7eb5bdf 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -1,9 +1,11 @@ import json import logging +import requests from fastapi import APIRouter, BackgroundTasks, HTTPException -from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel +from app.core.config import settings +from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel, Flux2ToProductImgModel from app.schemas.pose_transform import BatchPoseTransformModel from app.schemas.response_template import ResponseModel from app.service.generate_batch_image.service import start_product_batch_generate, start_relight_batch_generate, start_pose_transform_batch_generate @@ -154,49 +156,81 @@ def generate_single_logo_image(tasks_id: str): return ResponseModel(data=data['data']) -'''product image''' +"""product image flux2.0""" -@router.post("/generate_product_image") -def generate_product_image(request_item: GenerateProductImageModel, background_tasks: BackgroundTasks): +@router.post("/img_to_product") +async def img_to_product(request_data: Flux2ToProductImgModel): """ 创建一个具有以下参数的请求体: - **tasks_id**: 任务id 用于取消生成任务和获取生成结果 - **prompt**: 想要生成图片的描述词 - - **image_url**: 被生成图片的S3或minio url地址 - - **image_strength**: 生成强度,越低越接近原图 - - **product_type**: 输入single item 还是 overall item + - **image_path**: 被生成图片的S3或minio url地址 + - **infer_step**: 推理步数 - - 示例参数: + ### 请求体示例: + ```json + point { - "tasks_id": "123-89", - "prompt": "the best quality, masterpiece. detailed, high-res, simple background, studio photography, extremely detailed, updo, detailed face, face, close-up, HDR, UHD, 8K realistic, Highly detailed, simple background, Studio lighting", - "image_url": "aida-results/result_00097282-ebb2-11ee-a822-b48351119060.png", - "image_strength": 0.8, - "product_type": "overall" + "prompt": "Create realistic studio photo with real people model standing and wearing this garment, in white studio, Keep original model if present, or generate appropriate model, Standing pose, facing camera.", + "image_path":"aida-results/result_38151e0a-f83b-11f0-89f6-0242ac130002.png", + "infer_step":4, + "tasks_id":"123456-123" } + ``` """ try: - logger.info(f"generate_product_image request item is : @@@@@@:{json.dumps(request_item.dict(),indent=4)}") - service = GenerateProductImage(request_item) - background_tasks.add_task(service.get_result) + logger.info(f"img_to_product request item is : @@@@@@:{json.dumps(request_data.dict(), indent=4)}") + data = requests.post(f"http://{settings.A6000_SERVICE_HOST}:10090/api/v1/to_product", json=request_data.dict()) + logger.info(f"img_to_product response @@@@@@:{json.dumps(json.loads(data.content), indent=4)}") + return ResponseModel(data=json.loads(data.content)) except Exception as e: - logger.warning(f"generate_product_image Run Exception @@@@@@:{e}") - raise HTTPException(status_code=404, detail=str(e)) - return ResponseModel() + logger.warning(f"img_to_product Run Exception @@@@@@:{e}") -@router.get("/generate_product_image_cancel_cancel/{tasks_id}") -def generate_product_image(tasks_id: str): - try: - logger.info(f"generate_product_image_cancel_cancel request item is : @@@@@@:{tasks_id}") - data = generate_product_image_cancel(tasks_id) - logger.info(f"generate_product_image_cancel_cancel response @@@@@@:{data}") - except Exception as e: - logger.warning(f"generate_product_image_cancel_cancel Run Exception @@@@@@:{e}") - raise HTTPException(status_code=404, detail=str(e)) - return ResponseModel(data=data['data']) +'''product image 停用''' + + +# @router.post("/generate_product_image") +# def generate_product_image(request_item: GenerateProductImageModel, background_tasks: BackgroundTasks): +# """ +# 创建一个具有以下参数的请求体: +# - **tasks_id**: 任务id 用于取消生成任务和获取生成结果 +# - **prompt**: 想要生成图片的描述词 +# - **image_url**: 被生成图片的S3或minio url地址 +# - **image_strength**: 生成强度,越低越接近原图 +# - **product_type**: 输入single item 还是 overall item +# +# +# 示例参数: +# { +# "tasks_id": "123-89", +# "prompt": "the best quality, masterpiece. detailed, high-res, simple background, studio photography, extremely detailed, updo, detailed face, face, close-up, HDR, UHD, 8K realistic, Highly detailed, simple background, Studio lighting", +# "image_url": "aida-results/result_00097282-ebb2-11ee-a822-b48351119060.png", +# "image_strength": 0.8, +# "product_type": "overall" +# } +# """ +# try: +# logger.info(f"generate_product_image request item is : @@@@@@:{json.dumps(request_item.dict(), indent=4)}") +# service = GenerateProductImage(request_item) +# background_tasks.add_task(service.get_result) +# except Exception as e: +# logger.warning(f"generate_product_image Run Exception @@@@@@:{e}") +# raise HTTPException(status_code=404, detail=str(e)) +# return ResponseModel() +# +# +# @router.get("/generate_product_image_cancel_cancel/{tasks_id}") +# def generate_product_image(tasks_id: str): +# try: +# logger.info(f"generate_product_image_cancel_cancel request item is : @@@@@@:{tasks_id}") +# data = generate_product_image_cancel(tasks_id) +# logger.info(f"generate_product_image_cancel_cancel response @@@@@@:{data}") +# except Exception as e: +# logger.warning(f"generate_product_image_cancel_cancel Run Exception @@@@@@:{e}") +# raise HTTPException(status_code=404, detail=str(e)) +# return ResponseModel(data=data['data']) '''relight image 停用''' diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index 5062d78..815dd41 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -32,6 +32,13 @@ class GenerateProductImageModel(BaseModel): product_type: str +class Flux2ToProductImgModel(BaseModel): + tasks_id: str + prompt: str + image_url: str + image_strength: int + + class GenerateRelightImageModel(BaseModel): tasks_id: str prompt: str From 754e8d77358adf3ec3f454f9c10b353d7aefc3d5 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 15:21:51 +0800 Subject: [PATCH 03/33] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eto=20product=20?= =?UTF-8?q?img=20flux2=20=E7=89=88,=E5=81=9C=E7=94=A8sdxl=E7=89=88=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/schemas/generate_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index 815dd41..3e150d5 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -35,7 +35,7 @@ class GenerateProductImageModel(BaseModel): class Flux2ToProductImgModel(BaseModel): tasks_id: str prompt: str - image_url: str + image_path: str image_strength: int From 66037c94e681561b53f76b611a9923d7c765c705 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 15:23:49 +0800 Subject: [PATCH 04/33] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eto=20product=20?= =?UTF-8?q?img=20flux2=20=E7=89=88,=E5=81=9C=E7=94=A8sdxl=E7=89=88=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/schemas/generate_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index 3e150d5..48cfbd2 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -36,7 +36,7 @@ class Flux2ToProductImgModel(BaseModel): tasks_id: str prompt: str image_path: str - image_strength: int + infer_step: float | None = None class GenerateRelightImageModel(BaseModel): From e2a49e2f3a0f9302a2d46eca3fa2127331980e9d Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 15:26:15 +0800 Subject: [PATCH 05/33] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eto=20product=20?= =?UTF-8?q?img=20flux2=20=E7=89=88,=E5=81=9C=E7=94=A8sdxl=E7=89=88=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/schemas/generate_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index 48cfbd2..a26d5d6 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -36,7 +36,7 @@ class Flux2ToProductImgModel(BaseModel): tasks_id: str prompt: str image_path: str - infer_step: float | None = None + infer_step: int | None = None class GenerateRelightImageModel(BaseModel): From 1cbd019ffd373466eac923583e742960c303026d Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 15:56:42 +0800 Subject: [PATCH 06/33] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E6=A8=A1=E5=9E=8B=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/schemas/design.py | 6 +++--- app/service/prompt_generation/chatgpt_for_translation.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/schemas/design.py b/app/schemas/design.py index 6f0a633..9a3d80d 100644 --- a/app/schemas/design.py +++ b/app/schemas/design.py @@ -7,9 +7,9 @@ class SAMRequestModel(BaseModel): user_id: int = Field(..., description="用户id, 必填字段") image_path: str = Field(..., description="图片路径,必填字段") type: str = Field(..., description="推理类型,必填字段") - points: Optional[List[List[float]]] = None - labels: Optional[List[int]] = None - box: Optional[List[int]] = None + points: Optional[List[List[float]]] | None = None + labels: Optional[List[int]] | None = None + box: Optional[List[int]] | None = None class DesignModel(BaseModel): diff --git a/app/service/prompt_generation/chatgpt_for_translation.py b/app/service/prompt_generation/chatgpt_for_translation.py index 2214241..1ef3111 100644 --- a/app/service/prompt_generation/chatgpt_for_translation.py +++ b/app/service/prompt_generation/chatgpt_for_translation.py @@ -90,7 +90,7 @@ def get_response(messages): def get_translation_from_llama3(text): start_time = time.time() - url = f"http://{settings.A6000_SERVICE_HOST}:11434/api/generate" + url = f"http://{settings.A6000_SERVICE_HOST}:12434/api/generate" # url = "http://10.1.1.240:1143/api/generate" # prompt = f"System: {prefix_for_llama}\nUser:[{text}]" @@ -103,8 +103,8 @@ def get_translation_from_llama3(text): # 创建请求的负载 translator是自定义的翻译模型 payload = { - "model": "translator", - "prompt": f"[{text}]", + "model": "AiDA-translator:latest", + "prompt": text, "stream": False } # 将负载转换为 JSON 格式 @@ -180,7 +180,7 @@ def get_prompt_from_image(image_path, text): def main(): """Main function""" - text = get_translation_from_llama3("[火焰]") + text = get_translation_from_llama3("火焰") print(text) From a996a1853de84ecf3374913c31eacf2ead4cf39f Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 16:11:10 +0800 Subject: [PATCH 07/33] =?UTF-8?q?feat:=20fix:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 59c9820..9e6813d 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -36,7 +36,7 @@ class Settings(BaseSettings): # --- mysql 配置信息 --- MYSQL_HOST: str = Field(default='', description="") - MYSQL_PORT: int = Field(default='', description="") + MYSQL_PORT: int = Field(default=3306, description="") MYSQL_USER: str = Field(default='', description="") MYSQL_PASSWORD: str = Field(default='', description="") MYSQL_DB: str = Field(default='', description="") @@ -129,7 +129,7 @@ OLLAMA_URL = f"http://{settings.A6000_SERVICE_HOST}:11434/api/embeddings" DESIGN_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10000' DESIGN_MODEL_NAME = 'seg_knet' # Seg Product -SEG_PRODUCT_MODEL_URL = f'{settings.B_4_X_4090_SERVICE_HOST}:3000' +SEG_PRODUCT_MODEL_URL = f'{settings.B_4_X_4090_SERVICE_HOST}:30000' # Generate Image GI_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10061' GI_MODEL_NAME = 'flux' From 265f4de50ed8c34e156064187fd7be60e7f89a90 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 26 Jan 2026 16:32:30 +0800 Subject: [PATCH 08/33] =?UTF-8?q?feat:=20fix:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/config.py b/app/core/config.py index 9e6813d..e07f5c9 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -131,7 +131,7 @@ DESIGN_MODEL_NAME = 'seg_knet' # Seg Product SEG_PRODUCT_MODEL_URL = f'{settings.B_4_X_4090_SERVICE_HOST}:30000' # Generate Image -GI_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10061' +GI_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10051' GI_MODEL_NAME = 'flux' # Generate Single Logo GSL_MODEL_URL = f'{settings.B_4_X_4090_SERVICE_HOST}:10041' From 3aa8dfa0f4a7f7ee41dab25a57d3f87fe5b40cc7 Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 27 Jan 2026 10:12:23 +0800 Subject: [PATCH 09/33] =?UTF-8?q?feat:=20fix:=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/design_fast/utils/synthesis_item.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/service/design_fast/utils/synthesis_item.py b/app/service/design_fast/utils/synthesis_item.py index b380a81..da14dbf 100644 --- a/app/service/design_fast/utils/synthesis_item.py +++ b/app/service/design_fast/utils/synthesis_item.py @@ -367,7 +367,6 @@ def transpose_rotate(layer, image): # ------------------- 核心修改:计算实际旋转角度 ------------------- # 结合镜像状态,计算需要实际执行的旋转角度 actual_rotate = calculate_actual_rotate(original_rotate, is_mirrored_x, is_mirrored_y) - print(f"actual_rotate:{actual_rotate}") # ------------------- 执行镜像变换 ------------------- # 左右镜像(transpose[0] != 1 即-1,表示镜像) if is_mirrored_x != 1: From c987f498bc8343d64ffca1ffa431d1b836da4cee Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 27 Jan 2026 11:28:36 +0800 Subject: [PATCH 10/33] feat: fix: --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 6d51437..954fea1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,6 @@ services: aida_server: + container_name: "AiDA_${SERVE_ENV}_Server" build: context: . dockerfile: Dockerfile From e02ca351b61d7db54030b52a168e68c5d0976b29 Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 27 Jan 2026 13:42:34 +0800 Subject: [PATCH 11/33] =?UTF-8?q?feat:=20fix:=20=20=E5=8D=B0=E8=8A=B1overa?= =?UTF-8?q?ll=20=E8=A7=92=E5=BA=A6=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/design_fast/pipeline/no_seg_print_painting.py | 2 +- app/service/design_fast/pipeline/print_painting.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/service/design_fast/pipeline/no_seg_print_painting.py b/app/service/design_fast/pipeline/no_seg_print_painting.py index b6449db..0cf8cf1 100644 --- a/app/service/design_fast/pipeline/no_seg_print_painting.py +++ b/app/service/design_fast/pipeline/no_seg_print_painting.py @@ -169,7 +169,7 @@ class NoSegPrintPainting: canvas_h=painting_dict['dim_image_h'], canvas_w=painting_dict['dim_image_w'], location=painting_dict['location'], - angle=45) + angle=int(print_.get('print_angle_list', [0])[0])) painting_dict['mask_inv_print'] = np.zeros(painting_dict['tile_print'].shape[:2], dtype=np.uint8) return painting_dict diff --git a/app/service/design_fast/pipeline/print_painting.py b/app/service/design_fast/pipeline/print_painting.py index 7b1b2ed..8464762 100644 --- a/app/service/design_fast/pipeline/print_painting.py +++ b/app/service/design_fast/pipeline/print_painting.py @@ -232,7 +232,7 @@ class PrintPainting: canvas_h=painting_dict['dim_image_h'], canvas_w=painting_dict['dim_image_w'], location=painting_dict['location'], - angle=45) + angle=int(print_.get('print_angle_list', [0])[0])) painting_dict['mask_inv_print'] = np.zeros(painting_dict['tile_print'].shape[:2], dtype=np.uint8) return painting_dict From c24862507f49ed29ac35c8bd3d6bf68350694cc8 Mon Sep 17 00:00:00 2001 From: zcr Date: Wed, 28 Jan 2026 15:37:03 +0800 Subject: [PATCH 12/33] =?UTF-8?q?feat:=20fix:=20=20slogan=20=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_generate_image.py | 28 ++++++++++++++++++++++++++-- app/schemas/generate_image.py | 7 +++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index 7eb5bdf..c98ef12 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -5,7 +5,7 @@ import requests from fastapi import APIRouter, BackgroundTasks, HTTPException from app.core.config import settings -from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel, Flux2ToProductImgModel +from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel, Flux2ToProductImgModel, GenerateSloganImageModel from app.schemas.pose_transform import BatchPoseTransformModel from app.schemas.response_template import ResponseModel from app.service.generate_batch_image.service import start_product_batch_generate, start_relight_batch_generate, start_pose_transform_batch_generate @@ -156,6 +156,31 @@ def generate_single_logo_image(tasks_id: str): return ResponseModel(data=data['data']) +"""slogan """ + + +@router.post("/generate_slogan") +async def generate_slogan(request_data: GenerateSloganImageModel): + """ + ### 请求体示例: + ```json + { + "num_point": 16, + "image_url": "aida-slogan/6886785f-0aac-4052-b6fd-7ae20a841d8d.png", + "prompt": "123", + "tasks_id": "string-89" + } + ``` + """ + try: + logger.info(f"generate_slogan request item is : @@@@@@:{json.dumps(request_data.dict(), indent=4)}") + data = requests.post(f"http://{settings.A6000_SERVICE_HOST}:10020/api/slogan", json=request_data.dict()) + logger.info(f"generate_slogan response @@@@@@:{json.dumps(json.loads(data.content), indent=4)}") + return ResponseModel(data=json.loads(data.content)) + except Exception as e: + logger.warning(f"generate_slogan Run Exception @@@@@@:{e}") + + """product image flux2.0""" @@ -190,7 +215,6 @@ async def img_to_product(request_data: Flux2ToProductImgModel): '''product image 停用''' - # @router.post("/generate_product_image") # def generate_product_image(request_item: GenerateProductImageModel, background_tasks: BackgroundTasks): # """ diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index a26d5d6..d4c19a7 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -24,6 +24,13 @@ class GenerateSingleLogoImageModel(BaseModel): seed: str +class GenerateSloganImageModel(BaseModel): + num_point: int + tasks_id: str + prompt: str + image_url: str + + class GenerateProductImageModel(BaseModel): tasks_id: str prompt: str From f8382f280f4e8c381e5cbd81fa04bc63c3524e1d Mon Sep 17 00:00:00 2001 From: zcr Date: Thu, 29 Jan 2026 16:25:43 +0800 Subject: [PATCH 13/33] =?UTF-8?q?feat:=20fix:=20=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=B1=BB=E5=88=AB=E4=B8=BAother=E6=97=B6=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E7=9A=84pipeline=20item=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/design_fast/item.py | 1 + app/service/design_fast/utils/organize.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/service/design_fast/item.py b/app/service/design_fast/item.py index b629698..5ca89ab 100644 --- a/app/service/design_fast/item.py +++ b/app/service/design_fast/item.py @@ -16,6 +16,7 @@ class OthersItem(BaseItem): self.Others_pipeline = [ LoadImage(minio_client), Segmentation(minio_client), + Color(minio_client), Scaling(), Split(minio_client) ] diff --git a/app/service/design_fast/utils/organize.py b/app/service/design_fast/utils/organize.py index 82e8026..6cf06ec 100644 --- a/app/service/design_fast/utils/organize.py +++ b/app/service/design_fast/utils/organize.py @@ -79,7 +79,7 @@ def organize_others(layer): front_layer = dict(priority=layer['priority'] if layer.get("layer_order", False) else PRIORITY_DICT.get(f'{layer["name"].lower()}_front', None), name=f'{layer["name"].lower()}_front', image=layer["front_image"], - mask_image=layer['front_mask_image'], + # mask_image=layer['front_mask_image'], image_url=layer['front_image_url'], mask_url=layer.get('mask_url', None), sacle=layer['scale'], @@ -97,7 +97,7 @@ def organize_others(layer): back_layer = dict(priority=-layer.get("priority", 0) if layer.get("layer_order", False) else PRIORITY_DICT.get(f'{layer["name"].lower()}_back', None), name=f'{layer["name"].lower()}_back', image=layer["back_image"], - mask_image=layer['back_mask_image'], + # mask_image=layer['back_mask_image'], image_url=layer['back_image_url'], mask_url=layer.get('mask_url', None), sacle=layer['scale'], From be92d48abb440ccdffa410887bf6c12cf84d4379 Mon Sep 17 00:00:00 2001 From: zcr Date: Fri, 30 Jan 2026 15:45:57 +0800 Subject: [PATCH 14/33] =?UTF-8?q?feat:=20fix:=20=E5=9B=9E=E6=BA=AF?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E6=97=8B=E8=BD=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design_fast/utils/synthesis_item.py | 83 ++++--------------- 1 file changed, 17 insertions(+), 66 deletions(-) diff --git a/app/service/design_fast/utils/synthesis_item.py b/app/service/design_fast/utils/synthesis_item.py index da14dbf..ea387b2 100644 --- a/app/service/design_fast/utils/synthesis_item.py +++ b/app/service/design_fast/utils/synthesis_item.py @@ -342,82 +342,33 @@ def update_base_size_priority(layers): def transpose_rotate(layer, image): - """ - 融合镜像(transpose)和旋转(rotate)逻辑,计算实际旋转角度后执行图像变换, - 并调整粘贴位置以保持视觉中心一致 + # transpose[0]是左右 transpose[1]是上下 + transpose = layer.get('transpose', [1, 1]) # 默认为1, 1代表不镜像 - 参数: - layer: 包含transpose、rotate、adaptive_position等属性的字典 - image: PIL Image对象,待处理的图像 - - 返回: - tuple: (处理后的Image对象, 新的粘贴坐标(x, y)) - """ - # 获取镜像状态(transpose[0]=左右,transpose[1]=上下;1=正常,-1=镜像) - transpose = layer.get('transpose', [1, 1]) - is_mirrored_x = transpose[0] # 左右镜像状态 - is_mirrored_y = transpose[1] # 上下镜像状态 - - # 获取原始旋转角度和粘贴位置 - original_rotate = layer.get('rotate', 0) + rotate = layer.get('rotate', 0) paste_x, paste_y = layer['adaptive_position'][1], layer['adaptive_position'][0] original_w = image.width original_h = image.height + # transpose左右是1 上下是-1 + if transpose[0] != 1: + # 左右 + image = image.transpose(0) - # ------------------- 核心修改:计算实际旋转角度 ------------------- - # 结合镜像状态,计算需要实际执行的旋转角度 - actual_rotate = calculate_actual_rotate(original_rotate, is_mirrored_x, is_mirrored_y) - # ------------------- 执行镜像变换 ------------------- - # 左右镜像(transpose[0] != 1 即-1,表示镜像) - if is_mirrored_x != 1: - image = image.transpose(0) # 假设transpose(0)对应左右翻转(需匹配你的PIL版本) + if transpose[1] != 1: + # 上下 + image = image.transpose(1) - # 上下镜像(transpose[1] != 1 即-1,表示镜像) - if is_mirrored_y != 1: - image = image.transpose(1) # 假设transpose(1)对应上下翻转 - - # ------------------- 执行旋转并调整粘贴位置 ------------------- - if actual_rotate != 0: # 只有实际旋转角度非0时才执行旋转 - # 注意:原代码中是rotate(-rotate),这里同步调整符号 - image = image.rotate(-actual_rotate, expand=True) - - # 计算粘贴位置以保持视觉中心一致 - # 原位置的中心点 + if rotate: + image = image.rotate(-rotate, expand=True) + # 4. 计算粘贴位置以保持视觉中心一致 + # 原本 (15, 36) 是 288*288 的左上角,我们计算其中心点 target_center_x = paste_x + original_w // 2 target_center_y = paste_y + original_h // 2 - # 旋转后图像的新尺寸 + # 获取旋转后图像的新尺寸 new_w, new_h = image.size - # 新的左上角坐标(保证中心不变) + # 计算新的左上角坐标,使得旋转后的图像中心依然在原定的中心位置 paste_x = target_center_x - new_w // 2 paste_y = target_center_y - new_h // 2 - - return image, (paste_x, paste_y) - - -def calculate_actual_rotate(before_rotate, is_mirrored_x, is_mirrored_y): - """ - 根据X/Y轴镜像状态计算实际的旋转角度,并标准化到0-360度 - - 参数: - before_rotate: 原始旋转角度(数值类型) - is_mirrored_x: X轴镜像状态,-1表示镜像,1表示正常 - is_mirrored_y: Y轴镜像状态,-1表示镜像,1表示正常 - - 返回: - float/int: 标准化后的实际旋转角度(0-360度) - """ - actual_rotate = before_rotate - - # 根据镜像状态调整旋转角度 - if is_mirrored_x == -1 and is_mirrored_y == 1: - actual_rotate = -before_rotate - elif is_mirrored_x == 1 and is_mirrored_y == -1: - actual_rotate = -before_rotate - # elif is_mirrored_x == -1 and is_mirrored_y == -1: - # actual_rotate = before_rotate + 180 - - # 角度标准化到0-360度 - normalized_rotate = ((actual_rotate % 360) + 360) % 360 - return normalized_rotate + return image, (paste_x, paste_y) \ No newline at end of file From 2cc17a1210b3418a79c23032caad7376da9ef0c4 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 2 Feb 2026 15:37:01 +0800 Subject: [PATCH 15/33] =?UTF-8?q?feat:=20fix:=20=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=90=8D=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/comfyui_I2V/pose2v_server.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/service/comfyui_I2V/pose2v_server.py b/app/service/comfyui_I2V/pose2v_server.py index 17e3fc5..a37f246 100644 --- a/app/service/comfyui_I2V/pose2v_server.py +++ b/app/service/comfyui_I2V/pose2v_server.py @@ -13,7 +13,7 @@ from PIL import Image from minio import Minio, S3Error from moviepy.video.io.VideoFileClip import VideoFileClip -from app.core.config import settings +from app.core.config import settings, PS_RABBITMQ_QUEUES from app.schemas.comfyui_i2v import ComfyuiPose2VModel from app.service.generate_image.utils.mq import publish_status @@ -622,9 +622,9 @@ class ComfyUIServerPose2V: # 推送消息 if not settings.DEBUG: - publish_status(json.dumps(self.pose_transform_data), settings.COMFYUI_SERVER_ADDRESS) + publish_status(json.dumps(self.pose_transform_data), PS_RABBITMQ_QUEUES) logger.info( - f" [x] Sent to: {settings.COMFYUI_SERVER_ADDRESS} data:@@@@ {json.dumps(self.pose_transform_data, indent=4)}") + f" [x] Sent to: {PS_RABBITMQ_QUEUES} data:@@@@ {json.dumps(self.pose_transform_data, indent=4)}") return "\n🎉 所有任务完成!" From fe25f5878b29c74d5a365b50c02b42cbd1804db9 Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 3 Feb 2026 16:22:47 +0800 Subject: [PATCH 16/33] =?UTF-8?q?feat:=20fix:=20=E4=BF=AE=E5=A4=8Dsketch?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E4=B8=BAothers=E6=97=B6=20=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=20=E4=B8=8A=E5=8D=B0=E8=8A=B1=20=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E4=B8=8E=E5=88=86=E5=89=B2=E5=B0=BA=E5=AF=B8?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98,=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dothers=E5=88=86=E5=89=B2=E5=87=BA=E5=90=8E=E7=89=87?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/design_fast/item.py | 2 ++ app/service/design_fast/pipeline/segmentation.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/service/design_fast/item.py b/app/service/design_fast/item.py index 5ca89ab..3bee6bb 100644 --- a/app/service/design_fast/item.py +++ b/app/service/design_fast/item.py @@ -17,6 +17,8 @@ class OthersItem(BaseItem): LoadImage(minio_client), Segmentation(minio_client), Color(minio_client), + NoSegPrintPainting(minio_client), + PrintPainting(minio_client), Scaling(), Split(minio_client) ] diff --git a/app/service/design_fast/pipeline/segmentation.py b/app/service/design_fast/pipeline/segmentation.py index ebdb6c6..9468556 100644 --- a/app/service/design_fast/pipeline/segmentation.py +++ b/app/service/design_fast/pipeline/segmentation.py @@ -51,6 +51,8 @@ class Segmentation: if not _ or result["image"].shape[:2] != seg_result.shape: # 推理获得seg 结果 seg_result = get_seg_result(result['image']) + if result['name'] == 'others': + seg_result = seg_result.clip(max=1) self.save_seg_result(seg_result, result['image_id']) result['seg_result'] = seg_result From 4656eeee9194cf822e2b23bc9a276c6300d1e169 Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 3 Feb 2026 16:43:33 +0800 Subject: [PATCH 17/33] =?UTF-8?q?feat:=20=E5=8D=B0=E8=8A=B1=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BF=AE=E6=94=B9=20=E9=BB=98=E8=AE=A4=E4=B8=8D?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=99=A4overall=E4=BB=A5=E5=A4=96=E6=89=80?= =?UTF-8?q?=E6=9C=89=E5=8D=B0=E8=8A=B1=E7=B1=BB=E5=9E=8B=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.backup.py | 235 ------------------ .../pipeline/no_seg_print_painting.py | 12 +- .../design_fast/pipeline/print_painting.py | 14 +- 3 files changed, 17 insertions(+), 244 deletions(-) delete mode 100644 app/core/config.backup.py diff --git a/app/core/config.backup.py b/app/core/config.backup.py deleted file mode 100644 index e6c7283..0000000 --- a/app/core/config.backup.py +++ /dev/null @@ -1,235 +0,0 @@ -import os - -import pika -from dotenv import load_dotenv -from pydantic import BaseSettings - -BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../')) -load_dotenv(os.path.join(BASE_DIR, '.env')) - - -class Settings(BaseSettings): - PROJECT_NAME: str = 'FASTAPI BASE' - SECRET_KEY: str = '' - API_PREFIX: str = '' - BACKEND_CORS_ORIGINS: list[str] = ['*'] - DATABASE_URL: str = '' - ACCESS_TOKEN_EXPIRE_SECONDS: int = 60 * 60 * 24 * 7 # Token expired after 7 days - SECURITY_ALGORITHM: str = 'HS256' - LOGGING_CONFIG_FILE: str = os.path.join(BASE_DIR, 'logging_env.py') - - -OSS = "minio" -DEBUG = False -if DEBUG: - LOGS_PATH = "logs/" - CATEGORY_PATH = "service/attribute/config/descriptor/category/category_dis.csv" - SEG_CACHE_PATH = "../seg_cache/" - POSE_TRANSFORM_VIDEO_PATH = "../pose_transform_video/" - RECOMMEND_PATH_PREFIX = "service/recommend/" - CHROMADB_PATH = "./chromadb/" -else: - LOGS_PATH = "app/logs/" - CATEGORY_PATH = "app/service/attribute/config/descriptor/category/category_dis.csv" - SEG_CACHE_PATH = "/seg_cache/" - POSE_TRANSFORM_VIDEO_PATH = "/pose_transform_video/" - RECOMMEND_PATH_PREFIX = "app/service/recommend/" - CHROMADB_PATH = "/chromadb/" - -# RABBITMQ_ENV = "" # 生产环境 -RABBITMQ_ENV = os.getenv("RABBITMQ_ENV", "-dev") -# RABBITMQ_ENV = "-local" # 本地测试环境 - -if RABBITMQ_ENV == "-dev": - JAVA_STREAM_API_URL = f"https://develop.api.aida.com.hk/api/third/party/receiveDesignResults" -elif RABBITMQ_ENV == "-prod": - JAVA_STREAM_API_URL = f"https://api.aida.com.hk/api/third/party/receiveDesignResults" - -settings = Settings() - -# minio 配置 -MINIO_URL = "www.minio-api.aida.com.hk" -MINIO_ACCESS = 'vXKFLSJkYeEq2DrSZvkB' -MINIO_SECRET = 'uKTZT3x7C43WvPN9QTc99DiRkwddWZrG9Uh3JVlR' -MINIO_SECURE = True - -# S3 配置 -S3_ACCESS_KEY = "AKIAVD3OJIMF6UJFLSHZ" -S3_AWS_SECRET_ACCESS_KEY = "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" -S3_REGION_NAME = "ap-east-1" - -# redis 配置 -REDIS_HOST = "10.1.1.240" -REDIS_PORT = "6379" -REDIS_DB = "2" - -# rabbitmq config -RABBITMQ_PARAMS = { - "host": "18.167.251.121", - "port": 5672, - "credentials": pika.credentials.PlainCredentials(username='rabbit', password='123456'), - "virtual_host": "/" -} - -# milvus 配置 -MILVUS_URL = "http://10.1.1.240:19530" -MILVUS_TOKEN = "root:Milvus" -MILVUS_ALIAS = "default" -MILVUS_TABLE_KEYPOINT = "keypoint_cache_2" -MILVUS_TABLE_SEG = "seg_cache" - -# Mysql 配置 -DB_HOST = '18.167.251.121' # 数据库主机地址 -# DB_PORT = int( 33006) -DB_PORT = 33008 # 数据库端口 -DB_USERNAME = 'aida_con_python' # 数据库用户名 -DB_PASSWORD = '123456' # 数据库密码 -DB_NAME = 'aida' # 数据库库名 - -# openai -os.environ['SERPAPI_API_KEY'] = "a793513017b0718db7966207c31703d280d12435c982f1e67bbcbffa52e7632c" -OPENAI_STREAM = True -BUFFER_THRESHOLD = 6 # must be even number -SINGLE_TOKEN_THRESHOLD = 200 -TOKEN_THRESHOLD = 600 -OPENAI_TEMPERATURE = 0 - -# OPENAI_API_KEY = "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" -OPENAI_API_KEY = "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" -OPENAI_MODEL = "gpt-3.5-turbo-0613" -OPENAI_MODEL_LIST = {"gpt-3.5-turbo-0613", - "gpt-3.5-turbo-16k-0613", - "gpt-4-0314", - "gpt-4-32k-0314", - "gpt-4-0613", - "gpt-4-32k-0613", } - -# SR service config -SR_MODEL_NAME = "super_resolution" -SR_TRITON_URL = "10.1.1.240:10031" -SR_MINIO_BUCKET = "aida-users" -SR_RABBITMQ_QUEUES = f"SuperResolution{RABBITMQ_ENV}" - -# GenerateImage service config -FAST_GI_MODEL_URL = '10.1.1.243:10011' -FAST_GI_MODEL_NAME = 'stable_diffusion_xl' - -GI_MODEL_URL = '10.1.1.240:10061' -GI_MODEL_NAME = 'flux' - -GMV_MODEL_URL = '10.1.1.243:10081' -GMV_MODEL_NAME = 'multi_view' - -GMV_RABBITMQ_QUEUES = f"GenerateMultiView{RABBITMQ_ENV}" - -GI_MINIO_BUCKET = "aida-users" -GI_RABBITMQ_QUEUES = f"GenerateImage{RABBITMQ_ENV}" -GI_SYS_IMAGE_URL = "aida-sys-image/generate_image/white_image.jpg" - -# SLOGAN service config -SLOGAN_RABBITMQ_QUEUES = f"Slogan{RABBITMQ_ENV}" - -# Generate Single Logo service config -GSL_MODEL_URL = '10.1.1.243:10041' -GSL_MINIO_BUCKET = "aida-users" -GSL_MODEL_NAME = 'stable_diffusion_xl_transparent' -GEN_SINGLE_LOGO_RABBITMQ_QUEUES = f"GenSingleLogo{RABBITMQ_ENV}" - -# Generate Product service config -# GPI_RABBITMQ_QUEUES = os.getenv("GEN_PRODUCT_IMAGE_RABBITMQ_QUEUES", f"ToProductImage{RABBITMQ_ENV}") -# GPI_MODEL_NAME_OVERALL = 'sdxl_ensemble_all' -# GPI_MODEL_URL = '10.1.1.243:10051' - -# Generate Product service config 旧版product img 模型 -GPI_RABBITMQ_QUEUES = f"ToProductImage{RABBITMQ_ENV}" -BATCH_GPI_RABBITMQ_QUEUES = f"BatchToProductImage{RABBITMQ_ENV}" -GPI_MODEL_NAME_OVERALL = 'diffusion_ensemble_all' -GPI_MODEL_NAME_SINGLE = 'stable_diffusion_1_5_cnet' -GPI_MODEL_URL = '10.1.1.243:10051' - -# Generate Single Logo service config -GRI_RABBITMQ_QUEUES = f"Relight{RABBITMQ_ENV}" -BATCH_GRI_RABBITMQ_QUEUES = f"BatchRelight{RABBITMQ_ENV}" -GRI_MODEL_NAME_OVERALL = 'diffusion_relight_ensemble' -GRI_MODEL_NAME_SINGLE = 'stable_diffusion_1_5_relight' -GRI_MODEL_URL = '10.1.1.240:10051' - -# Pose Transform service config - -PS_RABBITMQ_QUEUES = f"PoseTransform{RABBITMQ_ENV}" -BATCH_PS_RABBITMQ_QUEUES = f"BatchPoseTransform{RABBITMQ_ENV}" -PT_MODEL_URL = '10.1.1.243:10061' - -# SEG service config -SEGMENTATION = { - "new_model_name": "seg_knet", - "name": "seg_ocrnet_hr18", - "input": "seg_input__0", - "output": "seg_output__0", -} -# ollama config -OLLAMA_URL = "http://10.1.1.240:11434/api/embeddings" - -# design batch -BATCH_DESIGN_RABBITMQ_QUEUES = f"DesignBatch{RABBITMQ_ENV}" - -# DESIGN config -DESIGN_MODEL_URL = '10.1.1.240:10000' -AIDA_CLOTHING = "aida-clothing" -KEYPOINT_RESULT_TABLE_FIELD_SET = ('neckline_left', 'neckline_right', 'shoulder_left', 'shoulder_right', 'armpit_left', 'armpit_right', - 'cuff_left_in', 'cuff_left_out', 'cuff_right_in', 'cuff_right_out', 'waistband_left', 'waistband_right') - -# DESIGN 预处理 -IF_DEBUG_SHOW = False - -# 优先级 -PRIORITY_DICT = { - 'earring_front': 99, - 'bag_front': 98, - 'hairstyle_front': 97, - 'outwear_front': 20, - 'tops_front': 19, - 'dress_front': 18, - 'blouse_front': 17, - 'skirt_front': 16, - 'trousers_front': 15, - 'bottoms_front': 14, - 'shoes_right': 1, - 'shoes_left': 1, - 'body': 0, - 'bottoms_back': -14, - 'trousers_back': -15, - 'skirt_back': -16, - 'blouse_back': -17, - 'dress_back': -18, - 'tops_back': -19, - 'outwear_back': -20, - 'hairstyle_back': -97, - 'bag_back': -98, - 'earring_back': -99, -} - -QWEN_API_KEY = "sk-f31c29e61ac2498ba5e307aaa6dc10e0" - -DB_CONFIG = { - "host": "18.167.251.121", - "port": 3306, - "user": "root", - "password": "QWa998345", - "database": "aida", - "charset": "utf8mb4" -} - -TABLE_CATEGORIES = { - "female_dress": "female/dress", - "female_outwear": "female/outwear", - "female_trousers": "female/trousers", - "female_skirt": "female/skirt", - "female_blouse": "female/blouse", - "male_tops": "male/tops", - "male_bottoms": "male/bottoms", - "male_outwear": "male/outwear" -} - -# --- ComfyUI 配置信息 --- -COMFYUI_SERVER_ADDRESS = "10.1.2.227:8080" # 替换为您的 ComfyUI 服务器地址 diff --git a/app/service/design_fast/pipeline/no_seg_print_painting.py b/app/service/design_fast/pipeline/no_seg_print_painting.py index 0cf8cf1..3341c81 100644 --- a/app/service/design_fast/pipeline/no_seg_print_painting.py +++ b/app/service/design_fast/pipeline/no_seg_print_painting.py @@ -12,9 +12,13 @@ class NoSegPrintPainting: self.minio_client = minio_client def __call__(self, result): - single_print = result['print']['single'] + # single_print = [result['print']['single']] overall_print = result['print']['overall'] - element_print = result['print']['element'] + # element_print = result['print']['element' + + single_print = None + element_print = None + result['single_image'] = None result['print_image'] = None @@ -25,7 +29,7 @@ class NoSegPrintPainting: result['no_seg_sketch_overall'] = result['no_seg_sketch_print'] = self.printpaint(result, painting_dict, print_=True) result['pattern_image'] = result['no_seg_sketch_overall'] - if single_print['print_path_list']: + if single_print: print_background = np.zeros((result['pattern_image'].shape[0], result['pattern_image'].shape[1], 3), dtype=np.uint8) mask_background = np.zeros((result['pattern_image'].shape[0], result['pattern_image'].shape[1], 3), dtype=np.uint8) for i in range(len(single_print['print_path_list'])): @@ -65,7 +69,7 @@ class NoSegPrintPainting: single_image = cv2.add(tmp1, tmp2) result['no_seg_sketch_print'] = single_image - if element_print['element_path_list']: + if element_print: print_background = np.zeros((result['final_image'].shape[0], result['final_image'].shape[1], 3), dtype=np.uint8) mask_background = np.zeros((result['final_image'].shape[0], result['final_image'].shape[1], 3), dtype=np.uint8) for i in range(len(element_print['element_path_list'])): diff --git a/app/service/design_fast/pipeline/print_painting.py b/app/service/design_fast/pipeline/print_painting.py index 8464762..fd54c59 100644 --- a/app/service/design_fast/pipeline/print_painting.py +++ b/app/service/design_fast/pipeline/print_painting.py @@ -12,10 +12,14 @@ class PrintPainting: self.minio_client = minio_client def __call__(self, result): - single_print = result['print']['single'] + # single_print = result['print']['single'] overall_print = result['print']['overall'] - element_print = result['print']['element'] - partial_path = result['print']['partial'] if 'partial' in result['print'] else None + # element_print = result['print']['element'] + # partial_path = result['print']['partial'] if 'partial' in result['print'] else None + + single_print = None + element_print = None + partial_path = None result['single_image'] = None result['print_image'] = None # TODO 给result['pattern_image'] resize 到resize_scale的大小 @@ -43,7 +47,7 @@ class PrintPainting: result['print_image'] = self.printpaint(result, painting_dict, print_=True) result['single_image'] = result['final_image'] = result['pattern_image'] = result['print_image'] - if single_print['print_path_list']: + if single_print: # 2025-9-19 印花调整 印花坐标按照sketch的缩放比调整 sketch_resize_scale = result['resize_scale'] print_background = np.zeros((result['pattern_image'].shape[0], result['pattern_image'].shape[1], 3), dtype=np.uint8) @@ -84,7 +88,7 @@ class PrintPainting: tmp2 = (result['final_image'] * (temp_fg / 255)).astype(np.uint8) result['single_image'] = cv2.add(tmp1, tmp2) - if element_print['element_path_list']: + if element_print: # 2025-9-19 印花调整 印花坐标按照sketch的缩放比调整 sketch_resize_scale = result['resize_scale'] print_background = np.zeros((result['final_image'].shape[0], result['final_image'].shape[1], 3), dtype=np.uint8) From 200414e5add581252c0fa827f57fe064a57c7ac3 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 9 Feb 2026 17:33:07 +0800 Subject: [PATCH 18/33] =?UTF-8?q?feat:=20=E5=81=9C=E7=94=A8flux2=20img2pro?= =?UTF-8?q?duct=20=E5=A4=8D=E7=94=A8sdxl=20img2product=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_generate_image.py | 123 +++++++++++++++++----------------- 1 file changed, 62 insertions(+), 61 deletions(-) diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index c98ef12..077fea9 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -184,77 +184,78 @@ async def generate_slogan(request_data: GenerateSloganImageModel): """product image flux2.0""" -@router.post("/img_to_product") -async def img_to_product(request_data: Flux2ToProductImgModel): - """ - 创建一个具有以下参数的请求体: - - **tasks_id**: 任务id 用于取消生成任务和获取生成结果 - - **prompt**: 想要生成图片的描述词 - - **image_path**: 被生成图片的S3或minio url地址 - - **infer_step**: 推理步数 - - ### 请求体示例: - ```json - point - { - "prompt": "Create realistic studio photo with real people model standing and wearing this garment, in white studio, Keep original model if present, or generate appropriate model, Standing pose, facing camera.", - "image_path":"aida-results/result_38151e0a-f83b-11f0-89f6-0242ac130002.png", - "infer_step":4, - "tasks_id":"123456-123" - } - ``` - """ - try: - logger.info(f"img_to_product request item is : @@@@@@:{json.dumps(request_data.dict(), indent=4)}") - data = requests.post(f"http://{settings.A6000_SERVICE_HOST}:10090/api/v1/to_product", json=request_data.dict()) - logger.info(f"img_to_product response @@@@@@:{json.dumps(json.loads(data.content), indent=4)}") - return ResponseModel(data=json.loads(data.content)) - except Exception as e: - logger.warning(f"img_to_product Run Exception @@@@@@:{e}") - - -'''product image 停用''' - -# @router.post("/generate_product_image") -# def generate_product_image(request_item: GenerateProductImageModel, background_tasks: BackgroundTasks): +# @router.post("/img_to_product") +# async def img_to_product(request_data: Flux2ToProductImgModel): # """ # 创建一个具有以下参数的请求体: # - **tasks_id**: 任务id 用于取消生成任务和获取生成结果 # - **prompt**: 想要生成图片的描述词 -# - **image_url**: 被生成图片的S3或minio url地址 -# - **image_strength**: 生成强度,越低越接近原图 -# - **product_type**: 输入single item 还是 overall item +# - **image_path**: 被生成图片的S3或minio url地址 +# - **infer_step**: 推理步数 # -# -# 示例参数: +# ### 请求体示例: +# ```json +# point # { -# "tasks_id": "123-89", -# "prompt": "the best quality, masterpiece. detailed, high-res, simple background, studio photography, extremely detailed, updo, detailed face, face, close-up, HDR, UHD, 8K realistic, Highly detailed, simple background, Studio lighting", -# "image_url": "aida-results/result_00097282-ebb2-11ee-a822-b48351119060.png", -# "image_strength": 0.8, -# "product_type": "overall" +# "prompt": "Create realistic studio photo with real people model standing and wearing this garment, in white studio, Keep original model if present, or generate appropriate model, Standing pose, facing camera.", +# "image_path":"aida-results/result_38151e0a-f83b-11f0-89f6-0242ac130002.png", +# "infer_step":4, +# "tasks_id":"123456-123" # } +# ``` # """ # try: -# logger.info(f"generate_product_image request item is : @@@@@@:{json.dumps(request_item.dict(), indent=4)}") -# service = GenerateProductImage(request_item) -# background_tasks.add_task(service.get_result) +# logger.info(f"img_to_product request item is : @@@@@@:{json.dumps(request_data.dict(), indent=4)}") +# data = requests.post(f"http://{settings.A6000_SERVICE_HOST}:10090/api/v1/to_product", json=request_data.dict()) +# logger.info(f"img_to_product response @@@@@@:{json.dumps(json.loads(data.content), indent=4)}") +# return ResponseModel(data=json.loads(data.content)) # except Exception as e: -# logger.warning(f"generate_product_image Run Exception @@@@@@:{e}") -# raise HTTPException(status_code=404, detail=str(e)) -# return ResponseModel() -# -# -# @router.get("/generate_product_image_cancel_cancel/{tasks_id}") -# def generate_product_image(tasks_id: str): -# try: -# logger.info(f"generate_product_image_cancel_cancel request item is : @@@@@@:{tasks_id}") -# data = generate_product_image_cancel(tasks_id) -# logger.info(f"generate_product_image_cancel_cancel response @@@@@@:{data}") -# except Exception as e: -# logger.warning(f"generate_product_image_cancel_cancel Run Exception @@@@@@:{e}") -# raise HTTPException(status_code=404, detail=str(e)) -# return ResponseModel(data=data['data']) +# logger.warning(f"img_to_product Run Exception @@@@@@:{e}") + + +'''product image''' + + +@router.post("/generate_product_image") +def generate_product_image(request_item: GenerateProductImageModel, background_tasks: BackgroundTasks): + """ + 创建一个具有以下参数的请求体: + - **tasks_id**: 任务id 用于取消生成任务和获取生成结果 + - **prompt**: 想要生成图片的描述词 + - **image_url**: 被生成图片的S3或minio url地址 + - **image_strength**: 生成强度,越低越接近原图 + - **product_type**: 输入single item 还是 overall item + + + 示例参数: + { + "tasks_id": "123-89", + "prompt": "the best quality, masterpiece. detailed, high-res, simple background, studio photography, extremely detailed, updo, detailed face, face, close-up, HDR, UHD, 8K realistic, Highly detailed, simple background, Studio lighting", + "image_url": "aida-results/result_00097282-ebb2-11ee-a822-b48351119060.png", + "image_strength": 0.8, + "product_type": "overall" + } + """ + try: + logger.info(f"generate_product_image request item is : @@@@@@:{json.dumps(request_item.dict(), indent=4)}") + service = GenerateProductImage(request_item) + background_tasks.add_task(service.get_result) + except Exception as e: + logger.warning(f"generate_product_image Run Exception @@@@@@:{e}") + raise HTTPException(status_code=404, detail=str(e)) + return ResponseModel() + + +@router.get("/generate_product_image_cancel_cancel/{tasks_id}") +def generate_product_image(tasks_id: str): + try: + logger.info(f"generate_product_image_cancel_cancel request item is : @@@@@@:{tasks_id}") + data = generate_product_image_cancel(tasks_id) + logger.info(f"generate_product_image_cancel_cancel response @@@@@@:{data}") + except Exception as e: + logger.warning(f"generate_product_image_cancel_cancel Run Exception @@@@@@:{e}") + raise HTTPException(status_code=404, detail=str(e)) + return ResponseModel(data=data['data']) '''relight image 停用''' From c03b7e263e6122053d67ea7d47cfc4e515ab6647 Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 10 Feb 2026 11:17:31 +0800 Subject: [PATCH 19/33] =?UTF-8?q?feat:=20fix:=20=20=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=B8=AD=E6=89=80=E6=9C=89mmcv=E7=9A=84?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 6 +- README.md | 1 - .../attribute/service_att_recognition.py | 5 +- .../attribute/service_category_recognition.py | 5 +- app/service/brand_dna/service.py | 11 +-- .../design_batch/utils/design_ensemble.py | 12 +-- .../design_fast/utils/design_ensemble.py | 12 +-- .../service_agent_tool_generate_image.py | 5 +- .../generate_image/service_generate_image.py | 4 +- .../generate_image/utils/image_processing.py | 9 +- app/service/lineart/service.py | 8 +- app/service/utils/image_normalize.py | 27 ++++++ pyproject.toml | 2 +- requirements.txt | Bin 1966 -> 1940 bytes requirements_2.txt | Bin 5666 -> 5640 bytes uv.lock | 88 ++---------------- 16 files changed, 74 insertions(+), 121 deletions(-) create mode 100644 app/service/utils/image_normalize.py diff --git a/.dockerignore b/.dockerignore index 0b6bf22..6406e77 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,6 @@ seg_cache -test \ No newline at end of file +test +.venv +__pycache__/ +*.pyc +.git/ \ No newline at end of file diff --git a/README.md b/README.md index 6085b85..b444530 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ $ conda activate trinity_client_aida $ pip install -r requirements.txt $ conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia -y - $ pip install mmcv==1.4.2 -f https://download.openmmlab.com/mmcv/dist/cu117/torch1.13/index.html 1. 启动服务器 diff --git a/app/service/attribute/service_att_recognition.py b/app/service/attribute/service_att_recognition.py index c007184..ff3d169 100644 --- a/app/service/attribute/service_att_recognition.py +++ b/app/service/attribute/service_att_recognition.py @@ -3,7 +3,6 @@ from pprint import pprint import cv2 -import mmcv import numpy as np import pandas as pd import torch @@ -12,6 +11,7 @@ from minio import Minio from app.core.config import settings, DESIGN_MODEL_URL from app.schemas.attribute_retrieve import AttributeRecognitionModel +from app.service.utils.image_normalize import my_imnormalize from app.service.utils.new_oss_client import oss_get_image minio_client = Minio(settings.MINIO_URL, access_key=settings.MINIO_ACCESS, secret_key=settings.MINIO_SECRET, secure=settings.MINIO_SECURE) @@ -109,10 +109,9 @@ class AttributeRecognition: @staticmethod def preprocess(img): - img = mmcv.imread(img) img_scale = (224, 224) img = cv2.resize(img, img_scale) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img diff --git a/app/service/attribute/service_category_recognition.py b/app/service/attribute/service_category_recognition.py index 5a04ba2..f3bba9b 100644 --- a/app/service/attribute/service_category_recognition.py +++ b/app/service/attribute/service_category_recognition.py @@ -10,7 +10,6 @@ from minio import Minio from skimage import transform import cv2 -import mmcv import numpy as np import pandas as pd import tritonclient.http as httpclient @@ -18,6 +17,7 @@ import torch from app.core.config import settings, DESIGN_MODEL_URL from app.schemas.attribute_retrieve import CategoryRecognitionModel +from app.service.utils.image_normalize import my_imnormalize from app.service.utils.new_oss_client import oss_get_image minio_client = Minio(settings.MINIO_URL, access_key=settings.MINIO_ACCESS, secret_key=settings.MINIO_SECRET, secure=settings.MINIO_SECURE) @@ -39,11 +39,10 @@ class CategoryRecognition: @staticmethod def preprocess(img): - img = mmcv.imread(img) # ori_shape = img.shape[:2] img_scale = (224, 224) img = cv2.resize(img, img_scale) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img diff --git a/app/service/brand_dna/service.py b/app/service/brand_dna/service.py index 350f395..6736df5 100644 --- a/app/service/brand_dna/service.py +++ b/app/service/brand_dna/service.py @@ -1,7 +1,6 @@ import logging import cv2 -import mmcv import numpy as np import pandas as pd import torch @@ -14,6 +13,7 @@ from app.core.config import settings from app.schemas.brand_dna import BrandDnaModel from app.service.attribute.config import const from app.service.utils.generate_uuid import generate_uuid +from app.service.utils.image_normalize import my_imnormalize from app.service.utils.new_oss_client import oss_upload_image, oss_get_image minio_client = Minio(settings.MINIO_URL, access_key=settings.MINIO_ACCESS, secret_key=settings.MINIO_SECRET, secure=settings.MINIO_SECURE) @@ -202,7 +202,7 @@ class BrandDna: # 服装分割预处理 @staticmethod def seg_product_preprocess(image): - img = mmcv.imread(image) + img = image ori_shape = img.shape[:2] img_scale_w, img_scale_h = ori_shape if ori_shape[0] > 1024: @@ -211,9 +211,9 @@ class BrandDna: img_scale_h = 1024 # 如果图片size任意一边 大于 1024, 则会resize 成1024 if ori_shape != (img_scale_w, img_scale_h): - # mmcv.imresize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 + # my_imnormalize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 img = cv2.resize(img, (img_scale_h, img_scale_w)) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img, ori_shape @@ -227,11 +227,10 @@ class BrandDna: # 类别检测模型预处理 @staticmethod def category_preprocess(img): - img = mmcv.imread(img) # ori_shape = img.shape[:2] img_scale = (224, 224) img = cv2.resize(img, img_scale) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img diff --git a/app/service/design_batch/utils/design_ensemble.py b/app/service/design_batch/utils/design_ensemble.py index 193da0e..2f107ef 100644 --- a/app/service/design_batch/utils/design_ensemble.py +++ b/app/service/design_batch/utils/design_ensemble.py @@ -10,13 +10,13 @@ import logging import cv2 -import mmcv import numpy as np import torch import torch.nn.functional as F import tritonclient.http as httpclient from app.core.config import DESIGN_MODEL_URL, DESIGN_MODEL_NAME +from app.service.utils.image_normalize import my_imnormalize """ keypoint @@ -25,13 +25,13 @@ from app.core.config import DESIGN_MODEL_URL, DESIGN_MODEL_NAME def keypoint_preprocess(img_path): - img = mmcv.imread(img_path) + img = img_path img_scale = (256, 256) h, w = img.shape[:2] img = cv2.resize(img, img_scale) w_scale = img_scale[0] / w h_scale = img_scale[1] / h - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img, (w_scale, h_scale) @@ -74,7 +74,7 @@ def keypoint_postprocess(output, scale_factor): # KNet def seg_preprocess(img_path): - img = mmcv.imread(img_path) + img = img_path ori_shape = img.shape[:2] img_scale_w, img_scale_h = ori_shape if ori_shape[0] > 1024: @@ -83,9 +83,9 @@ def seg_preprocess(img_path): img_scale_h = 1024 # 如果图片size任意一边 大于 1024, 则会resize 成1024 if ori_shape != (img_scale_w, img_scale_h): - # mmcv.imresize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 + # my_imnormalize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 img = cv2.resize(img, (img_scale_h, img_scale_w)) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img, ori_shape diff --git a/app/service/design_fast/utils/design_ensemble.py b/app/service/design_fast/utils/design_ensemble.py index 9aa674c..0b7b88f 100644 --- a/app/service/design_fast/utils/design_ensemble.py +++ b/app/service/design_fast/utils/design_ensemble.py @@ -10,12 +10,12 @@ import logging import cv2 -import mmcv import numpy as np import torch import tritonclient.http as httpclient from app.core.config import DESIGN_MODEL_URL, DESIGN_MODEL_NAME +from app.service.utils.image_normalize import my_imnormalize """ keypoint @@ -24,14 +24,14 @@ from app.core.config import DESIGN_MODEL_URL, DESIGN_MODEL_NAME def keypoint_preprocess(img_path): - img = mmcv.imread(img_path) + img = img_path img = cv2.copyMakeBorder(img, 25, 25, 25, 25, cv2.BORDER_CONSTANT, value=[255, 255, 255]) img_scale = (256, 256) h, w = img.shape[:2] img = cv2.resize(img, img_scale) w_scale = img_scale[0] / w h_scale = img_scale[1] / h - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img, (w_scale, h_scale) @@ -78,7 +78,7 @@ def keypoint_postprocess(output, scale_factor): # KNet def seg_preprocess(img_path): - img = mmcv.imread(img_path) + img = img_path ori_shape = img.shape[:2] img_scale_w, img_scale_h = ori_shape if ori_shape[0] > 1024: @@ -87,12 +87,12 @@ def seg_preprocess(img_path): img_scale_h = 1024 # 如果图片size任意一边 大于 1024, 则会resize 成1024 if ori_shape != (img_scale_w, img_scale_h): - # mmcv.imresize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 + # my_imnormalize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 img = cv2.resize(img, (img_scale_h, img_scale_w)) # 扩充25的白边 img = cv2.copyMakeBorder(img, 25, 25, 25, 25, cv2.BORDER_CONSTANT, value=[255, 255, 255]) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img, ori_shape diff --git a/app/service/generate_image/service_agent_tool_generate_image.py b/app/service/generate_image/service_agent_tool_generate_image.py index 76f5de8..322d2b5 100644 --- a/app/service/generate_image/service_agent_tool_generate_image.py +++ b/app/service/generate_image/service_agent_tool_generate_image.py @@ -11,7 +11,6 @@ import logging import uuid import cv2 -import mmcv import numpy as np import pandas as pd import torch @@ -21,6 +20,7 @@ from minio import Minio from tritonclient.utils import np_to_triton_dtype from app.core.config import settings, FAST_GI_MODEL_URL, GI_MODEL_URL, DESIGN_MODEL_URL, FAST_GI_MODEL_NAME, GI_MODEL_NAME +from app.service.utils.image_normalize import my_imnormalize from app.service.utils.new_oss_client import oss_upload_image logger = logging.getLogger() @@ -86,10 +86,9 @@ class AgentToolGenerateImage: @staticmethod def preprocess(img): - img = mmcv.imread(img) img_scale = (224, 224) img = cv2.resize(img, img_scale) - img = mmcv.imnormalize( + img = my_imnormalize( img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) diff --git a/app/service/generate_image/service_generate_image.py b/app/service/generate_image/service_generate_image.py index d9772b5..dc8dccb 100644 --- a/app/service/generate_image/service_generate_image.py +++ b/app/service/generate_image/service_generate_image.py @@ -189,10 +189,10 @@ if __name__ == '__main__': tasks_id="123-89", prompt="a single item of sketch of dress, 4k, white background", image_url="aida-collection-element/89/Sketchboard/95f20cdc-e059-435c-b8b1-d04cc9e80c3d.png", - mode='img2img', + mode='txt2img', category="sketch", gender="Female", - version="fast" + version="hight" ) server = GenerateImage(rd) print(server.get_result()) diff --git a/app/service/generate_image/utils/image_processing.py b/app/service/generate_image/utils/image_processing.py index 692ffc9..32be2d8 100644 --- a/app/service/generate_image/utils/image_processing.py +++ b/app/service/generate_image/utils/image_processing.py @@ -2,23 +2,23 @@ import logging import time import cv2 -import mmcv import numpy as np import torch import tritonclient.http as httpclient from app.core.config import settings, DESIGN_MODEL_URL, DESIGN_MODEL_NAME from app.service.generate_image.utils.upload_sd_image import upload_stain_png_sd, upload_face_png_sd +from app.service.utils.image_normalize import my_imnormalize logger = logging.getLogger() def seg_preprocess(img_path): - img = mmcv.imread(img_path) + img = img_path ori_shape = img.shape[:2] img_scale = ori_shape img = cv2.resize(img, img_scale) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img, ori_shape @@ -242,10 +242,9 @@ def stain_detection(image, user_id, category, tasks_id, spot_size=100): def generate_category_recognition(image, gender): def preprocess(img): - img = mmcv.imread(img) img_scale = (224, 224) img = cv2.resize(img, img_scale) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img diff --git a/app/service/lineart/service.py b/app/service/lineart/service.py index c459b3c..e34840e 100644 --- a/app/service/lineart/service.py +++ b/app/service/lineart/service.py @@ -1,7 +1,6 @@ import logging import cv2 -import mmcv import numpy as np import torch import torch.nn.functional as F @@ -10,6 +9,7 @@ from minio import Minio from app.core.config import settings from app.core.config import DESIGN_MODEL_URL from app.schemas.image2sketch import Image2SketchModel +from app.service.utils.image_normalize import my_imnormalize from app.service.utils.new_oss_client import oss_get_image, oss_upload_image logger = logging.getLogger() @@ -67,7 +67,7 @@ class LineArtService: @staticmethod def line_art_preprocess(image): - img = mmcv.imread(image) + img = image ori_shape = img.shape[:2] img_scale_w, img_scale_h = ori_shape if ori_shape[0] > 1024: @@ -76,9 +76,9 @@ class LineArtService: img_scale_h = 1024 # 如果图片size任意一边 大于 1024, 则会resize 成1024 if ori_shape != (img_scale_w, img_scale_h): - # mmcv.imresize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 + # my_imnormalize(img, img_scale_h, img_scale_w) # 老代码 引以为戒!哈哈哈~ h和w写反了 img = cv2.resize(img, (img_scale_h, img_scale_w)) - img = mmcv.imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) + img = my_imnormalize(img, mean=np.array([123.675, 116.28, 103.53]), std=np.array([58.395, 57.12, 57.375]), to_rgb=True) preprocessed_img = np.expand_dims(img.transpose(2, 0, 1), axis=0) return preprocessed_img, ori_shape diff --git a/app/service/utils/image_normalize.py b/app/service/utils/image_normalize.py new file mode 100644 index 0000000..f8f2939 --- /dev/null +++ b/app/service/utils/image_normalize.py @@ -0,0 +1,27 @@ +import cv2 +import np + + +def my_imnormalize(img, mean, std, to_rgb=True): + """Inplace normalize an image with mean and std. + + Args: + img (ndarray): Image to be normalized. + mean (ndarray): The mean to be used for normalize. + std (ndarray): The std to be used for normalize. + to_rgb (bool): Whether to convert to rgb. + + Returns: + ndarray: The normalized image. + """ + # cv2 inplace normalization does not accept uint8 + img = img.copy().astype(np.float32) + + assert img.dtype != np.uint8 + mean = np.float64(mean.reshape(1, -1)) + stdinv = 1 / np.float64(std.reshape(1, -1)) + if to_rgb: + cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img) # inplace + cv2.subtract(img, mean, img) # inplace + cv2.multiply(img, stdinv, img) # inplace + return img diff --git a/pyproject.toml b/pyproject.toml index e143cde..61e4f8a 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,8 +23,8 @@ dependencies = [ "load-dotenv>=0.1.0", "loguru>=0.7.3", "minio>=7.2.20", - "mmcv>=2.2.0", "moviepy==1.0.3", + "np>=1.0.2", "numpy<2", "ollama>=0.6.1", "opencv-python>=4.11.0.86", diff --git a/requirements.txt b/requirements.txt index 4eefcb72c27140af1d346516ba8e89395742e9ac..e1bf4bd6937ac1e9b17d9264303e9e2dc55a89e1 100644 GIT binary patch delta 12 UcmZ3-KZSq8ImXQ|7>}_603!nhM*si- delta 34 ncmbQjzm9*yIY!Z3hFpeZhB5|QAT(sqV=w_?qs=E7PqP95oNNeU diff --git a/requirements_2.txt b/requirements_2.txt index abeec7f2898691d7cc4497b61659d9d72c927f7e..2647c3a610068da9bcf5048ebf27ee8fbcaca868 100644 GIT binary patch delta 12 TcmZ3a)1k9Lk9)HR_bn~}9p(g9 delta 32 kcmeCsS){W;k6SpGA(^3!!4?P&8T1%TfY@lWI`=~^0DTPy0ssI2 diff --git a/uv.lock b/uv.lock index 67a7efd..02a7447 100755 --- a/uv.lock +++ b/uv.lock @@ -8,15 +8,6 @@ resolution-markers = [ "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')", ] -[[package]] -name = "addict" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/ef/fd7649da8af11d93979831e8f1f8097e85e82d5bfeabc8c68b39175d8e75/addict-2.4.0.tar.gz", hash = "sha256:b3b2210e0e067a281f5646c8c5db92e99b7231ea8b0eb5f74dbdf9e259d4e494", size = 9186, upload-time = "2020-11-21T16:21:31.416Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/00/b08f23b7d7e1e14ce01419a467b583edbb93c6cdb8654e54a9cc579cd61f/addict-2.4.0-py3-none-any.whl", hash = "sha256:249bb56bbfd3cdc2a004ea0ff4c2b6ddc84d53bc2194761636eb314d5cfa5dfc", size = 3832, upload-time = "2020-11-21T16:21:29.588Z" }, -] - [[package]] name = "agentaction" version = "0.1.7" @@ -1671,43 +1662,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/9a/b697530a882588a84db616580f2ba5d1d515c815e11c30d219145afeec87/minio-7.2.20-py3-none-any.whl", hash = "sha256:eb33dd2fb80e04c3726a76b13241c6be3c4c46f8d81e1d58e757786f6501897e", size = 93751, upload-time = "2025-11-27T00:37:13.993Z" }, ] -[[package]] -name = "mmcv" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "addict" }, - { name = "mmengine" }, - { name = "numpy" }, - { name = "opencv-python" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "pyyaml" }, - { name = "regex", marker = "sys_platform == 'win32'" }, - { name = "yapf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/a2/57a733e7e84985a8a0e3101dfb8170fc9db92435c16afad253069ae3f9df/mmcv-2.2.0.tar.gz", hash = "sha256:ac479247e808d8802f89eadf04d4118de86bdfe81361ec5aed0cc1bf731c67c9", size = 479121, upload-time = "2024-04-24T14:24:28.064Z" } - -[[package]] -name = "mmengine" -version = "0.10.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "addict" }, - { name = "matplotlib" }, - { name = "numpy" }, - { name = "opencv-python" }, - { name = "pyyaml" }, - { name = "regex", marker = "sys_platform == 'win32'" }, - { name = "rich" }, - { name = "termcolor" }, - { name = "yapf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/17/14/959360bbd8374e23fc1b720906999add16a3ac071a501636db12c5861ff5/mmengine-0.10.7.tar.gz", hash = "sha256:d20ffcc31127567e53dceff132612a87f0081de06cbb7ab2bdb7439125a69225", size = 378090, upload-time = "2025-03-04T12:23:09.568Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/8e/f98332248aad102511bea4ae19c0ddacd2f0a994f3ca4c82b7a369e0af8b/mmengine-0.10.7-py3-none-any.whl", hash = "sha256:262ac976a925562f78cd5fd14dd1bc9b680ed0aa81f0d85b723ef782f99c54ee", size = 452720, upload-time = "2025-03-04T12:23:06.339Z" }, -] - [[package]] name = "mmh3" version = "5.2.0" @@ -1801,6 +1755,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, ] +[[package]] +name = "np" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/7d/749666e5a9976dcbc4d16d487bbe571efc6bbf4cdf3f4620c0ccc52b57ef/np-1.0.2.tar.gz", hash = "sha256:781265283f3823663ad8fb48741aae62abcf4c78bc19f908f8aa7c1d3eb132f8", size = 7419, upload-time = "2017-10-05T11:26:00.956Z" } + [[package]] name = "numpy" version = "1.26.4" @@ -2269,15 +2229,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, ] -[[package]] -name = "platformdirs" -version = "4.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, -] - [[package]] name = "posthog" version = "5.4.0" @@ -2746,17 +2697,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] -[[package]] -name = "regex" -version = "2025.11.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/a9/546676f25e573a4cf00fe8e119b78a37b6a8fe2dc95cda877b30889c9c45/regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01", size = 414669, upload-time = "2025-11-03T21:34:22.089Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/9b/7c29be7903c318488983e7d97abcf8ebd3830e4c956c4c540005fcfb0462/regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204", size = 266194, upload-time = "2025-11-03T21:31:51.53Z" }, - { url = "https://files.pythonhosted.org/packages/1a/67/3b92df89f179d7c367be654ab5626ae311cb28f7d5c237b6bb976cd5fbbb/regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9", size = 277069, upload-time = "2025-11-03T21:31:53.151Z" }, - { url = "https://files.pythonhosted.org/packages/d7/55/85ba4c066fe5094d35b249c3ce8df0ba623cfd35afb22d6764f23a52a1c5/regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26", size = 270330, upload-time = "2025-11-03T21:31:54.514Z" }, -] - [[package]] name = "requests" version = "2.32.5" @@ -3224,8 +3164,8 @@ dependencies = [ { name = "load-dotenv" }, { name = "loguru" }, { name = "minio" }, - { name = "mmcv" }, { name = "moviepy" }, + { name = "np" }, { name = "numpy" }, { name = "ollama" }, { name = "opencv-python" }, @@ -3275,8 +3215,8 @@ requires-dist = [ { name = "load-dotenv", specifier = ">=0.1.0" }, { name = "loguru", specifier = ">=0.7.3" }, { name = "minio", specifier = ">=7.2.20" }, - { name = "mmcv", specifier = ">=2.2.0" }, { name = "moviepy", specifier = "==1.0.3" }, + { name = "np", specifier = ">=1.0.2" }, { name = "numpy", specifier = "<2" }, { name = "ollama", specifier = ">=0.6.1" }, { name = "opencv-python", specifier = ">=4.11.0.86" }, @@ -3605,18 +3545,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, ] -[[package]] -name = "yapf" -version = "0.43.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/23/97/b6f296d1e9cc1ec25c7604178b48532fa5901f721bcf1b8d8148b13e5588/yapf-0.43.0.tar.gz", hash = "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e", size = 254907, upload-time = "2024-11-14T00:11:41.584Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/81/6acd6601f61e31cfb8729d3da6d5df966f80f374b78eff83760714487338/yapf-0.43.0-py3-none-any.whl", hash = "sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca", size = 256158, upload-time = "2024-11-14T00:11:39.37Z" }, -] - [[package]] name = "yarl" version = "1.22.0" From dcc88adfc0e04eef712f2de7d134d41b6632b43b Mon Sep 17 00:00:00 2001 From: zcr Date: Fri, 27 Feb 2026 15:26:07 +0800 Subject: [PATCH 20/33] =?UTF-8?q?feat:=20fix:=20=20=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=B8=AD=E6=89=80=E6=9C=89mmcv=E7=9A=84?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/utils/image_normalize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/service/utils/image_normalize.py b/app/service/utils/image_normalize.py index f8f2939..9e6c0cb 100644 --- a/app/service/utils/image_normalize.py +++ b/app/service/utils/image_normalize.py @@ -1,5 +1,5 @@ import cv2 -import np +import numpy as np def my_imnormalize(img, mean, std, to_rgb=True): From 09e25f423eeaf327e006b1b80a6e9992aaa0529d Mon Sep 17 00:00:00 2001 From: zcr Date: Thu, 5 Mar 2026 14:01:29 +0800 Subject: [PATCH 21/33] =?UTF-8?q?feat:=20fix:=20=20others=20=E6=97=8B?= =?UTF-8?q?=E8=BD=AC=E5=8A=9F=E8=83=BD=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/design_fast/utils/organize.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/service/design_fast/utils/organize.py b/app/service/design_fast/utils/organize.py index 6cf06ec..9f82e39 100644 --- a/app/service/design_fast/utils/organize.py +++ b/app/service/design_fast/utils/organize.py @@ -92,6 +92,8 @@ def organize_others(layer): pattern_print_image_url=layer.get('pattern_print_image_url', None), pattern_image=layer.get('pattern_image', None), # back_perspective_url=layer['back_perspective_url'] if 'back_perspective_url' in layer.keys() else "" + transpose=layer.get("transpose", [1, 1]), # 默认为1, 1代表不镜像 + rotate=layer.get('rotate', 0), ) # 后片数据 back_layer = dict(priority=-layer.get("priority", 0) if layer.get("layer_order", False) else PRIORITY_DICT.get(f'{layer["name"].lower()}_back', None), @@ -109,6 +111,8 @@ def organize_others(layer): pattern_overall_image_url=layer.get('pattern_overall_image_url', None), pattern_print_image_url=layer.get('pattern_print_image_url', None), # back_perspective_url=layer['back_perspective_url'] if 'back_perspective_url' in layer.keys() else "" + transpose=layer.get("transpose", [1, 1]), # 默认为1, 1代表不镜像 + rotate=layer.get('rotate', 0), ) return front_layer, back_layer From 7e48420ba7b9f72b709aa388d0d220aef1c7d763 Mon Sep 17 00:00:00 2001 From: zcr Date: Thu, 5 Mar 2026 15:06:19 +0800 Subject: [PATCH 22/33] =?UTF-8?q?feat:=20fix:=20sam=20=E6=A8=A1=E5=9E=8Bip?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_design.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/api_design.py b/app/api/api_design.py index 555819f..b009f0e 100644 --- a/app/api/api_design.py +++ b/app/api/api_design.py @@ -426,7 +426,7 @@ async def seg_anything(request_data: SAMRequestModel): """ try: logger.info(f"seg_anything request item is : @@@@@@:{json.dumps(request_data.dict(), indent=4)}") - data = requests.post(f"http://{settings.A6000_SERVICE_HOST}:10075/predict", json=request_data.dict()) + data = requests.post(f"http://{settings.B_4_X_4090_SERVICE_HOST}:10075/predict", json=request_data.dict()) logger.info(f"seg_anything response @@@@@@:{json.dumps(json.loads(data.content), indent=4)}") return ResponseModel(data=json.loads(data.content)) except Exception as e: From 33b4dd4a7f71b1ac5b55d54b12157a38795b6f53 Mon Sep 17 00:00:00 2001 From: zcr Date: Thu, 5 Mar 2026 15:20:40 +0800 Subject: [PATCH 23/33] =?UTF-8?q?feat:=20fix:=20=E7=BF=BB=E8=AF=91=20?= =?UTF-8?q?=E6=A8=A1=E5=9E=8Bip=E6=9B=B4=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/core/config.py b/app/core/config.py index e07f5c9..9e6813d 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -131,7 +131,7 @@ DESIGN_MODEL_NAME = 'seg_knet' # Seg Product SEG_PRODUCT_MODEL_URL = f'{settings.B_4_X_4090_SERVICE_HOST}:30000' # Generate Image -GI_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10051' +GI_MODEL_URL = f'{settings.A6000_SERVICE_HOST}:10061' GI_MODEL_NAME = 'flux' # Generate Single Logo GSL_MODEL_URL = f'{settings.B_4_X_4090_SERVICE_HOST}:10041' From e25f49a776af2916a832fb66e17168cabc0fe009 Mon Sep 17 00:00:00 2001 From: zcr Date: Fri, 13 Mar 2026 11:22:12 +0800 Subject: [PATCH 24/33] =?UTF-8?q?feat:=20fix:=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E4=B8=AD=E9=97=B4=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/main.py b/app/main.py index e1c6f95..e88321b 100644 --- a/app/main.py +++ b/app/main.py @@ -16,7 +16,7 @@ from fastapi.responses import JSONResponse from app.api.api_route import router from app.core.config import settings -from app.core.record_api_count import count_api_calls +# from app.core.record_api_count import count_api_calls from app.schemas.response_template import ResponseModel from logging_env import LOGGER_CONFIG_DICT from dotenv import load_dotenv @@ -48,7 +48,7 @@ def get_application() -> FastAPI: allow_methods=["*"], allow_headers=["*"], ) - application.middleware("http")(count_api_calls) + # application.middleware("http")(count_api_calls) application.include_router(router=router) return application From d93c50ce2b604c3035b02f5920ed6dc3fba76fd2 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 23 Mar 2026 10:46:16 +0800 Subject: [PATCH 25/33] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eflux2klein?= =?UTF-8?q?=E4=BD=9C=E4=B8=BAmoodboard=E7=9A=84localbase=20=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_generate_image.py | 55 +++++++++++++++++++++++++++++++++-- app/core/config.py | 3 ++ app/schemas/generate_image.py | 18 ++++++++++-- 3 files changed, 71 insertions(+), 5 deletions(-) diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index 077fea9..c3332b6 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -1,11 +1,12 @@ import json import logging +import httpx import requests from fastapi import APIRouter, BackgroundTasks, HTTPException from app.core.config import settings -from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel, Flux2ToProductImgModel, GenerateSloganImageModel +from app.schemas.generate_image import GenerateImageModel, GenerateProductImageModel, GenerateSingleLogoImageModel, GenerateRelightImageModel, GenerateMultiViewModel, BatchGenerateProductImageModel, BatchGenerateRelightImageModel, AgentTollGenerateImageModel, Flux2ToProductImgModel, GenerateSloganImageModel, GenerateImageFlux2KleinModel from app.schemas.pose_transform import BatchPoseTransformModel from app.schemas.response_template import ResponseModel from app.service.generate_batch_image.service import start_product_batch_generate, start_relight_batch_generate, start_pose_transform_batch_generate @@ -22,6 +23,57 @@ logger = logging.getLogger() '''generate image''' +# flux2 klein +@router.post("/generate_image_flux2_klein") +async def generate_image_flux2_klein(request_item: GenerateImageFlux2KleinModel): + """ + 创建一个具有以下参数的请求体: + - **bucket_name**: OSS桶名 (必填) + - **object_name**: OSS对象名(文件路径)(必填) + + - **width**: 图片宽度,默认1024像素 (非必填,1024) + - **height**: 图片高度,默认1024像素 (非必填,默认1024) + - **prompt**: 文本提示词,用于模型推理等场景 (非必填,默认"") + - **steps**: 推理步数,控制模型生成过程的迭代次数 (非必填,默认4) + - **guidance**: 引导系数,调节提示词对生成结果的影响程度 (非必填,默认 4.0 ) + + ### 示例参数: + ``` + { + "bucket_name": "aida-users", + "object_name": "89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png", + "prompt": "a single item of sketch of dress, 4k, white background" + } + ``` + ### 输出示例: + ``` + { + "code": 200, + "msg": "OK!", + "data": { + "output_path": "aida-users/89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png" + } + } + ``` + """ + try: + logger.info(f"generate_image_flux2_gen_img request: {json.dumps(request_item.model_dump(), indent=4)}") + async with httpx.AsyncClient(timeout=120) as client: + resp = await client.post( + f"http://{settings.FLUX2_GEN_IMG_MODEL_URL}/predict", + json=request_item.model_dump(), + ) + result = resp.json() + + logger.info(f"generate_image_flux2_gen_img response: {json.dumps(result, indent=4)}") + return ResponseModel(data=result) + + except Exception as e: + logger.warning(f"generate_image_flux2_gen_img Run Exception @@@@@@:{e}") + raise HTTPException(status_code=404, detail=str(e)) + + +# sdxl @router.post("/generate_image") def generate_image(request_item: GenerateImageModel, background_tasks: BackgroundTasks): """ @@ -183,7 +235,6 @@ async def generate_slogan(request_data: GenerateSloganImageModel): """product image flux2.0""" - # @router.post("/img_to_product") # async def img_to_product(request_data: Flux2ToProductImgModel): # """ diff --git a/app/core/config.py b/app/core/config.py index 9e6813d..f3c1f69 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -64,6 +64,9 @@ class Settings(BaseSettings): # --- Design Callback Java 接口 --- JAVA_STREAM_API_URL: str = Field(default='', description="") + # --- flux2 klein model url --- + FLUX2_GEN_IMG_MODEL_URL: str = Field(default='', description="") + # --- 服务器IP --- A6000_SERVICE_HOST: str = Field(default='', description="") B_4_X_4090_SERVICE_HOST: str = Field(default='', description="") diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index d4c19a7..6fe2e70 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -1,6 +1,6 @@ -from typing import List +from typing import List, Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field class GenerateMultiViewModel(BaseModel): @@ -8,8 +8,20 @@ class GenerateMultiViewModel(BaseModel): image_url: str +class GenerateImageFlux2KleinModel(BaseModel): + bucket_name: str = Field(..., description="OSS桶名,不传则为None") + object_name: str = Field(..., description="OSS对象名(文件路径),不传则为None") + # input_image_paths: Optional[List[str]] = Field(default=[], description="输入图片路径列表") + width: Optional[int] = Field(default=1024, description="图片宽度,默认512像素") + height: Optional[int] = Field(default=1024, description="图片高度,默认512像素") + prompt: Optional[str] = Field(default="", description="文本提示词,用于模型推理等场景") + steps: Optional[int] = Field(default=4, description="推理步数,控制模型生成过程的迭代次数") + guidance: Optional[float] = Field(default=4.0, description="引导系数,调节提示词对生成结果的影响程度") + + class GenerateImageModel(BaseModel): - tasks_id: str + bucket_name: str + object_name: str prompt: str image_url: str mode: str From 6d9e96305b99825854447f5388bec99cef4fec4b Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 23 Mar 2026 11:21:50 +0800 Subject: [PATCH 26/33] =?UTF-8?q?feat:=20brand=20dna=20logo=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=9B=BF=E6=8D=A2flux2klein=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../brand_dna/service_generate_brand_info.py | 66 +++++-------------- 1 file changed, 17 insertions(+), 49 deletions(-) diff --git a/app/service/brand_dna/service_generate_brand_info.py b/app/service/brand_dna/service_generate_brand_info.py index fa8d2e5..345b855 100644 --- a/app/service/brand_dna/service_generate_brand_info.py +++ b/app/service/brand_dna/service_generate_brand_info.py @@ -1,19 +1,10 @@ -import logging - -import cv2 -import numpy as np -import tritonclient.grpc as grpcclient +import uuid +import httpx from langchain_classic.output_parsers import ResponseSchema, StructuredOutputParser from langchain_community.chat_models import ChatTongyi from langchain_core.prompts import PromptTemplate from minio import Minio -from tritonclient.utils import np_to_triton_dtype - -from app.core.config import GI_MODEL_URL, GI_MODEL_NAME from app.schemas.brand_dna import GenerateBrandModel -from app.service.utils.generate_uuid import generate_uuid -from app.service.utils.new_oss_client import oss_upload_image - from app.core.config import settings @@ -26,14 +17,9 @@ class GenerateBrandInfo: # user info init self.user_id = request_data.user_id self.category = "brand_logo" - # generate logo init - self.grpc_client = grpcclient.InferenceServerClient(url=GI_MODEL_URL) - self.image = np.random.randint(0, 256, (1024, 1024, 3), dtype=np.uint8) - self.batch_size = 1 - self.mode = 'txt2img' # llm generate brand info init - self.model = ChatTongyi(model="qwen2.5-14b-instruct", api_key="sk-7658298c6b99443c98184a5e634fe6ab") + self.model = ChatTongyi(model="qwen2.5-14b-instruct", api_key=settings.QWEN_API_KEY) self.response_schemas = [ ResponseSchema(name="brand_name", description="Brand name."), @@ -63,38 +49,20 @@ class GenerateBrandInfo: self.generate_logo_prompt = brand_data['brand_logo_prompt'] def generate_brand_logo(self): - prompts = [self.generate_logo_prompt] * self.batch_size - modes = [self.mode] * self.batch_size - images = [self.image.astype(np.float16)] * self.batch_size - - text_obj = np.array(prompts, dtype="object").reshape((-1, 1)) - mode_obj = np.array(modes, dtype="object").reshape((-1, 1)) - image_obj = np.array(images, dtype=np.float16).reshape((-1, 1024, 1024, 3)) - - input_text = grpcclient.InferInput("prompt", text_obj.shape, np_to_triton_dtype(text_obj.dtype)) - input_image = grpcclient.InferInput("input_image", image_obj.shape, np_to_triton_dtype(image_obj.dtype)) - input_mode = grpcclient.InferInput("mode", mode_obj.shape, np_to_triton_dtype(mode_obj.dtype)) - - input_text.set_data_from_numpy(text_obj) - input_image.set_data_from_numpy(image_obj) - input_mode.set_data_from_numpy(mode_obj) - - inputs = [input_text, input_image, input_mode] - result = self.grpc_client.infer(model_name=GI_MODEL_NAME, inputs=inputs) - image = result.as_numpy("generated_image") - image_result = cv2.cvtColor(np.squeeze(image.astype(np.uint8)), cv2.COLOR_RGB2BGR) - logo_url = self.upload_logo_image(image_result, generate_uuid()) - self.result_data['brand_logo'] = logo_url - - def upload_logo_image(self, image, object_name): - try: - _, img_byte_array = cv2.imencode('.jpg', image) - object_name = f'{self.user_id}/{self.category}/{object_name}.jpg' - oss_upload_image(oss_client=self.minio_client, bucket="aida-users", object_name=object_name, image_bytes=img_byte_array) - image_url = f"aida-users/{object_name}" - return image_url - except Exception as e: - logging.warning(f"upload_png_mask runtime exception : {e}") + request_item = { + "bucket_name": "aida-users", + "object_name": f'{self.user_id}/{self.category}/{uuid.uuid4().hex}.png', + "prompt": self.generate_logo_prompt, + "height": 1024, + "width": 1024 + } + with httpx.Client(timeout=120) as client: + resp = client.post( + f"http://{settings.FLUX2_GEN_IMG_MODEL_URL}/predict", + json=request_item, + ) + result = resp.json() + self.result_data['brand_logo'] = result.get("output_path", "") if __name__ == '__main__': From 7f2f79d029aeea863460c6456618602933f3b562 Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 24 Mar 2026 14:35:39 +0800 Subject: [PATCH 27/33] =?UTF-8?q?feat:=20flux2=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=A0=81=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_generate_image.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index c3332b6..5f7ff4b 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -63,10 +63,14 @@ async def generate_image_flux2_klein(request_item: GenerateImageFlux2KleinModel) f"http://{settings.FLUX2_GEN_IMG_MODEL_URL}/predict", json=request_item.model_dump(), ) - result = resp.json() - - logger.info(f"generate_image_flux2_gen_img response: {json.dumps(result, indent=4)}") - return ResponseModel(data=result) + if resp.status_code == 200: + result = resp.json() + logger.info(f"flux2_gen_img response: {json.dumps(result, indent=4)}") + return ResponseModel(data=result) + else: + error = resp.json() + logger.info(f"flux2_gen_img response: {json.dumps(error, indent=4)}") + return ResponseModel(data=error, msg="ERROR!", code=500) except Exception as e: logger.warning(f"generate_image_flux2_gen_img Run Exception @@@@@@:{e}") From a4d55fdb147f555809078a81b15e09e95777dfbf Mon Sep 17 00:00:00 2001 From: zcr Date: Wed, 25 Mar 2026 10:29:03 +0800 Subject: [PATCH 28/33] =?UTF-8?q?feat:=20flux2=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=A0=81=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/schemas/generate_image.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/schemas/generate_image.py b/app/schemas/generate_image.py index 6fe2e70..d9ea106 100644 --- a/app/schemas/generate_image.py +++ b/app/schemas/generate_image.py @@ -20,8 +20,7 @@ class GenerateImageFlux2KleinModel(BaseModel): class GenerateImageModel(BaseModel): - bucket_name: str - object_name: str + tasks_id: str prompt: str image_url: str mode: str From 160bf1a6b14e09a6072913d0a1f895bc77c8b03f Mon Sep 17 00:00:00 2001 From: zcr Date: Fri, 27 Mar 2026 14:56:32 +0800 Subject: [PATCH 29/33] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=88=86?= =?UTF-8?q?=E5=89=B2=E6=A8=A1=E5=9E=8B=E5=8F=82=E6=95=B0=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_design.py | 10 ++++++---- app/schemas/design.py | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/api/api_design.py b/app/api/api_design.py index b009f0e..1bab741 100644 --- a/app/api/api_design.py +++ b/app/api/api_design.py @@ -395,7 +395,8 @@ async def seg_anything(request_data: SAMRequestModel): 通过传入图片路径和点击的点坐标,返回分割后的掩码数据。 ### 参数说明: - - **user_id**:用户id 用于存储分割图 + - **bucket**: minio bucket name + - **object_name**: minio object name - **image_path**: 图片在服务器或云端的相对路径。 - **type**: 推理类型 - **box**: 框选矩形点位信息 @@ -408,8 +409,8 @@ async def seg_anything(request_data: SAMRequestModel): ```json point { - "user_id": 1, - "image_path": "aida-users/89/sketch/4e8fe37d-7068-400a-ac94-c01647fa5f6f.png", + "bucket": "test", + "object_name": "7068-400a-ac94-c01647fa5f6f.png", "type":"point", "points": [[310, 403], [493, 375], [261, 266], [404, 484]], "labels": [1, 1, 0, 1] @@ -417,7 +418,8 @@ async def seg_anything(request_data: SAMRequestModel): box { - "user_id": 1, + "bucket": "test", + "object_name": "7068-400a-ac94-c01647fa5f6f.png", "image_path": "aida-users/89/sketch/4e8fe37d-7068-400a-ac94-c01647fa5f6f.png", "type":"box", "box": [350, 286, 544, 520] diff --git a/app/schemas/design.py b/app/schemas/design.py index 9a3d80d..973f7f0 100644 --- a/app/schemas/design.py +++ b/app/schemas/design.py @@ -4,7 +4,8 @@ from pydantic import BaseModel, Field class SAMRequestModel(BaseModel): - user_id: int = Field(..., description="用户id, 必填字段") + bucket: str = Field(..., description="minio bucket name ") + object_name: str = Field(..., description="minio object name ") image_path: str = Field(..., description="图片路径,必填字段") type: str = Field(..., description="推理类型,必填字段") points: Optional[List[List[float]]] | None = None From 3414f2c1aa8d0e4eba14799cc321546eb54ecae8 Mon Sep 17 00:00:00 2001 From: zcr Date: Fri, 27 Mar 2026 14:59:27 +0800 Subject: [PATCH 30/33] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=88=86?= =?UTF-8?q?=E5=89=B2=E6=A8=A1=E5=9E=8B=E5=8F=82=E6=95=B0=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_design.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/api/api_design.py b/app/api/api_design.py index 1bab741..30ba803 100644 --- a/app/api/api_design.py +++ b/app/api/api_design.py @@ -411,6 +411,7 @@ async def seg_anything(request_data: SAMRequestModel): { "bucket": "test", "object_name": "7068-400a-ac94-c01647fa5f6f.png", + "image_path": "aida-users/89/sketch/4e8fe37d-7068-400a-ac94-c01647fa5f6f.png", "type":"point", "points": [[310, 403], [493, 375], [261, 266], [404, 484]], "labels": [1, 1, 0, 1] From 59e8a88a010e3a4e856f88013f3c4da7268865a5 Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 30 Mar 2026 17:14:18 +0800 Subject: [PATCH 31/33] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0flux2=20klein?= =?UTF-8?q?=20=E7=9A=84=E8=BE=93=E5=87=BA=E7=A4=BA=E4=BE=8B=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_generate_image.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index 5f7ff4b..964c45a 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -48,11 +48,13 @@ async def generate_image_flux2_klein(request_item: GenerateImageFlux2KleinModel) ### 输出示例: ``` { - "code": 200, - "msg": "OK!", - "data": { - "output_path": "aida-users/89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png" - } + "code": 200, + "msg": "OK!", + "data": { + "output_path": [ + "aida-users/89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png-0.png" + ] + } } ``` """ From 3ca4003e304b7cf1506cb111855c454268ec3d3e Mon Sep 17 00:00:00 2001 From: zcr Date: Mon, 30 Mar 2026 17:22:14 +0800 Subject: [PATCH 32/33] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0flux2=20klein?= =?UTF-8?q?=20=E7=9A=84=E8=BE=93=E5=87=BA=E7=A4=BA=E4=BE=8B=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/api_generate_image.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/api/api_generate_image.py b/app/api/api_generate_image.py index 964c45a..5f7ff4b 100644 --- a/app/api/api_generate_image.py +++ b/app/api/api_generate_image.py @@ -48,13 +48,11 @@ async def generate_image_flux2_klein(request_item: GenerateImageFlux2KleinModel) ### 输出示例: ``` { - "code": 200, - "msg": "OK!", - "data": { - "output_path": [ - "aida-users/89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png-0.png" - ] - } + "code": 200, + "msg": "OK!", + "data": { + "output_path": "aida-users/89/moodboard/5fdc698c-cb9b-4b36-afa9ce4-1-89.png" + } } ``` """ From 7543d6b3468115dd96c9463e77c8e04a0ad8597b Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 14 Apr 2026 10:16:30 +0800 Subject: [PATCH 33/33] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0flux2=20klein?= =?UTF-8?q?=20=E7=9A=84=E8=BE=93=E5=87=BA=E7=A4=BA=E4=BE=8B=20;=20fix:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 954fea1..103546e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,4 +11,10 @@ services: - /etc/localtime:/etc/localtime:ro - ./seg_cache:/seg_cache ports: - - "${SERVE_PORT}:80" \ No newline at end of file + - "${SERVE_PORT}:80" + networks: + - aida_app_net +networks: + aida_app_net: + external: true + name: aida_app_net \ No newline at end of file