一.flask写的接口

1.1 manage.py启动服务(发送图片base64版)

这里要注意的是用docker的话,记得端口映射

#coding:utf-8
import base64
import io
import logging
import picklefrom flask import Flask, jsonify, request
from PIL import Image
from sklearn import metricslogging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s",level=logging.INFO,datefmt="%Y-%m-%d %H:%M:%S",
)app = Flask(__name__)@app.route("/evaluate", methods=["POST"])
def evaluate():"""评价指标"""logging.info("Call evaluate")truth = request.json["truth"]predcition = request.json["prediction"]accuracy = metrics.accuracy_score(truth, predcition)f1 = metrics.f1_score(truth, predcition, average="macro")precision = metrics.precision_score(truth, predcition, average="macro")recall = metrics.recall_score(truth, predcition, average="macro")return jsonify({"accuracy": accuracy, "precision": precision, "recall": recall, "f1": f1})@app.route("/ocr", methods=["POST"])
def ocr():"""图像分析 OCR"""logging.info("OCR")base64str = request.json["img"]# print('base64str:',base64str)img = Image.open(io.BytesIO(base64.b64decode(base64str)))print('img:',img.size)# text = pytesseract.image_to_string(Image.open(io.BytesIO(img)), lang="chi_sim")return jsonify({"text": 'Success'})if __name__ == "__main__":app.run(host="0.0.0.0", port=6006)

1.2.test_route  测试路由文件(发送图片base64版)

#coding:utf-8
from io import BytesIO
from PIL import Image
import base64
import json
import re
import requestsdef image_to_base64(img_path):with open(img_path, "rb") as f:  # 转为二进制格式data_base64 = base64.b64encode(f.read()).decode()  # 使用base64进行加密return data_base64def base64_to_image(base64_str):base64_data = re.sub('^data:image/.+;base64,', '', base64_str)byte_data = base64.b64decode(base64_data)image_data = BytesIO(byte_data)img = Image.open(image_data)return imgdef json_send(dataPModel,url):headers = {"Content-type": "application/json", "Accept": "text/plain", "charset": "UTF-8"}response = requests.post(url=url, headers=headers, data=json.dumps(dataPModel))# print('response:',response)return json.loads(response.text)if __name__ == "__main__":url = 'http://192.168.102.193:1112/ocr'img = Image.open('haha.png').convert('RGB')print('img.size:', img.size)img_base64 = image_to_base64('haha.png')dataPModel = {}dataPModel['img'] = img_base64# dataPModel['uid'] = "0x031"print('dataPModel:', dataPModel)result = json_send(dataPModel, url)print(result['text'])

服务器返回结果:

本地返回结果:

2.1.manage.py启动服务(发送图片二进制版)

#coding:utf-8
"""
fzh created on 2020/06/28
"""
import logging
logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s",level=logging.INFO,datefmt="%Y-%m-%d %H:%M:%S",
)
import os
import base64
import io
from PIL import Image
import os
from flask import Flask, jsonify, request
import cv2
import glob
import numpy as np
import json
import datetime
import time
import re
import randomapp = Flask(__name__)@app.route("/express_reco", methods=["POST"])
def express_reco():logging.info('====快递单接收图片成功====')st1_time = time.time()algirm_info = {}path = './algrim_img'os.makedirs(path, exist_ok=True)#二进制图片方式name_ = random.randint(0, 1000)data_binary = request.files['encode_data']img_path = os.path.join(path, str(name_)+'.jpg')data_binary.save(img_path)#data_binary.filenameimg = cv2.imread(img_path)if __name__ == "__main__":app.run(host="0.0.0.0", port=6006)#注意部署要改为6006

2.2.test_route  测试路由文件(发送图片二进制版)

#coding:utf-8
import json
import os
import requests
import base64def json_send(url,dataPModel):# header = {"Content-type": "application/json", "Accept": "text/plain", "charset": "UTF-8"}header = {'Content-Type': 'application/json'}# response = requests.post(url=url, headers=header, data=json.dumps(dataPModel))response = requests.post(url=url, files=dataPModel)# print('response:', response)return json.loads(response.text)def send_express_reco():url = 'http://192.168.102.191:3112/express_reco'dataPModel = {}import cv2img_path = './快递单原始数据'imgs_list_path = [os.path.join(img_path, i) for i in os.listdir(img_path)]for i, img_list_path in enumerate(imgs_list_path[:10]):print('==img_list_path:', img_list_path)dataPModel['encode_data'] = open(img_list_path, 'rb')result = json_send(url, dataPModel)print('result:', result)print('==imgs_list_path[0]:',imgs_list_path[0])for i in range(10):dataPModel['encode_data'] = open(imgs_list_path[0], 'rb')result = json_send(url, dataPModel)print('result:', result)

3.1 flask上传视频流

(1)代码结构:

其中index.html用来渲染页面,app.py用来起服务

(2)index.html代码:

<!doctype html>
<html lang="en">
<head><!-- Required meta tags --><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><!-- Bootstrap CSS --><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"><title>Live Streaming Demonstration</title>
</head>
<body>
<div class="container"><div class="row"><div class="col-lg-8  offset-lg-2"><h3 class="mt-5">视频显示</h3><img src="{{ url_for('video_feed') }}" width="100%"></div></div>
</div>
</body>
</html>

(3)app.py代码:

#coding:utf-8
from flask import Flask, render_template, Response
import cv2app = Flask(__name__)
camera = cv2.VideoCapture(0)  # use 0 for web camera
# Use Ip Camera/CCTV/RTSP Link
# cv2.VideoCapture('rtsp://username:password@camera_ip_address:554/user=username_password='password'_channel=channel_number_stream=0.sdp')
### Example RTSP Link
# cv2.VideoCapture('rtsp://mamun:123456@101.134.16.117:554/user=mamun_password=123456_channel=0_stream=0.sdp') ```
def gen_frames():  # generate frame by frame from camerawhile True:# Capture frame-by-framesuccess, frame = camera.read()  # read the camera frame# print('===frame.shape', frame.shape)if not success:breakelse:ret, buffer = cv2.imencode('.jpg', frame)frame = buffer.tobytes()yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  # concat frame one by one and show result@app.route('/video_feed')
def video_feed():#Video streaming route. Put this in the src attribute of an img tagreturn Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')@app.route('/video', methods=["get"])
def index():"""Video streaming home page."""return render_template('index.html')if __name__ == '__main__':# app.run(debug=True, port=6006)app.run(host="0.0.0.0", port=6006)

python app.py启动服务即可

3.2查看视频流

二.开异步:

https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(1)executor.submit(second_send_houduan,json_info)

注意传递参数要放在外面

#coding:utf-8
from threading import Thread
import os
import base64
import io
import logging
import pickle
from whole_image_detect_first_plate import main_plate
from whole_image_detect_second_recognize import main_recoginze
from third_title_word_recognize import main_title_word_recoginze
from flask import Flask, jsonify, request
from PIL import Image
from config import model_title_detect, model_word_detect,crnn_model
# from sklearn import metrics
import requests
import json
import time
from time import sleep
from sql_tools import *
import asyncio
from multiprocessing import Process, Poolfrom concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(1)logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s",level=logging.INFO,datefmt="%Y-%m-%d %H:%M:%S",
)app = Flask(__name__)def json_send_head(dataPModel,url):# headers = {"Content-type": "application/json", "Accept": "text/plain", "charset": "UTF-8"}response = requests.post(url=url, data=dataPModel)# print('response:',response)return json.loads(response.text)#第二次算法返回的结果
def second_send_houduan(json_info):print('entrance second houduan!!!')# 发给后端url = 'http://tc.aa.zhangzb.site:9091/api/page/plateGetJson'dataPmodel = {}if len(json_info):info = main_recoginze(json_info, model_title_detect, model_word_detect, crnn_model)dataPmodel['json'] = json.dumps(info)text = json_send_head(url, dataPmodel)print('text:', text)else:dataPmodel = {}info = {'NO': 'NO JSON INFO!!'}dataPmodel['json'] = json.dumps(info)json_send_head(url, dataPmodel)#第二次对接,后端发给我版面框划分好后传的json信息
@app.route("/second_recognize", methods=["POST"])
def second_recognize():logging.info("second_recognize")str_info = request.json["json"]json_info = json.loads(str_info)# json_info = str_info #自己调试用print('json_info:', json_info)executor.submit(second_send_houduan,json_info)# print('len(json_info):', len(json_info))data = {}if len(json_info):data['msg'] = ''data['code'] = '200'else:data['msg'] = '接收的json有问题'data['code'] = '201'return jsonify(data)if __name__ == "__main__":app.run(host="0.0.0.0", port=6006)

三.gunicorn部署Flask服务

pip install gunicorn

gunicorn命令启动

gunicorn -w 4 -b ip:port xxx:app启动一个Flask应用

例如:gunicorn -w 4 -b 0.0.0.0:6006 manage:app

  • -w 4是指预定义的工作进程数为4,
  • -b 127.0.0.1:4000指绑定地址和端口
  • manage是flask的启动python文件,app则是flask应用程序实例
# run.py
from flask import Flask
app = Flask(__name__)

进行配置config.py

# gunicorn config
workers = 6  # must be 1, because of gpu
# threads = 4
bind = "0.0.0.0:6006"
worker_class = "gevent"
worker_connections = 1500
timeout = 60
loglevel = "debug"
accesslog = "-"
errorlog = "-"
daemon = False
pidfile = "master_pid"

启动的时候:gunicorn  -c ./config.py manage:app

退出gunicorn,通过下面命令查看

pstree -ap|grep gunicorn

在kill即可。

四.多GPU卡部署

参考:https://blog.miguelgrinberg.com/post/video-streaming-with-flask

利用flask写的接口(base64, 二进制, 上传视频流)+异步+gunicorn部署Flask服务+多gpu卡部署相关推荐

  1. flask 接口上传文件_Flask干货:Flask数据交换——上传文件

    图 | 源网络文 | 5号程序员01 事情是这样的. 有一天五号程序员打算网购一盒巧克力送给自己的女朋友 想必女朋友收到礼物是这样的: 结果商家邮寄来的巧克力中夹着一张纸条: 害!你说气不气人,现在都 ...

  2. 【Flask】 结合wtforms的文件上传表单

    表单中的文件上传 基本的表单渲染,表单类设置等等就不多说了,参看另一个文章即可.但是那篇文章里没有提到对于FileField,也就是上传文件的表单字段是如何处理,后端又是如何实现接受上传过来的文件的. ...

  3. 【转】Postman系列三:Postman中post接口实战(上传文件、json请求)

    一:接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是: 1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据: 2.Get安全性比Pos ...

  4. php图片上传为base64,php实现base64图片上传方式实例代码

    /** * base64图片上传 * @param $base64_img * @return array */ header("content-type:text/html;charset ...

  5. python程序打包成apk_利用Gradle+Python3自动打包Android APK上传到蒲公英。

    利用Gradle+Python3自动打包Android APK上传到蒲公英. 面对每次都要打包一个版本发布给测试,都要手动打包签名~然后登录上传文件.这些繁琐的事情.于是就想到一句很经典的话,(人生苦 ...

  6. vue+flask实现视频合成(拖拽上传)

    vue+flask实现视频合成 效果如下 欢迎访问博客代码哈士奇 技术 聊天 交流群 974178910 前端交流群 535620886 vue+flask实现视频合成 拖拽上传我们之前一个文章有写过 ...

  7. 通过API接口实现图片上传

    通过API接口实现图片上传 需求 近期在接口功能实现要求,实现一个API图片上传,补充商户开户后补充图片信息,用于管理人员审核. 业务要求 图片有多条,法人信息,授权信息,等 有必填图片,有非必填图片 ...

  8. 接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63

    接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63 参考文章: (1)接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63 (2)https://www.cnbl ...

  9. mvc 普通上传, 图片转二进制上传

    2019独角兽企业重金招聘Python工程师标准>>> [HttpPost]public ActionResult UpLoadImage(HttpPostedFileBase fi ...

最新文章

  1. [Springboot实战] 集成 Caffeine
  2. 如何开启mysql5.5的客户端服务 命令行打开方法
  3. c语言邻接表的构建_C++实现有向图邻接表的构建
  4. qt geomery的单位是什么_斜管沉淀池的原理是什么?
  5. .Net 下载网络图片
  6. 程序员修神之路--kubernetes是微服务发展的必然产物
  7. CompressedOops:Java压缩参考简介
  8. 马云:不能把孩子放在温室里,光给孩子知识是不够的
  9. VS Code 新扩展,面向 Web 开发人员调试 DOM
  10. CSS 之 样式优先级机制
  11. lsb算法 java,解决:-bash: lsb_release: command not found办法
  12. Python拓展应用——Selenium代刷问卷星问卷,升级版。
  13. 看看哪些小程序能帮你赚点零花钱!
  14. 软件项目文档及其必要性
  15. CH341应用升级为CH347软硬件注意事项
  16. IOS中impactor报81错误解决方法
  17. 如何设置Android手机的sqlite3命令环境
  18. Linux网络编程8——线程池模型
  19. [n年以前的诗] 怀念中XXXX年5月的泰山二首
  20. 《我在未来等你》的读书笔记和读后感作文2900字

热门文章

  1. svn忽略指定文件夹下的文件_管理SteamLibrary文件夹下的acf文件
  2. 亚马逊出的平板电脑_亚马逊推出了这款不到400元的平板电脑!学生党的福音!...
  3. 论文浅尝 | 基于神经网络的知识推理
  4. RabbitMQ 简介和使用
  5. 数据库:MySQL和MariaDB的JDBC连接
  6. 专享!解读抖音企业蓝V认证的详细流程是怎样的
  7. 你必须搞清楚的String,StringBuilder,StringBuffer
  8. 【Linux】使用ZStack私有云创建本地Linux服务器
  9. 游戏“冰川滑行”设计稿(第一版)
  10. ASP.NET 用户控件自定义属性、方法、事件