463 lines
19 KiB
Python
463 lines
19 KiB
Python
import json
|
|
import logging
|
|
import os
|
|
|
|
from fastapi import APIRouter, HTTPException, UploadFile, File, Form, BackgroundTasks
|
|
|
|
from app.schemas.design import DesignModel, DesignProgressModel, ModelProgressModel, DBGConfigModel, DesignStreamModel
|
|
from app.schemas.response_template import ResponseModel
|
|
from app.service.design.model_process_service import model_transpose
|
|
from app.service.design_batch.service import start_design_batch_generate
|
|
from app.service.design_fast.design_generate import design_generate, design_generate_v2
|
|
from app.service.design_fast.utils.redis_utils import Redis
|
|
|
|
router = APIRouter()
|
|
logger = logging.getLogger()
|
|
|
|
|
|
@router.post("/design")
|
|
def design(request_data: DesignModel, background_tasks: BackgroundTasks):
|
|
"""
|
|
objects.items.transparent:
|
|
"transparent":{
|
|
"mask_url":"test/transparent_test/transparent_mask.png",
|
|
"scale":0.1
|
|
},
|
|
mask_url 为空"" -> 单件衣服透明
|
|
mask_url 非空"mask_url" -> 区域透明
|
|
|
|
创建一个具有以下参数的请求体:
|
|
示例参数:
|
|
{
|
|
"objects": [
|
|
{
|
|
"basic": {
|
|
"body_point_test": {
|
|
"waistband_right": [
|
|
200,
|
|
241
|
|
],
|
|
"hand_point_right": [
|
|
223,
|
|
297
|
|
],
|
|
"waistband_left": [
|
|
112,
|
|
241
|
|
],
|
|
"hand_point_left": [
|
|
92,
|
|
305
|
|
],
|
|
"shoulder_left": [
|
|
99,
|
|
116
|
|
],
|
|
"shoulder_right": [
|
|
215,
|
|
116
|
|
]
|
|
},
|
|
"layer_order": true,
|
|
"scale_bag": 0.7,
|
|
"scale_earrings": 0.16,
|
|
"self_template": true,
|
|
"single_overall": "overall",
|
|
"switch_category": ""
|
|
},
|
|
"items": [
|
|
{
|
|
"businessId": 270372,
|
|
"color": "30 28 28",
|
|
"image_id": 69780,
|
|
"offset": [
|
|
0,
|
|
0
|
|
],
|
|
"path": "aida-sys-image/images/female/trousers/0825000630.jpg",
|
|
"print": {
|
|
"element": {
|
|
"element_angle_list": [],
|
|
"element_path_list": [],
|
|
"element_scale_list": [],
|
|
"location": []
|
|
},
|
|
"overall": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
},
|
|
"single": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
}
|
|
},
|
|
"priority": 10,
|
|
"resize_scale": [
|
|
1.0,
|
|
1.0
|
|
],
|
|
"type": "Trousers"
|
|
},
|
|
{
|
|
"businessId": 270373,
|
|
"color": "30 28 28",
|
|
"image_id": 98243,
|
|
"offset": [
|
|
0,
|
|
0
|
|
],
|
|
"path": "aida-sys-image/images/female/blouse/0902003811.jpg",
|
|
"print": {
|
|
"element": {
|
|
"element_angle_list": [],
|
|
"element_path_list": [],
|
|
"element_scale_list": [],
|
|
"location": []
|
|
},
|
|
"overall": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
},
|
|
"single": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
}
|
|
},
|
|
"priority": 11,
|
|
"resize_scale": [
|
|
1.0,
|
|
1.0
|
|
],
|
|
"type": "Blouse"
|
|
},
|
|
{
|
|
"businessId": 270374,
|
|
"color": "172 68 68",
|
|
"image_id": 98244,
|
|
"offset": [
|
|
0,
|
|
0
|
|
],
|
|
"path": "aida-sys-image/images/female/outwear/0825000410.jpg",
|
|
"print": {
|
|
"element": {
|
|
"element_angle_list": [],
|
|
"element_path_list": [],
|
|
"element_scale_list": [],
|
|
"location": []
|
|
},
|
|
"overall": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
},
|
|
"single": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
}
|
|
},
|
|
"priority": 12,
|
|
"resize_scale": [
|
|
1.0,
|
|
1.0
|
|
],
|
|
"transparent":{
|
|
"mask_url":"test/transparent_test/transparent_mask.png",
|
|
"scale":0.1
|
|
},
|
|
"type": "Outwear"
|
|
},
|
|
{
|
|
"body_path": "aida-sys-image/models/female/5bdfe7ca-64eb-44e4-b03d-8e517520c795.png",
|
|
"image_id": 96090,
|
|
"type": "Body"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"process_id": "83"
|
|
}
|
|
"""
|
|
# logger.info(f"design request item is : @@@@@@:{json.dumps(request_data.dict())}")
|
|
# data = generate(request_data=request_data)
|
|
# logger.info(f"design response @@@@@@:{json.dumps(data)}")
|
|
#
|
|
|
|
try:
|
|
logger.info(f"design request item is : @@@@@@:{json.dumps(request_data.dict())}")
|
|
data = design_generate(request_data=request_data)
|
|
logger.info(f"design response @@@@@@:{json.dumps(data)}")
|
|
except Exception as e:
|
|
logger.warning(f"design Run Exception @@@@@@:{e}")
|
|
raise HTTPException(status_code=404, detail=str(e))
|
|
return ResponseModel(data=data)
|
|
|
|
|
|
@router.post("/design_v2")
|
|
async def design_v2(request_data: DesignStreamModel, background_tasks: BackgroundTasks):
|
|
"""
|
|
创建一个具有以下参数的请求体:
|
|
示例参数:
|
|
{
|
|
"objects": [
|
|
{
|
|
"basic": {
|
|
"body_point_test": {
|
|
"waistband_right": [
|
|
200,
|
|
241
|
|
],
|
|
"hand_point_right": [
|
|
223,
|
|
297
|
|
],
|
|
"waistband_left": [
|
|
112,
|
|
241
|
|
],
|
|
"hand_point_left": [
|
|
92,
|
|
305
|
|
],
|
|
"shoulder_left": [
|
|
99,
|
|
116
|
|
],
|
|
"shoulder_right": [
|
|
215,
|
|
116
|
|
]
|
|
},
|
|
"layer_order": true,
|
|
"scale_bag": 0.7,
|
|
"scale_earrings": 0.16,
|
|
"self_template": true,
|
|
"single_overall": "overall",
|
|
"switch_category": ""
|
|
},
|
|
"items": [
|
|
{
|
|
"businessId": 270372,
|
|
"color": "30 28 28",
|
|
"image_id": 69780,
|
|
"offset": [
|
|
0,
|
|
0
|
|
],
|
|
"path": "aida-sys-image/images/female/trousers/0825000630.jpg",
|
|
"print": {
|
|
"element": {
|
|
"element_angle_list": [],
|
|
"element_path_list": [],
|
|
"element_scale_list": [],
|
|
"location": []
|
|
},
|
|
"overall": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
},
|
|
"single": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
}
|
|
},
|
|
"priority": 10,
|
|
"resize_scale": [
|
|
1.0,
|
|
1.0
|
|
],
|
|
"type": "Trousers"
|
|
},
|
|
{
|
|
"businessId": 270373,
|
|
"color": "30 28 28",
|
|
"image_id": 98243,
|
|
"offset": [
|
|
0,
|
|
0
|
|
],
|
|
"path": "aida-sys-image/images/female/blouse/0902003811.jpg",
|
|
"print": {
|
|
"element": {
|
|
"element_angle_list": [],
|
|
"element_path_list": [],
|
|
"element_scale_list": [],
|
|
"location": []
|
|
},
|
|
"overall": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
},
|
|
"single": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
}
|
|
},
|
|
"priority": 11,
|
|
"resize_scale": [
|
|
1.0,
|
|
1.0
|
|
],
|
|
"type": "Blouse"
|
|
},
|
|
{
|
|
"businessId": 270374,
|
|
"color": "172 68 68",
|
|
"image_id": 98244,
|
|
"offset": [
|
|
0,
|
|
0
|
|
],
|
|
"path": "aida-sys-image/images/female/outwear/0825000410.jpg",
|
|
"print": {
|
|
"element": {
|
|
"element_angle_list": [],
|
|
"element_path_list": [],
|
|
"element_scale_list": [],
|
|
"location": []
|
|
},
|
|
"overall": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
},
|
|
"single": {
|
|
"location": [],
|
|
"print_angle_list": [],
|
|
"print_path_list": [],
|
|
"print_scale_list": []
|
|
}
|
|
},
|
|
"priority": 12,
|
|
"resize_scale": [
|
|
1.0,
|
|
1.0
|
|
],
|
|
"transparent":{
|
|
"mask_url":"test/transparent_test/transparent_mask.png",
|
|
"scale":0.1
|
|
},
|
|
"type": "Outwear"
|
|
},
|
|
{
|
|
"body_path": "aida-sys-image/models/female/5bdfe7ca-64eb-44e4-b03d-8e517520c795.png",
|
|
"image_id": 96090,
|
|
"type": "Body"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"process_id": "83"
|
|
}
|
|
"""
|
|
try:
|
|
# 异步
|
|
logger.info(f"generate_image request item is : @@@@@@:{json.dumps(request_data.dict())}")
|
|
background_tasks.add_task(design_generate_v2, request_data)
|
|
except Exception as e:
|
|
logger.warning(f"design Run Exception @@@@@@:{e}")
|
|
raise HTTPException(status_code=404, detail=str(e))
|
|
return ResponseModel()
|
|
|
|
|
|
@router.post('/get_progress')
|
|
def get_progress(request_data: DesignProgressModel):
|
|
"""
|
|
获取design 进度
|
|
创建一个具有以下参数的请求体:
|
|
- **process_id**: 进度id
|
|
|
|
示例参数:
|
|
{
|
|
"process_id": "6878547032381675"
|
|
}
|
|
"""
|
|
try:
|
|
logger.info(f"get_progress request item is : @@@@@@:{json.dumps(request_data.dict())}")
|
|
process_id = request_data.process_id
|
|
r = Redis()
|
|
data = r.read(key=process_id)
|
|
if data is None:
|
|
raise ValueError(f"No progress ID: {process_id}")
|
|
logging.info(f"get_progress process_id @@@@@@ : {process_id} , progress : {json.dumps(data)}")
|
|
except Exception as e:
|
|
logger.warning(f"get_progress Run Exception @@@@@@:{e}")
|
|
raise HTTPException(status_code=404, detail=str(e))
|
|
return ResponseModel(data=data)
|
|
|
|
|
|
@router.post('/model_process')
|
|
def model_process(request_data: ModelProgressModel):
|
|
"""
|
|
获取模特图片预处理
|
|
创建一个具有以下参数的请求体:
|
|
- **model_path**: 模特图片的minio或s3 url地址
|
|
|
|
示例参数:
|
|
{
|
|
"model_path": "aida-users/10/models/female/9c788f5b-b8c7-424c-b149-025aeb0bda51model.jpg"
|
|
}
|
|
"""
|
|
try:
|
|
logger.info(f"model_process request item is : @@@@@@:{json.dumps(request_data.dict())}")
|
|
|
|
data = model_transpose(image_path=request_data.model_path)
|
|
logger.info(f"model_process response @@@@@@:{json.dumps(data)}")
|
|
except Exception as e:
|
|
logger.warning(f"model_process Run Exception @@@@@@:{e}")
|
|
raise HTTPException(status_code=404, detail=str(e))
|
|
return ResponseModel(data=data)
|
|
|
|
|
|
# ##############################################################
|
|
|
|
|
|
@router.post("/design_batch_generate")
|
|
async def design(file: UploadFile = File(...),
|
|
tasks_id: str = Form(...),
|
|
user_id: str = Form(...),
|
|
file_name: str = Form(...),
|
|
total: int = Form(...)
|
|
):
|
|
dbg_config = DBGConfigModel(
|
|
tasks_id=tasks_id,
|
|
user_id=user_id,
|
|
file_name=file_name,
|
|
total=total
|
|
)
|
|
contents = await file.read()
|
|
file_name = file.filename
|
|
await save_request_file(contents, file_name)
|
|
return await start_design_batch_generate(dbg_config, contents)
|
|
|
|
|
|
async def save_request_file(contents, file_name):
|
|
# 创建保存文件的目录(如果不存在)
|
|
save_dir = os.path.join(os.getcwd(), "service/design_batch", "request_data")
|
|
if not os.path.exists(save_dir):
|
|
os.makedirs(save_dir)
|
|
# 处理文件
|
|
file_path = os.path.join(save_dir, file_name)
|
|
with open(file_path, "wb") as f:
|
|
f.write(contents)
|