我正在尝试编写一个函数,它在tensorflow中读取json文件。 json文件具有以下结构:
{
"bounding_box": {
"y": 98.5,
"x": 94.0,
"height": 197,
"width": 188
},
"rotation": {
"yaw": -27.97019577026367,
"roll": 2.206029415130615,
"pitch": 0.0},
"confidence": 3.053506851196289,
"landmarks": {
"1": {
"y": 180.87722778320312,
"x": 124.47326660156205},
"0": {
"y": 178.60653686523438,
"x": 183.41931152343795},
"2": {
"y": 224.5936889648438,
"x": 141.62365722656205
}}}
我只需要边界框信息。有一些关于如何编写read_and_decode函数的例子,我试图将这些例子转换成json文件的函数,但仍有很多问题......:
def read_and_decode(filename_queue):
reader = tf.WhichKindOfReader() # ???
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(
serialized_example,
features={
'bounding_box':{
'y': tf.VarLenFeature(<whatstheproperdatatype>) ???
'x':
'height':
'width':
# I only need the bounding box... - do I need to write
# the format information for the other features...???
}
})
y=tf.decode() # decoding necessary?
x=
height=
width=
return x,y,height,width
我已经在互联网上做了几个小时的研究,但是找不到任何关于如何在张量流中读取json的细节...
也许有人可以给我一些线索......
答案 0 :(得分:5)
下面的解决方案确实可以完成工作,但效率不高,请参阅注释以了解详细信息。
如果使用tf.py_func
包装函数,则可以对TensorFlow使用标准python json解析:
import json
import numpy as np
import tensorflow as tf
def get_bbox(str):
obj = json.loads(str.decode('utf-8'))
bbox = obj['bounding_box']
return np.array([bbox['x'], bbox['y'], bbox['height'], bbox['width']], dtype='f')
def get_multiple_bboxes(str):
return [[get_bbox(x) for x in str]]
raw = tf.placeholder(tf.string, [None])
[parsed] = tf.py_func(get_multiple_bboxes, [raw], [tf.float32])
请注意,tf.py_func
会返回张量列表,而不仅仅是一个张量,这就是我们需要将parsed
包装在列表[parsed]
中的原因。如果没有,parsed
将获得形状[1, None, 4]
而不是所需的形状[None, 4]
(其中None
是批量大小)。
使用您的数据可获得以下结果:
json_string = """{
"bounding_box": {
"y": 98.5,
"x": 94.0,
"height": 197,
"width": 188
},
"rotation": {
"yaw": -27.97019577026367,
"roll": 2.206029415130615,
"pitch": 0.0},
"confidence": 3.053506851196289,
"landmarks": {
"1": {
"y": 180.87722778320312,
"x": 124.47326660156205},
"0": {
"y": 178.60653686523438,
"x": 183.41931152343795},
"2": {
"y": 224.5936889648438,
"x": 141.62365722656205
}}}"""
my_data = np.array([json_string, json_string, json_string])
init_op = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(parsed, feed_dict={raw: my_data}))
print(sess.run(tf.shape(parsed), feed_dict={raw: my_data}))
[[ 94. 98.5 197. 188. ]
[ 94. 98.5 197. 188. ]
[ 94. 98.5 197. 188. ]]
[3 4]
答案 1 :(得分:0)
这可能会解决问题,但您可以使用命令行工具(如https://stedolan.github.io/jq/tutorial/)将数据预处理为基于行的数据格式,如csv。也可能更有效率。