Configuring the Object Detection Training Pipeline
概述
Tensorflow对象检测API,使用protobuf文件来配置训练和评估过程。可以在object_detection / protos / pipeline.proto中找到训练模式配置文件。这些配置文件分为5个部分,分散在五个文件中。这里说配置文件并不在pipeline.proto中,而在以config结尾的配置文件中。比如\object_detection\samples\configs\ssd_inception_v2_coco.config(大多是嵌套型的map)。但是在这篇文档有解释,大概说像ssd_inception_v2_coco.config等文件其实是五个文件合在一起的一个简单例子:
pipline.proto
syntax = "proto2";
package object_detection.protos;
import "object_detection/protos/eval.proto";
import "object_detection/protos/input_reader.proto";
import "object_detection/protos/model.proto";
import "object_detection/protos/train.proto";
// Convenience message for configuring a training and eval pipeline. Allows all
// of the pipeline parameters to be configured from one file.
message TrainEvalPipelineConfig {
optional DetectionModel model = 1;
optional TrainConfig train_config = 2;
optional InputReader train_input_reader = 3;
optional EvalConfig eval_config = 4;
optional InputReader eval_input_reader = 5;
}
- model_config。这里定义训练模型类型和使用参数。
model_config.proto
syntax = "proto2";
package object_detection.protos;
import "object_detection/protos/faster_rcnn.proto";
import "object_detection/protos/ssd.proto";
// Top level configuration for DetectionModels.
message DetectionModel {
oneof model {
FasterRcnn faster_rcnn = 1;
Ssd ssd = 2;
}
}
- train_config,定义哪些参数应该被用来训练模型参数。
train_config.proto
syntax = "proto2";
package object_detection.protos;
import "object_detection/protos/optimizer.proto";
import "object_detection/protos/preprocessor.proto";
// Message for configuring DetectionModel training jobs (train.py).
message TrainConfig {
// Input queue batch size.
optional uint32 batch_size = 1 [default=32];
// Data augmentation options.
repeated PreprocessingStep data_augmentation_options = 2;
- eval_config,设定的使用哪些指标将被报告进行评估。
syntax = "proto2";
package object_detection.protos;
// Message for configuring DetectionModel evaluation jobs (eval.py).
message EvalConfig {
// Number of visualization images to generate.
optional uint32 num_visualizations = 1 [default=10];
// Number of examples to process of evaluation.
optional uint32 num_examples = 2 [default=5000];
train_input_config,定义在哪些数据集是训练集。
eval_input_config,定义在哪些数据集进行评估的。通常,这应该与训练输入数据集不同。
所有模型参数汇总的配置文件如下所示:
model {
(... Add model config here...)
}
train_config : {
(... Add train_config here...)
}
train_input_reader: {
(... Add train_input configuration here...)
}
eval_config: {
}
eval_input_reader: {
(... Add eval_input configuration here...)
}
设置需要的参数
需要配置大量模型参数。最佳设置取决于所需的应用程序。Faster R-CNN模型更适合于需要高精度且延迟优先级较低的情况。相反,如果处理时间是最重要的因素,建议使用SSD型号。可以阅读论文,以获得有关速度与准确度权衡的更详细讨论。
在object_detection / samples / configs文件夹中提供了示例模型配置。这些配置文件的内容可以粘贴到model
配置的字段中。用户应注意,其中的num_classes
字段应更改为适合用户正在训练的数据集的值。我的是num_classes = 20
定义输入
Tensorflow Object Detection API接受TFRecord文件格式的输入。必须指定训练和评估文件的位置。此外,还应指定标签映射,该映射定义类ID和类名之间的映射。标签映射在训练和评估数据集之间应该相同。
类别ID和类名配置tensorflow人脸识别(自己的数据集)
item {
id: 1
name: 'fanbingbing'
}
item {
id: 2
name: 'damimi'
}
item {
id: 3
name: 'liuyan'
}
在文件train和eval文件的输入配置如下所示:
tf_record_input_reader {
input_path: "/usr/home/username/data/train.record"
}
label_map_path: "/usr/home/username/data/label_map.pbtxt"
应该替换input_path
和label_map_path
参数,并将输入配置插入到config.poto配置中的train_input_reader
和eval_input_reader
字段中。配置可在谷歌云上使用。
train_config 的配置
在train_config
训练过程中的定义部分:
- 模型参数初始化。
- 输入预处理。
- SGD参数。
样例train_config
如下:
batch_size: 1
optimizer {
momentum_optimizer: {
learning_rate: {
manual_step_learning_rate {
initial_learning_rate: 0.0002
schedule {
step: 0
learning_rate: .0002
}
schedule {
step: 900000
learning_rate: .00002
}
schedule {
step: 1200000
learning_rate: .000002
}
}
}
momentum_optimizer_value: 0.9
}
use_moving_average: false
}
fine_tune_checkpoint: "/usr/home/username/tmp/model.ckpt-#####"
from_detection_checkpoint: true
load_all_detection_checkpoint_vars: true
gradient_clipping_by_norm: 10.0
data_augmentation_options {
random_horizontal_flip {
}
}
模型参数初始化
虽然是可选的,但强烈建议使用其他检测模型的检查点。从头开始训练物体探测器可能需要数天时间。为加快训练过程,建议从预先的图像分类或对象检测检查点中使用特征提取器参数。
train_config
提供两个字段来指定预先存在的检查点:fine_tune_checkpoint
和 from_detection_checkpoint
。fine_tune_checkpoint
应提供预先存在的检查点的路径(即:“/ usr / home / username / checkpoint / model.ckpt - #####”)。
from_detection_checkpoint
是一个布尔值。如果为false,则假定检查点来自对象分类检查点。请注意,从检测检查点开始通常会导致比分类检查点更快的训练工作。
如果为True,则假定检查点来自对象检测的检查点。
如下:
train_config: {
batch_size: 20
optimizer {
rms_prop_optimizer: {
learning_rate: {
exponential_decay_learning_rate {
initial_learning_rate: 0.004
decay_steps: 10000
decay_factor: 0.95
}
}
momentum_optimizer_value: 0.9
decay: 0.9
epsilon: 1.0
}
}
fine_tune_checkpoint: "ssd_inception_v2_coco_2018_01_28/model.ckpt"
from_detection_checkpoint: true
可在分类和目标检测找到提供的检查点列表。
输入预处理
将data_augmentation_options
在train_config
可用于指定的训练数据是如何被修改。该字段是可选的。我没用过。
SGD参数
其余参数train_config
是用于梯度下降的超参数。这些配置文件中提供的最佳学习率可能取决于训练设置的具体情况(例如,任务数量,gpu类型)。
配置评估程序
要设置的主要组件eval_config
是num_examples
和 metrics_set
。该参数num_examples
指示用于评估周期的批次数(当前为批量大小1),通常是评估数据集的总大小。该参数metrics_set
指示在评估期间运行的度量(即"coco_detection_metrics"
)。