我正在尝试使用新的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个对象类,一切正常。
答案 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:)