SNIPER:快速的多尺度目标检测算法

SNIPER是一种高效的多尺度训练方法,用于实例级识别任务,如对象检测和实例级分割。SNIPER并不是处理图像金字塔中的所有像素,而是选择性地处理标注对象周围的上下文区域。由于它在低分辨率图像块上运行,因此显著加快了多尺度训练。由于其高效的设计,SNIPER可以在训练过程中受益于批量标准化,并且可以在单个GPU上实现实例级别识别任务,从而实现更大的批量。因此,我们不需要跨GPU同步批量规范化统计信息,我们可以像对待图像分类一样训练对象检测器!

SNIPER is described in the following paper:

SNIPER: Efficient Multi-Scale Training
Bharat Singh*, Mahyar Najibi*, and Larry S. Davis (* denotes equal contribution)
arXiv preprint arXiv:1805.09300, 2018.

特点

  1. 在8个V100 GPU上使用ResNet-101骨干网以160个图像的batch size进行训练
  2. 无Python层(每层都已经针对CUDA / C ++中的大批量进行优化)
  3. 半精确度训练加快速度,同时识别精度不会降低
  4. 在单个V100 GPU上进行5个图像/秒的推断,在COCO上识别指标47.6 / 68.5,而且没有在分割mask进行训练的情况下
  5. R-FCN-3K分支也使用了SNIPER。在ImageNetDet数据集上比YOLO-9000好21%。该分支还支持非常少的样本即时训练(以秒为单位)(不需要包围盒!)
  6. 在p3.x16.large AWS实例中,在3天内使用ResNet-101训练OpenImagesV4(比COCO大14倍的超大数据集)!

结果

以下是在coco trainval集上使用SNIPER的coco test-dev结果,仅仅使用边界框标注,没使用分割mask数据标注。

预先训练的数据集 网络结构 mAP mAP@0.5 mAP@0.75 mAP@S mAP@M mAP@ L
SNIPER ImageNet ResNet101 46.5 67.5 52.2 30.0 49.4 58.4
SNIPER OpenImages ResNet101 47.8 68.2 53.6 31.5 50.4 59.8

您可以通过运行bash scripts/download_pretrained_models.shbash scripts/download_sniper_detector.sh分别下载OpenImages预先训练的模型和SNIPER目标检测器。

许可协议

SNIPER是在Apache许可下发布的。详情请参阅许可证。

引用

@article{sniper2018,
  title={{SNIPER}: Efficient Multi-Scale Training},
  author={Singh, Bharat and Najibi, Mahyar and Davis, Larry S},
  journal={arXiv preprint arXiv:1805.09300},
  year={2018}
}
@article{analysissnip2017,
  title={An analysis of scale invariance in object detection-snip},
  author={Singh, Bharat and Davis, Larry S},
  journal={CVPR},
  year={2018}
}

内容

  1. 安装
  2. 运行演示
  3. 用SNIPER训练模型
  4. 评估已训练的模型
  5. 其他方法和分支(SSH face,R-FCN-3K,open-images)

安装

  1. 克隆存储库:
git clone --recursive https://github.com/mahyarnajibi/SNIPER.git
  1. 编译存储库中提供的mxnet分支:
cd SNIPER-mxnet
mkdir build
cd build
cmake ..
make
  1. 编译lib目录中的C ++文件。以下脚本可以将它们全部编译在一起:
bash scripts/compile.sh
  1. 将mxnet添加到PYTHONPATH
export PYTHONPATH=SNIPER-mxnet/python:$PYTHONPATH
  1. 安装所需的python软件包:
pip install -r requirements.txt

运行演示

为了运行演示,您需要下载提供的SNIPER模型。以下脚本下载SNIPER模型并将其提取到默认位置:

bash download_sniper_detector.sh

下载模型后,以下命令将在提供的样本图像上运行SNIPER检测器,并显示默认配置:

python demo.py

如果一切顺利,样本检测结果将被保存为data/demo/demo_detections.png

您还可以通过向脚本提供路径来在任意图像上运行检测器:

python demo.py --im_path [PATH to the image]

训练模型

要在COCO上训练SNIPER,您需要下载预先训练的模型,用于负样例挖掘的预先计算的候选框(您也可以使用任何其他候选框集),并按照下面的描述配置数据集。

下载预先训练的模型

运行以下脚本下载并将预先训练的模型提取到默认路径(data/pretrained_model)中:

bash download_pretrained_models.sh

下载负样例挖掘的预先计算的候选框

运行以下脚本下载并将预先计算的候选框提取到默认路径(data/proposals)中:

bash download_sniper_neg_props.sh

配置COCO数据集

请按照官方COCO数据集网站下载数据集。下载数据集后,您应该具有以下目录结构:

data
  |--datasets
        |--coco
           |--annotations
           |--images

要训​​练带有SNIPER和默认参数的模型,您可以调用以下脚本:

python main_train.py

通过传递配置文件可以覆盖默认设置(请参阅configs文件夹中的示例配置文件)。配置文件的路径可以使用--cfg标志作为参数传递给上述脚本。

请注意,默认配置文件具有用于训练已发布模型的相同设置。如果您使用的内存量较少的GPU,请考虑减少训练批量的大小(通过TRAIN.BATCH_IMAGES在配置文件中设置)。此外,多核计算用于处理数据。对于要使用较少的内存量,您可能需要根据系统(通过设置TRAIN.NUM_PROCESSTRAIN.NUM_THREAD)来减少进程数量和线程数量。

评估已训练的模型

评估提供的SNIPER模型

该存储库提供了一组经过预先训练的SNIPER模型,可以通过运行以下脚本进行下载:

bash download_sniper_detector.sh

该脚本下载模型权重并将其提取到预期的目录中。要使用默认配置在coco test-dev上评估这些模型,可以运行以下脚本:

python main_test.py

通过将路径传递给带有--cfg标志的配置文件,可以覆盖默认设置(请参阅configs文件夹中的示例)。

请注意,评估是在每批多图像和并行模型转发设置下执行的。在GPU内存较低的情况下,请考虑减小不同规模的批量(通过设置TEST.BATCH_IMAGES)或减少并行作业的数量(通过TEST.CONCURRENT_JOBS在配置文件中设置)。

评估使用此存储库进行训练的模型

要评估使用此存储库进行训练的模型,可以通过传递在训练期间使用的相同配置文件来运行以下脚本。可以通过更新TEST配置文件的部分来设置测试设置(请参阅configs文件夹中的示例)。

python main_test.py --cfg [PATH TO THE CONFIG FILE USED FOR TRAINING]

默认情况下,这将生成一个json包含test-dev可以压缩并上载到COCO评估服务器的检测结果的文件。

其他方法和分支(SSH face,R-FCN-3K,open-images)

R-FCN-3K

包含R-FCN-3k探测器。

请切换到R-FCN-3k分支以获取具体说明。

SSH人脸检测器(即将发布)

SSH脸部检测装置将很快加入到这个仓库。与此同时,您使用原始SSH存储库中的代码。

OpenImagesV4

该库还包含在openimages数据集(一个超大的图像数据集)上进行训练的模块。请切换到openimages2分支以获取具体说明。

https://github.com/mahyarnajibi/SNIPER
https://arxiv.org/abs/1805.09300

转载请注明:《SNIPER:快速的多尺度目标检测算法

发表评论

电子邮件地址不会被公开。 必填项已用*标注