观潮 · 模式预报与气象 AI 观察

行车记录仪画面判天气:YOLO26n 拿到 82.04% Top-1 foggy 类 13 张一张没判对

2026-10-09

> 同一个作者在同一个数据集、同一套划分、同一批指标下放出了两个天气分类模型卡:YOLO26n 与 YOLOv8n,7 类(clear / partly cloudy / overcast / rainy / snowy / foggy / unknown),标签来自 BDD100K 每张图的 attributes.weather 字段。10000 张 test 图上,YOLO26n 的 Top-1 是 82.04%、Macro F1 64.09%,YOLOv8n 是 81.22% 与 63.07%。两个模型对 foggy 类都是精确率、召回率、F1 全 0——该类在测试集里只有 13 张,模型卡直接写明"当作不支持的类别"。放在作者自己的 20 个模型横向表里,这两个分别排第 15 和第 20,第一名的 TinyViT-21M 是 83.90% / 68.65%。

这两个模型在做什么

任务是从行车记录仪单帧画面判断当时是什么天气,不是预报,是图像分类。

同一把尺子下的结果数字

整体(test 划分,10000 张)

指标 · YOLO26n · YOLOv8n

Top-1 accuracy · 82.04% · 81.22%

Top-5 accuracy · 99.77% · 99.75%

Macro F1 · 64.09% · 63.07%

Balanced accuracy · 62.46% · 61.42%

Macro precision · 66.57% · 65.52%

Macro recall · 62.46% · 61.42%

Top-1 和 Macro F1 之间接近 18 个百分点的落差,是类别不均衡的直接结果:clear 一类就占了 5346 张,超过一半。作者因此建议看 Macro F1 而不是 accuracy。

YOLO26n 分类别

类别 · 精确率 · 召回率 · F1 · 测试图数

clear · 89.75% · 92.85% · 91.28% · 5346

foggy · 0.00% · 0.00% · 0.00% · 13(极少)

overcast · 63.66% · 71.83% · 67.50% · 1239

partly cloudy · 68.77% · 63.55% · 66.06% · 738

rainy · 88.68% · 64.77% · 74.86% · 738

snowy · 83.12% · 68.53% · 75.12% · 769

unknown · 72.04% · 75.71% · 73.83% · 1157

YOLOv8n 分类别

类别 · 精确率 · 召回率 · F1 · 测试图数

clear · 89.31% · 92.63% · 90.94% · 5346

foggy · 0.00% · 0.00% · 0.00% · 13(极少)

overcast · 62.26% · 69.49% · 65.68% · 1239

partly cloudy · 66.03% · 61.11% · 63.48% · 738

rainy · 88.42% · 65.18% · 75.04% · 738

snowy · 81.67% · 67.23% · 73.75% · 769

unknown · 70.96% · 74.33% · 72.60% · 1157

逐类的行为差异比总分更能说明问题。 rainy 的精确率高达 88.68%(YOLO26n),但召回率只有 64.77%——模型说下雨的时候基本是对的,但漏掉了三分之一以上的雨天。overcast 反过来:召回 71.83%、精确率 63.66%,也就是把不少别的类也判成了阴天。这两个方向性差别在总分里完全看不出来。

20 个模型的横向位置

两张模型卡附了同一张 Model Zoo 表,20 个模型在完全相同的 test 划分上按 Top-1 排序。摘取首尾与本批两个模型:

排名 · 模型 · Top-1 · Macro F1 · Balanced acc · Macro precision

1 · TinyViT-21M · 83.90% · 68.65% · 67.15% · 74.81%

2 · EfficientViT-B3 · 83.51% · 68.17% · 66.34% · 81.75%

3 · EfficientViT-B2 · 83.46% · 66.07% · 65.04% · 67.54%

4 · EfficientFormerV2-L · 83.27% · 65.93% · 65.03% · 67.12%

5 · RepViT-M1.5 · 83.19% · 67.78% · 65.71% · 81.56%

13 · ResNet-18 · 82.19% · 64.30% · 62.97% · 66.08%

15 · **YOLO26n** · **82.04%** · **64.09%** · **62.46%** · **66.57%**

17 · YOLO26s · 81.46% · 65.14% · 62.61% · 69.75%

18 · YOLOv8s · 81.40% · 66.34% · 63.52% · 71.54%

20 · **YOLOv8n** · **81.22%** · **63.07%** · **61.42%** · **65.52%**

20 个模型的 Top-1 全部落在 81.22% 到 83.90% 之间,跨度 2.68 个百分点;Macro F1 的跨度是 63.07% 到 68.65%。换句话说,在这个划分上换架构的收益上限很小,任务本身被数据(类别不均衡、标签主观)卡住了,而不是被模型卡住。另外 YOLO26s 与 YOLOv8s 的 Macro F1(65.14% / 66.34%)都高于各自的 n 版本,但 Top-1 反而更低——又是总分与均衡指标的背离。

复制与训练配置

```python

from huggingface_hub import hf_hub_download

from ultralytics import YOLO

model = YOLO(hf_hub_download("dronefreak/bdd100k-weather-yolo26n-cls", "best.pt"))

probs = model("street.jpg", verbose=False)[0].probs

print(model.names[probs.top1], f"{float(probs.top1conf):.1%}")

```

设置 · YOLO26n · YOLOv8n

Epochs(上限 / 实跑) · 50 / 42 · 50 / 36

最优 epoch(`best.pt`) · 32 · 26

`best.pt` 依据 · valid 划分的 macro_f1 · valid 划分的 macro_f1

Early stopping patience · 10 · 10

Batch size · 128 · 128

图像尺寸 · 224 · 224

优化器 · auto → MuSGD(lr=0.01, momentum=0.9) · 同左

预训练 · True · True

Seed · 0 · 0

复现命令:bdd100k-evaluate --dataset bdd100k-weather --checkpoint <weights> --data-dir <prepared dir> --split test。仓库内的文件包括 best.pt、metrics.json、results.csv、results.png、两张混淆矩阵、val_batch0_pred.jpg 和一个演示视频。

原文图

YOLO26n 归一化混淆矩阵
YOLO26n 归一化混淆矩阵

图:YOLO26n 在 test 划分(10000 张)上的归一化混淆矩阵,7 类天气。foggy 的精确率、召回率、F1 都是 0.00%,也就是没有任何一张 foggy 图落在对角线上。

YOLOv8n 归一化混淆矩阵
YOLOv8n 归一化混淆矩阵

图:YOLOv8n 在同一划分上的同一张矩阵。逐类数字与 YOLO26n 接近,foggy 同样是三项全 0。

作者承认的限制

一句话判断

这两个模型卡的价值不在 82% 这个数字,而在于作者把"同一划分、同一指标、20 个模型"的横向表和逐类精确率/召回率一起放了出来——看完就能判断,这个任务现在的瓶颈是 foggy 这类长尾和数据本身的主观标签,不是换个 YOLO 版本能解决的。

在观潮中打开(含配图与交互)→