使用Tornado给深度学习提供接口,并使用Postman测试接口

背景:

应项目需求,需要把做好的深度学习算法提供给别人使用,采用Tornado web框架,查阅了很多网上的Tornado的demo,大多数的demo都是实现网页间的交互等等,跟自己的需求不太一样。在这里记录一下自己的demo,详细解释看代码注释~

API服务代码server.py

import sys
import os
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import numpy as np
import json
import logging as log
from PIL import Image
from io import BytesIO
import Artworks_Retrival_api

from tornado.options import define, options
define("port", default=8390, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        # 想写前端界面的可以写,不写也可以,提供服务就好。。。
        # self.render("index.html")
        pass

class UserHandler(tornado.web.RequestHandler):
    # 下面函数,顾名思义~~
    def load_image_into_numpy_array(self,image):
        (im_width, im_height) = image.size
        return np.array(image.getdata()).reshape(
            (im_height, im_width, 3)).astype(np.uint8)

    def post(self):
        # 通过get方法从前端获取需要的数据
        # 这里get到的是图片,模型名称,以及检测得到的bbox坐标。。。(因为项目中,检测模块不是我做的~~)
        img_file = self.request.files.get('img')
        model_name = self.get_body_argument('model_name')
        x = self.get_body_argument("x1", 0)
        y = self.get_body_argument("y1", 0)
        X = self.get_body_argument("x2", 0)
        Y = self.get_body_argument("y2", 0)

        x = int(x)
        y = int(y)
        X = int(X)
        Y = int(Y)
        
        
        # 通过前端获取到的图片是一个二进制流文件
        # 但是tensorflow中的图片数据都是矩阵,所以首先要把二进制流转化为tensorflow可读的矩阵
        # 如下操作
        if img_file:
            image = img_file[0]['body']
            im = Image.open(BytesIO(image))
            im.getdata()
            r,g,b = im.split()
            out_merge = Image.merge("RGB",(b,g,r))
            image = self.load_image_into_numpy_array(out_merge)

        # 使用检测得到的bbox坐标对图片进行裁剪。。
        if model_name == 'auto':
            if X > 0 and Y > 0:
                off = 5
                h,w = image.shape[:2]
                crop_im = image[max(y-off,0):min(Y+off,h-1), max(x-off,0):min(X+off,w-1)]
            else:
                crop_im = image

        # 开始跑算法
        ar = art_retrival.retrival(crop_im,5)
        
        # 下面整理一下算法返回的结果,主要是方便别人使用~~
        log.info(f'Retrival: {ar}')
        data = [{'label':v[0], 'score':v[1]} for v in ar]
        results = {'status': 0, 'msg': 'Success', 'data': data}
        log.info(results)
        
        #json.dumps将结果反馈给前端
        s = json.dumps(results)
        
        #下面方便自己看一下,反馈了个啥
        self.write(s)

handlers = [
    (r"/", IndexHandler),
    (r"/artwork/retrival", UserHandler)
]

template_path = os.path.join(os.path.dirname(__file__),"template")

if __name__ == "__main__":
    # Artworks_Retrival_api为做好的算法类
    # __init__()中已经将预模型在内存
    art_retrival = Artworks_Retrival_api.Artworks_Retrival()
    
    #下面函数解释,emmm,不解释。。。
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers, template_path)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

使用Postman测试接口

ip输入栏前面设置为post,输入你的ip、端口、反馈的网页地址,点Body设置key,要与代码中get的名字一样,在再Value中通过本地传几个参数试试,点send发送即可~~

完成!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值