Spaces:
Build error
Build error
| """ | |
| project @ CTO_TCP_ZERO_GPU | |
| created @ 2024-11-14 | |
| author @ github.com/ishworrsubedii | |
| """ | |
| import base64 | |
| import json | |
| import os | |
| import time | |
| import requests | |
| from fastapi.routing import APIRouter | |
| from fastapi import File, UploadFile, Form | |
| import replicate | |
| from starlette.responses import JSONResponse | |
| from src.api.nto_api import supabase | |
| from src.utils.logger import logger | |
| mto_router = APIRouter() | |
| def run_mto(input): | |
| try: | |
| logger.info("Starting mannequin to model conversion") | |
| output = replicate.run( | |
| "xiankgx/face-swap:cff87316e31787df12002c9e20a78a017a36cb31fde9862d8dedd15ab29b7288", | |
| input=input | |
| ) | |
| logger.info("Mannequin to model conversion completed successfully") | |
| return output | |
| except Exception as e: | |
| logger.error(f"Error in mannequin to model conversion: {str(e)}") | |
| return None | |
| def read_return(url): | |
| try: | |
| res = requests.get(url) | |
| logger.info("Image fetched successfully") | |
| return res.content | |
| except Exception as e: | |
| logger.error(f"Error fetching image: {str(e)}") | |
| return None | |
| async def mto_image(image: UploadFile = File(...), store_name: str = Form(...), | |
| clothing_category: str = Form(...), | |
| product_id: str = Form(...), | |
| body_structure: str = Form(...), | |
| skin_complexion: str = Form(...), | |
| facial_structure: str = Form(...), ): | |
| start_time = time.time() | |
| try: | |
| logger.info(f"Starting MTO image process for store: {store_name}") | |
| if body_structure == "medium": | |
| body_structure = "fat" | |
| logger.info("Body structure adjusted from 'medium' to 'fat'") | |
| image_bytes = await image.read() | |
| logger.info("Source image read successfully") | |
| mannequin_image_url = f"https://lvuhhlrkcuexzqtsbqyu.supabase.co/storage/v1/object/public/ClothingTryOn/{store_name}/{clothing_category}/{product_id}/{product_id}_{skin_complexion}_{facial_structure}_{body_structure}.webp" | |
| logger.info(f"Fetching mannequin image") | |
| reference_image_bytes = read_return(mannequin_image_url) | |
| if reference_image_bytes is None: | |
| logger.error("Failed to fetch reference image") | |
| return JSONResponse({"error": "Failed to fetch reference image"}, status_code=500) | |
| image_uri = f"data:image/jpeg;base64,{base64.b64encode(image_bytes).decode()}" | |
| reference_image_uri = f"data:image/jpeg;base64,{base64.b64encode(reference_image_bytes).decode()}" | |
| input = { | |
| "local_source": image_uri, | |
| "local_target": reference_image_uri | |
| } | |
| output = run_mto(input) | |
| if output is None: | |
| logger.error("Face swap process failed") | |
| return JSONResponse({"error": "Face swap process failed"}, status_code=500) | |
| try: | |
| response = requests.get(str(output['image'])) | |
| image_content = response.content | |
| base64_image = base64.b64encode(image_content).decode('utf-8') | |
| logger.info("MTO image process completed successfully") | |
| return JSONResponse(content={ | |
| "output": f"data:image/webp;base64,{base64_image}", | |
| "status": "success", | |
| "inference_time": round((time.time() - start_time), 2) | |
| }, status_code=200) | |
| except Exception as e: | |
| logger.error(f"Error converting output to base64: {str(e)}") | |
| return JSONResponse({"error": "Error processing output image"}, status_code=500) | |
| except Exception as e: | |
| logger.error(f"Error in MTO image process: {str(e)}") | |
| return JSONResponse({"error": str(e)}, status_code=500) | |
| async def returnJsonData(gender: str): | |
| try: | |
| logger.info(f"Fetching mannequin catalogue for gender: {gender}") | |
| folderImageURL = supabase.storage.get_bucket("JSON").create_signed_url( | |
| path=os.path.join("MannequinInfo.json"), | |
| expires_in=3600 | |
| )["signedURL"] | |
| logger.info("Fetching JSON data from Supabase") | |
| r = requests.get(folderImageURL).content.decode() | |
| mannequin_data = json.loads(r) | |
| if gender.lower() == "female": | |
| res = [item for item in mannequin_data if item["gender"] == "female"] | |
| elif gender.lower() == "male": | |
| res = [item for item in mannequin_data if item["gender"] == "male"] | |
| else: | |
| res = [] | |
| logger.warning(f"Invalid gender parameter: {gender}") | |
| logger.info(f"Successfully retrieved {len(res)} mannequin entries") | |
| return res | |
| except Exception as e: | |
| logger.error(f"Error in mannequin catalogue: {str(e)}") | |
| return JSONResponse({"error": str(e)}, status_code=500) | |