在第二个评估步骤

时间:2018-01-12 14:09:30

标签: tensorflow artificial-intelligence object-detection tensorboard

我是Tensorflow 1.4.0的初学者,我尝试在对象检测模型上执行我的第一次培训+评估过程。在查看评估步骤的输出时,我所看到的是一些奇怪的东西。

这是我做的步骤。首先,值得一提的是,我的目标是在非常特殊的科学图像中检测两种不同的形状。他们属于一种版权"所以我只能展示它们的简化版本(手工制作)。请记住,原始的更详细。

输入图像的原始示例,将其视为重复图案(背景中始终存在网格),其中某些特定形状位于随机位置。

enter image description here

  1. 正如你所看到的,我想训练模型来检测2个类:" round"形状(A类)和"不规则"形状(B类)。

  2. 我使用labelImg为XML格式的两个类生成标签。一般来说,我已经标记了168张图片( 960x720 RGB,PNG ),总共有800个盒子(单张图片中可能有多个A / B形状)。

  3. enter image description here

    1. 我还准备了一个较小的评估数据集,由10个新图像和150个标签组成。这次图像比列车数据集中的其他图像更大(但它们不是"调整大小",只是视口更大,因此每个输入中可能有更多事件)。我们谈论的是 1920x1440 RGB,PNG 图像。

    2. 然后我将两个数据集的XML转换为两个.tfrecord文件(GitHub周围有一些脚本)。

    3. 然后我为Tensorflow准备了所有其他输入文件:

    4. 标签地图文件:

      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
      }
      
      1. 最后,我通过调用https://github.com/tensorflow/models/blob/master/research/object_detection/train.py脚本来运行Tensorflow。通过在笔记本电脑Nvidia Quadro GPU上运行,性能大约为0.600秒/步。控制台中没有错误,但我看到的第一件事是损失似乎收敛到0.4并且在相对较少的(?)步骤中保持不变:
      2. enter image description here

        1. 当大约500步时,我还在CPU上启动了评估脚本(https://github.com/tensorflow/models/blob/master/research/object_detection/eval.py)。它每5分钟运行一次(eval_interval_secs: 300),我可以在Tensorboard上看到输出。
        2. 这是问题所在。第一次评估是相对于步骤#0的检查点,因此输出图像是一堆随机移位的盒子,这应该是正常的。一个事实是,仅存在第一个A类的框。 然后,从第二次评估(步骤#1000左右)等所有输出图像再也没有检测到!在我决定停止所有事情之前,没有A / B类框被绘制并且没有任何东西出现(步骤#10000)。

          我期待继续看到检测,即使有错误。

          我有很多问题,我可能在我的流程中犯了明显的错误(我的知识仍然非常有限):

          • 我在损失和评估输出方面看到的确是一种奇怪的行为吗?
          • 我可以使用哪些技巧来检查我是否在数据准备方面犯了一些概念上的错误?
          • 我可以调试培训期间发生的事情吗?
          • Tensorflow配置文件怎么样?那里有什么不对吗?

          注意:我也尝试过使用ssd_ *等其他模型做同样的事情,但行为是一样的。

0 个答案:

没有答案