efficientdet-pytorch
efficientdet-pytorch 是一个基于 PyTorch 框架实现的 EfficientDet 目标检测工具,旨在高度还原谷歌官方 TensorFlow 版本的效果,并提供了经过迁移验证的预训练权重。它主要解决了开发者在 PyTorch 生态中难以复现原版高效检测模型性能的问题,让用户无需依赖 TensorFlow 即可利用先进的 EfficientDet 架构进行高精度的物体识别。
这款工具非常适合计算机视觉领域的研究人员、算法工程师以及希望快速部署高性能检测模型的开发者使用。其核心亮点在于极高的灵活性与可配置性:不仅支持自由切换 BiFPN 连接模式和卷积类型,还允许用户通过参数轻松替换激活函数与归一化层。更独特的是,它能无缝集成 timm 库中任何支持特征提取的主干网络(如 EfficientNetV2),极大地便利了模型改进实验。此外,项目持续更新,已适配 PyTorch 2.0 编译加速及自适应梯度裁剪(AGC)等先进技术,在保证精度的同时显著提升了训练效率与推理速度。
使用场景
某电商物流团队正致力于开发一套自动化包裹分拣系统,需要实时识别传送带上不同尺寸和类型的货物以引导机械臂抓取。
没有 efficientdet-pytorch 时
- 精度与速度难以兼得:团队在轻量级模型(速度快但漏检多)和大型模型(精度高但延迟高)之间陷入两难,无法在边缘设备上同时满足实时性和高准确率要求。
- 自定义骨干网络困难:现有的开源实现大多将网络结构写死,团队想尝试引入更先进的 EfficientNetV2 作为骨干以提升特征提取能力,却因代码耦合度高而不得不大量重写底层逻辑。
- 复现官方效果成本高:直接迁移 Google 的 TensorFlow 官方权重到 PyTorch 环境极其繁琐,且其他社区版本往往无法从零训练复现 MS COCO 数据集上的基准性能,导致模型调优缺乏可靠起点。
- 实验迭代周期长:由于双向往特征金字塔(BiFPN)的连接模式固定,研究人员无法快速验证不同的特征融合策略对特定货物检测效果的影响。
使用 efficientdet-pytorch 后
- 实现最佳效能平衡:利用其提供的 D0-D7 及 Lite 系列预训练模型,团队迅速部署了适合边缘计算的方案,在保持低延迟的同时显著提升了小件货物的检出率。
- 灵活替换骨干网络:借助对
timm库的深度集成,开发人员仅通过修改配置参数即可无缝切换至 EfficientNetV2 等任意支持特征提取的骨干网络,无需改动核心代码。 - 无缝加载权威权重:直接加载已移植的 Google 官方权重(包括 AdvProp 增强版),模型初始性能即达到业界领先水平,大幅缩短了从环境搭建到业务验证的时间。
- 高效开展架构实验:BiFPN 连接模式和卷积类型完全可配置,算法工程师能快速调整特征融合策略,针对不规则包裹优化模型结构,加速了技术迭代。
efficientdet-pytorch 凭借其对官方实现的高保真还原与极高的架构灵活性,帮助团队在有限的算力资源下快速构建了高精度、低延迟的工业级目标检测系统。
运行环境要求
- Linux
需要 NVIDIA GPU(支持 CUDA),具体显存取决于模型大小和输入分辨率(例如 D7x 需较大显存),支持原生 PyTorch AMP
未说明

快速开始
EfficientDet (PyTorch)
EfficientDet 的 PyTorch 实现。
该实现基于:
- Mingxing Tan 和 Google Brain 团队 的官方 TensorFlow 实现
- Mingxing Tan、Ruoming Pang 和 Quoc V. Le 的论文《EfficientDet: 可扩展且高效的目标检测》(arXiv:1911.09070)
此外,还有其他 PyTorch 实现。然而,要么它们的方法不符合我正确复现 TensorFlow 模型的目标(同时保持 PyTorch 风格和灵活性),要么在从头开始训练 MS COCO 数据集时无法达到相近的性能。
除了默认的模型配置外,这里还提供了极大的灵活性,以支持实验和快速改进——其中一些选项源自官方 TensorFlow 实现,另一些则是我自创的:
- BiFPN 连接方式和组合模式完全可配置,不会硬编码到模型代码中。
- BiFPN 和头部模块可以在深度可分离卷积与标准卷积之间切换。
- 激活函数和批归一化层可通过参数切换(未来将支持配置)。
- 我的
timm模型库中任何支持特征提取(features_only参数)的骨干网络都可以用作主干网络。
更新日志
2023-05-21
- 依赖
timm0.9 版本。 - 修复了一些小 bug。
- 发布版本 0.4.1。
2023-02-09
- 测试 PyTorch 2.0(夜间构建版),并在训练和验证脚本中添加了
--torchcompile支持。 - 进行了一次小规模代码清理,确保与
timm0.8.x 及更早版本的前向和反向兼容性。 - 使用
timm的convert_sync_batchnorm函数,因为它可以处理包含BatchNormAct2d层的更新模型。
2022-01-06
- 新增
efficientnetv2_ds权重,在 1024x1024 分辨率下达到 50.1 mAP,采用 AGC 裁剪并使用timm的efficientnetv2_rw_s主干网络。内存占用与 D3 相当,速度比 D4 更快。由于训练批次大小略小,性能可能还有提升空间……
2021-11-30
- 将
efficientnetv2_dt权重更新为新版本:在 768x768 分辨率下达到 46.1 mAP,在 896x896 分辨率下达到 47.0 mAP,均采用 AGC 裁剪。 - 添加 AGC(自适应梯度裁剪)支持,通过
timm实现。灵感来源于论文《无需归一化的高性能大规模图像识别》(arXiv:2102.06171)。 timm的最低版本要求提升至 0.4.12。
2021-11-16
- 增加基于
timm的efficientnetv2_rw_t(tiny)模型的 EfficientNetV2 主干实验efficientnetv2_dt,在 768x768 分辨率下达到 45.8 mAP。 - 更新了 TF EfficientDet-Lite 模型定义,包括从官方实现移植的权重(GitHub: google/automl)。
- 对于 Lite 模型,更新了 FPN 中的特征尺寸调整代码,改为基于特征尺寸而非缩减比例,以便支持不能被 128 整除的图像尺寸。
- 进行了一些小调整和 bug 修复。
2021-07-28
- 在 README 中添加了 Chris Hughes 提供的训练示例,用于使用自定义数据集和 Lightning 训练代码进行训练。
2021-04-30
- 添加了来自 TF 实现的 D0-D5 级别 EfficientDet AdvProp-AA 权重,模型名称为
tf_efficientdet_d?_ap。
2021-02-18
- 添加了一些新的模型权重,使用双线性插值进行 FPN 中的上采样和下采样。
- 40.9 mAP -
efficientdet_q1(取代之前的 40.6 mAP 模型) - 43.2 mAP -
cspresdet50 - 45.2 mAP -
cspdarkdet53m
- 40.9 mAP -
2020-12-07
- 通过引入
timm中的 ModelEmaV2 以及之前的 TorchScript 兼容性改进,现在可以使用完全 JIT 编译的模型进行训练和基准测试(--torchscript)。对于 CPU 密集型训练,速度有显著提升。 - 添加了替代 FPN 布局的权重。包括 QuadFPN 实验(
efficientdet_q0/q1/q2)以及 CSPResDeXt + PAN(cspresdext50pan)。详见下方更新后的表格。特别感谢 Artus 为 Q2 模型的训练提供了资源。 - 头部模块的激活函数可以通过配置与 FPN 不同。
- FPN 的重采样(插值)可以通过配置指定,支持任意 F 插值方法或
max/avg池化。 - 默认焦点损失函数已改回
new_focal,若需使用原始版本,请使用--legacy-focal参数。旧版焦点损失占用内存较少,但数值稳定性较差。 - 可以将自定义增强变换和 collate 函数传递给数据加载器工厂。
- 需要
timm≥ 0.3.2,请务必检查自定义模型配置是否存在破坏性变更。 - 现在需要 PyTorch ≥ 1.6。
2020-11-12
- 在现有的 EfficientDet BiFPN 结构基础上,新增了实验性的 PAN 和 Quad FPN 配置,并附带两个测试模型配置。
- 将未训练的实验性模型配置默认切换为兼容 TorchScript 的 BN 头布局。
2020-11-09
- 创建后将模型配置设置为只读,以减少误用的可能性。
- 在前向传播调用链中不再访问模型或基准测试的
.config属性(以确保 TorchScript 兼容性)。 - 进行了许多小改动,使得模型或训练/预测基准测试能够被 JIT 编译。
2020-10-30
合并了几个月积累的修复和新增功能。
- 支持可变类别数且初始化正确的模型微调(在 train.py 中演示)
- 新的数据集接口,通过解析器类支持 COCO、VOC 2007/2012 和 OpenImages V5/Challenge2019 数据集
- 新增带有标签平滑选项的焦点损失定义,并支持将损失函数编译为 JIT 以提升速度
- 优化了几个性能瓶颈,提升了约 2% 的吞吐量和 GPU 利用率
- 基于 TensorFlow Models Evaluator 框架的 Pascal 和 OpenImages 评估器(也可用于其他数据集)
- 支持原生 PyTorch DDP、SyncBN 和 AMP(PyTorch >= 1.6),若已安装 APEX,则仍默认使用 APEX
- 模型现在允许非正方形输入图像尺寸(锚点布局)。通过模型配置中的 image_size 元组指定。目前每个维度仍需满足
size % 128 = 0 - 锚点目标生成既可以在数据加载器进程中通过 collate 函数完成,也可以像以前一样在模型中完成,有助于平衡计算负载
- 在将固定大小的批处理张量传递给目标分配器之前,从数据集注释中过滤掉未使用的类别和边界框,似乎能加快收敛速度
- 添加了对 Letterbox 的 Random Erasing 数据增强支持
- 添加了一个(非常慢的)SoftNMS 实现,用于推理和验证。目前可以手动启用,如有需求可添加参数
- 已在 PyTorch 1.7 上测试通过
- 添加 ResDet50 模型权重,mAP 达 41.6。
优先级列表中尚未完成的几项:
- Mosaic 数据增强
- bbox IOU 损失(尝试过一些,但效果不佳,需要时间调试和改进)
注意 存在一些破坏性变更:
- 预测和训练基准现在输出 XYXY 格式的边界框,而非之前的 XYWH。这是为了支持其他数据集,因为 XYWH 是 COCO 评估器的要求。
- TF Models Evaluator 使用 YXYX 格式的边界框,与模型一致。目前默认会进行 XYXY 到 YXYX 的转换。为什么不直接全部使用 YXYX?因为 PyTorch 的 GPU NMS 是基于 XYXY 的。
- 必须将
timm更新到最新版本(>=0.3),因为一些辅助 API 发生了变化。
在 VOC 和 OI 上进行了训练验证:
- 在 voc0712 上进行微调,未做任何超参数调整,mAP@50 达 80.0(大致如以下命令所示)
- 经过几天的训练(仅 6 个 epoch),OI Challenge2019 的 mAP@50 达 18.0!数据集更大,训练时间很长,许多类别也颇具挑战性。
模型
下表包含带有预训练权重的模型。我在 模型配置 中还定义了许多其他使用不同 timm 主干网络的模型。
| 变体 | mAP (val2017) | mAP (test-dev2017) | mAP (TF official val2017) | mAP (TF official test-dev2017) | 参数 (M) | 图像尺寸 |
|---|---|---|---|---|---|---|
| tf_efficientdet_lite0 | 27.1 | TBD | 26.4 | N/A | 3.24 | 320 |
| tf_efficientdet_lite1 | 32.2 | TBD | 31.5 | N/A | 4.25 | 384 |
| efficientdet_d0 | 33.6 | TBD | N/A | N/A | 3.88 | 512 |
| tf_efficientdet_d0 | 34.2 | TBD | 34.3 | 34.6 | 3.88 | 512 |
| tf_efficientdet_d0_ap | 34.8 | TBD | 35.2 | 35.3 | 3.88 | 512 |
| efficientdet_q0 | 35.7 | TBD | N/A | N/A | 4.13 | 512 |
| tf_efficientdet_lite2 | 35.9 | TBD | 35.1 | N/A | 5.25 | 448 |
| efficientdet_d1 | 39.4 | 39.5 | N/A | N/A | 6.62 | 640 |
| tf_efficientdet_lite3 | 39.6 | TBD | 38.8 | N/A | 8.35 | 512 |
| tf_efficientdet_d1 | 40.1 | TBD | 40.2 | 40.5 | 6.63 | 640 |
| tf_efficientdet_d1_ap | 40.8 | TBD | 40.9 | 40.8 | 6.63 | 640 |
| efficientdet_q1 | 40.9 | TBD | N/A | N/A | 6.98 | 640 |
| cspresdext50pan | 41.2 | TBD | N/A | N/A | 22.2 | 640 |
| resdet50 | 41.6 | TBD | N/A | N/A | 27.6 | 640 |
| efficientdet_q2 | 43.1 | TBD | N/A | N/A | 8.81 | 768 |
| cspresdet50 | 43.2 | TBD | N/A | N/A | 24.3 | 768 |
| tf_efficientdet_d2 | 43.4 | TBD | 42.5 | 43 | 8.10 | 768 |
| tf_efficientdet_lite3x | 43.6 | TBD | 42.6 | N/A | 9.28 | 640 |
| tf_efficientdet_lite4 | 44.2 | TBD | 43.2 | N/A | 15.1 | 640 |
| tf_efficientdet_d2_ap | 44.2 | TBD | 44.3 | 44.3 | 8.10 | 768 |
| cspdarkdet53m | 45.2 | TBD | N/A | N/A | 35.6 | 768 |
| efficientdetv2_dt | 46.1 | TBD | N/A | N/A | 13.4 | 768 |
| tf_efficientdet_d3 | 47.1 | TBD | 47.2 | 47.5 | 12.0 | 896 |
| tf_efficientdet_d3_ap | 47.7 | TBD | 48.0 | 47.7 | 12.0 | 896 |
| tf_efficientdet_d4 | 49.2 | TBD | 49.3 | 49.7 | 20.7 | 1024 |
| efficientdetv2_ds | 50.1 | TBD | N/A | N/A | 26.6 | 1024 |
| tf_efficientdet_d4_ap | 50.2 | TBD | 50.4 | 50.4 | 20.7 | 1024 |
| tf_efficientdet_d5 | 51.2 | TBD | 51.2 | 51.5 | 33.7 | 1280 |
| tf_efficientdet_d6 | 52.0 | TBD | 52.1 | 52.6 | 51.9 | 1280 |
| tf_efficientdet_d5_ap | 52.1 | TBD | 52.2 | 52.5 | 33.7 | 1280 |
| tf_efficientdet_d7 | 53.1 | 53.4 | 53.4 | 53.7 | 51.9 | 1536 |
| tf_efficientdet_d7x | 54.3 | TBD | 54.4 | 55.1 | 77.1 | 1536 |
有关模型检查点 URL 和差异,请参阅 模型配置。
注:所有模块的官方分数现在都使用 soft-nms,但此处仍使用普通 NMS。
注:在训练一些实验性模型时,我注意到分布式训练中同步 BatchNorm (--sync-bn) 和模型 EMA 权重平均 (--model-ema) 的组合可能存在潜在问题。结果要么是模型无法收敛,要么看似收敛(训练损失降低),但评估损失(运行中的 BN 统计信息)却完全错误。我没有在 EfficientNets 上观察到这种情况,但在 CspResNeXt、VoVNet 等一些主干网络上确实出现了。禁用 EMA 或 sync bn 中的任意一个似乎可以消除问题并得到良好的模型。我尚未完全确定这一问题的原因。
环境设置
已在 Linux 下的 Python 3.7 - 3.9 conda 环境中测试,环境包括:
- PyTorch 1.6 - 1.10
- PyTorch Image Models (timm) >= 0.4.12,可通过
pip install timm或从 https://github.com/rwightman/pytorch-image-models 本地安装 - Apex AMP master(截至 2020 年 8 月)。建议现在使用原生 PyTorch 的 AMP 和 DDP。
注意 - Numpy 1.18+ 与 pycocotools 2.0 存在冲突/bug,必须强制安装 Numpy <= 1.17.5,或确保安装 pycocotools >= 2.0.2。
数据集设置与使用
COCO
MSCOCO 2017 验证数据:
wget http://images.cocodataset.org/zips/val2017.zip
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
unzip val2017.zip
unzip annotations_trainval2017.zip
MSCOCO 2017 测试-dev 数据:
wget http://images.cocodataset.org/zips/test2017.zip
unzip -q test2017.zip
wget http://images.cocodataset.org/annotations/image_info_test2017.zip
unzip image_info_test2017.zip
COCO 评估
使用 D2 模型运行验证(默认为 val2017):python validate.py /localtion/of/mscoco/ --model tf_efficientdet_d2
运行 test-dev2017:python validate.py /localtion/of/mscoco/ --model tf_efficientdet_d2 --split testdev
COCO 训练
./distributed_train.sh 4 /mscoco --model tf_efficientdet_d0 -b 16 --amp --lr .09 --warmup-epochs 5 --sync-bn --opt fusedmomentum --model-ema
注意:
- 目前的训练脚本默认使用的模型不包含官方模型中的冗余卷积+BN偏置层,在进行验证时请设置正确的标志。
- 我只使用图像均值(
--fill-color mean)作为裁剪/缩放/纵横比填充的背景进行训练,而官方仓库则使用黑色像素(0)(--fill-color 0)。两者应该都能正常工作。 - 官方训练代码默认使用 EMA 权重平均,但在采用余弦学习率调度的情况下,这样做是否有必要尚不明确。我发现,在训练的最后 10%-20% 的周期中,非 EMA 权重的表现往往优于 EMA 权重。
- 默认的超参数设置非常接近不稳定状态(损失爆炸),不要尝试使用 Nesterov 动量。尽量保持较大的批量大小,并使用同步 BN。
Pascal VOC
支持 2007 年、2012 年以及 2007 年和 2012 年合并的数据集,并以 2007 年测试集作为验证集。
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
find . -name '*.tar' -exec tar xf {} \;
在 VOCdevkit 文件夹内应有 VOC2007 和 VOC2012 文件夹,命令行中数据集的根目录即为 VOCdevkit。
备用下载链接,速度较慢但更新频率高于 ox.ac.uk:
http://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
VOC 评估
在 VOC2012 验证集上进行评估:
python validate.py /data/VOCdevkit --model efficientdet_d0 --num-gpu 2 --dataset voc2007 --checkpoint mychekpoint.pth --num-classes 20
VOC 训练
将 COCO 预训练权重微调至 VOC 2007 + 2012:
/distributed_train.sh 4 /data/VOCdevkit --model efficientdet_d0 --dataset voc0712 -b 16 --amp --lr .008 --sync-bn --opt fusedmomentum --warmup-epochs 3 --model-ema --model-ema-decay 0.9966 --epochs 150 --num-classes 20 --pretrained
OpenImages
搭建 OpenImages 数据集需要一定的投入。尽管我在标注方面做了一些简化,但获取整个数据集仍然会花费不少时间。大约需要 560GB 的存储空间。
要下载图像数据,我推荐使用 CVDF 的打包方式。OpenImages 数据集主页、标注信息及数据集许可信息可在以下网址找到:https://storage.googleapis.com/openimages/web/index.html
CVDF 图像下载
请按照此处的 S3 下载说明操作:https://github.com/cvdfoundation/open-images-dataset#download-images-with-bounding-boxes-annotations
每个 train_<x>.tar.gz 文件都应解压到 train/<x> 文件夹中,其中 x 是从 0 到 F 的十六进制数字。validation.tar.gz 可以解压为扁平文件并放入 validation/ 文件夹中。
标注下载
标注可以单独从上述 OpenImages 主页下载。为了方便起见,我已将所有标注打包在一起,并添加了一些包含所有图像文件 ID 和统计信息的“info”CSV 文件。我的数据集依赖于 <set>-info.csv 文件。请参阅 https://storage.googleapis.com/openimages/web/factsfigures.html 查看这些标注的许可信息。标注由 Google LLC 根据 CC BY 4.0 许可证授权。图像则被列为 CC BY 2.0 许可证。
wget https://github.com/rwightman/efficientdet-pytorch/releases/download/v0.1-anno/openimages-annotations.tar.bz2
wget https://github.com/rwightman/efficientdet-pytorch/releases/download/v0.1-anno/openimages-annotations-challenge-2019.tar.bz2
find . -name '*.tar.bz2' -exec tar xf {} \;
数据布局
当所有内容下载并解压完成后,您的 OpenImages 数据文件夹根目录应包含以下内容:
annotations/<openimages v5/v6 的 CSV 标注>
annotations/challenge-2019/<challenge2019 的 CSV 标注>
train/0/<所有以 '0' 开头的图像文件>
.
.
.
train/f/<所有以 'f' 开头的图像文件>
validation/<所有图像文件放在同一个文件夹中>
OpenImages 训练
使用 Challenge2019 标注(500 类)进行训练:
./distributed_train.sh 4 /data/openimages --model efficientdet_d0 --dataset openimages-challenge2019 -b 7 --amp --lr .042 --sync-bn --opt fusedmomentum --warmup-epochs 1 --lr-noise 0.4 0.9 --model-ema --model-ema-decay 0.999966 --epochs 100 --remode pixel --reprob 0.15 --recount 4 --num-classes 500 --val-skip 2
OI 的 500 类(Challenge2019)或 601 类(V5/V6)头部相比 COCO 需要占用更多的 GPU 内存。您可能需要将批量大小减半。
自定义数据集上的训练/微调示例
这里的模型已经成功应用于自定义训练流程和数据集,并取得了很好的效果。由于涉及许多细节问题,请不要提交“我在自定义数据集上得到糟糕结果”的问题。如果您能在一个公开、非专有、可下载的数据集上重现问题,并提供包含有效数据集/解析器实现的此仓库的公共 GitHub 分支,则我可能会有时间查看。
示例:
- Chris Hughes 整理了一个使用
timmEfficientNetV2 主干网络和最新版本 EfficientDet 模型进行训练的优秀示例: - Alex Shonenkov 提供了一个清晰简洁的 Kaggle 内核,展示了如何微调这些模型来检测小麦穗:https://www.kaggle.com/shonenkov/training-efficientdet(注意:该内容已过时,与当前版本相比有许多变化)
如果您有使用不同数据集训练这些模型的良好示例脚本或内核,请随时通知我以便在此处收录……
结果
我的训练
EfficientDet-D0
使用4张1080ti显卡进行的最新训练,D0模型的mAP为0.336:
./distributed_train.sh 4 /mscoco --model efficientdet_d0 -b 22 --amp --lr .12 --sync-bn --opt fusedmomentum --warmup-epochs 5 --lr-noise 0.4 0.9 --model-ema --model-ema-decay 0.9999
上述超参数设置得到了一个不错的模型,有几点值得注意:
- mAP在很早的时候(300个epoch中的第200个)就达到了峰值,随后似乎出现了过拟合,因此可能还有改进空间。
- 我启用了实验性的学习率噪声,这种策略在启用EMA时通常效果较好。
- 实际有效学习率略高于官方设定。官方设定的批量为64时的学习率为0.08,而这里的计算结果为0.0872。
- drop_path(也称为生存概率或drop_connect)率为0.1,这比官方建议的D0模型的0.0要高,但低于其他模型的0.2。
- EMA的持续时间比默认设置更长。
VAL2017
平均精度(AP)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.336251
平均精度(AP)@[ IoU=0.50 | area= all | maxDets=100 ] = 0.521584
平均精度(AP)@[ IoU=0.75 | area= all | maxDets=100 ] = 0.356439
平均精度(AP)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.123988
平均精度(AP)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.395033
平均精度(AP)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.521695
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.287121
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.441450
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.467914
平均召回率(AR)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.197697
平均召回率(AR)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.552515
平均召回率(AR)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.689297
EfficientDet-D1
最新一次运行的mAP为0.394(使用4张1080ti显卡):
./distributed_train.sh 4 /mscoco --model efficientdet_d1 -b 10 --amp --lr .06 --sync-bn --opt fusedmomentum --warmup-epochs 5 --lr-noise 0.4 0.9 --model-ema --model-ema-decay 0.99995
这次训练中我使用了一些改进的数据增强方法,目前仍在实验阶段,尚未准备好发布。如果没有这些增强,模型的表现应该也不错,但可能会更快地出现过拟合,最终的mAP可能在0.385到0.39之间。
移植的TensorFlow权重
TEST-DEV2017
注意:我目前只尝试将D7提交到开发服务器进行了简单验证。
TF-EfficientDet-D7
平均精度(AP)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.534
平均精度(AP)@[ IoU=0.50 | area= all | maxDets=100 ] = 0.726
平均精度(AP)@[ IoU=0.75 | area= all | maxDets=100 ] = 0.577
平均精度(AP)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
平均精度(AP)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.569
平均精度(AP)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.660
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.397
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.644
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.682
平均召回率(AR)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.508
平均召回率(AR)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.718
平均召回率(AR)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.818
VAL2017
TF-EfficientDet-D0
平均精度(AP)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.341877
平均精度(AP)@[ IoU=0.50 | area= all | maxDets=100 ] = 0.525112
平均精度(AP)@[ IoU=0.75 | area= all | maxDets=100 ] = 0.360218
平均精度(AP)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.131366
平均精度(AP)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.399686
平均精度(AP)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.537368
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.293137
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.447829
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.472954
平均召回率(AR)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.195282
平均召回率(AR)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.558127
平均召回率(AR)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.695312
TF-EfficientDet-D1
平均精度(AP)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.401070
平均精度(AP)@[ IoU=0.50 | area= all | maxDets=100 ] = 0.590625
平均精度(AP)@[ IoU=0.75 | area= all | maxDets=100 ] = 0.422998
平均精度(AP)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.211116
平均精度(AP)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.459650
平均精度(AP)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.577114
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.326565
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.507095
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.537278
平均召回率(AR)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.308963
平均召回率(AR)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.610450
平均召回率(AR)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.731814
TF-EfficientDet-D2
平均精度(AP)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.434042
平均精度(AP)@[ IoU=0.50 | area= all | maxDets=100 ] = 0.627834
平均精度(AP)@[ IoU=0.75 | area= all | maxDets=100 ] = 0.463488
平均精度(AP)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.237414
平均精度(AP)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.486118
平均精度(AP)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.606151
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.343016
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.538328
平均召回率(AR)@[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.571489
平均召回率(AR)@[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.350301
平均召回率(AR)@[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.638884
平均召回率(AR)@[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.746671
TF EfficientDet-D3
平均精度 (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.471223
平均精度 (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.661550
平均精度 (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.505127
平均精度 (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.301385
平均精度 (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.518339
平均精度 (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.626571
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.365186
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.582691
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.617252
平均召回率 (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.424689
平均召回率 (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.670761
平均召回率 (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.779611
TF-EfficientDet-D4
平均精度 (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.491759
平均精度 (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.686005
平均精度 (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.527791
平均精度 (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.325658
平均精度 (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.536508
平均精度 (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635309
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.373752
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.601733
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.638343
平均召回率 (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.463057
平均召回率 (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.685103
平均召回率 (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.789180
TF-EfficientDet-D5
平均精度 (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.511767
平均精度 (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.704835
平均精度 (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.552920
平均精度 (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.355680
平均精度 (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551341
平均精度 (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.650184
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.384516
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.619196
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.657445
平均召回率 (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.499319
平均召回率 (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.695617
平均召回率 (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.788889
TF-EfficientDet-D6
平均精度 (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.520200
平均精度 (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.713204
平均精度 (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.560973
平均精度 (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.361596
平均精度 (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.567414
平均精度 (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.657173
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.387733
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.629269
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.667495
平均召回率 (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.499002
平均召回率 (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.711909
平均召回率 (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.802336
TF-EfficientDet-D7
平均精度 (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.531256
平均精度 (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.724700
平均精度 (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.571787
平均精度 (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.368872
平均精度 (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.573938
平均精度 (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668253
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.393620
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.637601
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.676987
平均召回率 (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524850
平均召回率 (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.717553
平均召回率 (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.806352
TF-EfficientDet-D7X
平均精度 (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.543
平均精度 (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.737
平均精度 (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.585
平均精度 (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.401
平均精度 (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.579
平均精度 (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.680
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.398
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.649
平均召回率 (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.689
平均召回率 (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.550
平均召回率 (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.725
平均召回率 (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.823
待办事项
- 基础训练(目标检测)的重新实现
- 马赛克增强
- 随机/自动增强
- BBOX IoU 损失(GIoU、DIoU、CIoU 等)
- 语义分割实验
- 与 Detectron2 / MMDetection 代码库的集成
- 添加并清理我过去项目中使用过的基于 EfficientNet 的 U-Net 和 DeepLab 分割模型
- 添加并清理过去项目中的 OpenImages 数据集/训练支持
- 探索实例分割的可能性...
如果您所在的组织对赞助这些工作感兴趣,或者对可能的未来发展方向的优先级安排感兴趣,请随时联系我(通过 GitHub Issues、LinkedIn、Twitter 或发送邮件至 hello@rwightman.com)。如果有兴趣,我将设立一个 GitHub Sponsorship。
版本历史
v0.2.42021/05/01v0.1-anno2020/10/22v0.1.62020/09/18v0.12020/04/09常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器