| # Quick Setup & Usage Guide |
|
|
| ## Step 1: Configure TruFor Model Path |
| Edit `config.json`: |
| ```json |
| { |
| "trufor_model": "/path/to/your/trufor/checkpoint.pth" |
| } |
| ``` |
|
|
| ## Step 2: Run the API |
| ```bash |
| python app.py |
| # API runs on http://0.0.0.0:8000 |
| ``` |
|
|
| ## Step 3: Send Requests |
| ```bash |
| # Using curl with image file |
| curl -X POST "http://localhost:8000/faceswap-image" \ |
| -F "files=@test_image.jpg" |
| |
| # Using Python |
| import requests |
| with open('test_image.jpg', 'rb') as f: |
| files = {'files': f} |
| response = requests.post('http://localhost:8000/faceswap-image', files=files) |
| print(response.json()) |
| ``` |
|
|
| ## Step 4: Parse Response |
| ```python |
| data = response.json() |
| |
| for source in data['results']: |
| print(f"Source: {source['source']}") |
| print(f"Faces detected: {source['faces_detected']}") |
| |
| for face in source['predictions']: |
| print(f" Face {face['face_id']}: {face['prediction']}") |
| print(f" Confidence: {face['confidence']:.3f}") |
| |
| if face.get('visualization'): |
| # Visualization image available as base64 |
| print(f" Visualization: {face['visualization']['filename']}") |
| |
| # Save base64 image to file |
| import base64 |
| img_data = base64.b64decode(face['visualization']['image_base64']) |
| with open(face['visualization']['filename'], 'wb') as f: |
| f.write(img_data) |
| ``` |
|
|
| ## Response Structure |
| ```json |
| { |
| "success": true, |
| "total_sources_processed": 1, |
| "total_faces_processed": 2, |
| "results": [ |
| { |
| "source_type": "file", |
| "source": "test.jpg", |
| "success": true, |
| "faces_detected": 2, |
| "message": "Detected 2 face(s).", |
| "image_info": { |
| "width": 1920, |
| "height": 1080, |
| "channels": 3 |
| }, |
| "predictions": [ |
| { |
| "face_id": 1, |
| "bbox": [100, 50, 300, 250], |
| "square_bbox_224": [88, 38, 312, 262], |
| "detection_score": 0.98, |
| "prediction": "fake", |
| "confidence": 0.94, |
| "raw_confidence": { |
| "real": 0.06, |
| "fake": 0.94 |
| }, |
| "visualization": { |
| "filename": "test_plotted.jpg", |
| "image_base64": "iVBORw0KGgoAAAA...", |
| "mime_type": "image/jpeg" |
| }, |
| "extra_info": { |
| "bbox_dimensions": {"width": 200, "height": 200}, |
| "aspect_ratio": 1.0, |
| "crop_size": [224, 224], |
| "kps": [] |
| } |
| } |
| ] |
| } |
| ] |
| } |
| ``` |
|
|
| ## Key Features |
|
|
| | Feature | Details | |
| |---------|---------| |
| | **Detection** | Real-time face detection using InsightFace | |
| | **Classification** | CFace CLIP model for real/fake classification | |
| | **Localization** | TruFor model for detailed deepfake localization maps | |
| | **Visualization** | Multi-panel matplotlib visualization with base64 encoding | |
| | **Response Format** | JSON with embedded base64 images (no file I/O) | |
| | **Batch Processing** | Single model pass for all faces in all images | |
| | **Error Handling** | Graceful fallbacks if TruFor model unavailable | |
|
|
| ## Troubleshooting |
|
|
| ### TruFor Model Not Loading |
| ``` |
| Warning: Model checkpoint not found at /path/to/trufor/checkpoint.pth |
| ``` |
| **Solution**: Check `config.json` and ensure the path exists |
|
|
| ### CUDA Out of Memory |
| ``` |
| Error: CUDA Out of Memory during TruFor inference |
| ``` |
| **Solution**: |
| - Reduce image size or use smaller batches |
| - Run on CPU: Set GPU to -1 in config |
| - Use lower resolution input |
|
|
| ### No Visualization for Fake Detections |
| **Check**: |
| 1. Is TruFor model loaded? Check logs |
| 2. Is face actually predicted as "fake"? |
| 3. Are there exceptions in logs? |
|
|
| ### Visualization Quality Issues |
| **Adjust in `create_visualization_image()`**: |
| - Change `figsize=(cols*4, 4)` for larger/smaller images |
| - Change `dpi=100` for higher/lower resolution |
| - Modify colormaps: `cmap='RdBu_r'` → `'jet'`, `'viridis'`, etc. |
|
|
| ## API Endpoints |
|
|
| ### POST /faceswap-image |
| Analyze image(s) for face-swap deepfakes |
|
|
| **Parameters:** |
| - `files` (optional): List of image files |
| - `image_url` (optional): Single image URL |
| - `image_urls` (optional): Multiple image URLs |
|
|
| **Returns:** JSON with detection results and visualizations |
|
|
| ### GET / |
| Health check endpoint |
|
|
| **Returns:** API status and model information |
|
|
| ## Model Details |
|
|
| | Model | Purpose | Input | Output | |
| |-------|---------|-------|--------| |
| | **InsightFace** | Face detection | Image | Face bboxes, keypoints | |
| | **CFace CLIP** | Real/Fake classification | 224x224 face crops | Probability scores | |
| | **TruFor** | Deepfake localization | Full resolution image | Localization maps | |
|
|
| ## Performance Metrics |
|
|
| - **Face Detection**: ~50-100ms per image |
| - **CFace Classification**: ~10-20ms per face |
| - **TruFor Localization**: ~100-500ms per face (GPU dependent) |
| - **Visualization Generation**: ~20-50ms per deepfake |
| - **Total**: ~200-800ms per deepfake detection (with visualization) |
|
|
| ## Security Notes |
|
|
| - ✅ CORS enabled (configure as needed) |
| - ✅ No file storage (in-memory processing) |
| - ✅ Base64 encoding prevents binary issues |
| - ⚠️ Consider adding API authentication for production |
| - ⚠️ Validate image file sizes to prevent DoS |
|
|