我正在为对象检测创建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个
答案 0 :(得分:2)
"第一种方法"将原始 jpeg数据放在tfrecord中,之后才会将图像实际解码为像素数组。这样做的好处是你的tfrecords更小,因为数据实际上仍然是jpeg编码的。
" opencv"方法在您imread
时对jpeg图像进行解码,因此您将已解码(并因此较重)的图像作为像素阵列放入tfrecod。
IMO,你最好把图像写成tfrecord中的jpeg,并在Tensorflow中做任何串联(通过TF操作或py_func
)。