在上一篇文章分享了如果在C#环境下本地化部署图像分类模型C#部署基于pytorch的图像神经网络分类模型,实现本地化推理_c# pytorch-CSDN博客
这次主要介绍说明一下,简易利用Pytorch+FastAPI实现图像分类模型线上部署,使用API进行调用和结果回传。
首先,你需要有一个训练好的模型,我这边主要利用pytorch环境进行训练,然后利用jit进行模型保存和推理。
model.eval()
model.to(torch.device("cpu"))
x = torch.randn(size=(1,3,224,224))
net_trace = torch.jit.trace(model,x)
torch.jit.save(net_trace,args.Weight_Saved_Path + 'Classification_Weight.bin')
再就是构建一下你的服务器API,首先需要下载FastApi和uvicorn
pip install fastapi
pip install uvicorn
构建服务器API
app = FastAPI(title=“InferService")
model = torch.jit.load("../Classification_Model/Weight/Classification_Transformer.bin",map_location="cpu")
model.cuda()
with torch.no_grad():
@app.post("/infer/")
async def infer_model(imgbase_64: UploadFile = File(...)):
contents = await imgbase_64.read()
nparr = np.frombuffer(contents, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
inputs = torch.tensor(img.transpose(2,0,1),dtype=torch.float).unsqueeze(0) / 255.0
result = torch.softmax(model((inputs / 255.0).cuda()).cpu().detach(),dim=1)
result_soft = result.numpy().tolist()[0]
js = {
"0": result_soft[0],
"1": result_soft[1],
"re":torch.argmax(result,1).item()
}
print(js)
return js
if __name__ == "__main__":
uvicorn.run(app=app,host="0.0.0.0", port=9999)
# 主要是接收字节流的图像数据,然后对其进行解码,然后用opencv读出来
contents = await imgbase_64.read()
nparr = np.frombuffer(contents, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
最后就是你客户端的Demo了,主要是用于发送数据,C# Demo如下所示:
private void button1_Click(object sender, EventArgs e)
{
var mats = Cv2.ImRead("./096.jpg");
var res = Task.Run(() => HttpPostInfer(mats)).Result;
var res1 = res["0"];
var res2 = res["1"];
var res3 = res["re"];
MessageBox.Show(String.Format("获得的信息为:{0},{1},{2}", res1, res2, res3));
}
public async static Task<Dictionary<string, string>> HttpPostInfer(OpenCvSharp.Mat mat)
{
string url = "http://192.168.204.95:9999/infer/";
//var img = OpenCvSharp.Cv2.ImRead(@"E:\DBW_Project\ClassificationDemo\ClassificationDemo\120.jpg");
using (var client = new HttpClient())
{
// 创建一个MultipartFormDataContent对象,它可以包含多部分的数据,例如文本和文件
var content = new MultipartFormDataContent();
// 将字节流添加到MultipartFormDataContent对象
var byteArrayContent = new ByteArrayContent(mat.ToBytes());
byteArrayContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
content.Add(byteArrayContent, "imgbase_64", "image.jpg");
// 发送POST请求到服务器
var response = await client.PostAsync(url, content);
// 读取服务器的响应
string responseString = await response.Content.ReadAsStringAsync();
Dictionary<string, string> jsondata = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseString);
return jsondata;
}
}
一来一回就差不多了,剩下的就看自己的想法去做了