余姚做百度网站建设/seo专员
目录
- 服务端
- 客户端
- 过程中遇到的问题
目标: 我需要在测试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 BytesIOapp = Flask(__name__)_BATCH_SIZE = 1
_FIRST_TOP_K = 1os.environ['CUDA_VISIBLE_DEVICES'] = '2'# 定义载入模型的函数,具体代码省略,此处应用了全部变量的思想
def load_model():global modelglobal polySessdef 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() # 将二进制转化为<PIL.PngImagePlugin.PngImageFile>对象image = Image.open(BytesIO(image)).convert('RGB') # 将image转换为arrayimage = 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 bestpreds = 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, 出现以下信息,表明服务已成功开启
客户端
在本地运行客户端代码
# 要向它发送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 pathimg_name = image_path.split('/')[-1].split('.')[0]image = open(image_path, 'rb').read() # binpayload = {'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 objectimage = 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表明数据已成功返回客户端
测试结果:
过程中遇到的问题
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
从服务器传回的json格式不对,