我正在尝试使用新的对象检测API在grocery dataset检测上训练更快的R-CNN,但是我不太了解为此创建TFRecord文件的过程。我知道牛津和VOC数据集示例以及用于创建TFRecord文件的脚本,并且如果训练图像中只有一个对象,它们可以正常工作,这是我在所有官方示例和github项目中看到的。我有定义了20多个对象的图像,而且对象具有不同的类。我不想对每张图像重复20次以上,并创建20个几乎相同的tf_examples,其中只有img_encoded将为20+会占用我的所有空间。
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和classes期间,我的问题的答案都应该是每个边界框具有一个值的列表,因此我可以在每个列表中将不同的对象和参数添加到这些列表中图像。
也许有人有经验,可以提供建议。我所描述的方法是否会起作用,如果没有,是否有任何方法可以通过精致而简单的方式为一个图像中的多个对象创建tf_recrds?
我只是在这里放了一些功能(不是全部),以我认为必须的方式创建tfrecords,因为我附上了链接中的注释( ...(每盒1个)列表)中所说的内容。希望从附带的json中获得灵感是干净的。
要清除某些情况:例如,xmin在附加功能示例中具有4个不同bbox的4个不同的标准化xmin [0.4056372549019608、0.47794117647058826、0.4840686274509804、0.4877450980392157]。不要忘记,列表是使用dataset_util.float_list_feature 方法转换为可序列化的json格式的。 C
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 其他信息:对于正常 View ,其中该图像数据集中有1个图像具有1个对象类,一切正常。
最佳答案
您是正确的,因为xmin,xmax,ymin,ymax,classes_text和classes都是每个边界框带有一个值的列表。无需为每个边界框复制图像。确实会占用大量磁盘空间。正如@ gautam-mistry所指出的,记录被流进 tensorflow ;只要每个镜像都适合RAM,就算您复制了镜像(只要有磁盘空间),也应该可以。
关于python-3.x - TFRecord格式用于一幅训练图像上相同或不同类的多个实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49065432/