Commit
·
71692ad
1
Parent(s):
0e17006
Fix Docker build: Add build tools for insightface compilation and improve API endpoints
Browse files- Dockerfile +4 -1
- fastapi_app.py +40 -2
Dockerfile
CHANGED
|
@@ -3,10 +3,13 @@ FROM python:3.10-slim
|
|
| 3 |
ENV PYTHONDONTWRITEBYTECODE=1 \
|
| 4 |
PYTHONUNBUFFERED=1
|
| 5 |
|
| 6 |
-
# System deps for OpenCV/ffmpeg
|
| 7 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 8 |
ffmpeg \
|
| 9 |
libgl1 \
|
|
|
|
|
|
|
|
|
|
| 10 |
&& rm -rf /var/lib/apt/lists/*
|
| 11 |
|
| 12 |
WORKDIR /app
|
|
|
|
| 3 |
ENV PYTHONDONTWRITEBYTECODE=1 \
|
| 4 |
PYTHONUNBUFFERED=1
|
| 5 |
|
| 6 |
+
# System deps for OpenCV/ffmpeg and build tools for insightface
|
| 7 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 8 |
ffmpeg \
|
| 9 |
libgl1 \
|
| 10 |
+
build-essential \
|
| 11 |
+
g++ \
|
| 12 |
+
make \
|
| 13 |
&& rm -rf /var/lib/apt/lists/*
|
| 14 |
|
| 15 |
WORKDIR /app
|
fastapi_app.py
CHANGED
|
@@ -9,6 +9,7 @@ from io import BytesIO
|
|
| 9 |
import cv2
|
| 10 |
import numpy as np
|
| 11 |
from fastapi import BackgroundTasks, Depends, FastAPI, File, Form, Header, HTTPException, UploadFile
|
|
|
|
| 12 |
from fastapi.responses import JSONResponse, StreamingResponse
|
| 13 |
|
| 14 |
from SinglePhoto import FaceSwapper
|
|
@@ -18,7 +19,16 @@ logger = logging.getLogger(__name__)
|
|
| 18 |
|
| 19 |
API_KEY = os.getenv("FACE_SWAP_API_KEY")
|
| 20 |
face_swapper = FaceSwapper()
|
| 21 |
-
app = FastAPI(title="FaceSwapAll API", version="1.0.0")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
|
| 24 |
def verify_api_key(x_api_key: str | None = Header(default=None)) -> None:
|
|
@@ -118,9 +128,37 @@ def swap_video_file(
|
|
| 118 |
return output_video_path, workdir
|
| 119 |
|
| 120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
@app.get("/health")
|
| 122 |
def health() -> JSONResponse:
|
| 123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
|
| 125 |
|
| 126 |
@app.post("/swap/photo")
|
|
|
|
| 9 |
import cv2
|
| 10 |
import numpy as np
|
| 11 |
from fastapi import BackgroundTasks, Depends, FastAPI, File, Form, Header, HTTPException, UploadFile
|
| 12 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 13 |
from fastapi.responses import JSONResponse, StreamingResponse
|
| 14 |
|
| 15 |
from SinglePhoto import FaceSwapper
|
|
|
|
| 19 |
|
| 20 |
API_KEY = os.getenv("FACE_SWAP_API_KEY")
|
| 21 |
face_swapper = FaceSwapper()
|
| 22 |
+
app = FastAPI(title="FaceSwapAll API", version="1.0.0", docs_url="/docs", redoc_url="/redoc")
|
| 23 |
+
|
| 24 |
+
# Add CORS middleware
|
| 25 |
+
app.add_middleware(
|
| 26 |
+
CORSMiddleware,
|
| 27 |
+
allow_origins=["*"],
|
| 28 |
+
allow_credentials=True,
|
| 29 |
+
allow_methods=["*"],
|
| 30 |
+
allow_headers=["*"],
|
| 31 |
+
)
|
| 32 |
|
| 33 |
|
| 34 |
def verify_api_key(x_api_key: str | None = Header(default=None)) -> None:
|
|
|
|
| 128 |
return output_video_path, workdir
|
| 129 |
|
| 130 |
|
| 131 |
+
@app.get("/")
|
| 132 |
+
def root() -> JSONResponse:
|
| 133 |
+
"""Root endpoint with API information."""
|
| 134 |
+
return JSONResponse({
|
| 135 |
+
"name": "FaceSwapAll API",
|
| 136 |
+
"version": "1.0.0",
|
| 137 |
+
"status": "running",
|
| 138 |
+
"endpoints": {
|
| 139 |
+
"health": "/health",
|
| 140 |
+
"docs": "/docs",
|
| 141 |
+
"photo_swap": "/swap/photo",
|
| 142 |
+
"video_swap": "/swap/video",
|
| 143 |
+
"photo_single_src_multi_dst": "/swap/photo/single-src-multi-dst",
|
| 144 |
+
"photo_multi_src_single_dst": "/swap/photo/multi-src-single-dst",
|
| 145 |
+
"photo_multi_src_multi_dst": "/swap/photo/multi-src-multi-dst",
|
| 146 |
+
"photo_custom_mapping": "/swap/photo/custom-mapping",
|
| 147 |
+
"video_all_faces": "/swap/video/all-faces",
|
| 148 |
+
"video_custom_mapping": "/swap/video/custom-mapping",
|
| 149 |
+
"video_single_src_multi_video": "/swap/video/single-src-multi-video"
|
| 150 |
+
}
|
| 151 |
+
})
|
| 152 |
+
|
| 153 |
+
|
| 154 |
@app.get("/health")
|
| 155 |
def health() -> JSONResponse:
|
| 156 |
+
"""Health check endpoint."""
|
| 157 |
+
return JSONResponse({
|
| 158 |
+
"status": "ok",
|
| 159 |
+
"service": "FaceSwapAll API",
|
| 160 |
+
"version": "1.0.0"
|
| 161 |
+
})
|
| 162 |
|
| 163 |
|
| 164 |
@app.post("/swap/photo")
|