A production-grade image classification system built with PyTorch, fine-tuned from ImageNet weights on a custom 12-class object dataset. Packaged as a Dockerized REST API with Grad-CAM visual explainability.
This project demonstrates an end-to-end deep learning pipeline for image classification. Starting from a pretrained ResNet-50 backbone, the model is fine-tuned on a 12-class custom dataset using modern training techniques including mixed-precision training (FP16), cosine annealing scheduling, and an augmentation-heavy data pipeline.
The final model is served through a FastAPI REST interface and containerized with Docker for reproducible deployment. Grad-CAM integration provides visual explanations of model decisions, making predictions interpretable for downstream users.
Custom Dataset class with ImageFolder format. Augmentations: flip, color jitter, rotation, normalization.
ResNet-50 pretrained on ImageNet. Custom classification head with dropout for 12-class output.
AdamW optimizer + CosineAnnealingLR. Mixed precision with torch.cuda.amp — 38% faster convergence.
Top-1 / Top-5 accuracy, confusion matrix, and Grad-CAM heatmaps for visual explainability.
FastAPI server with POST /predict endpoint. Returns class, confidence, and top-5 rankings.
Fully Dockerized. Build once, run anywhere — on CPU or GPU with identical behaviour.
torchvision.models.resnet50(pretrained=True)pip install -r requirements.txt
data/
├── train/
│ ├── class_1/
│ └── class_2/
└── val/
├── class_1/
└── class_2/
python src/train.py \
--data_dir data/ \
--epochs 30 \
--batch_size 64 \
--lr 1e-4 \
--output_dir outputs/
python src/evaluate.py \
--checkpoint outputs/best_model.pth \
--data_dir data/val/ \
--gradcam
uvicorn src.api:app --host 0.0.0.0 --port 8000
# POST /predict with form-data: file=<image>
docker build -t resnet50-classifier .
docker run -p 8000:8000 resnet50-classifier
import requests
with open("image.jpg", "rb") as f:
response = requests.post(
"http://localhost:8000/predict",
files={"file": f}
)
print(response.json())
# {
# "predicted_class": "cat",
# "confidence": 0.9731,
# "top5": [["cat", 0.973], ["lynx", 0.018], ...]
# }