与本文有关联的文章:resnet50图片分类
目录
一、安装docker:
二、拉取tensorflow-serving镜像:
四、通过docker运行tensorflow-serving进行部署模型
说明一下参数:
0:前面几个参数不用变1:source模型保存的地方
2:MODEL_NAME是你自己自定义的
3:target也是你自己自定义的,但是我建议models不要动,就后面的字段改成和MODEL_NAME一样就可以了
五、客户端进行curl访问,返回结果给客户端
六、总结:
一、安装docker:
官网或者找别的博客参考,安装好后软件应该会有一个新手指引。否则会让你安装WSL2什么的。
检查是否安装好:
键入命令后出现类似界面,说明成功了。
二、拉取tensorflow-serving镜像:docker pull tensorflow/serving
这个会有下载进度条,下载完了也就成功了。
三、将模型文件转成saved_model格式由于我每次训练的结果都是保存为.h5的权重文件,所以还需要进行转换,如果你本身就是通过tf.saved_model.save()进行保存的,那就不用转换。
转换代码(不通用,需要载入自己的模型)
import tensorflow as tf from resnet50 import RESNET50 if __name__ == '__main__': classes_name = ['cat',"dog"] model = RESNET50(num_classes=len(classes_name)) model.load_weights('logs/EP039_loss0.019-valoss0.295.h5') tf.saved_model.save(model, "test/1")
转换后生成的文件:1文件夹里面有2个文件夹和1个pd文件:
四、通过docker运行tensorflow-serving进行部署模型docker run -p 8501:8501 --mount type=bind,source=E:papernetsresnettest/,target=/models/resnet -e MODEL_NAME=resnet -t tensorflow/serving说明一下参数: 0:前面几个参数不用变
1:source模型保存的地方
文件夹不用写上去是因为部署的时候tensorflow2建议将模型保存的最后一个文件夹为这种,那么它就会每次启动时会自动去用最新的模型。
2:MODEL_NAME是你自己自定义的 3:target也是你自己自定义的,但是我建议models不要动,就后面的字段改成和MODEL_NAME一样就可以了启动之后的情况
五、客户端进行curl访问,返回结果给客户端官方给的命令是这样的:
但是实际生成中肯定是通过代码进行的,而且谁会取部署一个线性回归的模型啊。所以需要写这个命令对应的其他脚本,c/c++、java、python都是可以的,只是python处理图片比较简单,我就以python为例了,其他大佬有c/c++方面的重写,记得call我哈哈哈(c/c++应该要装opencv,也不知道难不难装):
import cv2 import numpy as np import requests import json import time classes_name = ['cat',"dog"] input_shape = (224,224) filename = "datasets/test/dog/dog.10009.jpg" inputs = cv2.imread(filename) """ 数据预处理 """ inputs = cv2.resize(inputs,input_shape).astype(np.float32) inputs0 = np.array(inputs, dtype="float") / 255.0 inputs = np.expand_dims(inputs0,axis=0) start = time.time() """ REST API端口 """ url = 'http://localhost:8501/v1/models/resnet:predict' data = json.dumps({'inputs':inputs.tolist()}) # 要求输入的数据是json格式 # print(data) response = requests.post(url,data=data) result = json.loads(response.content) outputs = result['outputs'][0] result_index = np.argmax(outputs) print(f'预测结果是:{classes_name[result_index]}') print(f'花费时间:{time.time()-start:.2f}s')
我本来以为字典里面的和是有讲究的,跟自己在构建模型时有关,跟那个时候的命名一致,没想到竟然直接是和,那更省事了。
输出:
六、总结:这2天从零实现了图像分类,从网络结构编写,训练,预测,最后到部署。成就感满满啊。如果相关文章对您有帮助,就请点个赞吧,谢谢!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)