pyton3+urllib.request+json.dumps

client.py

#! -*- coding: utf-8 -*-
from urllib import request
import base64
import json

IMAGE_PATH = "test.png"
HOST = "http://127.0.0.1:5000/"


def base64_encode_image(a):
    return base64.b64encode(a).decode("utf-8")


def main():
    image = open(IMAGE_PATH, "rb").read()
    image = base64_encode_image(image)
    data = {"image": image}
    data = json.dumps(data)
    req = request.Request(HOST + "server", headers={"Content-Type": "application/json"})
    # bytes(data, encoding="utf-8")
    res = request.urlopen(req, data=bytes(data, encoding="utf-8"))
    result = res.read()
    print(result)


if __name__ == '__main__':
    main()

Server.py

#! -*- coding: utf-8 -*-
from tensorflow import keras as k
from PIL import Image
import numpy as np
import base64
import flask
import json
import sys
import io

MODEL_PATH = "../../experiments/imagecontact/inception_resnet_v2/checkpoints/weights.03-0.33.hdf5"

# load model
print("* Loading model ...")
model = k.models.load_model(MODEL_PATH)
# 如果出現一下錯誤
# ValueError: Tensor Tensor("outputs/Softmax:0", shape=(?, 2), dtype=float32) is not an element of this graph.
# 添加下一句
model._make_predict_function()
print("* Model loaded.")


def prepare_image(image, target):
    if image.mode != "RGB":
        image = image.convert("RGB")
    image = image.resize(target)
    image = np.asarray(image, "float32")
    image = np.expand_dims(image, axis=0)
    return image


def base64_decode_image(a):
    if sys.version_info.major == 3:
        a = bytes(a, encoding="utf-8")
    return base64.b64decode(a)


app = flask.Flask(__name__)


@app.route("/predict", methods=["POST"])
def predict():
    data = {"success": False}
    if flask.request.method == "POST":
        if flask.request.files.get("image"):
            image = flask.request.files["image"].read()
            image = Image.open(io.BytesIO(image))
            image = prepare_image(image, (224, 224))
            print("* inputs shape:", image.shape)
            outputs = model.predict(image)
            preds = np.argmax(outputs, axis=1)
            results = []
            for (pred, output) in zip(preds, outputs):
                r = {"pred": pred, "score": output[pred]}
                print(r)
                results.append(r)
            data["results"] = results
        else:
            data["err_msg"] = "Get none."
    else:
        data["err_msg"] = "Not support GET method."
    return flask.jsonify(data)


@app.route("/server", methods=["POST"])
def server():
    data = {"success": False}
    if flask.request.method == "POST":
        if flask.request.get_data():
            post_data = flask.request.get_data()
            post_data = json.loads(post_data)
            image = post_data["image"]
            image = base64_decode_image(image)
            image = Image.open(io.BytesIO(image))
            image = prepare_image(image, (224, 224))

            print("* inputs shape:", image.shape)
            outputs = model.predict(image)

            preds = np.argmax(outputs, axis=1)
            results = []
            for (pred, output) in zip(preds, outputs):
                r = {"pred": int(pred), "score": float(output[pred])}
                # json does not recognize NumPy data types. 
                # Convert the number to a Python int before serializing the object
                # r = {"pred": pred, "score": output[pred]}
                print(r)
                results.append(r)
            data["results"] = results
        else:
            data["err_msg"] = "Get none."
    else:
        data["err_msg"] = "Not support GET method."
    return json.dumps(data)


if __name__ == '__main__':
    app.run()

運行

  1. 使用http://127.0.0.1:5000/server服務
python client.py
  1. 使用http://127.0.0.1:5000/predict服務
curl -X POST -F [email protected] 'http://localhost:5000/predict'

歡迎交流學習

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章