利用Pytorch+FastAPI实现图像分类模型线上部署,API调用

在上一篇文章分享了如果在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;
    }
}

一来一回就差不多了,剩下的就看自己的想法去做了

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值