为啥来自 Tensorflow 2 对象检测 API 的微调模型上的 mAP 较低?

Posted

技术标签:

【中文标题】为啥来自 Tensorflow 2 对象检测 API 的微调模型上的 mAP 较低?【英文标题】:Why low mAP on fine-tuned model from Tensorflow 2 Object Detection API?为什么来自 Tensorflow 2 对象检测 API 的微调模型上的 mAP 较低? 【发布时间】:2021-12-19 15:25:14 【问题描述】:

我遵循所有步骤并在线阅读所有内容,并且我从 TF2 OD API 的 Model Zoo 成功训练了 SSD-MobileNetV1。

我使用新类“Handgun”和“Knife”微调了这个模型,并使用了包含 3500 张图像的平衡数据集。训练进行得很好,但是当我使用“pascal_voc_detection_metrics”运行评估过程(用于验证)时,我使用“Handgun”类达到了 0.005 AP@0.5(检测模型设法达到或多或少的 0.005 AP),这非常低,但 0.93 AP@0.5 与“刀”类。

我不明白为什么。我真的阅读了所有内容,但找不到解决方案。

SDD-MobileNetV1的配置:

model 
  ssd 
    num_classes: 2
    image_resizer 
      fixed_shape_resizer 
        height: 640
        width: 640
      
    
    feature_extractor 
      type: "ssd_mobilenet_v1_fpn_keras"
      depth_multiplier: 1.0
      min_depth: 16
      conv_hyperparams 
        regularizer 
          l2_regularizer 
            weight: 4e-05
          
        
        initializer 
          random_normal_initializer 
            mean: 0.0
            stddev: 0.01
          
        
        activation: RELU_6
        batch_norm 
          decay: 0.997
          scale: true
          epsilon: 0.001
        
      
      override_base_feature_extractor_hyperparams: true
      fpn 
        min_level: 3
        max_level: 7
      
    
    box_coder 
      faster_rcnn_box_coder 
        y_scale: 10.0
        x_scale: 10.0
        height_scale: 5.0
        width_scale: 5.0
      
    
    matcher 
      argmax_matcher 
        matched_threshold: 0.5
        unmatched_threshold: 0.5
        ignore_thresholds: false
        negatives_lower_than_unmatched: true
        force_match_for_each_row: true
        use_matmul_gather: true
      
    
    similarity_calculator 
      iou_similarity 
      
    
    box_predictor 
      weight_shared_convolutional_box_predictor 
        conv_hyperparams 
          regularizer 
            l2_regularizer 
              weight: 4e-05
            
          
          initializer 
            random_normal_initializer 
              mean: 0.0
              stddev: 0.01
            
          
          activation: RELU_6
          batch_norm 
            decay: 0.997
            scale: true
            epsilon: 0.001
          
        
        depth: 256
        num_layers_before_predictor: 4
        kernel_size: 3
        class_prediction_bias_init: -4.6
      
    
    anchor_generator 
      multiscale_anchor_generator 
        min_level: 3
        max_level: 7
        anchor_scale: 4.0
        aspect_ratios: 1.0
        aspect_ratios: 2.0
        aspect_ratios: 0.5
        scales_per_octave: 2
      
    
    post_processing 
      batch_non_max_suppression 
        score_threshold: 1e-08
        iou_threshold: 0.6
        max_detections_per_class: 100
        max_total_detections: 100
        use_static_shapes: false
      
      score_converter: SIGMOID
    
    normalize_loss_by_num_matches: true
    loss 
      localization_loss 
        weighted_smooth_l1 
        
      
      classification_loss 
        weighted_sigmoid_focal 
          gamma: 2.0
          alpha: 0.25
        
      
      classification_weight: 1.0
      localization_weight: 1.0
    
    encode_background_as_zeros: true
    normalize_loc_loss_by_codesize: true
    inplace_batchnorm_update: true
    freeze_batchnorm: false
  

train_config 
  batch_size: 4
  data_augmentation_options 
    random_horizontal_flip 
    
  
  data_augmentation_options 
    random_crop_image 
      min_object_covered: 0.0
      min_aspect_ratio: 0.75
      max_aspect_ratio: 3.0
      min_area: 0.75
      max_area: 1.0
      overlap_thresh: 0.0
    
  
  sync_replicas: true
  optimizer 
    momentum_optimizer 
      learning_rate 
        cosine_decay_learning_rate 
          learning_rate_base: 0.04
          total_steps: 25000
          warmup_learning_rate: 0.013333
          warmup_steps: 2000
        
      
      momentum_optimizer_value: 0.9
    
    use_moving_average: false
  
  fine_tune_checkpoint: "pre-trained-models/ssd_mobilenet_v1_fpn_640x640_coco17_tpu-8/checkpoint/ckpt-0"
  num_steps: 25000
  startup_delay_steps: 0.0
  replicas_to_aggregate: 8
  max_number_of_boxes: 100
  unpad_groundtruth_tensors: false
  fine_tune_checkpoint_type: "detection"
  fine_tune_checkpoint_version: V2

train_input_reader 
  label_map_path: "/annotations/label_map.pbtxt"
  tf_record_input_reader 
    input_path: "/annotations/train.record"
  

eval_config 
  metrics_set: "pascal_voc_detection_metrics"
  use_moving_averages: false
  batch_size: 1

eval_input_reader 
  label_map_path: "/annotations/label_map.pbtxt"
  shuffle: false
  num_epochs: 1
  tf_record_input_reader 
    input_path: "/annotations/validation.record"
  


我使用 model_main_tf2.py 进行训练和评估,并使用 roboflow 在 TFRecords 中转换我的图像。

【问题讨论】:

【参考方案1】:

这是link 报告的库的错误。 COCO 指标没有这个问题,所以用它来评估你的模型。 问题还没有解决。如果您想关注对代码所做的更新(它们工作正常),请点击上一个链接以及这个link

【讨论】:

以上是关于为啥来自 Tensorflow 2 对象检测 API 的微调模型上的 mAP 较低?的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 自定义对象检测结果令人失望 - 为啥?

Tensorflow对象检测:为啥使用ssd mobilnet v1时图像中的位置会影响检测精度?

如何使用 Tensorflow 2 对象检测 API 恢复微调模型以进行测试?

使用重新训练的 Tensorflow 对象检测模型使用 snpe 进行 pb 到 dlc 转换失败

使用rtsp流时Tensorflow对象检测速度慢

为啥我需要另一个来自 tensorflow 的 conda 环境?