tensorflow从numpy opencv奇怪的大小创建TFrecord

时间:2018-06-05 13:06:39

标签: python tensorflow tfrecord

我正在为对象检测创建TFrecord格式。当我们有图像的路径时,有两种方法可以做到这一点:

with tf.gfile.GFile(path+filename, 'rb') as fid:
        encoded_image_data = fid.read()
feat = {
      '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_image_data),
      '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)
      }
tf_example = tf.train.Example(features=tf.train.Features(feature=feat))

另一种方法是使用opencv而不是GFile:

img = cv2.imread(path+filename)
img = img.astype(np.uint8)
img_encoded = img.tostring()

但我不明白。事实上,当我用GFile格式创建TFrecord时,我得到一个10 MB的文件(这是我的数据集的大小为.jpg格式)。当我使用opencv方法时,我得到93 MB。为什么我会有这样的差异?如何使用opencv格式缩小大小?

P.S:我需要opencv格式,因为我想连接图像以获得4个通道而不是3个

1 个答案:

答案 0 :(得分:2)

"第一种方法"将原始 jpeg数据放在tfrecord中,之后才会将图像实际解码为像素数组。这样做的好处是你的tfrecords更小,因为数据实际上仍然是jpeg编码的。

" opencv"方法在您imread时对jpeg图像进行解码,因此您将已解码(并因此较重)的图像作为像素阵列放入tfrecod。

IMO,你最好把图像写成tfrecord中的jpeg,并在Tensorflow中做任何串联(通过TF操作或py_func)。