我正在尝试使用对象检测来计算图像中玉米粒的数量。我已经从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
}