TF-Service部署自用

TF-Service-docker部署调用

基于win10安装docker

1.ubuntu安装docker教程很多,跟着教程走就行,这里给个大佬链接:https://www.cnblogs.com/weiyinfu/p/9928363.html。
docker安装需要两个命令:
sudo apt-get install docker
sudo apt-get install docker.io
好的学习资料不必远求
docker --help
docker run --help

2.win10安装docker非常简单,看百度经验就行,地址链接:https://jingyan.baidu.com/article/642c9d340202e2644a46f796.html
安装前注意事项:1.首先检查有没有开启虚拟化,没开启百度biso开启虚拟化
2.启用系统的hyper-h,然后安装完会重启,其实就是个虚拟机(和vm是一样类型的东西)
注意这两点,就可以直接下载docker的win10安装包安装!!!

TF-Service

1.使用docker命令拉取镜像:docker pull tensorflow/serving
2.运行服务镜像:
tensoflow有cpu和GPU两个版本具有以下属性:
端口8500暴露于gRPC
端口8501暴露给REST API
可选环境变量MODEL_NAME(默认为model)
可选环境变量MODEL_BASE_PATH(默认为/models)
当服务镜像运行modelserver是,它运行如下:tensorflow_model_server --port=8500 --rest_api_port=8501 \ --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}

使用Docker,您需要:a.主机上的开放端口 b.要保存的SavedModel c.客户将引用的模型名称
你要做的是运行Docker容器, 将容器的端口发布到主机的端口,并将主机的路径安装到容器所需模型的SavedModel。
3.启动docker容器运行官方例子:docker run -p 8501:8501 \ --mount type=bind,source=/path/to/my_model/,target=/models/my_model \ -e MODEL_NAME=my_model -t tensorflow/serving
这种情况下,我们们启动了一个Docker容器,将REST API端口8501发布到我们主机的端口8501,并采用我们命名的模型my_model并将其绑定到默认模型基本路径( { MODEL_NAME}= /models/my_model)。最后,我们填补了环境变量 MODEL_NAME有my_model,离开MODEL_BASE_PATH它的默认值。
这时候在容器中运行:tensorflow_model_server --port=8500 --rest_api_port=8501 \ --model_name=my_model --model_base_path=/models/my_model
如果想发布gRPC端口,我们会使用-p 8500:8500。您可以同时打开gRPC和REST API端口,也可以选择仅打开其中一个。
4.创建自己的服务镜像
如果您想要将模型内置到容器中的服务镜像,则可以创建自己的镜像。
首先将服务镜像作为进程运行:docker run -d --name serving_base tensorflow/serving
接下来,将SavedModel复制到容器的模型文件夹:docker cp models/<my model> serving_base:/models/<my model>
最后,通过更改MODEL_NAME 以匹配模型的名称来提交为您的模型提供服务的容器“:docker commit --change "ENV MODEL_NAME <my model>" serving_base <my container>
你现在可以停下来了 serving_base:docker kill serving_base这将为您留下一个可以部署的Docker镜像,并将加载您的模型以便在启动时提供服务。

5.运行一个完整的例子
a.加载一个SavedModel并使用REST API调用它。首先拉出服务镜像:docker pull tensorflow/serving
这将在安装了ModelServer的情况下提取最新的TensorFlow服务映像。
接下来,我们将使用一个名为的玩具模型Half Plus Two,它0.5 * x + 2为x我们提供的预测值生成。
要获得此模型,请首先克隆TensorFlow服务仓库。
mkdir -p /tmp/tfserving cd /tmp/tfserving git clone https://github.com/tensorflow/serving
接下来,运行TensorFlow Serving容器,将其指向此模型并打开REST API端口(8501)(如果在windows下面应该加上盘符如下):docker run -p 8501:8501 --mount type=bind,source=C:/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,target=/models/half_plus_two -e MODEL_NAME=half_plus_two -t tensorflow/serving '&'
打开一个窗口测试接口这里使用curl命令,注意windows下面json 的区别,这里用windows的curl命令:curl -XPOST http://localhost:8501/v1/models/half_plus_two:predict -d "{\"instances\":[1.0, 2.0, 5.0]}"

YOLOV3部署

1.训练完的模型存为pb模型,在转换成SavedModel保存格式的pb模型

# yolo3 pb转换tensorflowservice savemodel pb
export_dir = r'E:\cvode\models\research\object_detection\mycode\logs\yolo3_voc6_model/000001'
graph_pb = r'G:\py_file\tensorflow-yolov3\voc_pb\yolov3_voc6_70loss6.69.pb'
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)

with tf.gfile.GFile(graph_pb, "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())


sigs = {}


with tf.Session(graph=tf.Graph()) as sess:# name="" is important to ensure we don't get spurious prefixing
    tf.import_graph_def(graph_def, name="")
    g = tf.get_default_graph()

    image_tensor = g.get_tensor_by_name("input/input_data:0")
    detection_sbbox = g.get_tensor_by_name("pred_sbbox/concat_2:0")
    detection_mbbox = g.get_tensor_by_name("pred_mbbox/concat_2:0")
    detection_lbbox = g.get_tensor_by_name("pred_lbbox/concat_2:0")
    print(type(detection_sbbox))
    out = {'boxes':detection_sbbox,'scores':detection_mbbox,'classes':detection_lbbox}
    print(type(out))
    sigs[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY] = \
        tf.saved_model.signature_def_utils.predict_signature_def(
            {"in": image_tensor},
            {'sbbox':detection_sbbox,'mbbox':detection_mbbox,'lbbox':detection_lbbox},)
            # {"scores":detection_scores},
            # {"classes":detection_classes},
            # {"nums":num_detections})

    builder.add_meta_graph_and_variables(sess,
                                         [tag_constants.SERVING],
                                         signature_def_map = sigs)
builder.save()

2.启动docker容器:docker run -p 8501:8501 --mount type=bind,source=E:\cvode\models\research\object_detection\mycode\logs\yolo3_voc6_model,target=/models/yolov3 -e MODEL_NAME=yolov3 -t tensorflow/serving '&'
3.查看容器模型的信息:saved_model_cli show --dir C:\tmp\tfserving\serving\tensorflow_serving\servables\tensorflow\testdata\saved_model_half_plus_two_cpu\00000123/ --all
4.客户端代码调用:

import json
import numpy as np
import requests
from PIL import Image
from core import utils
import cv2
import matplotlib.pyplot as plt

def predict(data):
    # payload = {
    #     "instances": [{'这里填你保存模型定义的placeholder名字': data.tolist()}]
    # }
    # payload = {
    #         "instances": [{'这里填你保存模型定义的placeholder名字': [1.0, 2.0, 5.0]}]
    #     }
    # data = cv2.imread(data)
    # data = data.reshape([1, data.shape[0], data.shape[1], 3])
    # image_path = "./docs/img_test/outstore_02.jpg"
    image_path = data
    num_classes = 6
    input_size = 416

    original_image = cv2.imread(image_path)
    original_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)
    original_image_size = original_image.shape[:2]
    image_data = utils.image_preporcess(np.copy(original_image), [input_size, input_size])
    image_data = image_data[np.newaxis, ...]
    payload = {
        "instances": image_data.tolist()
    }
    # r = requests.post('http://localhost:8501/v1/models/yolov3:predict', json=payload)
    r = requests.post('http://192.168.0.96:8501/v1/models/yolov3:predict', json=payload)
    print(r.content.decode('utf-8'))
    # exit()
    preds = json.loads(r.content.decode('utf-8'))["predictions"][0]
    # print(preds)
    pred_sbbox = preds['sbbox']
    pred_mbbox = preds['mbbox']
    pred_lbbox = preds['lbbox']
    print(pred_mbbox[0])
    print(pred_sbbox[0])
    print(pred_lbbox[0])
    pred_bbox = np.concatenate([np.reshape(pred_sbbox, (-1, 5 + num_classes)),
                                np.reshape(pred_mbbox, (-1, 5 + num_classes)),
                                np.reshape(pred_lbbox, (-1, 5 + num_classes))], axis=0)
    bboxes = utils.postprocess_boxes(pred_bbox, original_image_size, input_size, 0.3)
    bboxes = utils.nms(bboxes, 0.7, method='nms')
    image = utils.draw_bbox(original_image, bboxes)
    image = Image.fromarray(image)
    image.show()

if __name__ == '__main__':
    data = r'E:\cvode\models\research\object_detection\mycode\images\test\000709.jpg'
    predict(data)

结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
引用地址链接如下:
[1]:wyf: https://www.cnblogs.com/weiyinfu/p/9928363.html
[2]: 百度经验:https://jingyan.baidu.com/article/642c9d340202e2644a46f796.html
[3]:泛酸的桂花酒: https://www.jianshu.com/p/0f927dc8b23d

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值