Six weeks after v0.1.1, Oriented-Det v0.2.0 is on PyPI and tagged on GitHub. The headline is a new detector family: Rotated FCOS, an anchor-free single-stage model that sits in the zoo as the balanced pick — close to Rotated Faster R-CNN accuracy, without a region proposal network.

This post is the release note: what landed, which Hub slug to download, and how the loss recipe (not the architecture name) is what moved the number.

Upgrade Link to heading

pip install -U oriented-det
# or pin:
pip install oriented-det==0.2.0

PyTorch is still installed separately for your platform (pytorch.org). Weights stay on Hugging Face at dl4eo/oriented-det-pretrained. The FCOS Hub slug is first-class in the CLI:

odet pretrained download rotated_fcos_dota_le90_1x

Headline: a fourth detector, and a decoded-IoU loss that actually trains Link to heading

v0.2 adds model_type: rotated_fcos. The head follows MMRotate’s Rotated FCOS: DistanceAnglePointCoder (left, top, right, bottom, angle), center-in-OBB assignment, centerness, and a sigmoid focal classifier. There are no anchors and no RPN.

The published FCOS weight is the 1× decoded rIoU checkpoint. Box regression is 1 − differentiable polygon IoU (oriented_det.ops.diff_iou_rotated) — not the Monte-Carlo sampled rIoU used for matching, and not encoded L1. Official DOTA v1.0 Task 1 is 73.07% AP50 — +1.79 versus MMRotate Rotated FCOS 1× (71.28%).

L1 and KFIoU-aux stay as recipes, not Hub downloads. ProbIoU stays the ROI-head recipe for Faster R-CNN; it is not the FCOS default.

Precision–recall curve for Rotated FCOS 1× decoded rIoU (local val monitor, not Task 1)

Precision–recall curve for Rotated FCOS 1× decoded rIoU (local val monitor, not Task 1)

The updated zoo Link to heading

All eight DOTA Hub slugs now have official Task 1 (hidden test). Recipes train on trainval, so local make eval-val is a leaky monitor — do not quote it as the zoo number.

Model1× AP503× AP50Δ AP501× AP753× AP75
Oriented R-CNN76.73%74.88%−1.8550.2451.23
Rotated Faster R-CNN74.42%74.48%+0.0641.9045.39
Rotated FCOS73.07%72.91%−0.1640.4045.39
Rotated RetinaNet (OBB)71.72%73.89%+2.1743.4647.11

Slugs are oriented_rcnn_dota_le90_{1x,3x}, rotated_faster_rcnn_dota_le90_{1x,3x}, rotated_fcos_dota_le90_{1x,3x}, rotated_retinanet_dota_le90_{1x,3x}. From 0.3.1 the un-suffixed RetinaNet slugs are OBB; circum-HBB is *_hbb.

Advertise and finetune from 1× for Oriented R-CNN, Faster R-CNN, and FCOS. 3× Task 1 AP50 is a drop or a wash; the 3× gain is box tightness (AP75). RetinaNet 3× is the AP50 exception: +2.17 on the hidden test versus 1×. 1× versus MMRotate 1×: Oriented R-CNN +1.04 vs 75.69, Faster R-CNN +1.02 vs 73.40, FCOS +1.79 vs 71.28, RetinaNet +3.30 vs OBB 68.42.

Default pick. Use oriented_rcnn_dota_le90_1x when you want the highest official Task 1 accuracy. Use rotated_faster_rcnn_dota_le90_1x when you want the throughput / finetune story from July. Use rotated_fcos_dota_le90_1x when you want a one-stage, anchor-free detector in the same Apache 2.0 stack — the roadmap’s balanced tier. RetinaNet stays as the MMRotate-parity legacy baseline; reach for rotated_retinanet_dota_le90_3x if you want that family’s Task 1 peak.

Why decoded rIoU, not another L1 run Link to heading

FCOS can regress boxes three ways in this release:

RecipeBox lossOn Hub?
L1Encoded ltrb + wrapped angleNo (local baseline)
L1 + KFIoU aux 0.1L1 primary, Gaussian KFIoU + heading termNo (recipe + eval report)
Decoded rIoU1 − polygon IoUYes — rotated_fcos_dota_le90_1x

L1 is stable and underfits the geometry. KFIoU aux recovers some heading on elongated boxes without a CUDA IoU kernel. Putting exact polygon IoU in the training loss is what closed most of the remaining gap to the two-stage zoo.

A 1× ProbIoU-aux FCOS recipe was tried and removed. ProbIoU stays the ROI-head recipe for Faster R-CNN; it is not the FCOS default.

FCOS eval uses evaluation.final_nms_iou_threshold: 0.1 (MMRotate FCOS). For a clean demo use --nms-thr 0.1. Deploy score is 0.20 (local F1-maximizing threshold 0.25 minus 0.05). Do not copy --score-thr 0.60 from the Faster R-CNN harbor demo onto FCOS.

Threshold sweep (precision, recall, F1) for Rotated FCOS 1× — local val monitor, not Task 1

Threshold sweep (precision, recall, F1) for Rotated FCOS 1× — local val monitor, not Task 1

On the local val sweep, F1 peaks at score 0.25 (77.0% precision / 83.6% recall, F1 0.802). That plot is a trainval monitor, not the published Task 1 number. The deploy floor is 0.20.

Where FCOS wins and where Faster R-CNN still leads Link to heading

Mean AP hides class geometry. Official Task 1 AP50:

ClassFCOS 1×FRCNN 1×Δ
large-vehicle76.0575.25+0.80
helicopter64.3863.63+0.75
roundabout64.6163.01+1.60
swimming-pool71.6672.27−0.61
storage-tank84.2884.41−0.13
small-vehicle79.3279.55−0.23
plane88.7489.40−0.66
ship87.2887.85−0.57
harbor65.0967.09−2.00
bridge50.7152.03−1.32
ground-track-field59.8871.39−11.51

FCOS is competitive on compact and mid-size objects. It is not ahead of Faster R-CNN on tanks or pools on Task 1. The remaining gap is concentrated on elongated classes — especially ground-track-field — the same geometry that made ProbIoU worth the July work. If ships or GTF are the product, start from Faster R-CNN or Oriented R-CNN. If you want a one-stage, anchor-free detector, FCOS 1× rIoU is the default in that lane.

Per-class tables, confusion matrices, and GT-alignment stats: docs/eval-reports/rotated_fcos_dota_le90_1x/.

Try it Link to heading

Same demo tile as the v0.1.1 harbor scene: demo/large.jpg in the oriented-det demo folder (1299×1904, ships at many headings). The DOTA recipe still uses a 1024×1024 canvas, so the image is tiled.

Input aerial tile — harbor with ships at many headings

Input aerial tile — harbor with ships at many headings

From the oriented-det repository root:

odet pretrained download rotated_fcos_dota_le90_1x

odet image-demo demo/large.jpg hf://rotated_fcos_dota_le90_1x \
  --out-file large_fcos_detections.png \
  --device mps \
  --score-thr 0.20 \
  --nms-thr 0.1

On Apple Silicon use --device mps; on Linux with CUDA, --device cuda:0. Keep --nms-thr 0.1 unless you have a reason to match a two-stage config. Recipes and training commands: configs/rotated_fcos/.

odet train --config configs/rotated_fcos/dota_le90_1x.json

What did not change Link to heading

Apache 2.0, no MMCV runtime, no custom CUDA kernels required to train or evaluate. JSON configs with _base_ inheritance, odet CLI, Hub slugs, eval reports under docs/eval-reports/. The v0.1.1 MMRotate parity fixes for two-stage heads and RetinaNet are unchanged.

What’s next Link to heading

v0.2 closed the “four ResNet-FPN detectors on DOTA” chapter. That chapter’s follow-up shipped as Oriented-Det v0.3.1 — HRSC / FAIR1M / SSDD / HRSID loaders, HRSC Hub 3×, RetinaNet OBB, and ONNX export. The public roadmap next is v0.4: a speed tier (RTMDet-R, native YOLO-OBB) without AGPL dependencies.


Written on August 28, 2026 by Jeff Faudi. Link to heading