|
Download README.md from PhonePixelGhost/Image_Classification_Service: direct link, hf CLI and curl.
- Browser
- Download file 4.94 kB
-
https://huggingface.co/spaces/PhonePixelGhost/Image_Classification_Service/resolve/main/README.md
- Command line
-
hf download hf://spaces/PhonePixelGhost/Image_Classification_Service/README.md
-
curl -L -o README.md https://huggingface.co/spaces/PhonePixelGhost/Image_Classification_Service/resolve/main/README.md
4.94 kB
| title: Image Classification Service | |
| emoji: πΌοΈ | |
| colorFrom: indigo | |
| colorTo: purple | |
| sdk: docker | |
| pinned: false | |
| # High-Throughput Image Classification Service | |
| A production-ready image classification API using ResNet-18 with ONNX optimization, FastAPI, and CI/CD pipeline. | |
| ## Features | |
| - **Optimized Model**: ResNet-18 converted to ONNX with dynamic quantization (~70% size reduction) | |
| - **High Performance**: ProcessPoolExecutor for concurrent request handling | |
| - **Production Ready**: Docker containerization, comprehensive error handling | |
| - **CI/CD Pipeline**: Automated testing and deployment to Hugging Face Spaces | |
| - **Comprehensive Testing**: pytest unit tests with 100% endpoint coverage | |
| ## Project Structure | |
| ``` | |
| image-classification-service/ | |
| βββ app/ | |
| β βββ __init__.py | |
| β βββ main.py # FastAPI application | |
| β βββ model.py # ONNX inference logic | |
| β βββ schemas.py # Pydantic models | |
| βββ models/ | |
| β βββ resnet18_quantized.onnx # Optimized model | |
| βββ tests/ | |
| β βββ test_api.py # Unit tests | |
| βββ scripts/ | |
| β βββ 01_baseline_test.py # PyTorch baseline benchmark | |
| β βββ 02_export_onnx.py # Export to ONNX | |
| β βββ 03_quantize.py # Dynamic quantization | |
| β βββ 04_benchmark_onnx.py # ONNX benchmark | |
| βββ .github/ | |
| β βββ workflows/ | |
| β βββ ci-cd.yml # GitHub Actions pipeline | |
| βββ Dockerfile | |
| βββ .dockerignore | |
| βββ requirements.txt | |
| βββ README.md | |
| ``` | |
| ## Quick Start | |
| ### 1. Install Dependencies | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| ### 2. Prepare the Model | |
| Run the optimization scripts in order: | |
| ```bash | |
| cd scripts | |
| python 01_baseline_test.py # Measure PyTorch baseline | |
| python 02_export_onnx.py # Export to ONNX | |
| python 03_quantize.py # Apply quantization | |
| python 04_benchmark_onnx.py # Compare performance | |
| cd .. | |
| ``` | |
| ### 3. Run the API | |
| ```bash | |
| uvicorn app.main:app --host 0.0.0.0 --port 7860 | |
| ``` | |
| ### 4. Test the API | |
| ```bash | |
| # Health check | |
| curl http://localhost:7860/health | |
| # Predict | |
| curl -X POST "http://localhost:7860/predict" \ | |
| -H "accept: application/json" \ | |
| -F "file=@/path/to/image.jpg" | |
| ``` | |
| ## Docker Deployment | |
| ### Build and Run | |
| ```bash | |
| docker build -t image-classifier . | |
| docker run -p 7860:7860 image-classifier | |
| ``` | |
| ## Testing | |
| ```bash | |
| pytest tests/ -v | |
| ``` | |
| ## API Endpoints | |
| ### GET /health | |
| Health check endpoint. | |
| **Response:** | |
| ```json | |
| { | |
| "status": "ok" | |
| } | |
| ``` | |
| ### POST /predict | |
| Image classification endpoint. | |
| **Request:** | |
| - Content-Type: `multipart/form-data` | |
| - Body: `file` (image file) | |
| **Response:** | |
| ```json | |
| { | |
| "label": "tabby, tabby cat", | |
| "score": 0.8234, | |
| "label_id": 281, | |
| "inference_time_ms": 45.123 | |
| } | |
| ``` | |
| **Error Codes:** | |
| - `400`: Corrupted or invalid image | |
| - `413`: File too large (max 10MB) | |
| - `415`: Unsupported media type | |
| - `500`: Inference error | |
| ## Performance Metrics | |
| | Format | File Size | Avg Latency | P95 Latency | | |
| |--------|-----------|-------------|-------------| | |
| | PyTorch | ~45 MB | baseline | baseline | | |
| | ONNX | ~45 MB | ~20% faster | - | | |
| | ONNX Quantized | ~12 MB | ~40% faster | - | | |
| *Run benchmark scripts to get actual measurements on your hardware* | |
| ## CI/CD Pipeline | |
| The GitHub Actions workflow automatically: | |
| 1. Runs unit tests on every push/PR | |
| 2. Deploys to Hugging Face Spaces on main branch (requires `HF_TOKEN` secret) | |
| ### Setup Hugging Face Deployment | |
| 1. Create a Hugging Face Space | |
| 2. Generate an access token with write permissions | |
| 3. Add `HF_TOKEN` to GitHub repository secrets | |
| 4. Update `.github/workflows/ci-cd.yml` with your Space URL | |
| ## Model Details | |
| - **Base Model**: microsoft/resnet-18 (Hugging Face) | |
| - **Task**: Image Classification (ImageNet-1k) | |
| - **Input**: RGB images (224x224) | |
| - **Output**: 1000 class probabilities | |
| - **Optimization**: ONNX + Dynamic Quantization (QUint8) | |
| ## Cloud API Usage | |
| The service is deployed on Hugging Face Spaces. You can access the API directly using the following endpoint: | |
| **Endpoint:** `https://phonepixelghost-image-classification-service.hf.space/predict` | |
| ### 1. Using cURL | |
| You can test the API from your terminal using this command: | |
| ```bash | |
| curl -X POST https://phonepixelghost-image-classification-service.hf.space/predict \ | |
| -F "file=@test.jpg" | |
| ``` | |
| ### 2. Interactive UI | |
| Visit the Space URL to use the modern web interface: | |
| [Hugging Face Space Demo](https://huggingface.co/spaces/PhonePixelGhost/Image_Classification_Service) | |
| ## Local Development | |
| ### Adding New Features | |
| 1. Update code in `app/` | |
| 2. Add tests in `tests/` | |
| 3. Run tests: `pytest tests/ -v` | |
| 4. Update documentation | |
| ### Performance Testing | |
| Use JMeter or similar tools to test throughput: | |
| - Concurrent users: 10, 50, 100 | |
| - Measure: TPS, P95 latency, error rate | |
| ## License | |
| MIT | |
| ## Acknowledgments | |
| - Model: microsoft/resnet-18 from Hugging Face | |
| - Framework: FastAPI, ONNX Runtime | |