import io import json import logging import threading import time import uuid import cv2 import numpy as np from PIL import Image from minio import Minio from app.core.config import PRIORITY_DICT from app.service.design.utils.redis_utils import Redis from app.service.design_test.item import BodyItem, TopItem, BottomItem from app.service.utils.decorator import RunTime from app.service.utils.new_oss_client import oss_upload_image id_lock = threading.Lock() logger = logging.getLogger() # minio 配置 MINIO_URL = "www.minio.aida.com.hk:12024" MINIO_ACCESS = 'vXKFLSJkYeEq2DrSZvkB' MINIO_SECRET = 'uKTZT3x7C43WvPN9QTc99DiRkwddWZrG9Uh3JVlR' MINIO_SECURE = True minio_client = Minio(MINIO_URL, access_key=MINIO_ACCESS, secret_key=MINIO_SECRET, secure=MINIO_SECURE) def process_item(item, basic): if item['type'] == "Body": body_server = BodyItem(data=item, basic=basic, minio_client=minio_client) item_data = body_server.process() elif item['type'].lower() in ['blouse', 'outwear', 'dress', 'tops']: top_server = TopItem(data=item, basic=basic, minio_client=minio_client) item_data = top_server.process() else: bottom_server = BottomItem(data=item, basic=basic, minio_client=minio_client) item_data = bottom_server.process() return item_data def process_layer(item, layers): if item['name'] == "mannequin": body_layer = organize_body(item) layers.append(body_layer) return item['body_image'].size else: front_layer, back_layer = organize_clothing(item) layers.append(front_layer) layers.append(back_layer) def organize_body(layer): body_layer = dict(priority=0, name=layer["name"].lower(), image=layer['body_image'], image_url=layer['body_path'], mask_image=None, mask_url=None, sacle=1, # mask=layer['body_mask'], position=(0, 0)) return body_layer def organize_clothing(layer): # 起始坐标 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', image=layer["front_image"], # mask_image=layer['front_mask_image'], image_url=layer['front_image_url'], mask_url=layer['mask_url'], sacle=layer['scale'], clothes_keypoint=layer['clothes_keypoint'], position=start_point, resize_scale=layer["resize_scale"], mask=cv2.resize(layer['mask'], layer["front_image"].size), gradient_string=layer['gradient_string'] if 'gradient_string' in layer.keys() else "", pattern_image_url=layer['pattern_image_url'], pattern_image=layer['pattern_image'] ) # 后片数据 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'], image_url=layer['back_image_url'], mask_url=layer['mask_url'], sacle=layer['scale'], clothes_keypoint=layer['clothes_keypoint'], position=start_point, resize_scale=layer["resize_scale"], mask=cv2.resize(layer['mask'], layer["front_image"].size), gradient_string=layer['gradient_string'] if 'gradient_string' in layer.keys() else "", pattern_image_url=layer['pattern_image_url'], ) return front_layer, back_layer def calculate_start_point(keypoint_type, scale, clothes_point, body_point, offset, resize_scale): """ Align left Args: keypoint_type: string, "waistband" | "shoulder" | "ear_point" scale: float clothes_point: dict{'left': [x1, y1, z1], 'right': [x2, y2, z2]} body_point: dict, containing keypoint data of body figure Returns: start_point: tuple (x', y') x' = y_body - y1 * scale + offset y' = x_body - x1 * scale + offset """ side_indicator = f'{keypoint_type}_left' start_point = ( int(body_point[side_indicator][1] + offset[1] - int(clothes_point[side_indicator][0]) * scale), # y int(body_point[side_indicator][0] + offset[0] - int(clothes_point[side_indicator][1]) * scale) # x ) return start_point def update_base_size_priority(layers, size): # 计算透明背景图片的宽度 min_x = min(info['position'][1] for info in layers) x_list = [] for info in layers: if info['image'] is not None: x_list.append(info['position'][1] + info['image'].width) max_x = max(x_list) new_width = max_x - min_x new_height = 700 # 更新坐标 for info in layers: info['adaptive_position'] = (info['position'][0], info['position'][1] - min_x) return layers, (new_width, new_height) def synthesis_single(front_image, back_image): result_image = None if front_image: result_image = front_image if back_image: result_image.paste(back_image, (0, 0), back_image) image_data = io.BytesIO() result_image.save(image_data, format='PNG') image_data.seek(0) image_bytes = image_data.read() bucket_name = 'aida-results' object_name = f'result_{generate_uuid()}.png' oss_upload_image(oss_client=minio_client, bucket=bucket_name, object_name=object_name, image_bytes=image_bytes) return f"{bucket_name}/{object_name}" def oss_upload_json(json_data, object_name): try: with open(f"app/service/design/design_batch/response_json/{object_name}", 'w') as file: json.dump(json_data, file, indent=4) oss_client = Minio(MINIO_URL, access_key=MINIO_ACCESS, secret_key=MINIO_SECRET, secure=MINIO_SECURE) oss_client.fput_object("test", object_name, f"app/service/design/design_batch/response_json/{object_name}") except Exception as e: logger.warning(str(e)) def generate_uuid(): with id_lock: unique_id = str(uuid.uuid1()) return unique_id def positioning(all_mask_shape, mask_shape, offset): all_start = 0 all_end = 0 mask_start = 0 mask_end = 0 if offset == 0: all_start = 0 all_end = min(all_mask_shape, mask_shape) mask_start = 0 mask_end = min(all_mask_shape, mask_shape) elif offset > 0: all_start = min(offset, all_mask_shape) all_end = min(offset + mask_shape, all_mask_shape) mask_start = 0 mask_end = 0 if offset > all_mask_shape else min(all_mask_shape - offset, mask_shape) elif offset < 0: if abs(offset) > mask_shape: all_start = 0 all_end = 0 else: all_start = 0 if mask_shape - abs(offset) > all_mask_shape: all_end = min(mask_shape - abs(offset), all_mask_shape) else: all_end = mask_shape - abs(offset) if abs(offset) > mask_shape: mask_start = mask_shape mask_end = mask_shape else: mask_start = abs(offset) if mask_shape - abs(offset) >= all_mask_shape: mask_end = all_mask_shape + abs(offset) else: mask_end = mask_shape return all_start, all_end, mask_start, mask_end def synthesis(data, size, basic_info): # 创建底图 base_image = Image.new('RGBA', size, (0, 0, 0, 0)) try: all_mask_shape = (size[1], size[0]) body_mask = None for d in data: if d['name'] == 'body' or d['name'] == 'mannequin': # 创建一个新的宽高透明图像, 把模特贴上去获取mask transparent_image = Image.new("RGBA", size, (0, 0, 0, 0)) transparent_image.paste(d['image'], (d['adaptive_position'][1], d['adaptive_position'][0]), d['image']) # 此处可变数组会被paste篡改值,所以使用下标获取position body_mask = np.array(transparent_image.split()[3]) # 根据新的坐标获取新的肩点 left_shoulder = [x + y for x, y in zip(basic_info['body_point_test']['shoulder_left'], [d['adaptive_position'][1], d['adaptive_position'][0]])] right_shoulder = [x + y for x, y in zip(basic_info['body_point_test']['shoulder_right'], [d['adaptive_position'][1], d['adaptive_position'][0]])] body_mask[:min(left_shoulder[1], right_shoulder[1]), left_shoulder[0]:right_shoulder[0]] = 255 _, binary_body_mask = cv2.threshold(body_mask, 127, 255, cv2.THRESH_BINARY) top_outer_mask = np.array(binary_body_mask) bottom_outer_mask = np.array(binary_body_mask) top = True bottom = True i = len(data) while i: i -= 1 if top and data[i]['name'] in ["blouse_front", "outwear_front", "dress_front", "tops_front"]: top = False mask_shape = data[i]['mask'].shape y_offset, x_offset = data[i]['adaptive_position'] # 初始化叠加区域的起始和结束位置 all_y_start, all_y_end, mask_y_start, mask_y_end = positioning(all_mask_shape=all_mask_shape[0], mask_shape=mask_shape[0], offset=y_offset) all_x_start, all_x_end, mask_x_start, mask_x_end = positioning(all_mask_shape=all_mask_shape[1], mask_shape=mask_shape[1], offset=x_offset) # 将叠加区域赋值为相应的像素值 _, sketch_mask = cv2.threshold(data[i]['mask'], 127, 255, cv2.THRESH_BINARY) background = np.zeros_like(top_outer_mask) background[all_y_start:all_y_end, all_x_start:all_x_end] = sketch_mask[mask_y_start:mask_y_end, mask_x_start:mask_x_end] top_outer_mask = background + top_outer_mask elif bottom and data[i]['name'] in ["trousers_front", "skirt_front", "bottoms_front", "dress_front"]: bottom = False mask_shape = data[i]['mask'].shape y_offset, x_offset = data[i]['adaptive_position'] # 初始化叠加区域的起始和结束位置 all_y_start, all_y_end, mask_y_start, mask_y_end = positioning(all_mask_shape=all_mask_shape[0], mask_shape=mask_shape[0], offset=y_offset) all_x_start, all_x_end, mask_x_start, mask_x_end = positioning(all_mask_shape=all_mask_shape[1], mask_shape=mask_shape[1], offset=x_offset) # 将叠加区域赋值为相应的像素值 _, sketch_mask = cv2.threshold(data[i]['mask'], 127, 255, cv2.THRESH_BINARY) background = np.zeros_like(top_outer_mask) background[all_y_start:all_y_end, all_x_start:all_x_end] = sketch_mask[mask_y_start:mask_y_end, mask_x_start:mask_x_end] bottom_outer_mask = background + bottom_outer_mask elif bottom is False and top is False: break all_mask = cv2.bitwise_or(top_outer_mask, bottom_outer_mask) for layer in data: if layer['image'] is not None: if layer['name'] != "body": test_image = Image.new('RGBA', size, (0, 0, 0, 0)) test_image.paste(layer['image'], (layer['adaptive_position'][1], layer['adaptive_position'][0]), layer['image']) mask_data = np.where(all_mask > 0, 255, 0).astype(np.uint8) mask_alpha = Image.fromarray(mask_data) cropped_image = Image.composite(test_image, Image.new("RGBA", test_image.size, (255, 255, 255, 0)), mask_alpha) base_image.paste(test_image, (0, 0), cropped_image) # test_image 已经按照坐标贴到最大宽值的图片上 坐着这里坐标为00 else: base_image.paste(layer['image'], (layer['adaptive_position'][1], layer['adaptive_position'][0]), layer['image']) result_image = base_image image_data = io.BytesIO() result_image.save(image_data, format='PNG') image_data.seek(0) # oss upload image_bytes = image_data.read() bucket_name = "aida-results" object_name = f'result_{generate_uuid()}.png' oss_upload_image(oss_client=minio_client, bucket=bucket_name, object_name=object_name, image_bytes=image_bytes) return f"{bucket_name}/{object_name}" except Exception as e: logging.warning(f"synthesis runtime exception : {e}") @RunTime def design_generate(request_data): objects_data = request_data.dict()['objects'] process_id = request_data.dict()['process_id'] object_response = {} threads = [] active_threads = 0 lock = threading.Lock() total = len(objects_data) def process_object(step, object): nonlocal active_threads basic = object['basic'] items_response = {'layers': []} if basic['single_overall'] == "overall": item_results = [] for item in object['items']: item_results.append(process_item(item, basic)) layers = [] body_size = None for item in item_results: body_size = process_layer(item, layers) layers = sorted(layers, key=lambda s: s.get("priority", float('inf'))) layers, new_size = update_base_size_priority(layers, body_size) for lay in layers: items_response['layers'].append({ 'image_category': "body" if lay['name'] == 'mannequin' else lay['name'], 'position': lay['position'], 'priority': lay.get("priority", None), 'resize_scale': lay['resize_scale'] if "resize_scale" in lay.keys() else None, 'image_size': lay['image'] if lay['image'] is None else lay['image'].size, 'gradient_string': lay['gradient_string'] if 'gradient_string' in lay.keys() else "", 'mask_url': lay['mask_url'], 'image_url': lay['image_url'] if 'image_url' in lay.keys() else None, 'pattern_image_url': lay['pattern_image_url'] if 'pattern_image_url' in lay.keys() else None, }) items_response['synthesis_url'] = synthesis(layers, new_size, basic) else: item_result = process_item(object['items'][0], basic) items_response['layers'].append({ 'image_category': f"{item_result['name']}_front", 'image_size': item_result['back_image'].size if item_result['back_image'] else None, 'position': None, 'priority': 0, 'image_url': item_result['front_image_url'], 'mask_url': item_result['mask_url'], "gradient_string": item_result['gradient_string'] if 'gradient_string' in item_result.keys() else "", 'pattern_image_url': item_result['pattern_image_url'] if 'pattern_image_url' in item_result.keys() else None, }) items_response['layers'].append({ 'image_category': f"{item_result['name']}_back", 'image_size': item_result['front_image'].size if item_result['front_image'] else None, 'position': None, 'priority': 0, 'image_url': item_result['back_image_url'], 'mask_url': item_result['mask_url'], "gradient_string": item_result['gradient_string'] if 'gradient_string' in item_result.keys() else "", 'pattern_image_url': item_result['pattern_image_url'] if 'pattern_image_url' in item_result.keys() else None, }) items_response['synthesis_url'] = synthesis_single(item_result['front_image'], item_result['back_image']) update_progress(process_id, total) with lock: object_response[step] = items_response active_threads -= 1 for step, object in enumerate(objects_data): t = threading.Thread(target=process_object, args=(step, object)) threads.append(t) t.start() with lock: active_threads += 1 for t in threads: t.join() final_progress(process_id) return object_response def update_progress(process_id, total): logger.info(f"{process_id} , {total}") r = Redis() progress = r.read(key=process_id) if progress and total != 1: if int(progress) <= 100: r.write(key=process_id, value=int(progress) + int(100 / total)) else: r.write(key=process_id, value=99) return progress elif total == 1: r.write(key=process_id, value=100) return progress else: r.write(key=process_id, value=int(100 / total)) return progress def final_progress(process_id): r = Redis() progress = r.read(key=process_id) r.write(key=process_id, value=100) return progress if __name__ == '__main__': object_data = { "objects": [ { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 98419, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/dress/0825000526.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Dress" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] }, { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 98420, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/skirt/903000127.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Skirt" }, { "color": "28 26 26", "icon": "none", "image_id": 69140, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/blouse/0902001100.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Blouse" }, { "color": "28 26 26", "icon": "none", "image_id": 81604, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/outwear/outwear_p5_729.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Outwear" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] }, { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 63964, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/outwear/0825001572.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Outwear" }, { "color": "28 26 26", "icon": "none", "image_id": 98421, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/blouse/blouse_506.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Blouse" }, { "color": "28 26 26", "icon": "none", "image_id": 98422, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/trousers/0628001244.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Trousers" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] }, { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 79927, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/outwear/0825000378.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Outwear" }, { "color": "28 26 26", "icon": "none", "image_id": 67473, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/blouse/0825001350.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Blouse" }, { "color": "28 26 26", "icon": "none", "image_id": 80046, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/skirt/0628001443.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Skirt" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] }, { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 84148, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/trousers/0628000751.jpeg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Trousers" }, { "color": "28 26 26", "icon": "none", "image_id": 97321, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/blouse/0902000222.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Blouse" }, { "color": "28 26 26", "icon": "none", "image_id": 90718, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/outwear/0825000314.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Outwear" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] }, { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 86403, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/skirt/0902000231.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Skirt" }, { "color": "28 26 26", "icon": "none", "image_id": 87135, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/blouse/0902001315.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Blouse" }, { "color": "28 26 26", "icon": "none", "image_id": 87428, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/outwear/0902000566.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Outwear" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] }, { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 98423, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/dress/0916001596.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Dress" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] }, { "basic": { "body_point_test": { "waistband_right": [ 203, 249 ], "hand_point_right": [ 229, 343 ], "waistband_left": [ 119, 248 ], "hand_point_left": [ 97, 343 ], "shoulder_left": [ 108, 107 ], "shoulder_right": [ 212, 107 ] }, "layer_order": False, "scale_bag": 0.7, "scale_earrings": 0.16, "self_template": True, "single_overall": "overall", "switch_category": "" }, "items": [ { "color": "28 26 26", "icon": "none", "image_id": 86345, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/outwear/0825000695.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Outwear" }, { "color": "28 26 26", "icon": "none", "image_id": 78743, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/blouse/0902001412.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Blouse" }, { "color": "28 26 26", "icon": "none", "image_id": 68988, "offset": [ 1, 1 ], "path": "aida-sys-image/images/female/trousers/0825000403.jpg", "print": { "element": { "element_angle_list": [], "element_path_list": [], "element_scale_list": [], "location": [] }, "overall": { "location": [ [ 0.0, 0.0 ] ], "print_angle_list": [ 0.0, 0.0 ], "print_path_list": [], "print_scale_list": [ 0.0, 0.0 ] }, "single": { "location": [], "print_angle_list": [], "print_path_list": [], "print_scale_list": [] } }, "resize_scale": [ 1.0, 1.0 ], "type": "Trousers" }, { "body_path": "aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png", "image_id": 67277, "offset": [ 1, 1 ], "resize_scale": [ 1.0, 1.0 ], "type": "Body" } ] } ], "process_id": "123" } start_time = time.time() X = design_generate(object_data) print(time.time() - start_time) print(X)