本文节选自我的博客:AI 模型跨语言调用
- 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。
- 📝 CSDN主页:爱吃糖的猫🔥
- 📣 我的博客:爱吃糖的猫
- 📚 Github主页: MilesChen
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 💬介绍:The mixture of WEB+DeepLearning+Iot+anything🍁
前言
目前AI训练的模型只支持python调用,如果要使用c++或者在java中调用就显得极为不方便,本文采用一种将AI模型调用API使用Socket做二次封装做为一个客户端,提供给其他语言的服务端调用。
环境:
- win10
- python-3.6
- torch-1.1
- torchvision-0.3.0
服务端发送指令使用pytorch模型,返回模型结果
import torch
import numpy as np
from torch.autograd import Variable
from torchvision import transforms
from PIL import Image
import socket
client = socket.socket() #声明socket类型,同时生成socket连接对象
client.connect(('127.0.0.1',8080))
def resnet18_pre(img=0,image_dir=""): #cv2图片
if len(image_dir)>2:
img = Image.open(image_dir)
transform = transforms.Compose([
transforms.Resize((300, 300), interpolation=2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])
img = transform(img)
img = img.unsqueeze(0)
im = Variable(img)
Resnet_model = torch.load('Resnet18_1.pkl', map_location=lambda storage, loc: storage) # GPUc参数加载到CPU中
Resnet_model.eval() # 固定参数不反向更新参数
pre = Resnet_model(im)
numpy_array = pre.detach().numpy()
numpy_array = np.squeeze(numpy_array, axis=0) # 降低维度
output_np = np.argmax(numpy_array, axis=0) # 输出最大的位置 即是预测值 output_np int64
pre_data = output_np.astype(np.uint8)
return pre_data
while True:
data = client.recv(1024) #设置收多少字节
print("recv:",data.decode())
pre_data = resnet18_pre(image_dir=data.decode()) #接收的是图片的路径
print("预测结果:", pre_data)
msg = 'result:'+str(pre_data)
if len(msg) == 0:continue #为空就从新输入,不能发空
client.send(msg.encode("utf-8")) #转 二进制并发送
client.close()
1.使用pyinstall打包python文件为exe文件
terminine切换到anaconda指定的python环境下,cd切换到打包路径执行
pyinstaller -F -c use_model.py
2.在terminine执行打包好的exe文件
问题:could not get source code
terminine报错 如下
File “site-packages\torchvision\ops\misc.py”, line 135, in
File “site-packages\torchvision\ops\misc.py”, line 148, in FrozenBatchNorm2d
File “site-packages\torch\jit_init_.py”, line 850, in script_method
File “site-packages\torch\jit\frontend.py”, line 152, in get_jit_def
File “inspect.py”, line 973, in getsource
File “inspect.py”, line 955, in getsourcelines
File “inspect.py”, line 786, in findsource
OSError: could not get source code
解决办法:更换更低版本的torchvision
pip uninstall torchvision
pip install torchvision==0.2.2.post3
其他语言调用
在其他语言中创建一个Socker服务端,开启服务,需要使用到时候给客户端发送图片的路径,客户端接收到路径会去调用模型,得到预测结果并返回给socker服务器
总结
这里目前做得还是有问题,应该把AI模型部分作为服务端。由于后来领导改需求了,这个思路并没有完成,这篇文章也算给大家提供思路吧。
有任何疑问和想法,欢迎在评论区与我交流。