Преобразование градаций серого в RGB в tfrecord - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть набор данных в градациях серого, и я хотел бы использовать контрольные точки sdd-mobilenet для обучения обнаружению моего объекта.Как правильно преобразовать изображения в градациях серого в RGB, чтобы я мог преобразовать свой набор данных в tfrecord?Вот код, который я использую (обратите внимание, что закомментированные части не работают для меня)

with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid:
    encoded_jpg = fid.read()
# rgb_image = tf.image.grayscale_to_rgb(
#     tf.image.encode_jpeg(encoded_jpg),
#     name=None
# )
encoded_jpg_io = io.BytesIO(encoded_jpg)
encoded_jpg_io = tf.stack([encoded_jpg_io, encoded_jpg_io, encoded_jpg_io], axis=-1)
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():
    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(class_text_to_int(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/channels': dataset_util.int64_feature(),
    '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

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Почему 'image / channel': dataset_util.int64_feature (3) работает, а не

'image / channel': dataset_util.int64_feature (1), так как вы передаете изображения в оттенках серого с 1 цветным каналом?

0 голосов
/ 28 апреля 2018

Я попробовал разные методы и, наконец, смог получить ответ (не только преобразование в tfrecords, но также обучение и само обнаружение объекта).

Если набор данных состоит только из изображений в градациях серого, только для обнаружения объектов Tensorflowнужно, чтобы количество каналов было определено как 3. Следовательно, единственное необходимое изменение - добавить 'image/channels': dataset_util.int64_feature(3) к функциям поезда внутри кода.Абсолютно нет необходимости преобразовывать оттенки серого в RGB , используя cv2.COLOR_GRAY2BGR или tf.image.grayscale_to_rgb.

Преобразование изображений с использованием этих методов приводит к ошибкам, таким как: outofrangeerror FIFOQueue '_3_prefetch_queue' is closed and has insufficient elements (requested 1, current size 0) или OP_REQUIRES failed at iterator_ops.cc:891 : Invalid argument: assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP] во времяобучение.

Чтобы избежать каких-либо дополнительных усилий, убедитесь, что вы используете изображения jpg.Если у вас есть другие форматы, такие как bmp, конвертируйте их в jpg.Обратите внимание, что изменение расширения файла не является преобразованием. Вы должны преобразовать их, используя любые инструменты, которые вы предпочитаете.

...