SNIPER 是一种高效的多尺度训练方法,适用于对象检测和实例级分割等实例级识别任务。SNIPER 不是处理图像金字塔中的所有像素,而是选择性地处理地面实况对象(也称为chips)周围的上下文区域。这显着加快了多尺度训练的速度,因为它在低分辨率芯片上运行。由于其内存高效的设计,SNIPER 可以在训练期间受益于批量归一化,并且它可以在单个 GPU 上为实例级识别任务提供更大的批量大小。因此,我们不需要跨 GPU 同步批归一化统计数据,我们可以像进行图像分类一样训练目标检测器!
另一方面,AutoFocus 是一种用于基于深度学习的对象检测器的高效多尺度推理算法。AutoFocus 不是处理整个图像金字塔,而是采用从粗到精的方法,只处理可能包含更精细尺度的小物体的区域。这是通过预测较粗尺度的小对象的类别不可知分割图来实现的,称为 FocusPixels。FocusPixels 可以通过高召回率进行预测,并且在许多情况下,它们只覆盖整个图像的一小部分。为了有效地利用 FocusPixels,提出了一种算法,该算法生成包含 FocusPixels 的紧凑矩形 FocusChip。检测器正在处理更精细的尺度。
SNIPER最初在 NeurIPS 2018 上发表的以下论文中进行了描述:
SNIPER:高效多尺度训练 Bharat Singh*、Mahyar Najibi*和 Larry S. Davis(* 表示同等贡献) 神经网络,2018 年。
AutoFocus最初在 ICCV 2019 上发表的以下论文中进行了描述:
AutoFocus:高效多尺度推理 Mahyar Najibi*、Bharat Singh*和 Larry S. Davis(* 表示同等贡献) 中国计算机科学研究院,2019 年。
[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
以下是使用此存储库训练的 SNIPER 的COCO结果。这些模型在trainval集上训练(仅使用边界框注释)并在测试开发集上进行评估。
bash scripts/download_pretrained_models.sh
。在 COCO( ResNet-101和MobileNetV2)和 PASCAL VOC 数据集上训练的 SNIPER 检测器和在 COCO 数据集( ResNet-101)上训练的 AutoFocus 模型可以通过运行下载bash scripts/download_sniper_autofocus_detectors.sh
。
git clone --recursive https://github.com/mahyarnajibi/SNIPER.git
您需要安装CUDA、CuDNN、OpenCV和OpenBLAS。这些库被设置为在存储库中提供的config.mk
文件中默认使用SNIPER-mxnet
。您可以使用make
命令构建 MXNet 库:
cd SNIPER-mxnet
make -j [NUM_OF_PROCESS] USE_CUDA_PATH=[PATH_TO_THE_CUDA_FOLDER]
如果您计划在多个 GPU 上训练模型,这是可选的,但建议安装NCCL并按照以下说明使用 NCCL 支持构建 MXNet :
make -j [NUM_OF_PROCESS] USE_CUDA_PATH=[PATH_TO_THE_CUDA_FOLDER] USE_NCCL=1
在这种情况下,您可能还需要将USE_NCCL_PATH
上述命令中的变量设置为指向您的NCCL安装路径。
如果您需要有关如何编译 MXNet 的更多信息,请参阅此处。
bash scripts/compile.sh
pip install -r requirements.txt
要运行演示,您需要下载提供的 SNIPER 模型。以下脚本下载 SNIPER 模型并将它们解压缩到默认位置:
bash download_sniper_autofocus_detectors.sh
下载模型后,以下命令将使用提供的示例图像上的默认配置运行在 COCO 数据集上训练的 SNIPER 检测器:
python demo.py
如果一切顺利,样本检测将保存为data/demo/demo_detections.jpg
.
您还可以通过提供脚本路径在任意图像上运行检测器:
python demo.py --im_path [PATH to the image]
但是,如果您计划在多个图像上运行检测器,请考虑使用提供的多进程和多批处理main_test
模块。
您还可以MobileNetV2
通过传递提供的配置文件,基于在 COCO 数据集上训练的架构来测试提供的 SNIPER 模型,如下所示:
python demo.py --cfg configs/faster/sniper_mobilenetv2_e2e.yml
要训练 SNIPER/AutoFocus,您首先需要下载预训练模型并按如下所述配置数据集。
运行以下脚本下载预训练模型并将其提取到默认路径 ( data/pretrained_model
):
bash download_pretrained_models.sh
请关注COCO数据集官方网站下载数据集。下载数据集后,您应该具有以下目录结构:
data
|--coco
|--annotations
|--images
请从 [官方 Pascal VOC 数据集网站 ( http://host.robots.ox.ac.uk/pascal/VOC/ )下载训练、验证和测试子集。下载数据集后,您应该具有以下目录结构:
data
|--VOCdevkit
|--VOC2007
|--VOC2012
您可以使用或不使用负芯片挖掘来训练 SNIPER 检测器,如下所述。
负筹码挖矿导致AP相对提升(详见论文)。为了确定候选硬阴性区域,SNIPER 使用从针对短期训练计划训练的提案网络中提取的提案。
对于 COCO 和 Pascal VOC 数据集,我们提供了预先计算的建议。以下命令下载预先计算的建议,将它们提取到默认路径 ( data/proposals
),并在 COCO 数据集上使用默认参数训练 SNIPER 检测器:
bash download_sniper_neg_props.sh
python main_train.py
要使用提供的预计算建议对 Pascal VOC 进行训练,您可以运行python main_train.py --cfg configs/faster/sniper_res101_e2e_pascal_voc.yml
.
但是,也可以使用此存储库提取所需的建议(例如,如果您计划在新数据集上训练 SNIPER)。我们提供了一个一体化脚本,该脚本执行使用 Negative Chip Mining 训练 SNIPER 所需的所有步骤。运行以下脚本训练一个短周期(即 2 个时期)的提案网络,提取提案,并使用 Negative Chip Mining 训练 SNIPER 检测器:
bash train_neg_props_and_sniper.sh --cfg [PATH_TO_CFG_FILE]
TRAIN.USE_NEG_CHIPS
您可以通过将 设置为来禁用负筹码挖掘False
。如果您计划在新数据集上尝试 SNIPER 或想缩短训练周期,这将非常有用。在这种情况下,可以通过调用以下命令开始训练:
python main_train.py --set TRAIN.USE_NEG_CHIPS False
在任何情况下,都可以通过传递配置文件来覆盖默认训练设置(请参阅configs
文件夹以获取示例配置文件)。--cfg
可以使用标志将配置文件的路径作为参数传递给上述脚本。也可以通过--set
将最后一个参数传递给模块,后跟所需的键值(即 --set key1 value1 key2 value2 ...
)来设置单独的配置键值。
请注意,默认配置文件具有用于训练已发布模型的相同设置。如果您使用的是内存较少的 GPU,请考虑减少训练批量大小(通过TRAIN.BATCH_IMAGES
在配置文件中设置或--set TRAIN.BATCH_IMAGES [DISIRED_VALUE]
作为模块的最后一个参数传递)。此外,多处理用于处理数据。对于较小的内存量,您可能需要根据您的系统(分别通过设置TRAIN.NUM_PROCESS
和TRAIN.NUM_THREAD
)减少进程数和线程数。
要使用 AutoFocus FocusPixel 预测分支训练 SNIPER,您可以将 AutoFocus 配置文件(例如 configs/faster/sniper_res101_e2e_autofocus.yml
和 configs/faster/sniper_res101_e2e_mask_autofocus.yml
)传递给main_train.py
脚本。可以通过配置文件修改默认的 AutoFocus 训练超参数(用于定义正、负或无关 FocusPixels)。有关更多详细信息,请参阅论文。
[/hidecontent]