TensorFlow MNIST JSON 案例

json格式是一种常见的数据封装格式,我们可以通过代码的修改支持inference结果通过json格式来返回,这种转换的代码非常简单。

准备工作

请先阅读TensorFlow MNIST案例,编写自己的MNIST案例,或者开发别的案例

使用json格式封装输入、输出数据

您可以使用json格式封装输入、输出数据,这里给出了一个使用输入、输出数据为json格式的execute函数的范例(具体代码可以参见https://github.com/ucloud/uai-sdk/blob/master/examples/tensorflow/inference/mnist_0.11/mnist_inference_json.py)。 https://github.com/ucloud/uai-sdk/blob/master/examples/tensorflow/inference/mnist_0.11/2.json 是该案例的input json文件, 这里输入数据是json格式,有两个属性,一个是img,其值是图片的二进制值,一个是appid,其值是图片的ID。

{
   "img": "xxxx",

   "appid": "deadbeaf"
}

处理之前,代码会先依次读取appid和img两个属性对应的值。并对img数据进行处理,获取MNIST的识别结果"2", 最终结果会以json类型的方式返回,{“deadbeaf” : "2"}。(具体的json返回格式您可以根据需求自行定义) 具体代码实现如下:

def execute(self, data, batch_size):
    sess = self.output['sess']
    x = self.output['x']
    y_ = self.output['y_']

    ids = []
    imgs = []
    for i in range(batch_size):
      json_input = json.load(data[i])
      # 读取appid
      data_id = json_input['appid']
      # 读取img,并解码
      img_data = json_input['img'].decode('base64')
    
      im = Image.open(StringIO.StringIO(img_data)).resize((28, 28)).convert('L')
      im = np.array(im)
      im = im.reshape(784)
      im = im.astype(np.float32)
      im = np.multiply(im, 1.0 / 255.0)
      imgs.append(im)
      ids.append(data_id)
    
    imgs = np.array(imgs)
    print(imgs.shape)
    predict = sess.run(y_, feed_dict={x: imgs})
    ret = []
    
    for i in range(batch_size):
      读取inference结果,并编码成json格式
      ret_val = np.array_str(np.argmax(predict[i]))
      ret_item = json.dumps({ids[i]: ret_val})
      ret.append(ret_item)
    return ret

这部分代码的重点在于:

  • 对json对象的解析(这里我们使用json python包)
	json_input = json.load(data[i])
      # 读取appid
      data_id = json_input['appid']
      # 读取img,并解码
      img_data = json_input['img'].decode('base64')
  • 将返回结果使用json对象封装
ret_val = np.array_str(np.argmax(predict[i]))
      ret_item = json.dumps({ids[i]: ret_val})
      ret.append(ret_item)

测试MNIST json案例

我们同样提供了MNIST json案例的测试工具,启动server 服务的方法与MNIST案例相同,但是我们需要使用2.json作为input进行测试:

> curl -X POST http://localhost:8080/service -T http-server-flask/2.json
> { "deadbeef" : "2"}