开源
SNIPER:多尺度目标检测训练算法
来源:元经纪     阅读:743
网站管理员
发布于 2023-01-28 09:08
查看主页

概述

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 年。

特征

  1. 在 8 个 V100 GPU 上使用 ResNet-101 主干训练批量大小为 160 张的图像
  2. 没有 PYTHON 层(每一层都针对 CUDA/C++ 中的大批量大小进行了优化)
  3. 半精度训练,不损失精度
  4. 在单个 V100 GPU 上推理期间每秒 5 张图像,使用 ResNet-101 在 COCO 上为 47.8/68.2,并且没有对分割掩码进行训练
  5. 使用使用 SNIPER 训练的轻量级 MobileNetV2 模型在 COCO 上获得 34.3/54.5 而无需训练分割掩码
  6. R-FCN-3K 分支也由 SNIPER 提供支持。现在在 ImageNetDet 上比 YOLO-9000 好 21%。该分支还支持使用很少的样本(不需要边界框!)的即时训练(以秒为单位)
  7. 在 3 天内在 p3.x16.large AWS 实例上使用 ResNet-101 在 OpenImagesV4(比 COCO 大 14 倍)上进行训练!

结果

COCO数据集

[hidecontent type="logged" desc="隐藏内容:登录后可查看"]

以下是使用此存储库训练的 SNIPER 的COCO结果。这些模型在trainval集上训练(仅使用边界框注释)并在测试开发集上进行评估。

您可以通过运行下载 OpenImages 预训练模型bash scripts/download_pretrained_models.sh在 COCO( ResNet-101MobileNetV2)和 PASCAL VOC 数据集上训练的 SNIPER 检测器和在 COCO 数据集( ResNet-101)上训练的 AutoFocus 模型可以通过运行下载bash scripts/download_sniper_autofocus_detectors.sh

安装

  1. 克隆存储库:
git clone --recursive https://github.com/mahyarnajibi/SNIPER.git
  1. 编译存储库中提供的 MXNet 分支。

您需要安装CUDACuDNNOpenCVOpenBLAS。这些库被设置为在存储库中提供的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 的更多信息,请参阅此处

  1. 编译 lib 目录中的 C++ 文件。以下脚本将它们全部编译:
bash scripts/compile.sh
  1. 安装所需的 python 包:
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 训练模型

要训​​练 SNIPER/AutoFocus,您首先需要下载预训练模型并按如下所述配置数据集。

下载预训练模型

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

bash download_pretrained_models.sh
配置数据集
可可数据集:

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

data
  |--coco
      |--annotations
      |--images
PASCAL VOC 数据集:

请从 [官方 Pascal VOC 数据集网站 ( http://host.robots.ox.ac.uk/pascal/VOC/ )下载训练、验证和测试子集。下载数据集后,您应该具有以下目录结构:

data
  |--VOCdevkit
      |--VOC2007
      |--VOC2012
训练 SNIPER 检测器

您可以使用或不使用负芯片挖掘来训练 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_PROCESSTRAIN.NUM_THREAD)减少进程数和线程数。

使用 AutoFocus 训练 SNIPER 检测器

要使用 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]

 
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 开源
麦当劳与三星堆跨界联动 演绎美食与文化的“热辣”碰撞
“爆款”背后,是责任是敏锐是实力
新春走基层 | 全球首发!闪烁“科技智慧”的12英寸光学级铌酸锂晶体
大疆把电助力山地车价格打下来了:高配还不到7万元
3599元起买吗!RTX 5060 Ti 16GB完整规格流出

首页

分类

定制方案

消息

我的