In June we ran Oriented R-CNN on a MacBook with --device mps — no CUDA toolchain, one CLI command, rotated boxes on a real aerial tile. v0.2.0 added a fourth detector family: Rotated FCOS, an anchor-free single-stage model with a decoded-rIoU 3× Hub checkpoint.
This post puts both on the same Mac and the same images. Same canvas, same NMS, same score floor — Apple M1 Max, PyTorch MPS, Hub 3× weights. We also pull the training wall times from the published Hub runs (same NVIDIA L4 recipe). The question is practical: does the new one-stage model feel good enough on a laptop to replace the two-stage demo default?
Short answer: yes for most scenes, with one caveat about score thresholds. FCOS is faster at inference and about 5.7× faster to train, slightly more accurate on the published DOTA eval-val protocol, and visually competitive — but its scores are less peaked, so the old --score-thr 0.7 from the Oriented R-CNN walkthrough will silently drop half the boxes.
What we compare Link to heading
| Oriented R-CNN 3× | Rotated FCOS 3× | |
|---|---|---|
| Hub slug | oriented_rcnn_dota_le90_3x | rotated_fcos_dota_le90_3x |
| eval-val mAP50 | 79.40% | 82.32% |
| Architecture | two-stage (RPN + oriented RoIAlign) | one-stage, anchor-free |
| Parameters | 41.3M | 36.2M |
| Checkpoint size | 315 MB | 276 MB |
| 3× train wall (NVIDIA L4) | 5d 10h 56m | 23h 4m (~5.7× faster) |
| Mean epoch (incl. periodic mAP) | 3h 38m | 37m 54s |
Both are ResNet-50 + FPN, DOTA le90, train+val pretrain / val eval. The current Hub asset is the refreshed decoded-rIoU run at 82.32%.
Inference numbers below: Apple M1 Max, 64 GB unified memory, PyTorch 2.13.0, oriented-det 0.2.0, --device mps. Protocol: score ≥ 0.3, merge NMS IoU ≤ 0.1 (FCOS eval NMS; same floor for both). Training wall times come from the Hub run logs on a single NVIDIA L4 (see below).
Quick start Link to heading
From an oriented-det checkout with the usual macOS install (uv pip install torch torchvision then uv pip install -e .):
odet pretrained download rotated_fcos_dota_le90_3x
odet pretrained download oriented_rcnn_dota_le90_3x
odet image-demo demo/demo.jpg hf://rotated_fcos_dota_le90_3x \
--out-file demo_fcos.png \
--device mps \
--score-thr 0.3 \
--nms-thr 0.1
Swap the slug for Oriented R-CNN. Keep --nms-thr 0.1 unless you have a reason to match a two-stage production config (0.3). And prefer --score-thr 0.3 (or 0.25) for FCOS — more on that below.
Bus lot: same scene as the June demo Link to heading
demo/demo.jpg is the 1024×1024 DOTA tile from the macOS walkthrough — diagonal buses and trucks, the scene where axis-aligned boxes look silly.



Counts at score ≥ 0.3 are nearly identical (102 vs 100). Box geometry looks right on both: headings follow the chevron parking, large-vehicle / small-vehicle labels match. The visible difference is score calibration — Oriented R-CNN piles many boxes near 1.00; FCOS spreads them across roughly 0.4–0.9. That is expected for a one-stage sigmoid head versus a two-stage ROI classifier, but it changes which CLI threshold you want.
Score thresholds: do not copy --score-thr 0.7 onto FCOS
Link to heading
The June post used --score-thr 0.7 for a clean Oriented R-CNN overlay. On that same checkpoint family it still works. On FCOS it does not:
| Score floor | Oriented R-CNN dets (demo.jpg) | FCOS dets (demo.jpg) | Oriented R-CNN (large.jpg) | FCOS (large.jpg) |
|---|---|---|---|---|
| 0.05 | 104 | 113 | 334 | 354 |
| 0.25 | 102 | 101 | 321 | 321 |
| 0.30 | 102 | 100 | 318 | 314 |
| 0.50 | 102 | 87 | 310 | 250 |
| 0.70 | 98 | 41 | 296 | 43 |
At 0.3 the two models agree. At 0.7, FCOS keeps fewer than half the boxes while Oriented R-CNN barely flinches. For FCOS demos, start at 0.25–0.30 (the train-val / F1-maximizing region from the v0.2.0 report).
Latency on MPS Link to heading
Timed after warmup; mean of 5 single-forward runs (or 3 for the tiled harbor). Canvas 1024×1024, ORIENTED_DET auto window batch 32 on MPS.
| Image | Windows | Oriented R-CNN | Rotated FCOS | Speedup |
|---|---|---|---|---|
| Sparse DOTA tiles (avg of 4) | 1 | 0.38 s | 0.20 s | ~1.9× |
demo.jpg (dense vehicles) | 1 | 0.48 s | 0.42 s | ~1.15× |
large.jpg harbor | 6 | 2.98 s | 1.73 s | ~1.7× |
On sparse tiles the one-stage head is almost 2× faster. On the dense bus lot the gap shrinks because final oriented NMS (Python, AABB-prefiltered) scales with detection count — both emit ~100 boxes, so NMS dominates. The harbor tile (six overlapping windows, ~300 ships) still favors FCOS by about 40%.
Neither model needs custom CUDA kernels. MPS just works.
Training wall time (same L4 recipe) Link to heading
The Hub 3× checkpoints were trained on the same DOTA tile recipe: 13,691 train+val tiles, batch size 2, 36 epochs, milestones at 24 / 33, single NVIDIA L4. Timings are from the published sidecar logs (oriented_rcnn_r50_fpn_dota_le90_3x-68957f98.log, rotated_fcos_r50_fpn_dota_le90_3x-6e383331.log).
| Model | Started → finished | Total wall | Mean epoch | Min / max epoch |
|---|---|---|---|---|
| Oriented R-CNN 3× | 2026-06-21 → 2026-06-26 | 5d 10h 56m | 3h 38m | 2h 37m / 4h 46m |
| Rotated FCOS 3× | 2026-08-31 → 2026-09-01 | 23h 4m | 37m 54s | 31m 11s / 57m 30s |
Rotated FCOS finishes the 3× schedule in under a day — about 5.7× less wall clock than Oriented R-CNN on the same GPU and data. Train-only epochs (no periodic mAP) sit around 31–33 minutes for FCOS versus a few hours for Oriented R-CNN; mAP-every-4 epochs stretch both (FCOS peaks near 57 minutes when GPU-sampled val mAP runs).
That gap is architectural: Oriented R-CNN pays for an RPN plus oriented RoIAlign on every proposal every step. FCOS is a single dense head over P3–P7. The July ProbIoU post already showed Rotated Faster R-CNN (~58 min/epoch) beating Oriented R-CNN on training cost; FCOS lands in a similar per-epoch band while staying one-stage and anchor-free.
If you are iterating recipes on a single L4, that is the difference between waiting overnight and waiting almost a week for a 3× run.
Harbor: sliding-window ships Link to heading
Same large.jpg as the v0.1.1 harbor demo (1299×1904). The DOTA recipe tiles oversized rasters; here that is six 1024 windows with 200 px overlap.



odet image-demo demo/large.jpg hf://rotated_fcos_dota_le90_3x \
--out-file large_fcos.png \
--device mps \
--score-thr 0.3 \
--nms-thr 0.1
Ship counts match almost exactly. Visually both cover the moored rows; FCOS finishes in under two seconds on this machine.
Planes and storage tanks Link to heading
Two more DOTA val tiles for class variety — airport apron and tank farm — same thresholds.


Both find the nine aircraft. FCOS scores sit in the 0.8s; Oriented R-CNN saturates at 1.00. Parking-lot vehicles are comparable.


Compact circular tanks are a published FCOS strength on eval-val (ahead of Faster R-CNN on that class in the v0.2.0 note). On this tile both models land the visible tanks cleanly.
When to pick which Link to heading
| Goal | Pick |
|---|---|
| Fast macOS / MPS demo, one-stage stack | rotated_fcos_dota_le90_3x |
| Fast 3× training iteration on a single L4 | rotated_fcos_dota_le90_3x (~23 h vs ~5.5 days) |
| Highest DOTA-style accuracy (Linux/CUDA zoo) | rotated_faster_rcnn_dota_le90_3x (83.42%) |
| Rotated RoIAlign behaviour / continuity with June tutorials | oriented_rcnn_dota_le90_3x |
| Ships / elongated classes as the product | Prefer Faster R-CNN ProbIoU or Oriented R-CNN; FCOS trails on ship/bridge/GTF in the published per-class tables |
For laptop demos after v0.2, Rotated FCOS 3× is the better default than Oriented R-CNN 1×/3×: higher published mAP50, fewer parameters, faster MPS inference, much cheaper 3× training, and no RPN. Keep score thresholds in the 0.25–0.30 band and NMS at 0.1.
Commands (copy-paste) Link to heading
# Prefetch
odet pretrained download rotated_fcos_dota_le90_3x
odet pretrained download oriented_rcnn_dota_le90_3x
# FCOS on the June bus-lot tile
odet image-demo demo/demo.jpg hf://rotated_fcos_dota_le90_3x \
--out-file demo_fcos.png --device mps --score-thr 0.3 --nms-thr 0.1
# Side-by-side Oriented R-CNN
odet image-demo demo/demo.jpg hf://oriented_rcnn_dota_le90_3x \
--out-file demo_orcnn.png --device mps --score-thr 0.3 --nms-thr 0.1
# Harbor (sliding windows)
odet image-demo demo/large.jpg hf://rotated_fcos_dota_le90_3x \
--out-file large_fcos.png --device mps --score-thr 0.3 --nms-thr 0.1
References Link to heading
- oriented-det on GitHub
- Pretrained zoo —
rotated_fcos_dota_le90_3x,oriented_rcnn_dota_le90_3x(sidecar.logfiles hold the train timing summaries) - Rotated FCOS recipes
- Previous: Oriented-Det v0.2.0 · macOS Oriented R-CNN walkthrough · Faster R-CNN training-cost context