2024史上最全,视频流目标检测,模型部署教程

引言

深度学习的应用已经深入我们生活的方方面面,典型的chatgpt大语言模型,以及对目标的检测与识别,碍于本地算力的局限性,同时也有深度学习项目落地的成本问题,越来越多的模型选择在服务器部署,在提高算力,节约计算成本的同时也使得工程成本的降低。本文主要以虚拟机为例,讲解如何利用 tensorflow-serving 部署深度学习模型处理视频类型数据。

对于tensorflow-serving框架的搭建,有两种办法:第一种是基于dockers拉取镜像的方式,这里的镜像会包含比较完整的我们会使用到的库。第二种是基于linux系统本地的搭建,过程稍微复杂一点,需要额外安装curl等其他的资源库,本文介绍第一种方法。

第一步 安装虚拟机

这里我使用的是centos7,这里不展开讲解安装虚拟机的教程,家人们可以自行查阅网上资料

下载docker

卸载旧版本

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

在这里插入图片描述
复制指令到命令行,显示complete说明卸载成功。

安装

  • 安装关于docker的依赖环境

因为我之前已经安装了相关依赖,这里就没有进行重新安装

yum -y install yum-utils device-mapper-persistent-data lvm2

在这里插入图片描述

  • 设置国内镜像源下载

这里使用阿里云

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 开始安装docker
  1. 更新包索引
yum makecache fast

在这里插入图片描述

  1. 安装docker
yum -y install docker-ce

在这里插入图片描述

  1. 启动docker 服务
systemctl start docker
  1. 开启开机自启动(可选)
systemctl enable docker

okok,到现在我们已经把docker安装完成,下载我们来搭建tensorflow-serving 框架。

搭建ensorflow-serving框架

tensorflow-serving 的镜像

官方网址,https://hub.docker.com,通过官网安装一般来说很慢,国内有很多的docker下载的镜像,这里我们现在官网上找到自己需要的镜像,如我们这次需要下载的tensorflow/serving

在这里插入图片描述

我们记住这条安装指令,并在其前面加上一个镜像网址这是网站
在这里插入图片描述

我这里使用dockerpull.com

所以我们的指令就是:

# 不指定版本默认下载最新的版本
docker pull dockerpull.com/tensorflow/serving

在这里插入图片描述

这里下载可能会有一点慢,大家耐心等待,gpu版本体积高达10G是cpu版本的20倍

输入指令

docker images

可以查看我们下载好的镜像

在这里插入图片描述

  • 给docker镜像改名字
#docker tag id 仓库:标签
docker tag 5f tensorflow/serving:latest
#此时会用不同名但是相同id的两个镜像 此时我们删除其中一个
docker rmi dockerpull.com/tensorflow/serving:latest 

利用finalShell上传我们的模型tensorflow类型的模型文件

使用finalShell 连接我们的服务器,并上传指定格式的模型文件到虚拟机,这里我们需要记住模型存放的位置。

在这里插入图片描述

使用final上传tensorflow格式保存的模型,放到指定位置。

**在这里插入图片描述
**

创建模型容器

创建一个tensorflow-serving 容器,并指定模型的名称以及模型的名称和模型的位置。

docker run -itd --net host -p 8501:8501 -v $PWD/yolo5_model:/models/model --name tf tensorflow/serving:latest --model_name=yolo5_model --model_base_path=/models/model

$PWD/yolo5_model:/models/model
pwd表示当前路径,我的模型文件就在当前路径的yolo5_model文件夹下
models/model是在容器中的映射路径

-itd 表示在后台运行,-it表示在当前进程运行。

在这里插入图片描述

测试模型是否部署成功

curl http://localhost:8501/v1/models/yolo5_model

在这里插入图片描述

显示ok表示部署成功。

默认暴露的端口号:如果使用http 协议请求 使用8501端口,如果使用grpc协议 暴露的端口号为8500端口,关于端口的知识大家可以自行了解,这里可以简单理解为每个端口运行一个应用,如果这个端口正在被其他应用程序占用,我们将无法使用这个端口,所以,在这里的端口映射时,即使指定了端口,当指定端口被占用时,也将应用默认的端口号。

final step — 客户端请求服务器的服务

借助服务器强大的算力解决本地算力的不足,将庞大参数的计算放在服务器上。本地只进行轻量化的运算。最终再对返回的结果做进一步的处理

第一种使用http协议进行请求

#server_url = 'http://192.168.47.3:8501/v1/models/yolo5_model:predict' 换成自己本机的ip
data = json.dumps({
        "signature_name": "serving_default",  # Depends on your model signature
        "instances": img.tolist()
    })
headers = {"content-type": "application/json"}
json_response = requests.post(server_url, data=data, headers=headers)
predictions = json.loads(json_response.text)['predictions']

在这里插入图片描述

请求延时高,存在1-2秒的请求延时

使用grpc 协议提高传输效率

#  server_url = '192.168.47.3:8500' # grpc 这时默认的端口号是8500
channel = grpc.insecure_channel(server_url)  # 建立 gRPC 通道
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = 'yolo5_model'  # 模型名称
request.model_spec.signature_name = 'serving_default'  # 签名名称
request.inputs['images'].CopyFrom(tf.make_tensor_proto(img))  # 添加输入数据

response = stub.Predict(request, timeout=10.0)  # 设置超时
predictions = tf.make_ndarray(response.outputs['output'])  # 解析输出

在这里插入图片描述
帧率相对较快。

更多推荐