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 slugoriented_rcnn_dota_le90_3xrotated_fcos_dota_le90_3x
eval-val mAP5079.40%82.32%
Architecturetwo-stage (RPN + oriented RoIAlign)one-stage, anchor-free
Parameters41.3M36.2M
Checkpoint size315 MB276 MB
3× train wall (NVIDIA L4)5d 10h 56m23h 4m (~5.7× faster)
Mean epoch (incl. periodic mAP)3h 38m37m 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.

Input: demo.jpg — DOTA aerial bus lot

Input: demo.jpg — DOTA aerial bus lot

Oriented R-CNN 3× — 102 detections @ score ≥ 0.3

Oriented R-CNN 3× — 102 detections @ score ≥ 0.3

Rotated FCOS 3× — 100 detections @ score ≥ 0.3

Rotated FCOS 3× — 100 detections @ score ≥ 0.3

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 floorOriented R-CNN dets (demo.jpg)FCOS dets (demo.jpg)Oriented R-CNN (large.jpg)FCOS (large.jpg)
0.05104113334354
0.25102101321321
0.30102100318314
0.5010287310250
0.70984129643

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.

ImageWindowsOriented R-CNNRotated FCOSSpeedup
Sparse DOTA tiles (avg of 4)10.38 s0.20 s~1.9×
demo.jpg (dense vehicles)10.48 s0.42 s~1.15×
large.jpg harbor62.98 s1.73 s~1.7×

On sparse tiles the one-stage head is almost 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).

ModelStarted → finishedTotal wallMean epochMin / max epoch
Oriented R-CNN 3×2026-06-21 → 2026-06-265d 10h 56m3h 38m2h 37m / 4h 46m
Rotated FCOS 3×2026-08-31 → 2026-09-0123h 4m37m 54s31m 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.

Input: large.jpg — marina with ships at many headings

Input: large.jpg — marina with ships at many headings

Oriented R-CNN 3× — 318 dets (281 ship)

Oriented R-CNN 3× — 318 dets (281 ship)

Rotated FCOS 3× — 314 dets (282 ship)

Rotated FCOS 3× — 314 dets (282 ship)

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.

Planes — Oriented R-CNN 3×

Planes — Oriented R-CNN 3×

Planes — Rotated FCOS 3×

Planes — Rotated FCOS 3×

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

Storage tanks — Oriented R-CNN 3×

Storage tanks — Oriented R-CNN 3×

Storage tanks — Rotated FCOS 3×

Storage tanks — Rotated FCOS 3×

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

GoalPick
Fast macOS / MPS demo, one-stage stackrotated_fcos_dota_le90_3x
Fast 3× training iteration on a single L4rotated_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 tutorialsoriented_rcnn_dota_le90_3x
Ships / elongated classes as the productPrefer 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


Written on September 2, 2026 by Jeff Faudi. Link to heading