Merge branch 'develop'
# Conflicts: # app/service/design_fast/pipeline/split.py
This commit is contained in:
@@ -4,7 +4,8 @@ import logging
|
||||
from fastapi import APIRouter
|
||||
from fastapi import HTTPException
|
||||
|
||||
from app.core.config import SR_RABBITMQ_QUEUES, GI_RABBITMQ_QUEUES, GPI_RABBITMQ_QUEUES, GRI_RABBITMQ_QUEUES, OSS, JAVA_STREAM_API_URL, GMV_RABBITMQ_QUEUES, SLOGAN_RABBITMQ_QUEUES, GEN_SINGLE_LOGO_RABBITMQ_QUEUES, PS_RABBITMQ_QUEUES, BATCH_GPI_RABBITMQ_QUEUES, BATCH_GRI_RABBITMQ_QUEUES, BATCH_PS_RABBITMQ_QUEUES
|
||||
from app.core.config import SR_RABBITMQ_QUEUES, GI_RABBITMQ_QUEUES, GPI_RABBITMQ_QUEUES, GRI_RABBITMQ_QUEUES, OSS, JAVA_STREAM_API_URL, GMV_RABBITMQ_QUEUES, SLOGAN_RABBITMQ_QUEUES, GEN_SINGLE_LOGO_RABBITMQ_QUEUES, PS_RABBITMQ_QUEUES, BATCH_GPI_RABBITMQ_QUEUES, BATCH_GRI_RABBITMQ_QUEUES, \
|
||||
BATCH_PS_RABBITMQ_QUEUES, RABBITMQ_ENV
|
||||
from app.schemas.response_template import ResponseModel
|
||||
|
||||
logger = logging.getLogger()
|
||||
@@ -14,6 +15,7 @@ router = APIRouter()
|
||||
@router.get("{id}")
|
||||
def test(id: int):
|
||||
data = {
|
||||
"RABBITMQ_ENV":RABBITMQ_ENV,
|
||||
"超分 SR_RABBITMQ_QUEUES": SR_RABBITMQ_QUEUES,
|
||||
"多视角 GMV_RABBITMQ_QUEUES": GMV_RABBITMQ_QUEUES,
|
||||
"pose transform PS_RABBITMQ_QUEUES": PS_RABBITMQ_QUEUES,
|
||||
|
||||
@@ -9,11 +9,11 @@ load_dotenv(os.path.join(BASE_DIR, '.env'))
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
PROJECT_NAME: str = os.getenv('PROJECT_NAME', 'FASTAPI BASE')
|
||||
SECRET_KEY: str = os.getenv('SECRET_KEY', '')
|
||||
PROJECT_NAME: str = 'FASTAPI BASE'
|
||||
SECRET_KEY: str = ''
|
||||
API_PREFIX: str = ''
|
||||
BACKEND_CORS_ORIGINS: list[str] = ['*']
|
||||
DATABASE_URL: str = os.getenv('SQL_DATABASE_URL', '')
|
||||
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')
|
||||
@@ -36,12 +36,14 @@ else:
|
||||
RECOMMEND_PATH_PREFIX = "app/service/recommend/"
|
||||
CHROMADB_PATH = "/chromadb/"
|
||||
|
||||
|
||||
RABBITMQ_ENV = "-prod" # 生产环境#
|
||||
# RABBITMQ_ENV = "-dev" # 开发环境
|
||||
# RABBITMQ_ENV = "" # 生产环境
|
||||
RABBITMQ_ENV = os.getenv("RABBITMQ_ENV", "-dev")
|
||||
# RABBITMQ_ENV = "-local" # 本地测试环境
|
||||
|
||||
JAVA_STREAM_API_URL = os.getenv("JAVA_STREAM_API_URL", "https://api.aida.com.hk/api/third/party/receiveDesignResults")
|
||||
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()
|
||||
|
||||
@@ -106,7 +108,7 @@ OPENAI_MODEL_LIST = {"gpt-3.5-turbo-0613",
|
||||
SR_MODEL_NAME = "super_resolution"
|
||||
SR_TRITON_URL = "10.1.1.240:10031"
|
||||
SR_MINIO_BUCKET = "aida-users"
|
||||
SR_RABBITMQ_QUEUES = os.getenv("SR_RABBITMQ_QUEUES", f"SuperResolution{RABBITMQ_ENV}")
|
||||
SR_RABBITMQ_QUEUES = f"SuperResolution{RABBITMQ_ENV}"
|
||||
|
||||
# GenerateImage service config
|
||||
FAST_GI_MODEL_URL = '10.1.1.243:10011'
|
||||
|
||||
@@ -201,9 +201,10 @@ def design_generate_v2(request_data):
|
||||
# 发送结果给java端
|
||||
url = JAVA_STREAM_API_URL
|
||||
# xu_pei_test_url = "https://cd21b9110505.ngrok-free.app/api/third/party/receiveDesignResults"
|
||||
|
||||
tianxaing_test_url = "https://c2ae520723c9.ngrok-free.app/api/third/party/receiveDesignResults"
|
||||
logger.info(f"java 回调 -> {url}")
|
||||
# logger.info(f"xupei java 回调 -> {xu_pei_test_url}")
|
||||
logger.info(f"tianxiang java 回调 -> {tianxaing_test_url}")
|
||||
|
||||
headers = {
|
||||
'Accept': "*/*",
|
||||
@@ -218,10 +219,13 @@ def design_generate_v2(request_data):
|
||||
# 打印结果
|
||||
logger.info(response.text)
|
||||
|
||||
# response = post_request(xu_pei_test_url, json_data=items_response, headers=headers)
|
||||
# if response:
|
||||
# test_response = post_request(xu_pei_test_url, json_data=items_response, headers=headers)
|
||||
test_response = post_request(tianxaing_test_url, json_data=items_response, headers=headers)
|
||||
|
||||
if test_response:
|
||||
# 打印结果
|
||||
# logger.info(f"xupei test response : {response.text}")
|
||||
# logger.info(f"xupei test response : {test_response.text}")
|
||||
logger.info(f"tianxiang test response : {test_response.text}")
|
||||
|
||||
for step, object in enumerate(objects_data):
|
||||
t = threading.Thread(target=process_object, args=(step, object))
|
||||
|
||||
@@ -15,8 +15,8 @@ class AccessoriesItem(BaseItem):
|
||||
self.Accessories_pipeline = [
|
||||
LoadImage(minio_client),
|
||||
# KeyPoint(),
|
||||
ContourDetection(),
|
||||
# Segmentation(minio_client),
|
||||
# ContourDetection(),
|
||||
Segmentation(minio_client),
|
||||
# BackPerspective(minio_client),
|
||||
Color(minio_client),
|
||||
PrintPainting(minio_client),
|
||||
|
||||
@@ -22,7 +22,7 @@ class Color:
|
||||
resize_pattern = cv2.resize(pattern, (dim_image_w, dim_image_h), interpolation=cv2.INTER_AREA)
|
||||
# 无色
|
||||
elif "color" not in result.keys() or result['color'] == "":
|
||||
result['final_image'] = result['pattern_image'] = result['single_image'] = result['image']
|
||||
result['no_seg_sketch'] = result['final_image'] = result['pattern_image'] = result['single_image'] = result['image']
|
||||
result['alpha'] = 100 / 255.0
|
||||
return result
|
||||
# 正常颜色
|
||||
@@ -59,6 +59,8 @@ class Color:
|
||||
tmp2 = (result['final_image'] * (temp_fg / 255)).astype(np.uint8)
|
||||
result['single_image'] = cv2.add(tmp1, tmp2)
|
||||
result['alpha'] = 100 / 255.0
|
||||
|
||||
result['no_seg_sketch'] = result['final_image'].copy()
|
||||
return result
|
||||
|
||||
def get_gradient(self, bucket_name, object_name):
|
||||
|
||||
@@ -24,6 +24,7 @@ class PrintPainting:
|
||||
if result['resize_scale'][0] == 1.0 and result['resize_scale'][1] == 1.0:
|
||||
pass
|
||||
else:
|
||||
# 2025-9-19 印花调整 印花坐标按照sketch的缩放比调整
|
||||
height, width = result['pattern_image'].shape[:2]
|
||||
new_width = int(width * result['resize_scale'][0])
|
||||
new_height = int(height * result['resize_scale'][1])
|
||||
@@ -34,6 +35,7 @@ class PrintPainting:
|
||||
result['gray'] = cv2.resize(result['gray'], (new_width, new_height))
|
||||
|
||||
if overall_print['print_path_list']:
|
||||
overall_print['location'][0] = [x * y for x, y in zip(overall_print['location'][0], result['resize_scale'])]
|
||||
painting_dict = {'dim_image_h': result['pattern_image'].shape[0], 'dim_image_w': result['pattern_image'].shape[1]}
|
||||
result['print_image'] = result['pattern_image']
|
||||
if "print_angle_list" in overall_print.keys() and overall_print['print_angle_list'][0] != 0:
|
||||
@@ -50,6 +52,9 @@ class PrintPainting:
|
||||
result['single_image'] = result['final_image'] = result['pattern_image'] = result['print_image']
|
||||
|
||||
if single_print['print_path_list']:
|
||||
# 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)
|
||||
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'])):
|
||||
@@ -67,8 +72,8 @@ class PrintPainting:
|
||||
rotated_resized_source_mask = resized_source_mask.rotate(-single_print['print_angle_list'][i])
|
||||
source_image_pil = Image.fromarray(cv2.cvtColor(print_background, cv2.COLOR_BGR2RGB))
|
||||
source_image_pil_mask = Image.fromarray(cv2.cvtColor(mask_background, cv2.COLOR_BGR2RGB))
|
||||
source_image_pil.paste(rotated_resized_source, (int(single_print['location'][i][0]), int(single_print['location'][i][1])), rotated_resized_source)
|
||||
source_image_pil_mask.paste(rotated_resized_source_mask, (int(single_print['location'][i][0]), int(single_print['location'][i][1])), rotated_resized_source_mask)
|
||||
source_image_pil.paste(rotated_resized_source, (int(single_print['location'][i][0] * sketch_resize_scale[0]), int(single_print['location'][i][1] * sketch_resize_scale[1])), rotated_resized_source)
|
||||
source_image_pil_mask.paste(rotated_resized_source_mask, (int(single_print['location'][i][0] * sketch_resize_scale[0]), int(single_print['location'][i][1] * sketch_resize_scale[1])), rotated_resized_source_mask)
|
||||
print_background = cv2.cvtColor(np.array(source_image_pil), cv2.COLOR_RGBA2BGR)
|
||||
mask_background = cv2.cvtColor(np.array(source_image_pil_mask), cv2.COLOR_RGBA2BGR)
|
||||
ret, mask_background = cv2.threshold(mask_background, 124, 255, cv2.THRESH_BINARY)
|
||||
@@ -146,7 +151,9 @@ class PrintPainting:
|
||||
img_bg = cv2.bitwise_and(result['pattern_image'], result['pattern_image'], mask=cv2.bitwise_not(print_mask))
|
||||
mask_mo = np.expand_dims(print_mask, axis=2).repeat(3, axis=2)
|
||||
gray_mo = np.expand_dims(result['gray'], axis=2).repeat(3, axis=2)
|
||||
img_fg = (img_fg * (mask_mo / 255) * (gray_mo / 255)).astype(np.uint8)
|
||||
img_fg = (img_fg * (mask_mo / 255) * (gray_mo / 255)).astype(np.uint8) # 当sketch 图像为灰色时(非纯白) , 印花*灰度图像会导致印花在sketch上颜色变暗
|
||||
# img_fg = (img_fg * (mask_mo / 255) ).astype(np.uint8) # 不过灰度图像
|
||||
|
||||
result['final_image'] = cv2.add(img_bg, img_fg)
|
||||
canvas = np.full_like(result['final_image'], 255)
|
||||
temp_bg = np.expand_dims(cv2.bitwise_not(result['mask']), axis=2).repeat(3, axis=2)
|
||||
@@ -156,6 +163,9 @@ class PrintPainting:
|
||||
result['single_image'] = cv2.add(tmp1, tmp2)
|
||||
|
||||
if element_print['element_path_list']:
|
||||
# 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)
|
||||
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'])):
|
||||
@@ -173,8 +183,8 @@ class PrintPainting:
|
||||
source_image_pil = Image.fromarray(cv2.cvtColor(print_background, cv2.COLOR_BGR2RGB))
|
||||
source_image_pil_mask = Image.fromarray(cv2.cvtColor(mask_background, cv2.COLOR_BGR2RGB))
|
||||
|
||||
source_image_pil.paste(rotated_resized_source, (int(element_print['location'][i][0]), int(element_print['location'][i][1])), rotated_resized_source)
|
||||
source_image_pil_mask.paste(rotated_resized_source_mask, (int(element_print['location'][i][0]), int(element_print['location'][i][1])), rotated_resized_source_mask)
|
||||
source_image_pil.paste(rotated_resized_source, (int(element_print['location'][i][0] * sketch_resize_scale[0]), int(element_print['location'][i][1] * sketch_resize_scale[1])), rotated_resized_source)
|
||||
source_image_pil_mask.paste(rotated_resized_source_mask, (int(element_print['location'][i][0] * sketch_resize_scale[1]), int(element_print['location'][i][1] * sketch_resize_scale[1])), rotated_resized_source_mask)
|
||||
|
||||
print_background = cv2.cvtColor(np.array(source_image_pil), cv2.COLOR_RGBA2BGR)
|
||||
mask_background = cv2.cvtColor(np.array(source_image_pil_mask), cv2.COLOR_RGBA2BGR)
|
||||
|
||||
@@ -67,7 +67,6 @@ class Split(object):
|
||||
# mask_image = np.zeros((height, width, 3))
|
||||
# mask_image[front_mask != 0] = [0, 0, 255]
|
||||
|
||||
|
||||
# 切换为原始图片尺寸-------------------------------
|
||||
height, width = ori_front_mask.shape
|
||||
mask_image = np.zeros((height, width, 3))
|
||||
@@ -113,7 +112,6 @@ class Split(object):
|
||||
# mask_image[back_mask != 0] = [0, 255, 0]
|
||||
mask_image[ori_back_mask != 0] = [0, 255, 0]
|
||||
|
||||
|
||||
rbga_mask = rgb_to_rgba(mask_image, ori_front_mask + ori_back_mask)
|
||||
mask_pil = Image.fromarray(cvtColor(rbga_mask.astype(np.uint8), COLOR_BGR2RGBA))
|
||||
image_data = io.BytesIO()
|
||||
@@ -124,7 +122,7 @@ class Split(object):
|
||||
result['mask_url'] = req.bucket_name + "/" + req.object_name
|
||||
|
||||
# 创建中间图层
|
||||
result_pattern_image_rgba = rgb_to_rgba(result['pattern_image'], result['mask'])
|
||||
result_pattern_image_rgba = rgb_to_rgba(result['no_seg_sketch'], ori_front_mask + ori_back_mask)
|
||||
result_pattern_image_pil = Image.fromarray(cvtColor(result_pattern_image_rgba, COLOR_BGR2RGBA))
|
||||
result['pattern_image'], result['pattern_image_url'], _ = upload_png_mask(self.minio_client, result_pattern_image_pil, f'{generate_uuid()}')
|
||||
return result
|
||||
|
||||
@@ -58,6 +58,15 @@ def organize_clothing(layer):
|
||||
def organize_accessories(layer):
|
||||
# 起始坐标
|
||||
start_point = (0, 0)
|
||||
layer['clothes_keypoint'] = {
|
||||
'accessories_left': [0, 0]
|
||||
}
|
||||
layer['body_point_test'] = {
|
||||
'accessories_left': [0, 0]
|
||||
}
|
||||
|
||||
start_point = calculate_start_point(layer['keypoint'], layer['scale'], layer['clothes_keypoint'], layer['body_point_test'], layer["offset"], layer["resize_scale"])
|
||||
|
||||
# 前片数据
|
||||
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',
|
||||
|
||||
@@ -207,7 +207,7 @@ def update_base_size_priority(layers, size):
|
||||
if info['name'] == 'mannequin':
|
||||
new_height = info['image'].height
|
||||
max_x = max(x_list)
|
||||
new_width = max_x - min_x
|
||||
new_width = max_x - min_x * 2
|
||||
# 更新坐标
|
||||
for info in layers:
|
||||
info['adaptive_position'] = (info['position'][0], info['position'][1] - min_x)
|
||||
|
||||
@@ -5,7 +5,7 @@ from io import BytesIO
|
||||
import cv2
|
||||
import numpy as np
|
||||
import urllib3
|
||||
from PIL import Image
|
||||
from PIL import Image, ImageDraw
|
||||
from minio import Minio
|
||||
|
||||
from app.core.config import *
|
||||
@@ -82,7 +82,7 @@ if __name__ == '__main__':
|
||||
# url = "aida-users/89/sketchboard/female/Dress/e6724ab7-8d3f-4677-abe0-c3e42ab7af85.jpeg"
|
||||
# url = "aida-users/87/print/956614a2-7e75-4fbe-9ed0-c1831e37a2c9-4-87.png"
|
||||
# url = "aida-users/89/single_logo/123-89.png"
|
||||
url = "aida-users/89/123-89.png"
|
||||
url = "aida-results/result_d2577888-92d7-11f0-9cfd-e0d362103998.png"
|
||||
|
||||
# url = "aida-collection-element/12148/Sketchboard/95ea577b-305b-4a62-b30a-39c0dd3ddb3f.png"
|
||||
read_type = "2"
|
||||
@@ -92,4 +92,20 @@ if __name__ == '__main__':
|
||||
cv2.waitKey(0)
|
||||
else:
|
||||
img = oss_get_image(oss_client=minio_client, bucket=url.split('/')[0], object_name=url[url.find('/') + 1:], data_type=read_type)
|
||||
draw = ImageDraw.Draw(img)
|
||||
# 获取图片尺寸
|
||||
width, height = img.size
|
||||
img
|
||||
# 计算中心点坐标
|
||||
center_x = width // 2
|
||||
center_y = height // 2
|
||||
|
||||
# 绘制垂直中心线(红色)
|
||||
draw.line(
|
||||
[(center_x, 0), (center_x, height)], # 从顶部到底部的垂直线
|
||||
fill=(255, 0, 0), # 红色 (R, G, B)
|
||||
width=2 # 线宽
|
||||
)
|
||||
|
||||
img.show()
|
||||
img.save("result.png")
|
||||
|
||||
Reference in New Issue
Block a user