Проблема обнаружения большого количества объектов на одном изображении с помощью Tensorflow Object Detection API

Мне нужно обнаружить большое количество двух классов объектов на одном изображении. Я добился некоторого успеха, используя API обнаружения объектов Tensorflow, переобучив сеть fast_rcnn_inception_resnet_v2_atrous_coco из зоопарка модели обнаружения объектов, используя следующий файл конфигурации:

model {
  faster_rcnn {
    num_classes: 2
    image_resizer {
      keep_aspect_ratio_resizer {
        min_dimension: 600
        max_dimension: 1024
      }
    }
    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, 1.0, 2.0]
        aspect_ratios: [0.5, 1.0, 2.0]
        height_stride: 8
        width_stride: 8
      }
    }
    first_stage_atrous_rate: 2
    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: 2000
    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: 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.6
        max_detections_per_class: 1000
        max_total_detections: 1000
      }
      score_converter: SOFTMAX
    }
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
  }
}

train_config: {
  batch_size: 1
  optimizer {
    momentum_optimizer: {
      learning_rate: {
        manual_step_learning_rate {
          initial_learning_rate: 0.0003
          schedule {
            step: 900000
            learning_rate: .00003
          }
          schedule {
            step: 1200000
            learning_rate: .000003
          }
        }
      }
      momentum_optimizer_value: 0.9
    }
    use_moving_average: false
  }
  gradient_clipping_by_norm: 10.0
  fine_tune_checkpoint: "/path/model.ckpt"
  from_detection_checkpoint: true
  load_all_detection_checkpoint_vars: true
  # Note: The below line limits the training process to 200K steps, which we
  # empirically found to be sufficient enough to train the pets dataset. This
  # effectively bypasses the learning rate schedule (the learning rate will
  # never decay). Remove the below line to train indefinitely.
  num_steps: 200000
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
}

train_input_reader: {
  tf_record_input_reader {
    input_path: "/path/train.record"
  }
  label_map_path: "/path/label_map.pbtxt"
}

eval_config: {
  num_examples: 8000
  # Note: The below line limits the evaluation process to 10 evaluations.
  # Remove the below line to evaluate indefinitely.
  max_evals: 10
}

eval_input_reader: {
  tf_record_input_reader {
    input_path: "/path/val.record"
  }
  label_map_path: "/path/label_map.pbtxt"
  shuffle: false
  num_readers: 1
}

Однако, используя Nvidia M10 с 8 ГБ памяти, я могу обнаруживать только (примерно) верхнюю половину изображения:

Ограничивающие рамки обнаружения объектов только в верхней половине изображения

Этот шаблон соответствует многим изображениям, при этом некоторые изображения имеют несколько ограничивающих рамок ниже на изображении, но ни одно изображение не имеет ограничивающих рамок, точно распределенных по всему изображению. Моя первая мысль заключалась в том, что это проблема с памятью, поэтому я попытался запустить обнаружение на графическом процессоре с большим объемом памяти (Nvidia V100 с памятью 32 ГБ). Я изменил файл конфигурации, чтобы увеличить first_stage_max_proposals с 2000 до 4000 и max_detections_per_class / max_total_detections с 1000 до 2000 (на 8-гигабайтном графическом процессоре эти настройки привели к ошибке Aborted (core dumped)). Результаты были лишь ненамного лучше:

Ограничивающие рамки обнаружения объектов с большим графическим процессором (еще несколько рамок)

Я попытался поднять first_stage_max_proposals до 8000 и max_detections_per_class / max_total_detections до 4000, но это привело к ошибке Aborted (core dumped) на 32-гигабайтном графическом процессоре.

Мои вопросы:

1) Это лучшие настройки конфигурации для обнаружения большого количества объектов на одном изображении?

2) Есть ли лучшая сеть, чем fast_rcnn_inception_resnet_v2_atrous_coco для этой конкретной задачи?

3) Есть ли совершенно другой подход, который лучше подходит для этой проблемы?

Я подумал о том, чтобы разделить изображение на более мелкие изображения и запустить его на них, но, если возможно, я хотел бы сохранить его как одно изображение, так как точное количество объектов важно для моего приложения и разделение объектов по некоторой разделительной линии может привести к неточному подсчету.

Спасибо!


person cd_warman    schedule 31.12.2019    source источник
comment
Какое максимальное количество обнаружений вы хотите?   -  person Vedanshu    schedule 01.01.2020
comment
Максимальное количество обнаружений на изображение, вероятно, составит около 800 общих объектов, при среднем количестве обнаружений на изображение около 350-400 объектов.   -  person cd_warman    schedule 02.01.2020
comment
сделать max_proposals и max_total_detections 800.   -  person Vedanshu    schedule 03.01.2020
comment
Результаты очень похожи с max_proposals и max_total_detections, установленными на 800, при этом объекты не обнаруживаются в нижней половине изображения в качестве примера, и в целом меньше объектов обнаруживается в нижней половине.   -  person cd_warman    schedule 07.01.2020
comment
Можете ли вы удалить batch_non_max_suppression из second_stage_post_processing.   -  person Vedanshu    schedule 07.01.2020
comment
В любом случае, что именно вы пытаетесь обнаружить?   -  person Vedanshu    schedule 07.01.2020
comment
Вы когда-нибудь находили решение этой проблемы?   -  person gfkeith    schedule 25.03.2020
comment
Я так и не нашел хорошего решения. Я закончил тем, что разделил изображения (и обучение / аннотации) на более мелкие изображения (каждое изображение на 3 суб-изображения) и запустил обучение, а затем протестировал суб-изображения. Для окончательного вывода я повторно объединил фрагменты изображения с некоторыми незначительными элементами, чтобы исправить ограничивающие рамки по краям. Это сработало. Я пишу статью, которая скоро будет опубликована, я оставлю ее здесь, когда закончу.   -  person cd_warman    schedule 26.03.2020


Ответы (2)


Я столкнулся с той же проблемой. Итак, я только что внес некоторые изменения в конфигурационный файл модели Faster R-CNN Inception ResNet V2 1024x1024 от Model Zoo. Нравиться:

first_stage_max_proposals: 1500
max_detections_per_class: 1500
max_total_detections: 1500

Добавьте max_number_of_boxes: 1500 в блок train_config, train_input_reader и eval_input_reader. Я также добавляю max_num_boxes_to_visualize: 1500 в блок eval_config.

Эта работа меня устраивает. Итак, теперь я получаю обнаружение примерно 1500 объектов на одном изображении.

person Kashif Iqbal    schedule 26.07.2021

Помимо настройки max_detections_per_class и max_total_detections, вам необходимо добавить max_number_of_boxes в блоки train_config, train_input_reader и eval_input_reader и max_num_boxes_to_visualize в блок eval_config, иначе поле истинности земли будет вырезано из процесса обучения и оценки. Я развернул модель для решения проблемы, аналогичной вашей, где мы пытались обнаружить множество мелких объектов, и fast_rcnn_inception_resnet_v2_atrous_coco работает достаточно хорошо, так что это не должно быть вашей проблемой.

person Nuntipat Narkthong    schedule 25.07.2020