更快的RCNN低估对象

时间:2019-08-11 21:25:46

标签: tensorflow machine-learning computer-vision object-detection faster-rcnn

我正在尝试使用对象检测来计算图像中玉米粒的数量。我已经从Tensorflow模型库(Faster RCNN / Resnet 101和Faster RCNN / Inception V2)的两个体系结构上训练了一个玉米图像的小型数据集(仅25个图像,但是每个图像平均包含250个内核实例)。当我在测试图像上尝试训练过的模型时,仅检测到90到115个玉米粒(大约占40%)。

这似乎与培训质量无关紧要:绝大多数的检测分数是.9+,然后我得到了几个一般的分数(从0.1到0.6)然后是零。我只有一堂课可以检测;我已将max_detections_per_class和max_total_detections设置为400,足以覆盖我在每个测试图像中注释的220-300个玉米粒。仍然陌生:所有检测仅发生在图像的上部(请参阅此处的测试图像之一,以不限数量的盒子绘制,分数阈值为0.15:http://tibichelcea.net/wp-content/uploads/2019/08/20190730_124151.jpg)。几乎感觉像配置文件中有某些东西限制了检测次数(感兴趣的区域?),但是我还不够先进,无法弄清楚如何解决这个问题。

我将附加用于训练和导出图形以进行检测的Faster RCNN / Resnet101的配置文件(另一个与此类似)。

有人对我如何克服这个限制有一些想法吗?

更新:问题出在配置文件的train_input_reader和eval_input_reader部分。每个标签都有一个可选参数: max_number_of_boxes ,它告诉读者为每个图像读取每个类的最大标签/盒子数。默认情况下为100,这意味着在我的培训和评估中,仅读取了前100个标签,所有标签都聚集在图像的顶部。训练仅在那些对象上进行,因此,大多数检测也恰好在图像的顶部(可能是由于过拟合)。我已经使用以下部分更新了以下配置文件。

model {
  faster_rcnn {
    num_classes: 1
    image_resizer {
      keep_aspect_ratio_resizer {
        min_dimension: 600
        max_dimension: 1024
      }
    }
    feature_extractor {
      type: 'faster_rcnn_resnet101'
      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.7
    first_stage_max_proposals: 3000
    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: 400
        max_total_detections: 800
      }
      score_converter: SOFTMAX
    }
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
  }
}

train_input_reader: {
  tf_record_input_reader {
    input_path: "<some path>\\train.tfrecords"
  }
  label_map_path: "<some path>\\train.pbtxt"
  max_number_of_boxes: 400
}

eval_input_reader: {
  tf_record_input_reader {
    input_path: "<some path>\\test.tfrecords"
  }
  label_map_path: "<some path>\\test.pbtxt"
  shuffle: false
  num_readers: 1
  max_number_of_boxes: 400
}

0 个答案:

没有答案