A simplified implemention of Faster R-CNN that replicate performance from origin paper
更简洁快速的Faster R-CNN实现
1. 引言
[更新:] 我已经进一步简化了代码,使其适用于pytorch 1.5和torchvision 0.6,并用torchvision中的roipool和nms替换了自己的自定义操作。如果你需要旧版本的代码,请查看分支v1.0
本项目是基于chainercv和其他项目的一个简化的Faster R-CNN实现。我希望它能作为一个起点,为那些想要了解Faster R-CNN细节的人提供帮助。它的目标是:
- 简化代码(简单优于复杂)
- 让代码更直观(扁平优于嵌套)
- 达到原论文中报告的性能(速度和mAP都很重要)
它具备以下特点:
- 可以作为纯Python代码运行,无需构建过程。
- 这是一个约2000行有效代码的最小实现,其中包含大量注释和说明。(感谢chainercv出色的文档)
- 它比原实现具有更高的mAP(0.712 VS 0.699)
- 在TITAN XP上训练和测试的速度与其他实现相当(分别为6fps和14fps)
- 内存效率高(对于vgg16约为3GB)

2. 性能
2.1 mAP
使用VGG16在trainval数据集上进行训练,在test数据集上进行测试。
注意:训练表现出很大的随机性,可能需要一些运气和更多的训练epoch才能达到最高的mAP。然而,要超过下限应该比较容易。
| 实现 | mAP |
|---|---|
| 原始论文 arXiv | 0.699 |
| 使用Caffe预训练模型训练 | 0.700-0.712 |
| 使用torchvision预训练模型训练 | 0.685-0.701 |
| 从chainercv转换的模型(报告0.706) | 0.7053 |
2.2 速度
| 实现 | GPU | 推理 | 训练 |
|---|---|---|---|
| 原始论文 arXiv | K40 | 5 fps | N/A |
| 本实现 [1] | TITAN Xp | 14-15 fps | 6 fps |
| pytorch-faster-rcnn | TITAN Xp | 15-17fps | 6fps |
[1]: 确保正确安装cupy并只有一个程序使用GPU。训练速度对GPU状态敏感。更多信息请参阅故障排除。此外,程序开始时会较慢 —— 需要时间来预热。
通过去除可视化、日志记录、平均损失等功能,速度可以更快。
3. 安装依赖项
以下是使用anaconda从头创建环境的示例:
# 创建conda环境
conda create --name simp python=3.7
conda activate simp
# 安装PyTorch
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
# 安装其他依赖
pip install visdom scikit-image tqdm fire ipdb pprint matplotlib torchnet
# 启动visdom进行可视化
nohup python -m visdom.server &
如果不使用anaconda,则:
-
安装带有GPU支持的PyTorch(代码仅支持GPU),参考官方站点
-
安装其他依赖项:
pip install visdom scikit-image tqdm fire ipdb pprint matplotlib torchnet -
为了可视化,启动visdom
nohup python -m visdom.server &
4. 示例
从Google Drive或Baidu Netdisk(密码: scxn)下载预训练模型。
更多详情见demo.ipynb。
5. 训练
5.1 准备数据
Pascal VOC2007
-
下载训练、验证、测试数据和VOCdevkit
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 wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar -
将这些tar文件解压缩到一个名为
VOCdevkit的目录中tar xvf VOCtrainval_06-Nov-2007.tar tar xvf VOCtest_06-Nov-2007.tar tar xvf VOCdevkit_08-Jun-2007.tar -
应该有如下基本结构
$VOCdevkit/ # 开发工具包 $VOCdevkit/VOCcode/ # VOC实用代码 $VOCdevkit/VOC2007 # 图像集合,注解等 # ... 和几个其他目录 ... -
修改
utils/config.py中的voc_data_dir配置项,或者通过参数如--voc-data-dir=/path/to/VOCdevkit/VOC2007/传递给程序。
5.2 [可选]准备Caffe预训练的vgg16
如果你想使用Caffe预训练模型作为初始权重,可以运行以下命令获取由Caffe转来的vgg16权重,这与原论文中使用的相同。
python misc/convert_caffe_pretrain.py
这个脚本会下载预训练模型并将其转换为与torchvision兼容的格式。如果你在中国并无法下载预训练模型,你可以参考此问题
然后可以在utils/config.py中设置caffe_pretrain_path,指定Caffe预训练模型vgg16_caffe.pth的位置。默认路径是可以的。
如果你想使用torchvision的预训练模型,可以跳过此步骤。
注意,Caffe预训练模型显示出轻微更好的性能。
注意:Caffe模型要求图像以BGR 0-255的形式,而torchvision模型则需要RGB形式且范围为0-1。详细信息请参阅data/dataset.py。
5.3 开始训练
python train.py train --env='fasterrcnn' --plot-every=100
你可以参考utils/config.py了解更多参数。
一些关键参数:
--caffe-pretrain=False:使用Caffe的预训练模型还是torchvision的(默认:torchvision)--plot-every=n:每n批次可视化预测、损失等。--env:用于可视化的visdom环境--voc_data_dir:VOC数据存储位置--use-drop=False:在RoI头部使用dropout,默认False--use-Adam=False:使用Adam代替SGD,默认使用SGD。(使用Adam时需要设置非常低的lr)--load-path:预训练模型路径,默认None,如果指定了路径,将会加载该模型。
你可以在浏览器中访问http://<ip>:8097,看到如下所示的训练过程的可视化:

故障排除
-
DataLoader:
接收到了0项ancdata -
Windows 支持
我没有配备GPU的Windows设备来调试和测试。如果有人能提交拉取请求并进行测试,那将非常欢迎。
致谢
本项目基于许多杰出的工作构建,包括:
- Yusuke Niitani的ChainerCV(主要)
- Ruotian Luo的pytorch-faster-rcnn,它基于Xinlei Chen的tf-faster-rcnn
- Jianwei Yang和Jiasen Lu的faster-rcnn.pytorch。主要参考了longcw的faster_rcnn_pytorch
- 上述所有仓库都直接或间接引用了Ross Girshick和Sean Bell的py-faster-rcnn
^_^
根据MIT许可协议授权,详情请参阅LICENSE文件。
欢迎贡献。
如果你遇到任何问题,可以自由地打开一个议题,但我最近比较忙。
如果有任何错误或不清楚的地方,请指正。
模型结构:
