Instance-segmentation model for the "hang the wire" hook mission of the SAE
Brasil Eletroquad 2026 competition, trained by
Black Bee Drones. It segments two
classes - rose (each visible segment of the suspended rope) and sphere
(the orange sphere on the rope) - and runs on every control-loop tick of the
mission. The team finished 2nd overall
(official results).
yolo26n-seg.pt (Ultralytics)rose (0), sphere (1)The drone takes off, finds the orange sphere mounted on one of two suspended
ropes, parks a fixed distance from it, picks which side of the rope to fly
along, turns perpendicular to the rope, descends on LIDAR, releases a hook with
a servo, and lands. Because each visible rope segment is its own rose
instance, the controller can measure both rope arms and choose a side. The
mission runs on a Jetson Orin Nano through
Nectar SDK.
Evaluated on the dataset's test split (395 images, 501 instances), NMS
iou=0.6. The numbers below are Ultralytics-native (COCO 101-point
interpolation); see SUMMARY.md for the full breakdown, including
the SDK/torchmetrics figures (which run a different curve discretization and
read systematically lower at mAP@50-95).
| Metric | Box | Mask |
|---|---|---|
| mAP@50 | 0.9929 | 0.9844 |
| mAP@50-95 | 0.9640 | 0.8535 |
Per-class mAP@50-95:
| Class | Box | Mask |
|---|---|---|
rose |
0.9450 | 0.7555 |
sphere |
0.9831 | 0.9515 |
Operating-point precision / recall / F1 at the per-class optimal confidences (from the F1 curve):
| Class | conf | Box P / R / F1 | Mask P / R / F1 |
|---|---|---|---|
rose |
0.47 | 0.963 / 0.975 / 0.969 | 0.946 / 0.958 / 0.952 |
sphere |
0.70 | 0.987 / 0.993 / 0.990 | 0.987 / 0.993 / 0.990 |
| Setting | Value |
|---|---|
imgsz |
960 |
iou (NMS) |
0.6 |
conf (rose) |
0.47 |
conf (sphere) |
0.70 |
Predict at the lower of the two confidences and apply a per-class filter, so each class keeps its own threshold.
from nectar.ai.segmentation import Segmentor
from nectar.ai.detection.postprocess import PerClassConfidenceFilter
# loads weights/best.pt from the Hub
segmentor = Segmentor("blackbeedrones/sae-2026-hang-all-yolo26n-seg-v2-960")
segmentor.load()
result = segmentor.segment(image, conf=0.47, iou=0.6, imgsz=960)
# rose=0, sphere=1
per_class = PerClassConfidenceFilter(threshold_mapping={0: 0.47, 1: 0.70}, default_threshold=0.47)
kept = per_class.filter(result.to_supervision())
for seg in result:
print(seg.class_name, f"{seg.confidence:.2f}", f"area={seg.mask_area}px")
from huggingface_hub import hf_hub_download
from ultralytics import YOLO
weights = hf_hub_download("blackbeedrones/sae-2026-hang-all-yolo26n-seg-v2-960", "weights/best.pt")
model = YOLO(weights)
results = model.predict("image.jpg", imgsz=960, iou=0.6, conf=0.47)
Trained with Ultralytics through the Nectar SDK on
blackbeedrones/sae-2026-hook
(Roboflow sae-2026-hang v2: 9,235 train / 396 val / 395 test images). Full
configuration in experiment.config.yaml.
| Parameter | Value |
|---|---|
| Base model | yolo26n-seg.pt |
| Image size | 960 |
| Batch size | 48 |
| Epochs | up to 250, early-stopped at 165 (patience 20) |
| LR / schedule | 0.01, linear with cosine (cos_lr), lrf=0.01 |
| Weight decay | 5e-4 |
| Warmup | 3 epochs |
| EMA | on (decay 0.9997) |
| Augmentation | mosaic 1.0 (closed last 10 epochs), HSV, fliplr 0.5, scale 0.5, translate 0.1 |
| Mask | overlap_mask=true, mask_ratio=4 |
| Seed | 42 |
weights/best.pt - recommended checkpoint (best validation).weights/last.pt, weights/epoch*.pt - last and per-epoch checkpoints.evaluation/ - curves, confusion matrix, prediction samples, per-class CSV/JSON.experiment.config.yaml, args.yaml, results.csv - training configuration and log.SUMMARY.md - full evaluation breakdown and threshold analysis.weights/last.pt 19 MBweights/best.pt 19 MBweights/epoch199.pt 19 MBweights/epoch198.pt 19 MBweights/epoch197.pt 19 MBweights/epoch196.pt 19 MBweights/epoch195.pt 19 MBweights/epoch194.pt 19 MBweights/epoch193.pt 19 MBweights/epoch192.pt 19 MBweights/epoch191.pt 19 MBweights/epoch190.pt 19 MBweights/epoch189.pt 19 MBweights/epoch188.pt 19 MBweights/epoch187.pt 19 MBweights/epoch186.pt 19 MBweights/epoch185.pt 19 MBweights/epoch184.pt 19 MBweights/epoch183.pt 19 MBweights/epoch182.pt 19 MBweights/epoch181.pt 19 MBweights/epoch180.pt 19 MBweights/epoch179.pt 19 MBweights/epoch178.pt 19 MBweights/epoch177.pt 19 MBweights/epoch176.pt 19 MBweights/epoch175.pt 19 MBweights/epoch174.pt 19 MBweights/epoch173.pt 19 MBweights/epoch172.pt 19 MBweights/epoch171.pt 19 MBweights/epoch170.pt 19 MBweights/epoch169.pt 19 MBweights/epoch168.pt 19 MBweights/epoch167.pt 19 MBweights/epoch166.pt 19 MBweights/epoch165.pt 19 MBweights/epoch164.pt 19 MBweights/epoch163.pt 19 MBweights/epoch162.pt 19 MBweights/epoch161.pt 19 MBweights/epoch160.pt 19 MBweights/epoch159.pt 19 MBweights/epoch158.pt 19 MBweights/epoch157.pt 19 MBweights/epoch156.pt 19 MBweights/epoch155.pt 19 MBweights/epoch154.pt 19 MBweights/epoch153.pt 19 MBweights/epoch152.pt 19 MBweights/epoch151.pt 19 MBweights/epoch150.pt 19 MBweights/epoch149.pt 19 MBweights/epoch148.pt 19 MBweights/epoch147.pt 19 MBweights/epoch146.pt 19 MBweights/epoch145.pt 19 MBweights/epoch144.pt 19 MBweights/epoch143.pt 19 MBweights/epoch142.pt 19 MBweights/epoch141.pt 19 MBweights/epoch140.pt 19 MBweights/epoch139.pt 19 MBweights/epoch138.pt 19 MBweights/epoch137.pt 19 MBweights/epoch136.pt 19 MBweights/epoch135.pt 19 MBweights/epoch134.pt 19 MBweights/epoch133.pt 19 MBweights/epoch132.pt 19 MBweights/epoch131.pt 19 MBweights/epoch130.pt 19 MBweights/epoch129.pt 19 MBweights/epoch128.pt 19 MBweights/epoch127.pt 19 MBweights/epoch126.pt 19 MBweights/epoch125.pt 19 MBweights/epoch124.pt 19 MBweights/epoch123.pt 19 MBweights/epoch122.pt 19 MBweights/epoch121.pt 19 MBweights/epoch120.pt 19 MBweights/epoch119.pt 19 MBweights/epoch118.pt 19 MBweights/epoch117.pt 19 MBweights/epoch116.pt 19 MBweights/epoch115.pt 19 MBweights/epoch114.pt 19 MBweights/epoch113.pt 19 MBweights/epoch112.pt 19 MBweights/epoch111.pt 19 MBweights/epoch110.pt 19 MBweights/epoch109.pt 19 MBweights/epoch108.pt 19 MBweights/epoch107.pt 19 MBweights/epoch106.pt 19 MBweights/epoch105.pt 19 MBweights/epoch104.pt 19 MBweights/epoch103.pt 19 MBweights/epoch102.pt 19 MBweights/epoch101.pt 19 MBweights/epoch100.pt 19 MBweights/epoch99.pt 19 MBweights/epoch98.pt 19 MBweights/epoch97.pt 19 MBweights/epoch96.pt 19 MBweights/epoch95.pt 19 MBweights/epoch94.pt 19 MBweights/epoch93.pt 19 MBweights/epoch92.pt 19 MBweights/epoch91.pt 19 MBweights/epoch90.pt 19 MBweights/epoch89.pt 19 MBweights/epoch88.pt 19 MBweights/epoch87.pt 19 MBweights/epoch86.pt 19 MBweights/epoch85.pt 19 MBweights/epoch84.pt 19 MBweights/epoch83.pt 19 MBweights/epoch82.pt 19 MBweights/epoch81.pt 19 MBweights/epoch80.pt 19 MBweights/epoch79.pt 19 MBweights/epoch78.pt 19 MBweights/epoch77.pt 19 MBweights/epoch76.pt 19 MBweights/epoch75.pt 19 MBweights/epoch74.pt 19 MBweights/epoch73.pt 19 MBweights/epoch72.pt 19 MBweights/epoch71.pt 19 MBweights/epoch70.pt 19 MBweights/epoch69.pt 19 MBweights/epoch68.pt 19 MBweights/epoch67.pt 19 MBweights/epoch66.pt 19 MBweights/epoch65.pt 19 MBweights/epoch64.pt 19 MBweights/epoch63.pt 19 MBweights/epoch62.pt 19 MBweights/epoch61.pt 19 MBweights/epoch60.pt 19 MBweights/epoch59.pt 19 MBweights/epoch58.pt 19 MBweights/epoch57.pt 19 MBweights/epoch56.pt 19 MBweights/epoch55.pt 19 MBweights/epoch54.pt 19 MBweights/epoch53.pt 19 MBweights/epoch52.pt 19 MBweights/epoch51.pt 19 MBweights/epoch50.pt 19 MBweights/epoch49.pt 19 MBweights/epoch48.pt 19 MBweights/epoch47.pt 19 MBweights/epoch46.pt 19 MBweights/epoch45.pt 19 MBweights/epoch44.pt 19 MBweights/epoch43.pt 19 MBweights/epoch42.pt 19 MBweights/epoch41.pt 19 MBweights/epoch40.pt 19 MBweights/epoch39.pt 19 MBweights/epoch38.pt 19 MBweights/epoch37.pt 19 MBweights/epoch36.pt 19 MBweights/epoch35.pt 19 MBweights/epoch34.pt 19 MBweights/epoch33.pt 19 MBweights/epoch32.pt 19 MBweights/epoch31.pt 19 MBweights/epoch30.pt 19 MBweights/epoch29.pt 19 MBweights/epoch28.pt 19 MBweights/epoch27.pt 19 MBweights/epoch26.pt 19 MBweights/epoch25.pt 19 MBweights/epoch24.pt 19 MBweights/epoch23.pt 19 MBweights/epoch22.pt 19 MBweights/epoch21.pt 19 MBweights/epoch20.pt 19 MBweights/epoch19.pt 19 MBweights/epoch18.pt 19 MBweights/epoch17.pt 19 MBweights/epoch16.pt 19 MBweights/epoch15.pt 19 MBweights/epoch14.pt 19 MBweights/epoch13.pt 19 MBweights/epoch12.pt 19 MBweights/epoch11.pt 19 MBweights/epoch10.pt 19 MBweights/epoch9.pt 19 MBweights/epoch8.pt 19 MBweights/epoch7.pt 19 MBweights/epoch6.pt 19 MBweights/epoch3.pt 19 MBweights/epoch5.pt 19 MBweights/epoch4.pt 19 MBweights/epoch2.pt 19 MBweights/epoch1.pt 19 MBweights/epoch0.pt 19 MB