maxwoe's picture
Update model card
cd023dd
---
license: mit
tags:
- image-rotation
- orientation-estimation
- angle-detection
- circular-gaussian-distribution
- mambaout
- pytorch
datasets:
- coco
metrics:
- mae
pipeline_tag: image-classification
---
# Image Rotation Angle Estimation
**[Try the interactive demo](https://huggingface.co/spaces/maxwoe/image-rotation-angle-estimation)** | **[GitHub](https://github.com/maxwoe/image-rotation-angle-estimation)** | **[Paper](https://arxiv.org/abs/2603.25351)**
Predicts the rotation angle of an image using the **Circular Gaussian Distribution (CGD)** method with a **MambaOut Base** backbone.
The model outputs a probability distribution over 360 angle bins (1 degree resolution) and extracts the predicted angle via argmax. It handles the full 360 degree range with no boundary discontinuities.
## Available Checkpoints
| Checkpoint | Dataset | MAE | Median Error |
|---|---|---|---|
| `cgd_mambaout_base_coco2017.ckpt` | COCO 2017 | 2.84° | 0.55° |
| `cgd_mambaout_base_coco2014.ckpt` | COCO 2014 | 3.71° | 0.68° |
## Usage
Download the inference code from this Hub repo (`model_cgd.py`, `architectures.py`, `rotation_utils.py`), then:
```python
from model_cgd import CGDAngleEstimation
from PIL import Image
# Load model (defaults to COCO 2017 checkpoint)
model = CGDAngleEstimation.from_pretrained("maxwoe/image-rotation-angle-estimation")
# Or load a specific checkpoint
# model = CGDAngleEstimation.from_pretrained(
# "maxwoe/image-rotation-angle-estimation",
# model_name="cgd_mambaout_base_coco2014.ckpt",
# )
image = Image.open("your_image.jpg")
angle = model.predict_angle(image)
print(f"Predicted rotation: {angle:.1f}°")
```
`predict_angle` accepts a PIL Image, numpy array, or file path.
## Evaluation Results (COCO 2017, 5 seeds)
| Metric | Value |
|---|---|
| MAE | 2.84° |
| Median Error | 0.55° |
| RMSE | 8.45° |
| P90 Error | 3.54° |
| P95 Error | 12.00° |
| Accuracy at 2° | 90.2% |
| Accuracy at 5° | 97.5% |
| Accuracy at 10° | 98.1% |
## Model Details
- **Method:** Circular Gaussian Distribution (CGD), 360 bins, sigma = 6.0°
- **Backbone:** MambaOut Base (`mambaout_base.in1k`), pretrained on ImageNet-1K
- **Input size:** 224 x 224 pixels
- **Output:** Probability distribution over 360 angle bins, converted to angle via argmax
- **Loss:** KL Divergence with soft Gaussian labels
- **Optimizer:** AdamW with ReduceLROnPlateau scheduler
## License
MIT