如何在Tensorflow中读取json文件?

时间:2016-07-14 18:42:55

标签: python json neural-network tensorflow

我正在尝试编写一个函数,它在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的细节...

也许有人可以给我一些线索......

2 个答案:

答案 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。也可能更有效率。