物体检测¶
1 简介¶
物体检测模块提供了多种模型用于通用物体检测任务,即检测图片中感兴趣的物体目标区域,目前已经支持的模型有:
- FasterRCNN系列
- SSD系列
- YOLO系列
Benchmark¶
- VOC Dataset
- TrainSet: voc07+12 trainval
- TestSet: voc07 test
模型名称 | 输入图片尺寸 | mAP@IOU0.5 |
---|---|---|
faster-rcnn-resnet50 | 600x1024 | 0.790 |
faster-rcnn-resnet50-ohem | 600x1024 | 0.796 |
faster-rcnn-resnet50-fpn | 600x1024 | 0.798 |
rfcn-resnet50 | 600x1024 | 0.764 |
ssd-vgg16 | 300x300 | 0.777 |
ssd-vgg16 | 512x512 | 0.801 |
ssd-resnet50 | 300x300 | 0.749 |
ssd-resnet50-fpn | 300x300 | 0.762 |
- COCO 2017
- TrainSet: train 118k
- TestSet: test 5k
模型名称 | 输入图片尺寸 | mAP@IOU0.5 |
---|---|---|
faster-rcnn-resnet50 | 800x1333 | 0.34 |
ssd-mobilenet-v1 | 512x512 | 0.21 |
2 使用示例¶
下面我们以使用VOC数据集,训练faster-rcnn模型为例,介绍如何训练一个检测模型
2.1 数据准备¶
VOC我们已经提供了转换好的tfrecord, 下载VOC到 data
文件夹下
ossutil cp -r oss://pai-vision-data-hz/data/voc0712_tfrecord/ data/voc0712_tfrecord
下载resnet50预训练模型到pretrained_models
文件夹下
ossutil cp -r oss://pai-vision-data-hz/pretrained_models/resnet_v1d_50/ pretrained_models/resnet_v1d_50
2.2 模型训练¶
2.2.1 文件配置形式¶
运行如下python代码即可启动文件配置形式的训练评估流程,样例配置文件参见sample_config,配置文件参数说明参见proto文档。如果你使用了自定义的配置文件,把easy_vision.FASTER_RCNN_SAMPLE_CONFIG
替换为你的配置文件路径即可。
import easy_vision
easy_vision.train_and_evaluate(easy_vision.FASTER_RCNN_SAMPLE_CONFIG)
2.2.2 参数配置训练¶
运行如下python代码即可启动参数配置形式的训练评估流程
import easy_vision
param_config = """
--model_type FasterRCNN
--backbone resnet_v1d_50
--num_classes 20
--model_dir experiments/pascal_voc/resnet50_frcnn_model
--train_data data/voc0712_tfrecord/voc0712_part_*.tfrecord
--test_data data/voc0712_tfrecord/VOC2007_test.tfrecord
--num_test_example 2
--train_batch_size 32
--test_batch_size 1
--image_min_sizes 600
--image_max_sizes 1024
--lr_type exponential_decay
--initial_learning_rate 0.001
--decay_epochs 20
--staircase true"""
easy_vision.train_and_evaluate_with_param_config(param_config)
param_config 包含若干模型配置参数,格式遵循python argparser格式,各参数具体说明如下,所有字符串均不需要加引号
参数名称 | 参数描述 | 参数值格式 | 默认值 |
---|---|---|---|
model_type | 训练模型类型 | 字符串,可选范围 SSD FasterRCNN RFCN |
无,必选字段 |
backbone | 检测模型使用的backbone | 字符串格式,可取值范围: mobilenet_v1 resnet_v1_50 resnet_v1_101 resnet_v1a_18 resnet_v1a_34 resnet_v1d_50 resnet_v1d_101 vgg16_reduce_fc |
无,必选参数 |
weight_decay | l2 regularization的大小 | 浮点 | 1e-4 |
use_fpn | 是否使用fpn | 布尔型 | false |
num_classes | 检测类别数目 | 21 | 无,必选参数 |
anchor_scales | anchor框的大小,和resize后的输入图片在一个尺度。 设置大小时参考输入图片resize后的大小。 如果使用普通ssd,该参数不填。 如果使用fpn,该参数只填写一个值,表示分辨率最高layer的anchor大小,一共有5个layer,后面每个layer上每个anchor大小为前一layer的2倍, 例如 32, 64, 128, 256, 512 如果使用fastr-rcnn、rfcn(不包括fpn),可任意填写多个anchor大小,例如 128 256 512 |
浮点列表 eg. 单一尺度 32 多个尺度 128 256 512 |
ssd 默认为输入大小的[0.1 0.2 0.37 0.54 0.71 0.88 0.96 1.0]倍 ssd fpn 默认为32 faster-rcnn-fpn默认为32 faster-rcnn rfcn默认为 [128 256 512] |
anchor_ratios | anchor宽高比 | 浮点列表 | 0.5 1 2 |
image_sizes | 输入图片缩放大小(ssd使用), 长度为2的列表, 分别是 高 宽 | 浮点列表 | 300 300 |
image_min_sizes | 图片缩放大小最短边(faster-rcnn、rfcn使用) 为了支持multi-scale training,当输入的size有多个时,前n-1个作为训练的配置,最后一个做评估测试的配置。否则,训练评估使用相同配置。 |
浮点列表 | 600 |
image_max_sizes | 图片缩放大小最长边(faster-rcnn、rfcn使用) 为了支持multi-scale training,当输入的size有多个时,前n-1个作为训练的配置,最后一个做评估测试的配置。否则,训练评估使用相同配置。 |
浮点列表 | 1024 |
optimizer | 优化方法,其中momentum就是sgd | 字符串,可选方法如下: momentum adam |
momentum |
lr_type | 学习率调整策略 exponential_decay, 指数衰减,详细参考tf.train.exponential_decay polynomial_decay, 多项式衰减,详细参考tf.train.polynomial_decay, 其中num_steps自动设置为总的训练迭代次数,end_learning_rate为initial_learning_rate的千分之一 manual_step, 人工指定各阶段的学习率, 通过decay_epochs 指定需要调整学习率的迭代轮数, 通过learning_rates指定对应迭代轮数使用的学习率 cosine_decay,通过余弦曲线调制学习率变化,最终会降到0。详细参考论文, 通过decay_epochs 指定需要调整学习率的迭代轮数 |
字符串,可选方法如下: exponential_decay polynomial_decay manual_step cosine_decay |
exponential_decay |
initial_learning_rate | 初始学习率 | 浮点数 | 0.01 |
decay_epochs |
如果使用exponential_decay, 参数对应 tf.train.exponential_decay中的decay_steps,后端会自动根据训练数据总数把decay_epochs转换为decay_steps。例如数值可填:10,一般是总epoch数的1/2。 如果使用manual_step, 参数表示需要调整学习率的迭代轮数, "16 18"表示在16epoch 18 epoch对学习率进行调整。一般这两个值取总设置的总epoch的8/10、9/10 |
整数列表 20 20 40 60 |
20 |
decay_factor | tf.train.exponential_decay 中的decay_factor | 浮点数 | 0.95 |
staircase | tf.train.exponential_decay 中的staircase | 布尔 | true |
power | tf.train.polynomial_decay 中的power | float | 0.9 |
learning_rates | manual_step学习率调整策略中使用的参数,表示在指定epoch 学习率调整为多少. 如果您指定的调整epoch有两个,则需要在此也填写两个对应的学习率。例:decay_epoches为20 40,此处填写0.001 0.0001,则代表在20epoch学习率调整为0.001,40epoch学习率调整为0.0001。建议这几次调整的学习率是初始学习率的1/10、1/100、1/1000...... | manual_step学习率调整策略中使用的参数,表示在指定epoch 学习率调整为多少 | 浮点列表 |
lr_warmup | 是否对学习率做warmup | 布尔 | false |
lr_warm_up_epochs | 学习率warmup的轮数 | 浮点型 | 1 |
train_data | 训练数据文件oss路径 | oss://path/to/train_*.tfrecord | 无,必选参数 |
test_data | 训练过程中评估数据oss路径 | oss://path/to/test_*.tfrecord | 无,必选参数 |
train_batch_size | 训练batch_size | 整型, 例如32 | 无,必选参数 |
test_batch_size | 评估batch_size | 整型, 例如32 | 无,必选参数 |
train_num_readers | 训练数据并发读取线程数 | 整型 | 4 |
model_dir | 训练所用oss目录 | oss://path/to/model | 无,必选参数 |
pretrained_model | 预训练模型oss路径,如果提供,会在此模型基础上finetune | oss://pai-vision-data-hz/pretrained_models/inception_v4.ckpt | "" |
use_pretrained_model | 是否使用预训练模型 | 布尔型 | true |
num_epochs | 训练迭代轮数,1表示所有训练数据过了一遍 | 整型 40 | 无,必选参数 |
num_test_example | 训练过程中评估数据条目数, -1表示使用所有测试数据集数据 | 整型,例如2000 | 可选,默认-1 |
num_visualizations | 评估过程可视化显示的样本数目 | 整型 | 10 |
save_checkpoint_epochs | 保存checkpoint的频率,以epoch为单位, 1表示每过一遍训练数据保存一次checkpoint | 整型 | 1 |
save_summary_epochs | 保存summary的频率,以epoch为单位, 0.01 表示每过1%训练数据保存一次summary | 浮点 | 0.01 |
num_train_images | 总的训练样本数,如果使用自己生成的tfrecord需要提供该信息 | 整型 | 可选,默认0 |
label_map_path | 类别映射文件,如果使用自己生成的tfrecord需要提供该信息 | 字符串 | 可选,默认"" |