在服务器的docker中部署深度学习模型(flask框架)

目录

      • 服务端
      • 客户端
      • 过程中遇到的问题

目标: 我需要在测试polygonrnn++的预测效果,并把模型部署在服务器上。

服务端

首先在服务端搭建配置好环境的docker。 新建容器时有几个注意点:

  • 使用nvidia-docker 或者设置 --runtime 参数,否则 import tensorflow (gpu版) 时会报错: file too short
  • 使用 -p 参数设置多个端口映射, :左边是服务器端口,:后边是容器的端口; 设置多个端口的目的在于,使用pycharm调试远程服务器上docker中的代码需要一个端口,flask启动服务时候又需要一个端口… 多开放几个端口备用总没坏处
  • 容器中需要安装 openssh-server 并开启 ssh 服务:
nvidia-docker run -it --name container_name -p 1111:22 -p 1112:6006 =p 1113:8888 image_name 
apt-get update
apt-get install openssh-server
apt-get install vim
vim /etc/ssh/sshd_config  # PermitRootLogin 这一行 prohibit-password 改为 yes
passwd
service ssh restart

服务端代码 polygon_app.py

import os
import numpy as np
import utils
import skimage.io as io
import json
import time
import tensorflow as tf
from flask import Flask, request, jsonify
import cv2
from PIL import Image
from io import BytesIO

app = Flask(__name__)

_BATCH_SIZE = 1
_FIRST_TOP_K = 1

os.environ['CUDA_VISIBLE_DEVICES'] = '2'

# 定义载入模型的函数,具体代码省略,此处应用了全部变量的思想
def load_model():
	global model
	global polySess

def wrapup_data_dict(predictions_dict):
    output_dict = {"success": True, 'polys': predictions_dict['polys'][0].tolist()}
    return output_dict

@app.route('/predict', methods = ["POST"])
def predict():
    data = {"success": False}
    if request.method == "POST":
        if request.files.get("image"):
            # 网络传输中一般选择二进制传输,此步获得request请求中的image数据,为binary格式
            image = request.files["image"].read() 
            # 将二进制转化为对象
            image = Image.open(BytesIO(image)).convert('RGB') 
            # 将image转换为array
            image = np.array(image) 
            image = cv2.resize(image, (224, 224), cv2.INTER_NEAREST)
            image_np = np.expand_dims(image, axis=0)
            t_start = time.time()
            # 预测
            preds = [model.do_test(polySess, image_np, top_k) for top_k in range(_FIRST_TOP_K)]

            # sort predictions based on the eval score and pick the best
            preds = sorted(preds, key=lambda x: x['scores'][0], reverse=True)[0]
            output = {'polys': preds['polys']}
            # 将数据保包装成可jsonify的dict格式
            data = wrapup_data_dict(output)    # data = {"success": True, 'polys': [[x,y],[x,y],[x,y]]}
            print("single image crop cost {}s".format(time.time() - t_start))
    return jsonify(data)

if __name__ == "__main__":
    load_model()
    # host ip: 容器中的本机ip, port为创建容器时的开放端口号
    app.run(host='172.17.0.6', port=6006, debug=True, use_reloader=False)

使用pycharm调试远程服务器上docker中的代码的具体操作可以参照此处:https://blog.csdn.net/weixin_40122615/article/details/102746393

运行polygon_app.py, 出现以下信息,表明服务已成功开启
在服务器的docker中部署深度学习模型(flask框架)_第1张图片

客户端

在本地运行客户端代码

# 要向它发送request请求的地址,[运行容器的服务器地址]:[已定义的服务器映射端口号]
TEST_API_URL = 'http://192.168.0.11:1112/predict'
prefix = 'D:/data/polygonrnn-pp'

def vis_predictions(img_name, image, preds_dict, show_ggnn = False):

    # 此函数用来可视化预测结果并保存


def predict_result(image_path):
    # Initialize image path
    img_name = image_path.split('/')[-1].split('.')[0]
    image = open(image_path, 'rb').read()  # bin
    payload = {'image': image}

    # Submit the request.
    r = requests.post(TEST_API_URL, files=payload).json()

    # Ensure the request was successful.
    if r['success']:
        # convert binary to PIL.image object
        image = Image.open(io.BytesIO(image)).convert('RGB')
        if 'polys_ggnn' in r:
            vis_predictions(img_name, np.array(image), r, show_ggnn=True)
        else:
            vis_predictions(img_name, np.array(image), r)
        print('Request done')

    # Otherwise, the request failed.
    else:
        print('Request failed')

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="simple_request")
    parser.add_argument('--file', type=str, help='test image file')
    args = parser.parse_args()
    predict_result(args.file)

指定要测试的图片,返回以下结果。
在这里插入图片描述
服务端输出的200表明数据已成功返回客户端
在服务器的docker中部署深度学习模型(flask框架)_第2张图片
测试结果:
在服务器的docker中部署深度学习模型(flask框架)_第3张图片

过程中遇到的问题

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
从服务器传回的json格式不对,

你可能感兴趣的:(TensorFlow,docker)