Tensorflow2.0+部署(tensorflow/serving)过程备忘记录Windows

Tensorflow2.0+部署(tensorflow/serving)过程备忘记录

部署思路:采用Tensorflow自带的serving进模型部署,采用容器docker

1.首先安装docker

下载地址(下载windows版本):https://desktop.docker.com/

  1. docker安装
    安装就按正常流程一步一步安装即可
  2. window环境检查
    win10,win11版本及以上
    虚拟化是否开启(用处不知道,反正大家都开启了,网上有教程,可以搜搜)在这里插入图片描述
  3. 安装wsl
    下图是截别人的图
    在这里插入图片描述
  4. 安装docker成功
    (1)桌面会出现Docker Desktop图标,点击进入后界面如下
    在这里插入图片描述
    (2)给docker添加阿里云镜像源,为了后续下载东西更方便
    注册、登录阿里云(支付宝、淘宝扫码都可)
    在这里插入图片描述
    (3)进入后,可以看到自己独立的镜像加速器,是一个网址,最下方一行是给docker配置镜像源的方法,或者直接在Docker Desktop里面,添加那一行命令即可
    在这里插入图片描述
    (4)打开Docker Desktop ,点击设置,Docker Engine,添加上图中的代码到窗口中,点击应用和重启按钮即可
    在这里插入图片描述
    (5)win+R,打开命令行,输入docker info,查看是否应用成功
    在这里插入图片描述

2.安装tensorflow/serving服务

1.docker 拉取tensorflow/serving服务
安装tensorflow 2.6.0的GPU服务

docker pull tensorflow/serving:2.6.0-gpu

安装tensorflow 2.6.0的CPU服务

docker pull tensorflow/serving:2.6.0

2.查看是否拉取成功,其中,GPU版本比较大

docker images

在这里插入图片描述

3.准备模型测试

1.先拿官方例子测试一下,先下载一下tensorflow/serving2.6.0,然后在该目录结构下,找到 saved_model_half_plus_two_gpu例子,整体拷贝到想要放置的位置
在这里插入图片描述
2.开始发布一下该服务
(1)GPU版本,–gpus all 标注了下使用机器的所有GPU,我这边不加提示找不到GPU
注意:
下面的绝对路径表示模型存放的实际路径,最后一个参数项需要指定运行的容器和版本,里面的其他参数照猫画虎吧,很好理解,具体参数项也比较复杂

docker run --gpus all -t --rm -p 8501:8501 -v "C:/Users/lixia/.docker/tf_serving/saved_model_half_plus_two_gpu:/models/saved_model_half_plus_two_gpu" -e MODEL_NAME=saved_model_half_plus_two_gpu tensorflow/serving:2.6.0-gpu

出现了如下图,则表示发布成功
在这里插入图片描述
此时,在Docker Desktop中可以看到该服务信息
在这里插入图片描述
此时,浏览器访问localhost:8501,看是否能连通

http://localhost:8501/v1/models/saved_model_half_plus_two_gpu

出现该信息,则表示可以正常连通和访问了
在这里插入图片描述
3.测试调用一下该服务,是否能正常返回结果

#调用官方例子 线性回归小例子 y=0.5*x+2.0
import requests
import json

url='http://localhost:8501/v1/models/saved_model_half_plus_two_gpu:predict'
pdata = {"instances":[1.0, 2.0, 3.0]}
param = json.dumps(pdata)
res = requests.post(url, data= param)
print(res.text)

在这里插入图片描述
出现该结果表示部署成功
在这里插入图片描述
4.服务停止
(1)去Docker Desktop界面端中,手动终止,上面有图
(2)命令行的形式停止

查看运行中的服务
docker ps
终止服务 ****表示ID
docker stop ******

在这里插入图片描述

4.准备自己的模型部署测试

准备一个部署练习代码:是否佩戴口罩检测(YOLOv5)
1.首先需要有一个训练好的模型文件,如下图,是我训练好的一个模型
在这里插入图片描述
2.将.h5模型转换为.pb模型
直接使用TF自带的函数转(tf.keras.models.save_model),我的模型初始化+参数加载都在yolo.YOLO()中完成了

import tensorflow as tf
import yolo

def export_serving_model(path,version=1):
    """
    导出标准的模型格式
    :param path:
    :return:
    """
    #路径+模型名字+版本
    export_path = './yolov5_mask_detection/1'

    #调用模型,指定训练好的.h5文件
    model = yolo.YOLO()

    #导出模型
    tf.keras.models.save_model(
        model.yolo_model,
        export_path,
        overwrite=True,
        include_optimizer=True,
        save_format=None,
        signatures=None,
        options=None
    )

运行完后,会生产出下面文件结构的模型.pb文件,直接拷贝上上级整体目录结构即可yolov5_mask_detection
在这里插入图片描述
3.将pb模型发布服务
(1)我直接拷贝到D盘根目录
在这里插入图片描述
(2)发布GPU服务

docker run --gpus all -t --rm -p 8501:8501 -v "D:/yolov5_mask_detection:/models/yolov5_mask_detection" -e MODEL_NAME=yolov5_mask_detection tensorflow/serving:2.6.0-gpu

(3)发布CPU服务
直接发布即可,发现GPU模型直接可以在CPU使用

docker run -t --rm -p 8501:8501 -v "D:/yolov5_mask_detection:/models/yolov5_mask_detection" -e MODEL_NAME=yolov5_mask_detection tensorflow/serving:2.6.0

出现如下,表示发布成功
在这里插入图片描述
4.调用模型
(1)新建一个裸的python环境,最好和tf用的版本一致,保不齐会出现问题啥的,如果缺少requests 、numpy、PIL库,pip install安装即可;
(2)调用代码前,如果不知道输入输出是啥,需要看下
进行conda环境,激活tf虚拟环境,输入命令查看

#打开anaconda命令行输入
conda activate tensorflow-gpu
#产看模型的输入输出和网络结构,绝对路径表示模型存放路径
saved_model_cli show --dir D:\yolov5_mask_detection\1 --all

输出参数包含三个,yolo_eval_1表示概率值;yolo_eval_2表示标签值;yolo_eval表示目标检测框
在这里插入图片描述
(3)调用代码,核心代码和上述官方例子一致,只不过加了些影像读取+预处理代码
代码如下:

import json
import time
import requests
import numpy as np
from PIL import Image

#---------------------------------------------------#
#   对输入图像进行resize,模型训练过程也采用了同样的方法
#---------------------------------------------------#
def resize_image(image, size, letterbox_image):
    iw, ih  = image.size
    w, h    = size
    if letterbox_image:
        scale   = min(w/iw, h/ih)
        nw      = int(iw*scale)
        nh      = int(ih*scale)

        image   = image.resize((nw,nh), Image.BICUBIC)
        new_image = Image.new('RGB', size, (128,128,128))
        new_image.paste(image, ((w-nw)//2, (h-nh)//2))
    else:
        new_image = image.resize((w, h), Image.BICUBIC)
    return new_image
#---------------------------------------------------#
#   对输入图像进行归一化,模型训练过程也采用了同样的方法
#---------------------------------------------------#
def preprocess_input(image):
    image /= 255.0
    return image
#服务网址
url = 'http://localhost:8501/v1/models/yolov5_mask_detection:predict'
#计时器
tt1 = time.time()
#输入的影像路径
image = Image.open("1.jpg")
#影像需要重采样成640*640
image_data  = resize_image(image, (640, 640), True)
#维度扩展,和模型训练保持一致
image_data  = np.expand_dims(preprocess_input(np.array(image_data, dtype='float32')), 0)
#原始影像大小,主要是为了将描框放缩到初始影像大小时用到的参数
input_image_shape = np.expand_dims(np.array([image.size[1], image.size[0]], dtype='float32'), 0)
#构造输入的参数类型,有两个参数,第一个表示影像数据1*640*640*3,第二个表示初始影像宽高
data = json.dumps({
    "signature_name": "serving_default",
    "inputs":
        {"input_1": image_data.tolist(), "input_2": input_image_shape.tolist()}
})
#构造headers
headers = {"content-type":"application/json"}
#发送请求
r = requests.post(url, data=data, headers=headers)
#计时器终止
tt2 = time.time()
print(tt2-tt1)
#打印返回的结果,这里表示所有框的位置
print(r.text)

直接右键运行,得到结果,表示该程序检测出了9个目标,概率值+标签+目标框像素位置如下,通过解析json,可以得到目标检测结果
在这里插入图片描述
(4)我们看下,将检测结果标记到图上后,效果如下:
在这里插入图片描述
换个图片试一下
在这里插入图片描述

5.将docker环境整体打包到其他电脑测试(待续…)

有空了试试

6.一些备忘记录

1.conda 环境整体打包移植

//----------------------------------------------------------------------------------------------------------
conda 环境打包到其他电脑

要将 Conda 环境打包并迁移到其他电脑上使用,可以按照以下步骤进行操作:

导出 Conda 环境: 在源电脑上使用以下命令导出 Conda 环境的配置信息到一个 YAML 文件中:

conda env export > environment.yml
复制环境文件: 将生成的 environment.yml 文件复制到目标电脑上。

创建 Conda 环境: 在目标电脑上使用以下命令根据导出的环境文件创建相同的 Conda 环境:

conda env create -f environment.yml
激活环境: 激活新创建的 Conda 环境:

conda activate <environment_name>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/430715.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VM新建虚拟机

目录 一、前言二、下载镜像三、新建虚拟机 一、前言 上一篇文章我们介绍了VMware Workstation 15 Pro的安装与破解 &#xff0c;这篇文章我们介绍一下新建虚拟机 二、下载镜像 Linux使用最多的是CentOS和Ubuntu&#xff0c;下面是下载地址 Centos7:https://www.centos.org/…

MySQL 主从同步模式

MySQL主从同步是一种数据库复制技术&#xff0c;其中一个MySQL数据库服务器&#xff08;主服务器&#xff09;上的更改会被自动地传播到一个或多个其他数据库服务器&#xff08;从服务器&#xff09;。这有助于提高系统的可伸缩性、可用性和容错性。以下是设置MySQL主从同步的基…

颜永红:大模型时代的智能音频处理 | 演讲嘉宾公布

一、GAS 2024 2024中国国际音频产业大会(GAS)将于2024年3.27 - 28日在上海张江科学会堂举办。大会将以“音无界&#xff0c;未来&#xff08;Audio&#xff0c; Future&#xff09;”为主题。大会由中国电子音响行业协会、上海市浦东新区先进音视频技术协会共同主办&#xff0c…

【详识JAVA语言】String类oj练习

1. 第一个只出现一次的字符 class Solution { public int firstUniqChar(String s) {int[] count new int[256];// 统计每个字符出现的次数for(int i 0; i < s.length(); i){count[s.charAt(i)];}// 找第一个只出现一次的字符for(int i 0; i < s.length(); i){if(1 …

openinstall支持“荣耀商推”广告效果监测

近日&#xff0c;openinstall广告效果监测服务已全面对接荣耀商推渠道&#xff0c;开发者通过集成openinstall作为第三方归因服务商&#xff0c;可快速归因监测荣耀应用商店、荣耀浏览器、荣耀阅读、荣耀视频等生态资源的广告投放效果&#xff0c;以及通过配置回调事件做投放优…

ViT再升级!9个视觉transformer最新改进方案让性能飞跃

通过优化ViT结构和训练策略&#xff0c;我们可以提高模型的性能和计算效率&#xff0c;增强模型对局部信息的捕捉能力。同时解决一些原有模型存在的问题。 比如原始的ViT模型在处理高分辨率图像时&#xff0c;由于自注意力机制的计算复杂度与序列长度相关&#xff0c;会导致较…

rabbitmq4

独占队列&#xff1a;我们的队列只能被当前通道所绑定&#xff0c;不能被其他的连接所绑定&#xff0c;如果有其他的通道或连接再使用此队列的话&#xff0c;会直接报错&#xff0c;一般设置为false&#xff1a; autoDelete&#xff1a;消费者在消费完队列&#xff0c;并且彻底…

来分析一下dom破坏

一、如图 我们在这串代码的情况下看一下打印状态 打印x和y的时候把标签打印出来了&#xff0c;而document没有打印出来x值&#xff0c;所以我们要考虑特性 可以看到我们接下来的验证&#xff0c;其中document.cookie 已经被我们⽤img 标签给覆盖了 接下来覆盖系统函数 既然我们…

Linux 文件系列:深入理解文件描述符fd,重定向,自定义shell当中重定向的模拟实现

Linux 文件系列:深入理解文件fd,重定向,自定义shell当中重定向的模拟实现 一.预备知识二.回顾C语言中常见的文件接口跟重定向建立联系1.fopen函数的介绍2.fclose函数的介绍3.代码演示1.以"w"(写)的方式打开2.跟输出重定向的联系3.以 "a"(追加)的方式打开4.…

基于springboot+vue的校园爱心捐赠互助管理系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 随着经济水平和生活水平的提高在校大学生在校需要处理的物品也在不断增加&#xff0c;同时校园内还存在很多贫困生&#xff0c;可以通过线上平台实现资源的整合和二次利用&#xff0c;通过线上平台求助信…

LeetCode Python - 32.最长有效括号

目录 题目答案方法一&#xff1a;动态规划方法二&#xff1a;使用堆栈 运行结果方法一方法二 题目 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串的长度。 示例 1&#xff1a; 输入&#xff1a;s “(()”…

机器学习入门-小白必看

机器学习 1. 机器学习的基本概念与背景2. 机器学习的常用方法3.是否需要学习机器学习&#xff0c;机器学习已经过时了&#xff1f;&#xff1f;4. 如何在机器学习上进行创新&#xff1f;5. 我该用哪种机器学习方法&#xff0c;如何定下来呢&#xff1f;总结&#xff08;对小白的…

O2O:Actor-Critic Alignment for Offline-to-Online Reinforcement Learning

ICML 2023 Poster paper 1 Introduction O2O容易因为分布偏移导致策略崩溃&#xff0c;解决方法包括限制策略偏移计以及平衡样本采样等。然而这些方法需要求解分布散度或者密度比(density ratio)。为了避免这些复杂操作&#xff0c;本文并不采用以往AC方法对Q值进行变形&…

【笔记】Android 漫游定制SPN定制有关字段

一、SPN模块简介 【笔记】SPN和PLMN 运营商网络名称显示 Android U 配置 WiFiCalling 场景下PLMN/SPN 显示的代码逻辑介绍 【笔记】Android Telephony 漫游SPN显示定制&#xff08;Roaming Alpha Tag&#xff09; 二、相关配置字段 non_roaming_operator_string_array 是否…

关于yolov8的output0

关于yolov8的output0 // output0nvinfer1::IElementWiseLayer* conv22_cv2_0_0 convBnSiLU(network, weightMap, *conv15->getOutput(0), base_in_channel, 3, 1, 1, "model.22.cv2.0.0");nvinfer1::IElementWiseLayer* conv22_cv2_0_1 convBnSiLU(network, we…

Cesium 自定义Primitive - 圆

一、创作思路 1、创建一个自定义CustomPrimitive 2、然后根据两个点&#xff0c;生成圆 3、方便后期绘制圆 二、实现代码 1、在vue的包中加入turf. npm install turf/turf 1、创建一个CustomCirclePrimitive类,并加入更新的代码 export default class CustomCirclePrimitive …

StarRocks实战——贝壳找房数仓实践

目录 前言 一、StarRocks在贝壳的应用现状 1.1 历史的数据分析架构 1.2 OLAP选型 1.2.1 离线场景 1.2.2 实时场景 1.2.3 StarRocks 的引入 二、StarRocks 在贝壳的分析实践 2.1 指标分析 2.2 实时业务 2.3 可视化分析 三、未来规划 3.1 StarRocks集群的稳定性 3…

STM32:CAN功能板设计和调试

0前言 本文主要目的是&#xff0c;总结去年设计stm32-CAN板子过程中遇到的问题&#xff0c;分为keil嵌入式软件和嘉立创EDA设计两个部分。 1 STM32F1 CAN功能 keil expected a “}“ 问题在于&#xff0c;PCB使用芯片为stm32f103c8t6&#xff0c;下载程序时选择device默认此…

在cadence中导入工艺库和仿真状态的方法

在cadence中导入库和仿真状态的方法 一、在cadence中导入库 1、打开cadence的启动界面&#xff0c;如图 2、右键空白处&#xff0c;添加library 3、找到自己的库文件路径即可 二、在cadence中导入仿真状态 1.打开ADE L界面 2.选择好自己需要的状态&#xff0c;注意要取…

Leet code 1089 复写0

1、先找到最后一个数 比如示例1中答案的最后一个数是4 定义两个指针 dest 和 cur dest初始位置是-1 cur初始位置为 0 如果arr[cur]为非零元素 dest位置1 如果arr[cur]为零元素 dest位置2 直到cur<arr.size() 或者 dest>arr.size()-1 cur就是最后一个元素位置 2、…