实时口罩检测-通用部署教程:使用Traefik实现多模型服务统一网关路由

张开发
2026/4/6 11:14:18 15 分钟阅读

分享文章

实时口罩检测-通用部署教程:使用Traefik实现多模型服务统一网关路由
实时口罩检测-通用部署教程使用Traefik实现多模型服务统一网关路由1. 引言为什么需要一个统一的AI服务网关想象一下你部署了多个AI模型服务比如一个实时口罩检测模型、一个图像风格迁移模型还有一个文本摘要模型。每个服务都运行在不同的端口上比如localhost:8001、localhost:8002、localhost:8003。每次调用时你都需要记住哪个端口对应哪个服务管理起来非常混乱。更麻烦的是如果你需要为这些服务添加SSL证书、负载均衡、或者统一的访问控制难道要为每个服务都单独配置一遍吗这显然不是一个高效、优雅的解决方案。Traefik就是为了解决这类问题而生的。它是一个现代的HTTP反向代理和负载均衡器可以自动发现你的服务并作为一个统一的网关将所有流量路由到正确的后端。今天我们就以实时口罩检测-通用模型为例手把手教你如何使用Traefik来管理你的AI模型服务实现一个整洁、可扩展的服务架构。通过本教程你将学会如何部署一个基于Gradio的实时口罩检测模型服务。如何配置和启动Traefik作为统一网关。如何通过一个统一的域名或路径访问所有模型服务告别端口记忆。为未来扩展更多AI服务打下坚实基础。2. 环境准备与项目结构在开始之前请确保你的服务器或本地开发环境满足以下条件操作系统Linux (如 Ubuntu 20.04/22.04) 或 macOS。Windows用户建议使用WSL2。Docker与Docker Compose这是本教程的核心工具用于容器化部署。请确保已安装。基础网络知识了解基本的IP、端口和域名概念即可。首先我们来规划一下项目目录结构。清晰的目录结构是良好运维的开始。ai-models-gateway/ ├── docker-compose.yml # 主编排文件 ├── traefik/ │ ├── traefik.yml # Traefik静态配置 │ └── config/ │ └── dynamic.yml # Traefik动态配置路由规则 └── services/ └── mask-detection/ ├── Dockerfile # 口罩检测服务的Dockerfile └── app/ └── ... # 你的模型代码和Gradio应用你可以使用以下命令快速创建这个结构mkdir -p ai-models-gateway/traefik/config ai-models-gateway/services/mask-detection/app cd ai-models-gateway touch docker-compose.yml traefik/traefik.yml traefik/config/dynamic.yml services/mask-detection/Dockerfile3. 部署实时口罩检测模型服务我们的第一个AI服务是基于ModelScope的实时口罩检测模型。我们将把它打包成一个Docker容器。3.1 创建口罩检测服务的Dockerfile编辑services/mask-detection/Dockerfile文件# 使用一个包含Python和常用深度学习库的基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 安装系统依赖如果需要 RUN apt-get update apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ rm -rf /var/lib/apt/lists/* # 复制依赖文件并安装Python包 COPY ./app/requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 复制应用代码 COPY ./app . # 暴露Gradio默认端口 EXPOSE 7860 # 启动命令 CMD [python, webui.py]3.2 准备模型应用代码在services/mask-detection/app/目录下你需要准备模型运行的核心代码。根据输入描述主入口文件是webui.py。这里提供一个简化的示例框架你需要根据实际从ModelScope加载模型的代码进行填充。services/mask-detection/app/webui.py:import gradio as gr from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import cv2 import numpy as np # 初始化模型这里需要替换成实际的模型加载代码 # 假设模型ID为 damo/cv_tinynas_object-detection_damoyolo_mask print(正在加载口罩检测模型...) mask_detection_pipeline pipeline( Tasks.domain_specific_object_detection, modeldamo/cv_tinynas_object-detection_damoyolo_mask ) print(模型加载完毕) def detect_mask(image): 对输入图像进行口罩检测 Args: image: numpy数组格式的图片 Returns: annotated_image: 标注后的图片 result_text: 检测结果文本 # 将图片保存为临时文件或直接处理这里假设pipeline接受numpy数组 # 实际调用需要参考ModelScope pipeline的输入格式 result mask_detection_pipeline(image) # 可视化结果 annotated_image image.copy() result_text 检测结果\n # 假设result包含bboxes和labels # 这里需要根据模型实际输出结构进行解析和绘制 # 例如 # for bbox, label in zip(result[bboxes], result[labels]): # x1, y1, x2, y2 bbox # class_name 佩戴口罩 if label 1 else 未佩戴口罩 # cv2.rectangle(annotated_image, (x1, y1), (x2, y2), (0,255,0), 2) # cv2.putText(annotated_image, class_name, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 2) # result_text f- 位置[{x1}, {y1}, {x2}, {y2}], 状态{class_name}\n # 示例返回原图和一个假的结果文本实际使用时请替换 result_text 检测完成识别到2个人脸其中1人佩戴口罩1人未佩戴。 return annotated_image, result_text # 创建Gradio界面 with gr.Blocks(title实时口罩检测-通用) as demo: gr.Markdown(# 实时口罩检测-通用模型) gr.Markdown(上传一张包含人脸的图片模型将检测其中是否佩戴口罩。) with gr.Row(): with gr.Column(): input_image gr.Image(label上传图片, typenumpy) submit_btn gr.Button(开始检测) with gr.Column(): output_image gr.Image(label检测结果可视化) output_text gr.Textbox(label检测详情, lines4) submit_btn.click( fndetect_mask, inputs[input_image], outputs[output_image, output_text] ) gr.Examples( examples[[example1.jpg], [example2.jpg]], # 准备一些示例图片路径 inputs[input_image], outputs[output_image, output_text], fndetect_mask, cache_examplesTrue ) # 启动应用监听所有网络接口方便Docker内部访问 if __name__ __main__: demo.launch(server_name0.0.0.0, server_port7860, shareFalse)同时创建依赖文件services/mask-detection/app/requirements.txt:gradio3.50 modelscope[multi-modal]1.9.0 opencv-python-headless numpy4. 配置Traefik作为统一网关现在我们来配置Traefik让它成为我们所有AI服务的“总入口”。4.1 配置Traefik静态文件编辑traefik/traefik.yml这是Traefik服务本身的配置# Traefik静态配置 api: dashboard: true # 启用管理仪表板 insecure: true # 为简单起见允许HTTP访问仪表板生产环境应使用安全配置 providers: docker: endpoint: unix:///var/run/docker.sock # 监听Docker事件 exposedByDefault: false # 默认不暴露所有容器需要手动打标签 file: filename: /etc/traefik/config/dynamic.yml # 动态配置文件的路径 entryPoints: web: address: :80 # 定义一个名为web的入口点监听80端口 # 如果需要HTTPS可以添加websecure入口点 # websecure: # address: :443 log: level: INFO accessLog: {}4.2 配置动态路由规则编辑traefik/config/dynamic.yml这里定义了具体的路由规则告诉Traefik如何将外部请求转发到我们的口罩检测服务# Traefik动态配置 http: routers: # 定义口罩检测服务的路由 mask-detection-router: rule: PathPrefix(/mask-detection) || Host(mask.localhost) # 规则路径前缀或特定域名 service: mask-detection-service entryPoints: - web # 可以在这里添加中间件如认证、限流等 # middlewares: # - auth-middleware services: # 定义口罩检测服务 mask-detection-service: loadBalancer: servers: - url: http://mask-detection:7860 # 指向Docker Compose中定义的服务名和端口 # 可选定义中间件 # middlewares: # auth-middleware: # basicAuth: # users: # - admin:$2y$10$xxxxxxxxxxxx # 经过哈希的密码规则解释PathPrefix(/mask-detection): 当访问http://你的服务器IP/mask-detection时请求会被转发到口罩检测服务。Host(mask.localhost): 当访问http://mask.localhost时需要在你的hosts文件或DNS中配置请求也会被转发。这在本地开发时非常方便。4.3 编写Docker Compose编排文件最后编辑根目录下的docker-compose.yml它将所有服务Traefik和口罩检测组合在一起version: 3.8 services: # Traefik 网关服务 traefik: image: traefik:v2.10 container_name: traefik-gateway restart: unless-stopped ports: - 80:80 # 将宿主机的80端口映射到Traefik的web入口点 - 8080:8080 # 映射Traefik仪表板端口通过 insecure 方式访问 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # 让Traefik能读取Docker信息 - ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro - ./traefik/config:/etc/traefik/config:ro networks: - ai-network labels: - traefik.enabletrue # 允许Traefik管理自身为仪表板创建路由 # 实时口罩检测服务 mask-detection: build: ./services/mask-detection # 使用我们编写的Dockerfile构建 container_name: mask-detection-service restart: unless-stopped # 注意我们不直接将7860端口映射到宿主机所有流量通过Traefik进入 # ports: # - 7860:7860 # 注释掉由Traefik代理 volumes: - ./services/mask-detection/app:/app # 开发时挂载代码方便修改 networks: - ai-network labels: - traefik.enabletrue # 关键告诉Traefik这个容器需要被代理 # 以下标签会被Traefik的docker provider自动读取用于创建路由 # 我们已经在dynamic.yml中手动定义了路由所以这里可以简化。 # 更自动化的方式是通过labels定义规则但手动配置在dynamic.yml中更清晰、集中。 # 定义一个自定义网络让服务间可以通过服务名通信 networks: ai-network: driver: bridge5. 启动服务与验证一切就绪现在让我们启动整个栈。5.1 启动所有服务在项目根目录 (ai-models-gateway/) 下运行docker-compose up -d-d参数表示在后台运行。你会看到Docker开始构建mask-detection镜像并拉取traefik镜像。5.2 验证服务运行状态使用以下命令查看容器是否正常运行docker-compose ps你应该看到traefik-gateway和mask-detection-service的状态都是Up。5.3 访问你的AI服务现在你可以通过以下几种方式访问口罩检测服务通过路径前缀访问推荐 打开浏览器访问http://你的服务器IP/mask-detection。 Traefik会将请求路由到mask-detection-service容器的7860端口你就能看到Gradio的Web界面了。通过本地域名访问适合开发 编辑你电脑的hosts文件Linux/macOS在/etc/hostsWindows在C:\Windows\System32\drivers\etc\hosts添加一行127.0.0.1 mask.localhost然后访问http://mask.localhost。同样可以访问。访问Traefik仪表板 访问http://你的服务器IP:8080你可以看到一个清晰的仪表板上面列出了所有配置的路由器Routers和服务Services非常直观。5.4 测试口罩检测功能在Gradio界面中上传一张包含人脸的图片点击“开始检测”。如果模型加载和运行正常你应该能看到标注了人脸框和口罩佩戴状态的输出图像和文本。6. 扩展添加更多AI模型服务Traefik的强大之处在于其易扩展性。假设你现在要部署第二个AI服务比如一个“图像风格迁移”模型。创建新服务目录在services/下创建style-transfer/并编写其Dockerfile和app/代码。在docker-compose.yml中添加新服务style-transfer: build: ./services/style-transfer container_name: style-transfer-service restart: unless-stopped networks: - ai-network labels: - traefik.enabletrue在traefik/config/dynamic.yml中添加新的路由和服务配置http: routers: style-transfer-router: rule: PathPrefix(/style-transfer) service: style-transfer-service entryPoints: - web services: style-transfer-service: loadBalancer: servers: - url: http://style-transfer:7860 # 假设它也运行在7860端口重启服务docker-compose up -d --build style-transfer docker-compose restart traefik # 让Traefik重新加载配置访问新服务现在你就可以通过http://你的服务器IP/style-transfer访问新的风格迁移服务了。7. 总结通过本教程我们成功搭建了一个由Traefik作为统一网关的AI模型服务架构。我们将实时口罩检测-通用模型部署为独立的容器服务并通过Traefik实现了基于路径的智能路由。这种架构的核心优势在于统一入口所有AI服务通过一个IP和端口通常是80/443暴露通过不同的路径如/mask-detection,/style-transfer进行区分管理极其方便。解耦与独立每个AI服务都是独立的容器可以单独开发、更新、扩缩容互不影响。易于扩展添加新的AI服务只需重复“创建服务 - 添加Compose配置 - 添加Traefik路由”这三步架构无需改动。功能强大Traefik为未来添加HTTPS、自动SSL证书Let‘s Encrypt、访问认证、流量监控、负载均衡等高级功能提供了极其简便的配置方式。你现在拥有的是一个生产可用的AI服务网关雏形。接下来你可以为Traefik配置HTTPS启用websecure入口点。使用Let‘s Encrypt自动管理SSL证书。为敏感服务添加BasicAuth等认证中间件。部署更多的AI模型构建你自己的AI服务矩阵。希望这篇教程能帮助你优雅地管理和部署你的AI应用。从记住一堆杂乱的端口到通过一个清晰的网关访问所有服务这就是现代化运维带来的效率提升。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章