对象检测损失不减,AP增加

问题描述 投票:1回答:1

我正试图训练一个对象检测模型来检测和分类10个类。我的原始数据集非常稀疏且不平衡,共包含3k张标签图片,类之间的分布如下。

第一类: 21

第2班:22人

三班:9人

第4班:192人

第5类:2240

第6班:319人

7班:56人

8班:190人

9班:44人

10级:167人

由于这种稀疏性,我对所有图像进行了增强,即添加噪声、模糊、对比度、亮度和水平翻转。我还对翻转后的图像进一步增强了噪声、对比度和亮度。最终的数据集由37k张被标记的图像组成,其分布情况如下。

第一类: 4235

第2类:5365

第3类:2385

第4类:10755

第5类:17185

6级:4035

7级:3150

第8类:3820

第9类:555人

10班:1500人

下图显示了4个不同环节的不同损失。粉色图是来自37k图像的增强数据集的结果,而其他图则是来自之前在约2.5k图像的原始数据集上的运行。从粉色图中可以看出,总损失与初始值相比根本没有下降(之前运行的蓝色和红色图也是如此)。RPN的损失在减少,但盒子分类器的损失却在增加,这可能是什么原因呢?

Losses for different training sessions

我还附上了每个类的平均精度的图像。事实上,大部分类的精度一直在稳步上升,而损失却没有下降,我觉得这好像是模型过拟合?像我这样通过增强每一个数据集来增加10倍的数据集是个坏主意吗?我还在下面附上了我正在使用的配置文件。任何关于如何改善我的训练结果的建议都将被感激不尽!

Average precision for classes

 model {
  faster_rcnn {
    num_classes: 10
    image_resizer {
     fixed_shape_resizer {
       height: 300
       width: 500 
     }
    }
    feature_extractor {
      type: 'faster_rcnn_inception_resnet_v2'
      first_stage_features_stride: 8
    }
    first_stage_anchor_generator {
      grid_anchor_generator {
        scales: [0.25, 0.5, 0.75, 1.0, 1.5,2,3]
        aspect_ratios: [0.5,1,2,3]
        height: 32
        width: 32
        height_stride: 8
        width_stride: 8
      }
    }
    first_stage_atrous_rate: 1
    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: 17
    maxpool_kernel_size: 1
    maxpool_stride: 1
    second_stage_box_predictor {
      mask_rcnn_box_predictor {
        use_dropout: True
        dropout_keep_probability: 0.6
        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.3
        iou_threshold: 0.5
    #    soft_nms_sigma: 0.5
    #   use_class_agnostic_nms: True
    #    max_classes_per_detection: 1
        max_detections_per_class: 100
        max_total_detections: 100
      }
      score_converter: SOFTMAX
    }
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
  }
}
train_config: {
  batch_size: 1
  use_multiclass_scores : False  
  optimizer {
    #momentum_optimizer: {
    adam_optimizer: {
      learning_rate: {
        manual_step_learning_rate {
          initial_learning_rate: 0.0001
          schedule {
            step: 150000
            learning_rate: .00001
          }
          schedule {
            step: 250000
            learning_rate: .000001
          }
        }
      }
      #momentum_optimizer_value: 0.9
    }
    use_moving_average: false
  }
  gradient_clipping_by_norm: 10.0
  from_detection_checkpoint: false

  data_augmentation_options {
    random_horizontal_flip {}
  }

  data_augmentation_options {
    random_crop_image {
      min_object_covered : 1.0
      min_aspect_ratio: 1
      max_aspect_ratio: 1
      min_area: 0.5
      max_area: 1
       random_coef: 0.5
     }
  }
}
tensorflow deep-learning object-detection object-detection-api
1个回答
0
投票

不幸的是,对于深度学习,很多时候很难区分到底是哪个参数给你带来了问题。从你的问题来看,即使进行了数据增强,似乎也是一件很好的事情,就是你每个类的图片数量变化非常大。

比如说你增强数据后,你最终会有这些到类中的图片的情况

第5类:17185

第9类:555人

5级有17185张图片,而9级只有555张。在图像数量上存在着巨大的不平衡,通常情况下,它更倾向于让每个类的图像数量尽可能地接近。

当你在训练时,你会有一个验证部分,所有类的图像池将用于测试该实例的模型。如果你在一个类中有一堆图像,而另一个类没有,那么模型在验证来自大类的图像时会做得相当好,而在验证来自小类的图像时会很吃力,因为模型没有很多例子来训练,或者它开始用大类来训练更重,因为里面有更多的训练例子。

© www.soinside.com 2019 - 2024. All rights reserved.