tensorflow 从 numpy opencv 奇怪的大小创建 TFrecord
tensorflow create TFrecord from numpy opencv weird size
我正在创建一个 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 个
"first method" 将 raw jpeg 数据放入 tfrecord 中,稍后才会将图像实际解码为像素数组。这样做的好处是您的 tfrecords 更小,因为数据实际上仍然是 jpeg 编码的。
当您 imread
时,"opencv" 方法会解码 jpeg 图像,因此您将解码(因此很重)的图像作为像素数组放入 tfrecod。
IMO,你最好在 tfrecord 中将图像写成 jpeg,然后在 Tensorflow 中做你需要做的任何连接(通过 TF 操作或 py_func
s)。
我正在创建一个 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 个
"first method" 将 raw jpeg 数据放入 tfrecord 中,稍后才会将图像实际解码为像素数组。这样做的好处是您的 tfrecords 更小,因为数据实际上仍然是 jpeg 编码的。
当您 imread
时,"opencv" 方法会解码 jpeg 图像,因此您将解码(因此很重)的图像作为像素数组放入 tfrecod。
IMO,你最好在 tfrecord 中将图像写成 jpeg,然后在 Tensorflow 中做你需要做的任何连接(通过 TF 操作或 py_func
s)。