前言

目前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模型部分作为服务端。由于后来领导改需求了,这个思路并没有完成,这篇文章也算给大家提供思路吧。


有任何疑问和想法,欢迎在评论区与我交流。