7.1 KiB
Face Detection API Migration
Overview
Migrated Miku bot's profile picture feature from local anime-face-detector library to external API service to resolve Python dependency conflicts.
Changes Made
1. Profile Picture Manager (bot/utils/profile_picture_manager.py)
Removed:
- Local
anime-face-detectorlibrary initialization - Direct YOLOv3 model loading in bot process
self.face_detectorinstance variable- OpenCV image conversion for face detection
Added:
- API endpoint constant:
FACE_DETECTOR_API = "http://anime-face-detector:6078/detect" - HTTP client for face detection API calls
- Enhanced detection response parsing with bbox, confidence, and keypoints
- Health check on initialization to verify API availability
Updated Methods:
initialize()
- Now checks API health endpoint instead of loading local model
- Graceful fallback if API unavailable
_detect_face(image_bytes, debug)
- Changed signature from
(cv_image: np.ndarray)to(image_bytes: bytes) - Now sends multipart form-data POST to API
- Returns rich detection dict instead of simple tuple:
{
'center': (x, y), # Face center coordinates
'bbox': [x1, y1, x2, y2], # Bounding box
'confidence': 0.98, # Detection confidence
'keypoints': [...], # 27 facial landmarks
'count': 1 # Number of faces detected
}
_intelligent_crop(image, image_bytes, target_size, debug)
- Added
image_bytesparameter for API call - Updated to use new detection dict format
- Falls back to saliency detection if API call fails
2. Dependencies (bot/requirements.txt)
Removed:
anime-face-detector
This library had conflicts with the bot's CUDA/PyTorch environment.
3. Docker Networking (anime-face-detector-gpu/docker-compose.yml)
Added:
networks:
miku-discord_default:
external: true
Allows the face detector container to communicate with Miku bot container.
Architecture
Before (Monolithic):
┌─────────────────────────────┐
│ Miku Bot Container │
│ ┌───────────────────────┐ │
│ │ anime-face-detector │ │ ❌ Dependency conflicts
│ │ YOLOv3 Model │ │
│ └───────────────────────┘ │
│ Discord Bot Logic │
└─────────────────────────────┘
After (Microservices):
┌─────────────────────────────┐ ┌──────────────────────────────┐
│ Miku Bot Container │ │ Face Detector API Container │
│ │ │ │
│ HTTP Client ──────────────────────▶ FastAPI Endpoint │
│ Discord Bot Logic │ │ YOLOv3 Model (GPU) │
│ Profile Picture Manager │ │ anime-face-detector lib │
└─────────────────────────────┘ └──────────────────────────────┘
▲ │
│ │
└───── JSON Response with detections ───┘
API Endpoint
Request:
POST http://anime-face-detector:6078/detect
Content-Type: multipart/form-data
file: <image_bytes>
Response:
{
"detections": [
{
"bbox": [629.5, 408.4, 1533.7, 1522.5],
"confidence": 0.9857,
"keypoints": [
[695.4, 644.5, 0.736],
[662.7, 894.8, 0.528],
...
]
}
],
"count": 1,
"annotated_image": "/app/api/outputs/image_..._annotated.jpg",
"json_file": "/app/api/outputs/image_..._results.json"
}
Benefits
✅ Dependency Isolation: Face detection library runs in dedicated container with its own Python environment ✅ GPU Optimization: Detector container uses CUDA-optimized YOLOv3 ✅ Easier Updates: Can update face detection model without touching bot code ✅ Better Debugging: Gradio UI at port 7860 for visual testing ✅ Scalability: Multiple services could use the same face detection API ✅ Graceful Degradation: Bot continues working with saliency fallback if API unavailable
Deployment Steps
1. Start Face Detector API
cd /home/koko210Serve/docker/anime-face-detector-gpu
docker-compose up -d
2. Verify API Health
curl http://localhost:6078/health
# Should return: {"status":"healthy","detector_loaded":true}
3. Rebuild Miku Bot (to remove old dependency)
cd /home/koko210Serve/docker/miku-discord
docker-compose build miku-bot
docker-compose up -d
4. Check Logs
# Bot should show:
docker-compose logs miku-bot | grep "face detector"
# Expected: "✅ Anime face detector API connected"
Testing
Test Face Detection Directly:
curl -X POST http://localhost:6078/detect \
-F "file=@./images/test_miku.jpg" | jq .
Test Profile Picture Change:
# Via API
curl -X POST "http://localhost:8000/profile-picture/change"
# Or via web UI
# Navigate to http://localhost:8000 → Actions → Profile Picture
Troubleshooting
"Face detector API not available"
- Check if container is running:
docker ps | grep anime-face-detector - Check network:
docker network ls | grep miku-discord - Verify API responds:
curl http://localhost:6078/health
"No faces detected"
- Check API logs:
docker-compose -f anime-face-detector-gpu/docker-compose.yml logs - Test with Gradio UI: http://localhost:7860
- Bot will fallback to saliency detection automatically
Network Issues
If containers can't communicate:
# Ensure miku-discord network exists
docker network inspect miku-discord_default
# Reconnect anime-face-detector container
cd anime-face-detector-gpu
docker-compose down
docker-compose up -d
Future Enhancements
Potential improvements now that we have a dedicated API:
- Batch Processing: Detect faces in multiple images simultaneously
- Face Recognition: Add character identification (not just detection)
- Expression Analysis: Determine mood from detected faces
- Quality Scoring: Rate image quality for better selection
- Custom Models: Easy to swap YOLOv3 for newer models
- Caching: Store detection results to avoid reprocessing
Files Modified
- ✏️
/miku-discord/bot/utils/profile_picture_manager.py- API integration - ✏️
/miku-discord/bot/requirements.txt- Removed anime-face-detector - ✏️
/anime-face-detector-gpu/docker-compose.yml- Added network config
Documentation
- 📄 Face Detector API docs:
/anime-face-detector-gpu/README_API.md - 📄 Setup guide:
/anime-face-detector-gpu/SETUP_COMPLETE.md - 📄 Profile picture feature:
/miku-discord/PROFILE_PICTURE_IMPLEMENTATION.md