flask部署Centernet服务供调用

flask部署Centernet服务供调用

前言

最近在做的是会议视频分析的项目,需要统计出参会人员的专注度与会场活跃度两个指标,需要识别出参会人员的抬头低头扭头的人数,以及参会人员的表情,具体可参照我之前的博客。框架搭好之后,基本功能已经实现,现在公司要求部署这个服务供外部调用,展示相应数据,顾在这里详细记录一下部署的过程。我也是新手,跟大家一起学习…

1.Flask

Flask是一个轻量级的web框架,提供了很多库让我们能够快速简单地部署自己的服务,关于Flask框架这里就不过多赘述,想了解更多Flask的知识可以参考其中文网站http://www.pythondoc.com/flask/index.html

2.准备部署

2.1修改demo.py

虽然是对视频分析,但实际模型是隔一段时间接收外部传送的一张图片,仍然是对每一帧画面做处理,因此这里我需要简化demo.py,修改后的demo.py如下所示:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import _init_paths

import os
import cv2
import time
import numpy as np

from opts import opts
from detectors.detector_factory import detector_factory

image_ext = ['jpg', 'jpeg', 'png', 'webp']
video_ext = ['mp4', 'mov', 'avi', 'mkv']
time_stats = ['tot', 'load', 'pre', 'net', 'dec', 'post', 'merge']


def meeting_det(image, opt=opts().init()):
    os.environ['CUDA_VISIBLE_DEVICES'] = opt.gpus_str
    opt.debug = max(opt.debug, 1)
    Detector = detector_factory[opt.task]
    detector = Detector(opt)

    concentrate_rate, activity_rate = detector.run(image)
    return concentrate_rate, activity_rate


if __name__ == '__main__':
    opt = opts().init()
    meeting_det(opt)

因为我需要的是参会人员的专注度与会场活跃度两个指标,所以在代码内部,就返回了这两个参数,具体代码细节这里就不放了。这个demo.py实际上还可以再优化一些,以后再优化,现在有点懒…

2.2 修改内部代码

关于内部代码的修改,这里就不展示太多了,稍后我会将完整的代码都上传至github,大家可以下载下来对比一下源代码

2.3 实现

在实际测试中,我们很容易发现,每次载入模型都需要很长时间,如果api每调用一次都载入一次模型,那么将会白白消耗很多时间。别着急,这个已经有解决方案了:我们可以通过flask建立一个REST API,这是一种架构风格,允许我们只载入一次模型,节省了很多时间。
但目前我还没有用到这个架构风格,现在正处于调试阶段,跟随进度一 点点来,不断试错,并把错误展示出来,为以后遇到相同问题时提供思路,哈哈哈哈…
现在我编写的flask服务代码flask_test.py如下:

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 17 10:31:15 2019

@author: zhangdong0626
"""
from flask import Flask, request, render_template, redirect, url_for
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)  # flask实例
from meeting_det import meeting_det #导入检测模型
import json

def test(imagepath):
    return imagepath,imagepath
# 设置HTTP请求方法
@app.route("/data/cv_test/centernet_test_add_emotion_upload/src", methods = ['POST', "GET"])
def get_meeting_info(): 
    if request.method == 'POST': 
        new_img1=request.files['file']  # 'file'对应前端表单name属性
        new_img1.save(os.path.join(os.getcwd(),'media/')+ secure_filename(new_img1.filename)) 
        imagepath=os.path.join(os.getcwd(),'media/'+secure_filename(new_img1.filename))   # 获取图片地址
        final_result_dict = {}
        concentrate_rate, activity_rate = meeting_det(imagepath) #返回需要的数据
        final_result_dict["concentrate_rate"] = concentrate_rate
        final_result_dict["activity_rate"] = activity_rate
#        return jsonify(str(final_result_dict))
        return json.dumps(final_result_dict, ensure_ascii=False) #将数据打包成json文件
    return render_template('uploadimg.html') #网页界面设计

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=10100, debug=False)

运行flask_test.py,终端显示如下

 * Serving Flask app "flask_test" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:10100/ (Press CTRL+C to quit)

表示服务部署成功
在windows下输入地址http://0.0.0.0 :10100/data/cv_test/centernet_test_add_emotion_upload/src
如果在终端运行,将0.0.0.0替换为你的终端地址
如果在windows或ubuntu下运行,将0.0.0.0替换为你的本机地址,一般为127.0.0.1
网页界面显示如下:
在这里插入图片描述
上传图片文件,终端会显示:

Creating model...
loaded ../exp/ctdet/coco_dla/model_last.pth, epoch 1000
----------------
总人数: 37
抬头:25,低头:9,扭头:3
微笑:4,正常:30,无表情:3
参会人员专注度:67.57 会场活跃度:60.27
 [17/Oct/2019 10:44:18] "POST /data/cv_test/centernet_test_add_emotion_upload/src HTTP/1.1" 200 -

同时网页会显示返回的数据:
在这里插入图片描述
这样,简单的centernet服务部署就完成了。

3.待优化

1.现在每次调用服务都会载入一次模型,非常耗时,准备优化
2.现在仅支持手动单张图片送入检测,准备实现自动连续送入图片检测

优化记录

2019.10.17 11:54

待优化第一条:

原因分析

每次调用服务都会载入一次模型,非常耗时,原因是一些预处理工作包括加载预训练模型都被放在了meeting_det()函数体内,导致每次调用都会重复做这些工作。

解决过程

修改上述2.1中demo.py为:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import _init_paths

import os
import cv2
import time
import numpy as np

from opts import opts
from detectors.detector_factory import detector_factory

opt = opts().init()
os.environ['CUDA_VISIBLE_DEVICES'] = opt.gpus_str
opt.debug = max(opt.debug, 1)
Detector = detector_factory[opt.task]
detector = Detector(opt)

def meeting_det(image, opt=opts().init()):
    start_time = time.time()
    concentrate_rate, activity_rate = detector.run(image)
    total_time = time.time() - start_time
    print('total_time:', total_time)
    return concentrate_rate, activity_rate

将预处理工作和模型加载放在meeting_det()外,其中加载训练模型的语句为detector = Detector(opt)。这样每次处理新的图片时就不会反复重新载入模型,调用时只会执行meeting_det()函数。

待优化第二条:

正在解决…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值