тензорный поток создает TFrecord из странного размера NumPy OpenCV - PullRequest
0 голосов
/ 05 июня 2018

Я создаю формат 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()

, но я чего-то не понимаю,Фактически, когда я создавал TFrecord в формате GFile, я получал файл размером 10 Мб (это размер моего набора данных в формате .jpg).Когда я использую метод opencv, я получаю 93 МБ.Почему я получаю такую ​​разницу?Как я могу уменьшить размер с форматом opencv?

PS: мне нужен формат opencv, потому что я хочу объединить изображения, чтобы получить 4 канала вместо 3

1 Ответ

0 голосов
/ 05 июня 2018

«Первый метод» помещает данные raw jpeg в tfrecord и только позже фактически декодирует изображение в массив пикселей.Преимущество этого в том, что ваши tfrecords меньше, потому что данные фактически все еще в jpeg-кодировке.

Метод "opencv" декодирует изображение jpeg, когда вы imread, поэтому вы помещаете в tfrecod декодированный(и, следовательно, тяжелое) изображение в виде пиксельного массива.

IMO, вам лучше записать изображения в формате jpegs в tfrecord и выполнить любую необходимую конкатенацию в Tensorflow (либо с помощью операций TF, либо * 1008).* с). * * 1009

...