Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, File, UploadFile | |
| import deepface.DeepFace as DeepFace | |
| from fastapi.responses import JSONResponse | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from pydantic import BaseModel | |
| import numpy as np | |
| from mivolo.predictor import Predictor | |
| import base64 | |
| from PIL import Image | |
| import numpy as np | |
| from AttributesHolder import Namespace | |
| import cv2 | |
| config = { | |
| "checkpoint": 'models/mivolo_imbd.pth.tar', | |
| "detector_weights": 'models/yolov8x_person_face.pt', | |
| "device": 'cpu', | |
| "draw": False, | |
| "with_persons": True, | |
| "disable_faces": False, | |
| "output": 'output' | |
| } | |
| namespace = Namespace() | |
| setattr(namespace, 'checkpoint', 'models/mivolo_imbd.pth.tar') | |
| setattr(namespace, 'detector_weights', 'models/yolov8x_person_face.pt') | |
| setattr(namespace, 'device', 'cpu') | |
| setattr(namespace, 'draw', False) | |
| setattr(namespace, 'with_persons', True) | |
| setattr(namespace, 'disable_faces', False) | |
| setattr(namespace, 'output', 'output') | |
| predictor = Predictor(config=namespace) | |
| app = FastAPI() | |
| class Base64Data(BaseModel): | |
| base64_data: str | |
| origins = ["*"] | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=origins, | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| def index(): | |
| return {"message": "Hello, World!!!"} | |
| # post image to server | |
| async def create_upload_file(contents: Base64Data): | |
| try: | |
| # Read the file | |
| print("-----Starting Prediction----------") | |
| loaded_image = base64_to_cv2(contents.base64_data) | |
| detected_objects, out_im = predictor.recognize(loaded_image) | |
| age = detected_objects.ages[0] | |
| gender = detected_objects.genders[0] | |
| contents = contents.base64_data | |
| df = DeepFace.find(img_path = contents, db_path = "dataset/",model_name ='GhostFaceNet', threshold=0.9) | |
| filename = df[0].head()['identity'][0] | |
| filename = filename.replace("\\", "/") | |
| print(f"filename: {filename}") | |
| # Convert the image to base64 | |
| base64_output = image_to_base64("dataset/" + filename) | |
| print("------Prediction Done-----------") | |
| return JSONResponse(content={ | |
| "celeb_image": base64_output, | |
| "celeb":df[0].head()['identity'][0], "res":{ | |
| "age": age, | |
| "gender": gender | |
| } }, status_code=200) | |
| except Exception as e: | |
| return JSONResponse(content={"message": "Error processing the file.", "error": str(e)}, status_code=500) | |
| def image_to_base64(image_path): | |
| with open(image_path, "rb") as img_file: | |
| # Read the image file | |
| img_data = img_file.read() | |
| # Encode the image data as base64 | |
| base64_data = base64.b64encode(img_data) | |
| # Decode bytes-like object to ASCII string | |
| base64_str = base64_data.decode("ascii") | |
| return base64_str | |
| def base64_to_cv2(base64_string): | |
| base64_string = base64_string.split(",")[1] | |
| # Decode the base64 string into bytes | |
| decoded_bytes = base64.b64decode(base64_string) | |
| # Convert bytes to numpy array | |
| np_array = np.frombuffer(decoded_bytes, np.uint8) | |
| # Decode the numpy array into an image | |
| image = cv2.imdecode(np_array, cv2.IMREAD_COLOR) | |
| return image |