- ⚡超级轻量级:模型文件仅为980KB(INT8)或1.8MB(FP16)。
- ⚡超级快:在移动ARM CPU上实现97fps(10.23ms)。
- 👍高精度:最高34.3 mAPval@0.5:0.95,并且在CPU上依然实时。
- 🤗训练友好:相比其他模型,GPU内存消耗更低。GTX1060 6G上可以实现Batch-size=80。
- 😎易于部署:支持多种后端,包括ncnn、MNN和OpenVINO。还提供基于ncnn推理框架的Android demo。
简介
NanoDet是一个基于FCOS的一阶段无锚框目标检测模型,使用Generalized Focal Loss作为分类和回归损失函数。
在NanoDet-Plus中,我们提出了一种新的标签分配策略,包括一个简单的指派引导模块(AGM)和一个动态软标签指派器(DSLA),以解决轻量级模型训练中的最优标签分配问题。我们还引入了一个轻量级的特征金字塔Ghost-PAN,以增强多层特征融合。这些改进使得NanoDet在COCO数据集上的检测精度提升了7 mAP。
QQ交流群:908606542 (答案:炼丹)
基准测试
Model | Resolution | mAPval 0.5:0.95 | CPU Latency (i7-8700) | ARM Latency (4xA76) | FLOPS | Params | Model Size |
---|---|---|---|---|---|---|---|
NanoDet-m | 320*320 | 20.6 | 4.98ms | 10.23ms | 0.72G | 0.95M | 1.8MB(FP16) | 980KB(INT8) |
NanoDet-Plus-m | 320*320 | 27.0 | 5.25ms | 11.97ms | 0.9G | 1.17M | 2.3MB(FP16) | 1.2MB(INT8) |
NanoDet-Plus-m | 416*416 | 30.4 | 8.32ms | 19.77ms | 1.52G | 1.17M | 2.3MB(FP16) | 1.2MB(INT8) |
NanoDet-Plus-m-1.5x | 320*320 | 29.9 | 7.21ms | 15.90ms | 1.75G | 2.44M | 4.7MB(FP16) | 2.3MB(INT8) |
NanoDet-Plus-m-1.5x | 416*416 | 34.1 | 11.50ms | 25.49ms | 2.97G | 2.44M | 4.7MB(FP16) | 2.3MB(INT8) |
YOLOv3-Tiny | 416*416 | 16.6 | - | 37.6ms | 5.62G | 8.86M | 33.7MB |
YOLOv4-Tiny | 416*416 | 21.7 | - | 32.81ms | 6.96G | 6.06M | 23.0MB |
YOLOX-Nano | 416*416 | 25.8 | - | 23.08ms | 1.08G | 0.91M | 1.8MB(FP16) |
YOLOv5-n | 640*640 | 28.4 | - | 44.39ms | 4.5G | 1.9M | 3.8MB(FP16) |
FBNetV5 | 320*640 | 30.4 | - | - | 1.8G | - | - |
MobileDet | 320*320 | 25.6 | - | - | 0.9G | - | - |
下载预训练模型并找到更多模型请访问模型库或访问Release Files
说明 (点击展开)
-
ARM性能基于ncnn在Kirin 980(4xA76+4xA55)ARM CPU上测量。您可以使用ncnn_android_benchmark在您的手机上测试延迟。
-
Intel CPU性能基于OpenVINO在Intel Core-i7-8700上测量。
-
NanoDet mAP(0.5:0.95)基于COCO val2017数据集进行验证,无测试时间增强。
-
YOLOv3和YOLOv4 mAP来自Scaled-YOLOv4: Scaling Cross Stage Partial Network。
新闻更新!!!
-
[2023.01.20] 升级到pytorch-lightning-1.9。最低PyTorch版本升级到1.10。支持FP16训练(感谢@crisp-snakey)。支持忽略标签(感谢@zero0kiriyu)。
-
[2022.08.26] 升级到pytorch-lightning-1.7。最低PyTorch版本升级到1.9。要使用之前版本的PyTorch,请安装NanoDet <= v1.0.0-alpha-1
-
[2021.12.25] NanoDet-Plus发布!添加AGM(指派引导模块)和DSLA(动态软标签指派器),在只增加少量成本的情况下改进7 mAP。
更多更新记录请参阅更新记录。
演示
Android 演示
Android演示项目在demo_android_ncnn文件夹中。请参阅Android演示指南。
这里有一个更好的实现 👉 ncnn-android-nanodet
NCNN C++ 演示
基于ncnn的C++演示在demo_ncnn文件夹中。请参阅Cpp演示指南。
MNN 演示
使用阿里巴巴的MNN框架进行推理的演示在demo_mnn文件夹中。请参阅MNN演示指南。
OpenVINO 演示
使用OpenVINO进行推理的演示在demo_openvino文件夹中。请参阅OpenVINO演示指南。
Web 浏览器演示
https://nihui.github.io/ncnn-webassembly-nanodet/
Pytorch 演示
首先,安装依赖并按照安装指南设置NanoDet。然后从这里下载COCO预训练权重
预训练权重使用配置 config/nanodet-plus-m_416.yml
进行训练。
- 图片推理
python demo/demo.py image --config CONFIG_PATH --model MODEL_PATH --path IMAGE_PATH
- 视频推理
python demo/demo.py video --config CONFIG_PATH --model MODEL_PATH --path VIDEO_PATH
- 摄像头推理
python demo/demo.py webcam --config CONFIG_PATH --model MODEL_PATH --camid YOUR_CAMERA_ID
此外,我们提供了一个notebook在这里,展示如何使用PyTorch使其工作。
安装
依赖
- Linux或MacOS
- CUDA >= 10.2
- Python >= 3.7
- Pytorch >= 1.10.0,<2.0.0
步骤
- 创建一个conda虚拟环境并激活它。
conda create -n nanodet python=3.8 -y
conda activate nanodet
- 安装pytorch
conda install pytorch torchvision cudatoolkit=11.1 -c pytorch -c conda-forge
- 克隆这个仓库
git clone https://github.com/RangiLyu/nanodet.git
cd nanodet
- 安装依赖
pip install -r requirements.txt
- 设置NanoDet
python setup.py develop
模型库
NanoDet支持多种骨干网络。前往config文件夹查看示例训练配置文件。
Model | Backbone | Resolution | COCO mAP | FLOPS | Params | 预训练权重 |
---|---|---|---|---|---|---|
NanoDet-m | ShuffleNetV2 1.0x | 320*320 | 20.6 | 0.72G | 0.95M | 下载 |
NanoDet-Plus-m-320 (全新) | ShuffleNetV2 1.0x | 320*320 | 27.0 | 0.9G | 1.17M | 权重 | 检查点 |
NanoDet-Plus-m-416 (全新) | ShuffleNetV2 1.0x | 416*416 | 30.4 | 1.52G | 1.17M | 权重 | 检查点 |
NanoDet-Plus-m-1.5x-320 (全新) | ShuffleNetV2 1.5x | 320*320 | 29.9 | 1.75G | 2.44M | 权重 | 检查点 |
NanoDet-Plus-m-1.5x-416 (全新) | ShuffleNetV2 1.5x | 416*416 | 34.1 | 2.97G | 2.44M | 权重 | 检查点 |
注意:权重
和检查点
的区别在于权重仅提供推理时的参数,而检查点包含训练时的参数。
旧版本模型库
<SOURCE_TEXT>
模型 | 主干网络 | 分辨率 | COCO mAP | FLOPS | 参数量 | 预训练权重 |
---|---|---|---|---|---|---|
NanoDet-m-416 | ShuffleNetV2 1.0x | 416*416 | 23.5 | 1.2G | 0.95M | 下载 |
NanoDet-m-1.5x | ShuffleNetV2 1.5x | 320*320 | 23.5 | 1.44G | 2.08M | 下载 |
NanoDet-m-1.5x-416 | ShuffleNetV2 1.5x | 416*416 | 26.8 | 2.42G | 2.08M | 下载 |
NanoDet-m-0.5x | ShuffleNetV2 0.5x | 320*320 | 13.5 | 0.3G | 0.28M | 下载 |
NanoDet-t | ShuffleNetV2 1.0x | 320*320 | 21.7 | 0.96G | 1.36M | 下载 |
NanoDet-g | Custom CSP Net | 416*416 | 22.9 | 4.2G | 3.81M | 下载 |
NanoDet-EfficientLite | EfficientNet-Lite0 | 320*320 | 24.7 | 1.72G | 3.11M | 下载 |
NanoDet-EfficientLite | EfficientNet-Lite1 | 416*416 | 30.3 | 4.06G | 4.01M | 下载 |
NanoDet-EfficientLite | EfficientNet-Lite2 | 512*512 | 32.6 | 7.12G | 4.71M | 下载 |
NanoDet-RepVGG | RepVGG-A0 | 416*416 | 27.8 | 11.3G | 6.75M | 下载 |
训练方法
-
准备数据集
如果您的数据集注释是 pascal voc xml 格式,请参照config/nanodet_custom_xml_dataset.yml
否则,如果您的数据集注释是 YOLO 格式(Darknet TXT),请参照config/nanodet-plus-m_416-yolo.yml
或者将您的数据集注释转换为 MS COCO 格式(COCO 注释格式详情)。
-
准备配置文件
在 config 文件夹中复制并修改一个示例 yml 配置文件。
更改 save_dir 到您希望保存模型的位置。
更改 model->arch->head 中的 num_classes。
更改 data->train 和 data->val 中的图像路径和注释路径。
设置 gpu ids、num workers 和 batch size 以适应您的设备。
根据您的数据集和 batchsize 设置 total_epochs、lr 和 lr_schedule。
如果您想修改网络、数据增强或其他内容,请参照配置文件详情
-
开始训练
NanoDet 现在使用pytorch lightning进行训练。
对于单 GPU 或多个 GPU,运行:
python tools/train.py CONFIG_FILE_PATH
-
可视化日志
TensorBoard 日志保存在您在配置文件中设置的
save_dir
中。要可视化 tensorboard 日志,运行:
cd <YOUR_SAVE_DIR> tensorboard --logdir ./
部署方法
NanoDet 提供了包括 ncnn、OpenVINO 和 MNN 在内的多后端 C++ 演示。 还提供基于 ncnn 库的 Android 演示。
导出模型到 ONNX
要将 NanoDet 的 pytorch 模型转换为 ncnn,您可以选择以下方式:pytorch->onnx->ncnn
要导出 onnx 模型,请运行 tools/export_onnx.py
。
python tools/export_onnx.py --cfg_path ${CONFIG_PATH} --model_path ${PYTORCH_MODEL_PATH}
使用推理库在 C++ 中运行 NanoDet
ncnn
请参照demo_ncnn。
OpenVINO
请参照demo_openvino。
MNN
请参照demo_mnn。
在 Android 上运行 NanoDet
请参照android_demo。
引用
如果您在研究中发现该项目有用,请考虑引用:
@misc{=nanodet,
title={NanoDet-Plus: Super fast and high accuracy lightweight anchor-free object detection model.},
author={RangiLyu},
howpublished = {\url{https://github.com/RangiLyu/nanodet}},
year={2021}
}
鸣谢
https://github.com/Tencent/ncnn
https://github.com/open-mmlab/mmdetection
https://github.com/implus/GFocal
https://github.com/cmdbug/YOLOv5_NCNN
https://github.com/rbgirshick/yacs </SOURCE_TEXT>