Spaces:
Sleeping
Sleeping
| import os | |
| import sys | |
| import uvicorn | |
| from fastapi import FastAPI, UploadFile, File, Form | |
| from typing import Optional | |
| from starlette.responses import JSONResponse | |
| # --- Import AI Functions --- | |
| # Now that Detection.py is in the same directory, the import is straightforward. | |
| try: | |
| from models.Detection import load_model_and_assets, process_image_and_predict, process_video_and_predict_realtime, MIN_CONFIDENCE_THRESHOLD | |
| print("Successfully imported functions from Detection.py") | |
| except ImportError as e: | |
| print(f"ERROR: Could not import from Detection.py. Please ensure the file is in the same repository as app.py: {e}") | |
| # It's good practice to exit if a critical import fails | |
| sys.exit(1) | |
| # --- FastAPI App Initialization --- | |
| app = FastAPI() | |
| # --- Load AI Model and Assets on Startup --- | |
| # This function, located in your Detection.py, should be updated to correctly | |
| # reference the files within the 'models' subfolder of your Hugging Face Space. | |
| print("\n--- Hugging Face Space starting: Loading AI model and assets... ---") | |
| load_model_and_assets() | |
| print("--- AI model and assets loaded. Ready to serve predictions. ---\n") | |
| # --- FastAPI Routes --- | |
| # The rest of the routes remain the same, as they now correctly call the functions | |
| # from your Detection.py script. | |
| async def process_image_api( | |
| image: UploadFile = File(...), | |
| min_confidence: Optional[float] = Form(MIN_CONFIDENCE_THRESHOLD) | |
| ): | |
| try: | |
| contents = await image.read() | |
| temp_filepath = f"/tmp/{image.filename}" | |
| with open(temp_filepath, "wb") as f: | |
| f.write(contents) | |
| action, confidence = process_image_and_predict(temp_filepath, min_confidence) | |
| os.remove(temp_filepath) | |
| response = { | |
| "sign": action if action else "UNKNOWN", | |
| "confidence": round(float(confidence), 2), | |
| "success": True, | |
| "filename": image.filename | |
| } | |
| return JSONResponse(content=response) | |
| except Exception as e: | |
| return JSONResponse( | |
| status_code=500, | |
| content={ | |
| "error": "Error processing image with AI model", | |
| "details": str(e), | |
| "success": False | |
| } | |
| ) | |
| async def process_video_api( | |
| video: UploadFile = File(...), | |
| min_confidence: Optional[float] = Form(MIN_CONFIDENCE_THRESHOLD) | |
| ): | |
| try: | |
| contents = await video.read() | |
| temp_filepath = f"/tmp/{video.filename}" | |
| with open(temp_filepath, "wb") as f: | |
| f.write(contents) | |
| action, confidence = process_video_and_predict_realtime(temp_filepath, min_confidence) | |
| os.remove(temp_filepath) | |
| response = { | |
| "phrase": action if action else "UNKNOWN", | |
| "confidence": round(float(confidence), 2), | |
| "success": True, | |
| "filename": video.filename | |
| } | |
| return JSONResponse(content=response) | |
| except Exception as e: | |
| return JSONResponse( | |
| status_code=500, | |
| content={ | |
| "error": "Error processing video with AI model", | |
| "details": str(e), | |
| "success": False | |
| } | |
| ) | |
| #just added | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="0.0.0.0", port=7860) |