--- 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