Detectron 目标检测的简单使用,基本介绍. Detectron 初步使用
Detectron 提供了基于 COCO Dataset 的推断和训练使用说明 - Using Detectron.
<h2>1. Detectron Model ZOO 和 Baselines</h2>
Detectron 截止到 2017.12 提供了很多 baselines 模型,并记为 12_2017_baselines
.
Baselines 的配置文件在路径 configs/12_2017_baselines
中,并提供了对应的模型和结果.
如Table表.
<h3>1.1 Settings 和 Notes</h3>
- Baselines 是在 Big Basin 服务器上得到的,其共 8 张 Tesla P100 GPUs (16GB GPU memory, CUDA 8.0, and cuDNN 6.0.21).
- Baselines 是采用 8 块 GPUs 数据并行 SGD 训练的(data parallel sync SGD),minibatch 为 8 或 16 张图片(参见 表中的 im/gpu).
- 训练时,只进行了水平翻转数据增广.
- 推断时,没有数据增广,如 multiple scales, flipping 等处理.
- 模型都是在
coco_2014_train
和coco_2014_valminusminival
上进行训练的,其与最新的coco_2017_val
数据集基本一致. - 推断时间一般表示为 X+Y, X 表示在 well-optimized GPU 上的耗时,Y 是在 unoptimized CPU 上的耗时( CPU 耗时可以根据工程实际进一步优化).
- 推断结果,如 boxes、masks 和 keypoints(kps) 是保存为 COCO json format 的.
- mode id 项是为了便于参考.
- 检验下载文件完整性:添加
.md5sum
到相应的 URL 接可以下载文件的 md5 hash 值. - 模型和结果都是基于 COCO Dataset.
- 基于 Cityscapes dataset 即将发布.
<h3>1.2 训练方案</h3>
Detectron 提供了三种训练方案,参见表中的 lr schd 项.
- 1x - minibatch 为 16, 该方案的初始 LR=0.002,并在 60K 和 80K 次迭代后衰减 *0.1,在 90K 次迭代终止.
该方案在
coco_2014_train
unioncoco_2014_valminusminival
(或,coco_2017_train
) 数据集上的 118287张图片上训练了 12.17 个 epochs.</p> - <p>2x - 1x 方案的两倍,LR 相应的进行比例缩放.</p>
- <p>s1x - stretched 1x,该方案是将方案 1x 大约拉伸了 1.44x,并延长了第一个学习率的持续时间. minibatch 为 16 时,该方案将 LR 在 100K 和 120K 次迭代后衰减 *0.1,在 130K 次迭代终止.</p>
<p>所有的训练方案都使用了 500 次线性学习率的学习率,进行热身.
当 minibatch 在 8 到 16 张图片之间时,根据论文 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour 的策略进行基础学习率 base learning rate 和 SGD 迭代次数的调整.
<h3>1.3 ImageNet Pretrained Models</h3>
Detectron 采用了在 ImageNet-1k 数据集上训练的 Backbone 模型.
- R-50.pkl: converted copy of MSRA's original ResNet-50 model
- R-101.pkl: converted copy of MSRA's original ResNet-101 model
- X-101-64x4d.pkl: converted copy of FB's original ResNeXt-101-64x4d model trained with Torch7
- X-101-32x8d.pkl: ResNeXt-101-32x8d model trained with Caffe2 at FB
- X-152-32x8d-IN5k.pkl: ResNeXt-152-32x8d model trained on ImageNet-5k with Caffe2 at FB (see our ResNeXt paperfor details on ImageNet-5k)
<h3>1.4 Proposal, Box, and Mask Detection Baselines</h3>
参见 Proposal, Box, and Mask Detection Baselines.
<h2>1. 基于预训练模型进行推断</h2>
<h3>1.1 直接处理图片文件 Image</h3>
假设图片文件保存路径为 demo/*.jpg
,运行 infer_simple.py
即可进行测试.
infer_simple.py
是采用 end-to-end 训练得到的 Mask RCNN 模型,ResNet-101-FPN Backbone:
python2 tools/infer_simple.py \
--cfg configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml \
--output-dir /tmp/detectron-visualizations \
--image-ext jpg \
--wts https://s3-us-west-2.amazonaws.com/detectron/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl \
demo
Detectron 根据 --wts
参数指定的 URL 自动下载模型.
Detectron 根据 --output-dir
参数指定的路径,输出检测的可视化结果,PDF 格式.
如:
Mask RCNN 输出示例.
注: 当对 high-resolution 图片进行推断时,Mask RCNN 可能比较慢,因为很多时间被花费在将预测 masks 上采样到原始图片分辨率上(Detectron 还未进行优化). 解决方案是,先将高分辨率图片 resize,确保其最短边在 600-800px;再对 resized 图片进行推断.
<h3>1.2 COCO Dataset</h3>
采用单块 GPU 运行 end-to-end 训练的 Mask RCNN 模型.
对 coco_2014_minival
的所有图片进行推断:
python2 tools/test_net.py \
--cfg configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml \
TEST.WEIGHTS https://s3-us-west-2.amazonaws.com/detectron/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl \
NUM_GPUS 1
采用多块 GPUs 时,如 N=8
,
python2 tools/test_net.py \
--cfg configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml \
--multi-gpu-testing \
TEST.WEIGHTS https://s3-us-west-2.amazonaws.com/detectron/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl \
NUM_GPUS $N
在 NVIDIA Tesla P100 GPU 上,单张图片的推断时间大概是 130-140ms.
<h2>2. Detectron 训练</h2>
简单介绍在 COCO Dataset 上训练模型.
采用 ResNet-50-FPN Backbone 进行 end-to-end 的 Faster R-CNN 训练.
这里简单进行模型训练,小尺寸的输入图片,能够使训练和推断的速度相对较快.
<h3>2.1 单 GPU 训练</h3>
python2 tools/train_net.py \
--cfg configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml \
OUTPUT_DIR /tmp/detectron-output
- 输出保存路径
/tmp/detectron-output
,如 models, validation set detections 等. - Maxwell GPU,如 M40 上,训练耗时大约 4.2 个小时.
- M40 上,每张图片的推断时间大约是 80 ms.
coco_2014_minival
上的 Box AP 大约是 22.1%.
<h3>2.2 Multi-GPU 训练</h3>
Detectron 提供了基于2、4、8 张 GPUS 训练的 configs 参数配置文件.
如 configs/getting_started/tutorial_{2,4,8}gpu_e2e_faster_rcnn_R-50-FPN.yaml
.
如,2 张 GPUs 的训练:
python2 tools/train_net.py \
--multi-gpu-testing \
--cfg configs/getting_started/tutorial_2gpu_e2e_faster_rcnn_R-50-FPN.yaml \
OUTPUT_DIR /tmp/detectron-output
--multi-gpu-testing
是告诉 Detectron 在训练结束后,采用 multiple GPUs (如 NUM_GPUs
为 2) 进行并行化推断.
期望的结果:
- 训练在 2 张 M40 上大概耗时 2.3 个小时.
- 推断时间大约是 80 ms,在 2 张 GPUs 上并行推断时,耗时减半.
coco_2014_minival
上的 Box AP 大约是 22.1%.
关于学习方案的调整(“linear scaling rule”),可以参考提供的 config 文件,阅读论文 Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.
除了这里,其它的 configs 都是基于 8 GPUs.
如果训练的 GPUs 少于 8,或者想尝试改变 minibatch size,有必要理解如何根据 linear scaling rule 来调整训练方案.
注: 这里的训练示例采用了相对低的 GPU-compute 模型,因此,Caffe2 Python op 的开销相对较高. 导致将 GPUs 由 2 增加到 8 时,开销并不成比例减少,如采用 8 GPUs,需要训练 0.9 小时,只比单张 GPU 快了 4.5x 倍. 当采用相对高的 GPU-compute 模型时,multi-GPUs 开销的减少比例会提高.