如何在Flask服务器启动时预加载Mask RCNN模型及权重避免每次请求重载
Flask启动阶段预加载Mask RCNN模型解决方案
核心问题是Mask RCNN依赖的TensorFlow版本多为1.x,模型加载与默认计算图绑定,仅初始化模型实例无法正常调用,推理时需要在同一张图的上下文内执行,同时要避免调试模式重载导致的重复加载问题。
修改后的Flask代码
from flask import Flask, jsonify, request import base64 import cv2 import numpy as np import tensorflow as tf from Configuration import create_model app = Flask(__name__) # 启动阶段加载模型,仅执行一次 model = create_model() # 保存模型绑定的默认计算图 graph = tf.get_default_graph() @app.route('/', methods=['GET', 'POST']) def index(): if request.method == "POST": # 加载客户端上传的图片 imagefile = request.files['image'].read() # 类型: bytes jpg_as_np = np.frombuffer(imagefile, dtype=np.uint8) # 转numpy数组 img = cv2.imdecode(jpg_as_np, flags=1) # 解码为opencv格式数组 ### 推理逻辑部分 ### image = img[..., ::-1] # 推理时指定使用加载模型时绑定的计算图 with graph.as_default(): # 目标检测 r = model.detect([image], verbose=0)[0] # 此处保留你原有的掩码可视化逻辑生成masked_image ### 逻辑结束 ### string = base64.b64encode(cv2.imencode('.jpg', masked_image)[1]).decode() # 转换为base64字符串用于接口返回 return jsonify({"count": str(r["masks"].shape[2]), 'image': string}) if __name__ == "__main__": # 关闭重载器,避免调试模式下重复加载两次模型 app.run(use_reloader=False)
核心修改说明
- 把
create_model()调用从路由函数内移到app初始化完成后、启动服务前,仅在服务启动时执行一次模型结构加载和权重读取 - 保存模型加载时绑定的TensorFlow默认计算图,推理时显式指定在该图上下文内执行,避免出现变量未初始化、图不匹配的错误
- 启动服务时添加
use_reloader=False参数,关闭Flask调试模式默认的代码重载功能,避免重复加载两次模型
注意事项
- 如果你使用的是TensorFlow 2.x版本,将
tf.get_default_graph()替换为tf.compat.v1.get_default_graph()即可 - 生产环境部署时如果使用Gunicorn、uWSGI等容器,不要配置多worker(多进程)模式,或者配置每个worker单独初始化模型,否则会出现模型调用异常
- 权重文件路径建议使用绝对路径,避免运行目录变化导致权重加载失败
内容的提问来源于stack exchange,提问作者BlueTurtle
相关产品推荐
相关产品推荐

