Мне нужно обнаружить большое количество двух классов объектов на одном изображении. Я добился некоторого успеха, используя 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) Есть ли совершенно другой подход, который лучше подходит для этой проблемы?
Я подумал о том, чтобы разделить изображение на более мелкие изображения и запустить его на них, но, если возможно, я хотел бы сохранить его как одно изображение, так как точное количество объектов важно для моего приложения и разделение объектов по некоторой разделительной линии может привести к неточному подсчету.
Спасибо!
max_proposals
иmax_total_detections
800. - person Vedanshu   schedule 03.01.2020batch_non_max_suppression
изsecond_stage_post_processing
. - person Vedanshu   schedule 07.01.2020