API обнаружения объектов Tensorflow 2 Low mAP

Я пытаюсь обучить более быструю модель r-cnn, используя обнаружение объектов Tensorflow 2.0, однако у меня очень низкий показатель mAP на уровне 0,01.

Я взглянул на обучающие изображения в Tensorboard, и обучающие изображения не выглядят правильно загруженными, или я сделал что-то не так в файле конфигурации.. Я следую руководству RoboFlow, используя образец набора данных Hardhat. Это моя записная книжка Colab (https://colab.research.google.com/drive/1cjHpLYq8NAEce36mJGGg0Lec31wSdtF9?usp=sharing).

На верхнем изображении показано изображение, которое использовалось в наборе обучающих данных, загруженном в Tensorboard, а изображение ниже является исходным.

Я совершенно новичок в этом, и я не уверен, где я ошибаюсь. Ниже приведен файл конфигурации, который я использую.

       model {
  faster_rcnn {
    num_classes: 3
    image_resizer {
      keep_aspect_ratio_resizer {
        min_dimension: 640
        max_dimension: 640
        pad_to_max_dimension: true
      }
    }
    feature_extractor {
      type: 'faster_rcnn_resnet101_keras'
      batch_norm_trainable: true
    }
    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: 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
            }
          }
        }
        share_box_across_classes: true
      }
    }
    second_stage_post_processing {
      batch_non_max_suppression {
        score_threshold: 0.0
        iou_threshold: 0.6
        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
    use_static_shapes: true
    use_matmul_crop_and_resize: true
    clip_anchors_to_image: true
    use_static_balanced_label_sampler: true
    use_matmul_gather_in_matcher: true
  }
}

train_config: {
  batch_size: 1
  sync_replicas: true
  startup_delay_steps: 0
  replicas_to_aggregate: 8
  num_steps: 2000
  optimizer {
    momentum_optimizer: {
      learning_rate: {
        cosine_decay_learning_rate {
          learning_rate_base: .04
          total_steps: 25000
          warmup_learning_rate: .013333
          warmup_steps: 2000
        }
      }
      momentum_optimizer_value: 0.9
    }
    use_moving_average: false
  }
  fine_tune_checkpoint_version: V2
  fine_tune_checkpoint: "/content/models/research/deploy/faster_rcnn_resnet101_v1_640x640_coco17_tpu-8/checkpoint/ckpt-0"
  fine_tune_checkpoint_type: "detection"
  data_augmentation_options {
    random_horizontal_flip {
    }
  }

  max_number_of_boxes: 100
  unpad_groundtruth_tensors: false
  use_bfloat16: true  # works only on TPUs
}

train_input_reader: {
  label_map_path: "/content/train/Workers_label_map.pbtxt"
  tf_record_input_reader {
    input_path: "/content/train/Workers.tfrecord"
  }
}

eval_config: {
  metrics_set: "coco_detection_metrics"
  use_moving_averages: false
  batch_size: 1;
}

eval_input_reader: {
  label_map_path: "/content/train/Workers_label_map.pbtxt"
  shuffle: false
  num_epochs: 1
  tf_record_input_reader {
    input_path: "/content/valid/Workers.tfrecord"
  }
}

Заранее спасибо!

1 ответ

Глядя на результаты тренировок, похоже, что вам следует попробовать одну из следующих вещей:

  1. Набор данных, который вы использовали, состоял всего из 100 изображений. Попробуйте увеличить его размер с помощью аугментации (или, в данном случае, вместо этого используйте полный набор данных, который содержит более 7000 изображений).
  2. Каждая эпоха занимает менее секунды, поэтому общее время тренировки было менее 5 минут. Вы можете попробовать повысить num_stepsот 2000 до 20 000 или 100 000. Исходя из предыдущего опыта, эти модели TF2, как правило, требуют довольно много времени, чтобы сойтись.
  3. Попробуйте другую модель (я видел, что YOLOv5 и YOLOv4 гораздо быстрее сходятся на небольших наборах данных из-за их встроенных дополнений).