TFRecord格式用于一个训练图像上相同或不同类的多个实例

时间:2018-03-02 08:37:41

标签: python-3.x tensorflow tfrecord

我正在尝试使用新的Object Detection API在grocery dataset检测上训练更快的R-CNN,但我不太了解为此创建TFRecord文件的过程。我知道牛津和VOC数据集示例以及创建TFRecord文件的脚本,如果训练图像中只有一个对象,它们可以正常工作,这是我在所有官方示例和github项目中看到的。我有图像,其中定义了20多个对象,顺便说一下,对象有不同的类。我不希望每个图像迭代20次以上并创建20个几乎相同的tf_examples,其中只有20g的img_encoded将占用我所有的空间。

  tf_example = tf.train.Example(features=tf.train.Features(feature={
      '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),
  }))
  return tf_example

我相信我在该领域的问题的答案是creating tf_records xmin,xmax,ymin,ymax,classes_text和类应该都是每个边界框有一个值的列表,所以我可以添加不同的对象和参数到每个图像的这些列表。

也许某人有经验并可以提供建议。我所描述的方式是否有效,如果没有,有没有办法以一种精巧而简单的方式为一个图像中的多个对象创建tf_recrds?

我刚刚在这里放了一些功能(不是全部)用于按照我认为必须工作的方式创建tfrecords,因为注释中的内容(列表...(每盒1个) )在我附上的链接。希望的想法是从附加的json干净。

要清除某些情况:xmin例如对于附加功能示例中的4个不同的bbox,有4个不同的标准化xmin [0.4056372549019608,0.47794117647058826,0.4840686274509804,0.4877450980392157]。不要忘记使用 dataset_util.float_list_feature 方法将列表转换为可序列化的json格式。 ç

features {
  feature {
    key: "image/filename"
    value {
      bytes_list {
        value: "C4_P06_N1_S4_1.JPG"
      }
    }
  }
  feature {
    key: "image/format"
    value {
      bytes_list {
        value: "jpeg"
      }
    }
  }
  feature {
    key: "image/height"
    value {
      int64_list {
        value: 2112
      }
    }
  }
  feature {
    key: "image/key/sha256"
    value {
      bytes_list {
        value: "4e0b458e4537f87d72878af4201c55b0555f10a0e90decbd397fd60476e6e973"
      }
    }
  }
  feature {
    key: "image/object/bbox/xmax"
    value {
      float_list {
        value: 0.43323863636363635
        value: 0.4403409090909091
        value: 0.46448863636363635
        value: 0.5085227272727273
      }
    }
  }
  feature {
    key: "image/object/bbox/xmin"
    value {
      float_list {
        value: 0.3565340909090909
        value: 0.36363636363636365
        value: 0.39204545454545453
        value: 0.4318181818181818
      }
    }
  }
  feature {
    key: "image/object/bbox/ymax"
    value {
      float_list {
        value: 0.9943181818181818
        value: 0.7708333333333334
        value: 0.20265151515151514
        value: 0.9943181818181818
      }
    }
  }
  feature {
    key: "image/object/bbox/ymin"
    value {
      float_list {
        value: 0.8712121212121212
        value: 0.6174242424242424
        value: 0.06818181818181818
        value: 0.8712121212121212
      }
    }
  }
  feature {
    key: "image/object/class/label"
    value {
      int64_list {
        value: 1
        value: 0
        value: 3
        value: 0
      }
    }
  }
}

我有点做了我认为必须提供的帮助,但我在训练期间得到了这些数字而且这是不正常的。

INFO:tensorflow:global step 204: loss = 1.4067 (1.177 sec/step)
INFO:tensorflow:global step 205: loss = 1.0570 (1.684 sec/step)
INFO:tensorflow:global step 206: loss = 1.0229 (0.916 sec/step)
INFO:tensorflow:global step 207: loss = 80484784668672.0000 (0.587 sec/step)
INFO:tensorflow:global step 208: loss = 981436265922560.0000 (0.560 sec/step)
INFO:tensorflow:global step 209: loss = 303916113723392.0000 (0.539 sec/step)
INFO:tensorflow:global step 210: loss = 4743170218786816.0000 (0.613 sec/step)
INFO:tensorflow:global step 211: loss = 2933532187951104.0000 (0.518 sec/step)
INFO:tensorflow:global step 212: loss = 1.8134 (1.513 sec/step)
INFO:tensorflow:global step 213: loss = 73507901414572032.0000 (0.553 sec/step)
INFO:tensorflow:global step 214: loss = 650799901688463360.0000 (0.622 sec/step)

P.S 附加信息:对于普通视图,其中1个图像具有来自此数据集的1个对象类,一切正常。

3 个答案:

答案 0 :(得分:3)

你的正确性是xmin,xmax,ymin,ymax,classes_text和classes都是每个边界框都有一个值的列表。无需为每个边界框复制图像;它确实占用了大量的磁盘空间。正如@ gautam-mistry指出的那样,这些记录流入了张量流;只要每个图像都适合RAM,你就可以了,即使你复制了图像(只要你有磁盘空间)。

答案 1 :(得分:0)

TFRecords文件表示一系列(二进制)字符串。格式不是随机访问,因此适用于流式传输大量数据,但如果需要快速分片或其他非顺序访问则不适用。

tf.python_io.TFRecordWritertf.python_io.tf_record_iteratortf.python_io.TFRecordCompressionTypetf.python_io.TFRecordOptions

答案 2 :(得分:0)

我发现了问题所在->我的protobuf类文件中有一个错误。不同类型的类涉及一个类。例如:

item {
  id: 1
  name: 'raccoon'
}

item {
  id: 1
  name: 'lion'
}

依此类推,但是由于我只有大约50堂课,因此损失很大。也许会帮助某人,请谨慎使用proto txt:)