maxwoe/image-rotation-angle-estimation
1594
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
Usage
Download the inference code from this Hub repo (model_cgd.py, architectures.py, rotation_utils.py), then:
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)
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
