制作具有不同大小的不同类别的图像的单个批次进行分类?

时间:2018-06-27 06:40:25

标签: image tensorflow decoding tfrecord

我有一个名为“ CLASS.tfrecord ”的tfrecord文件,该文件存储带有标签的可变大小图像,例如形状为(244、400、3)和(311、411、3)的图像。批量解码图像时,会引发错误报告,提示推断的大小不同。

我想在同一批次中混合不同类别的图像,以训练分类器而不会由于数据不平衡而产生偏差

这是代码:

var ref = Database.database().reference()

完整的回溯是:

def decode_batch_example(serialized_output, num_examples, parallel=16):
"""
:param serialized_output:
:param num_examples:
:param parallel:
:return:
"""

read_format_dict = {'image': tf.FixedLenFeature([], dtype=tf.string),
                    'label': tf.FixedLenFeature([], dtype=tf.string),
                    'name': tf.FixedLenFeature([], dtype=tf.string),
                    'height': tf.FixedLenFeature([], dtype=tf.int64),
                    'width': tf.FixedLenFeature([], dtype=tf.int64),
                    'channel': tf.FixedLenFeature([], dtype=tf.int64)}

batch = tf.train.batch([serialized_output],
                       num_examples,
                       capacity=num_examples*10,
                       name='batch_of_serialized_output')

raw_data_batch = tf.parse_example(serialized=batch, features=read_format_dict, name='raw_data_batch')

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord, sess=tf.get_default_session())

height_batch = tf.map_fn(lambda x: tf.cast(x, dtype=tf.int32),
                         raw_data_batch['height'],
                         dtype=tf.int32,
                         back_prop=False,
                         parallel_iterations=parallel,
                         name='height_batch')

width_batch = tf.map_fn(lambda x: tf.cast(x, dtype=tf.int32),
                         raw_data_batch['width'],
                         dtype=tf.int32,
                         back_prop=False,
                         parallel_iterations=parallel,
                         name='width_batch')

channel_batch = tf.map_fn(lambda x: tf.cast(x, dtype=tf.int32),
                        raw_data_batch['channel'],
                        dtype=tf.int32,
                        back_prop=False,
                        parallel_iterations=parallel,
                        name='channel_batch')

image_shape_batch = tf.map_fn(lambda x: tf.stack([x[0], x[1], x[2]]),
                        (height_batch, width_batch, channel_batch),
                        dtype=tf.int32, name='image_shape_batch')

image_batch = tf.map_fn(lambda x: tf.decode_raw(x, tf.uint8),
                        raw_data_batch['image'],
                        dtype=tf.uint8,
                        back_prop=False,
                        parallel_iterations=parallel,
                        name='decode_raw_image')

image_batch = tf.map_fn(lambda x: tf.reshape(x[0], x[1]),
                        (image_batch,
                        image_shape_batch),
                        dtype=tf.uint8,
                        back_prop=False,
                        parallel_iterations=parallel,
                        name='reshaped_image')

label_batch = raw_data_batch['label']
name_batch = raw_data_batch['name']

coord.request_stop()
coord.join(threads)

return {'image_pixel': image_batch, 'image_name': name_batch}, label_batch

我应该为不同大小的图像创建不同的tfrecords,并为数据混合不同的批次吗?我做错了明显的事。我知道Fully Connected图层会使用相同大小的图像,但是对于在解码原始图像之前如何调整不同大小图像的大小感到困惑。

0 个答案:

没有答案