You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

核心修改说明

  1. 把create_model()调用从路由函数内移到app初始化完成后、启动服务前,仅在服务启动时执行一次模型结构加载和权重读取
  2. 保存模型加载时绑定的TensorFlow默认计算图,推理时显式指定在该图上下文内执行,避免出现变量未初始化、图不匹配的错误
  3. 启动服务时添加use_reloader=False参数,关闭Flask调试模式默认的代码重载功能,避免重复加载两次模型

注意事项

  • 如果你使用的是TensorFlow 2.x版本,将tf.get_default_graph()替换为tf.compat.v1.get_default_graph()即可
  • 生产环境部署时如果使用Gunicorn、uWSGI等容器,不要配置多worker(多进程)模式,或者配置每个worker单独初始化模型,否则会出现模型调用异常
  • 权重文件路径建议使用绝对路径,避免运行目录变化导致权重加载失败

内容的提问来源于stack exchange,提问作者BlueTurtle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:45:00