Spaces:
Running
Running
| import os | |
| import logging | |
| from zipfile import Path | |
| from dotenv import load_dotenv | |
| from ultralytics import YOLO | |
| from google.cloud import storage | |
| import google.auth | |
| # ---------------- ENV ---------------- | |
| load_dotenv(override=True) | |
| BASE_DIR = os.path.dirname(os.path.abspath(__file__)) | |
| # ---------------- LOGGER ---------------- | |
| LOG_FILE = os.path.join(BASE_DIR, "api.log") | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format="%(asctime)s [%(levelname)s] %(message)s", | |
| handlers=[logging.FileHandler(LOG_FILE), logging.StreamHandler()] | |
| ) | |
| logger = logging.getLogger("WildlifeLogger") | |
| ENV = os.getenv("ENV", "DEV").upper() | |
| logger.info(f"Running in {ENV}") | |
| # ---------------- STORAGE ---------------- | |
| UPLOAD_DIR = os.path.join(BASE_DIR, "user_data") | |
| os.makedirs(UPLOAD_DIR, exist_ok=True) | |
| STORAGE_BACKEND = "local" | |
| gcs_client = None | |
| gcs_bucket = None | |
| GCS_UPLOAD_DIR = "uploaded_images/" | |
| if ENV == "PROD": | |
| STORAGE_BACKEND = os.getenv("PROD_STORAGE_BACKEND", "gcs").lower() | |
| GCS_BUCKET_NAME = os.getenv("PROD_GCS_BUCKET_NAME") | |
| GCS_KEY_PATH = os.getenv("PROD_GOOGLE_APPLICATION_CREDENTIALS") | |
| if STORAGE_BACKEND == "gcs": | |
| try: | |
| if os.getenv("GOOGLE_CLOUD_PROJECT"): | |
| creds, project = google.auth.default() | |
| gcs_client = storage.Client(credentials=creds, project=project) | |
| else: | |
| gcs_client = storage.Client.from_service_account_json(GCS_KEY_PATH) | |
| gcs_bucket = gcs_client.bucket(GCS_BUCKET_NAME) | |
| logger.info(f"Connected to GCS bucket: {GCS_BUCKET_NAME}") | |
| except Exception as e: | |
| logger.error(f"GCS connection failed: {e}") | |
| STORAGE_BACKEND = "local" | |
| # ---------------- UPLOAD RULES ---------------- | |
| MIN_IMAGES = 1 | |
| MAX_IMAGES = 1000 | |
| ALLOWED_EXTENSIONS = {"jpg", "jpeg", "png", "webp"} | |
| # ---------------- YOLO MODELS ---------------- | |
| try: | |
| logger.info("Loading YOLO models...") | |
| DETECT_MODEL = YOLO("api/walidlife_models/detect/deer.pt") | |
| BUCK_DOE_MODEL = YOLO("api/walidlife_models/classify/Buck_classificationt.pt", task="classify") | |
| BUCK_TYPE_MODEL = YOLO("api/walidlife_models/classify/mules_vs_whitetails.pt", task="classify") | |
| logger.info("YOLO models loaded") | |
| except Exception as e: | |
| logger.error(f"YOLO load failed: {e}") | |
| DETECT_MODEL = BUCK_DOE_MODEL = BUCK_TYPE_MODEL = None | |