我是Tensorflow 1.4.0的初学者,我尝试在对象检测模型上执行我的第一次培训+评估过程。在查看评估步骤的输出时,我所看到的是一些奇怪的东西。
这是我做的步骤。首先,值得一提的是,我的目标是在非常特殊的科学图像中检测两种不同的形状。他们属于一种版权"所以我只能展示它们的简化版本(手工制作)。请记住,原始的更详细。
输入图像的原始示例,将其视为重复图案(背景中始终存在网格),其中某些特定形状位于随机位置。
正如你所看到的,我想训练模型来检测2个类:" round"形状(A类)和"不规则"形状(B类)。
我使用labelImg为XML格式的两个类生成标签。一般来说,我已经标记了168张图片( 960x720 RGB,PNG ),总共有800个盒子(单张图片中可能有多个A / B形状)。
我还准备了一个较小的评估数据集,由10个新图像和150个标签组成。这次图像比列车数据集中的其他图像更大(但它们不是"调整大小",只是视口更大,因此每个输入中可能有更多事件)。我们谈论的是 1920x1440 RGB,PNG 图像。
然后我将两个数据集的XML转换为两个.tfrecord
文件(GitHub周围有一些脚本)。
然后我为Tensorflow准备了所有其他输入文件:
标签地图文件:
item {
id: 1
name: 'shape_a'
display_name: 'Shape A'
}
item {
id: 2
name: 'shape_b'
display_name: 'Shape B'
}
配置文件(改编自https://github.com/tensorflow/models/tree/master/research/object_detection/samples/configs)。正如您所看到的,我选择了faster_rcnn_inception_v2,并且我尝试从头开始训练它(因为这些图像的性质与预训练模型中使用的不同)。大多数参数都保存在存储库中。
model {
faster_rcnn {
num_classes: 2
image_resizer {
keep_aspect_ratio_resizer {
min_dimension: 720
max_dimension: 960
}
}
feature_extractor {
type: 'faster_rcnn_inception_v2'
first_stage_features_stride: 16
}
first_stage_anchor_generator {
grid_anchor_generator {
scales: [0.25, 0.5, 1.0, 2.0]
aspect_ratios: [0.5, 1.0, 2.0]
height_stride: 16
width_stride: 16
}
}
first_stage_box_predictor_conv_hyperparams {
op: CONV
regularizer {
l2_regularizer {
weight: 0.0
}
}
initializer {
truncated_normal_initializer {
stddev: 0.01
}
}
}
first_stage_nms_score_threshold: 0.0
first_stage_nms_iou_threshold: 0.5
first_stage_max_proposals: 300
first_stage_localization_loss_weight: 2.0
first_stage_objectness_loss_weight: 1.0
initial_crop_size: 14
maxpool_kernel_size: 2
maxpool_stride: 2
second_stage_box_predictor {
mask_rcnn_box_predictor {
use_dropout: false
dropout_keep_probability: 1.0
fc_hyperparams {
op: FC
regularizer {
l2_regularizer {
weight: 0.0
}
}
initializer {
variance_scaling_initializer {
factor: 1.0
uniform: true
mode: FAN_AVG
}
}
}
}
}
second_stage_post_processing {
batch_non_max_suppression {
score_threshold: 0.0
iou_threshold: 0.5
max_detections_per_class: 100
max_total_detections: 300
}
score_converter: SOFTMAX
}
second_stage_localization_loss_weight: 2.0
second_stage_classification_loss_weight: 1.0
}
}
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
}
gradient_clipping_by_norm: 10.0
from_detection_checkpoint: false
# fine_tune_checkpoint: "./run/train/modelXXXXXX.ckpt"
num_steps: 200000
data_augmentation_options {
random_horizontal_flip {}
}
data_augmentation_options {
random_vertical_flip {}
}
data_augmentation_options {
random_adjust_brightness { max_delta: 0.15 }
}
}
train_input_reader: {
tf_record_input_reader {
input_path: "./train.tfrecord"
}
label_map_path: "./label_map.pbtxt"
}
eval_config: {
num_examples: 10
# Note: The below line limits the evaluation process to 10 evaluations.
# Remove the below line to evaluate indefinitely.
max_evals: 10
eval_interval_secs: 300
}
eval_input_reader: {
tf_record_input_reader {
input_path: "./eval.tfrecord"
}
label_map_path: "./label_map.pbtxt"
shuffle: false
num_readers: 1
}
eval_interval_secs: 300
),我可以在Tensorboard上看到输出。这是问题所在。第一次评估是相对于步骤#0的检查点,因此输出图像是一堆随机移位的盒子,这应该是正常的。一个事实是,仅存在第一个A类的框。 然后,从第二次评估(步骤#1000左右)等所有输出图像再也没有检测到!在我决定停止所有事情之前,没有A / B类框被绘制并且没有任何东西出现(步骤#10000)。
我期待继续看到检测,即使有错误。
我有很多问题,我可能在我的流程中犯了明显的错误(我的知识仍然非常有限):
注意:我也尝试过使用ssd_ *等其他模型做同样的事情,但行为是一样的。