Tensorflow Object Dectection API: как создавать tfrecords с изображениями, не содержащими никаких меток (жесткие негативы)?

Привет.

В настоящее время я использую API обнаружения объектов тензорного потока (с Faster Rcnn) в моем собственном наборе данных, для некоторых из моих меток я идентифицировал объекты, которые с большой вероятностью будут обнаружены как ложные срабатывания, и я знаю, что API использует интеллектуальный анализ жестких примеров , поэтому я пытаюсь ввести изображения, содержащие эти жесткие объекты, в обучение, чтобы майнер мог воспринимать их как жесткие негативы.

после этого разговора на github https://github.com/tensorflow/models/issues/2544 мне сказали, что это возможно

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

Итак, мой вопрос: как мне создать tfrecords с некоторыми изображениями, не имеющими ограничивающих рамок? Что мне добавить в связанные файлы .xml?


person OverFlow7    schedule 17.11.2017    source источник
comment
у тебя был ответ?   -  person Khanh Le    schedule 17.01.2018
comment
К сожалению нет   -  person OverFlow7    schedule 18.01.2018


Ответы (3)


В вашем сценарии генерации tfrecords убедитесь, что вы добавили метаданные жесткого негативного изображения в запись tf следующим образом:

tf_example = tf.train.Example(features=tf.train.Features(feature={
            'image/height': dataset_util.int64_feature(height),
            'image/width': dataset_util.int64_feature(width),
            'image/filename': dataset_util.bytes_feature(filename),
            'image/source_id': dataset_util.bytes_feature(filename),
            'image/encoded': dataset_util.bytes_feature(encoded_jpg),
            'image/format': dataset_util.bytes_feature(image_format)
            }))

Для изображения с объектами вы также должны добавить ограничивающие рамки и информацию о метке -

tf_example = tf.train.Example(features=tf.train.Features(feature={
            'image/height': dataset_util.int64_feature(height),
            'image/width': dataset_util.int64_feature(width),
            'image/filename': dataset_util.bytes_feature(filename),
            'image/source_id': dataset_util.bytes_feature(filename),
            'image/encoded': dataset_util.bytes_feature(encoded_jpg),
            'image/format': dataset_util.bytes_feature(image_format),
            'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
            'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
            'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
            'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
            'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
            'image/object/class/label': dataset_util.int64_list_feature(classes),
        }))

Также убедитесь, что вы установили min_negatives_per_image на положительное число в файле pipeline.config, иначе он не будет тренироваться с отрицательными изображениями.

person Malgo    schedule 13.05.2020
comment
да, я отмечу то же самое - нужно правильно настроить тренировочную конфигурацию, то есть min_negatives_per_image, чтобы вызвать ожидаемое жесткое отрицательное поведение выборки - person pitfall; 07.11.2020
comment
Я использовал этот фрагмент кода, и поведение моего поезда вообще не изменилось. Мне пришлось передать пустой список клавишам ящиков, чтобы его можно было использовать при обучении в качестве отрицательного образца (изображение без аннотаций). Использование fast_rcnn_resnet101_coco.config. - person denisb411; 20.01.2021

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

person Dmytro Prylipko    schedule 08.02.2019

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

def create_tf_example(group, path, label_map):
    with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid:
        encoded_jpg = fid.read()
    encoded_jpg_io = io.BytesIO(encoded_jpg)
    image = Image.open(encoded_jpg_io)
    width, height = image.size

    filename = group.filename.encode('utf8')
    image_format = b'jpg'

    xmins = []
    xmaxs = []
    ymins = []
    ymaxs = []
    classes_text = []
    classes = []

    for index, row in group.object.iterrows():
        if not pd.isnull(row.xmin):
            if not row.xmin == -1:
                xmins.append(row['xmin'] / width)
                xmaxs.append(row['xmax'] / width)
                ymins.append(row['ymin'] / height)
                ymaxs.append(row['ymax'] / height)
                classes_text.append(row['class'].encode('utf8'))
                classes.append(label_map[row['class']])

    tf_example = tf.train.Example(features=tf.train.Features(feature={
        'image/height': dataset_util.int64_feature(height),
        'image/width': dataset_util.int64_feature(width),
        'image/filename': dataset_util.bytes_feature(filename),
        'image/source_id': dataset_util.bytes_feature(filename),
        'image/encoded': dataset_util.bytes_feature(encoded_jpg),
        'image/format': dataset_util.bytes_feature(image_format),
        'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
        'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
        'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
        'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
        'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
        'image/object/class/label': dataset_util.int64_list_feature(classes),
    }))
    return tf_example

Итак, когда появляется фиктивная аннотация 'xmin == -1', она создает tfrecord с пустым списком ограничивающих рамок (class, xmin, xmax, ymin, ymax).

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

введите описание изображения здесь

person denisb411    schedule 19.01.2021