Rahiq's picture
Deploy waste classification backend with ML model
bf17f74
# Backend Inference Service
FastAPI-based REST API for waste classification inference and feedback collection.
## Setup
### 1. Install Dependencies
\`\`\`bash
pip install -r backend/requirements.txt
pip install -r ml/requirements.txt
\`\`\`
### 2. Train or Download Model
Ensure you have a trained model at `ml/models/best_model.pth`:
\`\`\`bash
# Train a model
python ml/train.py
# Or download a pretrained model (if available)
# Place it in ml/models/best_model.pth
\`\`\`
### 3. Start Service
\`\`\`bash
# Development
python backend/inference_service.py
# Production with Gunicorn
gunicorn backend.inference_service:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
\`\`\`
Service will be available at `http://localhost:8000`
## API Endpoints
### Health Check
\`\`\`bash
GET /
GET /health
\`\`\`
Response:
\`\`\`json
{
"status": "healthy",
"model_loaded": true,
"timestamp": "2024-01-01T00:00:00"
}
\`\`\`
### Predict
\`\`\`bash
POST /predict
Content-Type: application/json
{
"image": "data:image/jpeg;base64,/9j/4AAQ..."
}
\`\`\`
Response:
\`\`\`json
{
"category": "recyclable",
"confidence": 0.95,
"probabilities": {
"recyclable": 0.95,
"organic": 0.02,
"wet-waste": 0.01,
"dry-waste": 0.01,
"ewaste": 0.005,
"hazardous": 0.003,
"landfill": 0.002
},
"timestamp": 1704067200000
}
\`\`\`
### Feedback
\`\`\`bash
POST /feedback
Content-Type: application/json
{
"image": "data:image/jpeg;base64,/9j/4AAQ...",
"predicted_category": "recyclable",
"corrected_category": "organic",
"confidence": 0.75
}
\`\`\`
Response:
\`\`\`json
{
"status": "success",
"message": "Feedback saved for retraining",
"saved_path": "ml/data/retraining/organic/feedback_20240101_120000.jpg"
}
\`\`\`
### Trigger Retraining
\`\`\`bash
POST /retrain
Authorization: Bearer <ADMIN_API_KEY>
\`\`\`
Response:
\`\`\`json
{
"status": "started",
"message": "Retraining initiated with 150 new samples",
"feedback_count": 150
}
\`\`\`
### Retraining Status
\`\`\`bash
GET /retrain/status
\`\`\`
Response:
\`\`\`json
{
"status": "success",
"total_retrains": 3,
"events": [...],
"latest": {
"version": 3,
"timestamp": "2024-01-01T00:00:00",
"accuracy": 92.5,
"improvement": 2.3,
"new_samples": 150
}
}
\`\`\`
### Statistics
\`\`\`bash
GET /stats
\`\`\`
Response:
\`\`\`json
{
"model_loaded": true,
"categories": ["recyclable", "organic", ...],
"feedback_samples": 150,
"feedback_by_category": {
"recyclable": 45,
"organic": 38,
...
}
}
\`\`\`
## Docker Deployment
### Build and Run
\`\`\`bash
# Build image
docker build -f backend/Dockerfile -t waste-classification-api .
# Run container
docker run -p 8000:8000 \
-v $(pwd)/ml/models:/app/ml/models \
-v $(pwd)/ml/data:/app/ml/data \
waste-classification-api
\`\`\`
### Using Docker Compose
\`\`\`bash
# Start all services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down
\`\`\`
## Environment Variables
- `PORT`: Server port (default: 8000)
- `ADMIN_API_KEY`: Admin key for retraining endpoint
## Performance
- **Inference Time**: ~50ms per image (CPU)
- **Throughput**: ~20 requests/second (single worker)
- **Memory**: ~500MB with model loaded
- **Scaling**: Deploy multiple workers for higher throughput
## Production Deployment
### Railway / Render
1. Connect your repository
2. Set build command: `pip install -r backend/requirements.txt -r ml/requirements.txt`
3. Set start command: `python backend/inference_service.py`
4. Set environment variables
5. Deploy
### AWS EC2
1. Launch EC2 instance (t3.medium or higher)
2. Install Docker
3. Clone repository
4. Run with Docker Compose
5. Configure security group (port 8000)
6. Set up SSL with Nginx reverse proxy
### Vercel (Not Recommended)
FastAPI with ML models exceeds serverless function limits. Use Railway, Render, or AWS EC2 instead.
## Monitoring
Add application monitoring:
\`\`\`python
from prometheus_fastapi_instrumentator import Instrumentator
Instrumentator().instrument(app).expose(app)
\`\`\`
Access metrics at `/metrics`
## Security
- Add rate limiting with `slowapi`
- Implement proper authentication
- Validate image sizes and formats
- Use HTTPS in production
- Restrict CORS origins
- Sanitize file uploads
\`\`\`