江西省网站建设_网站建设公司_UI设计_seo优化
2026/1/22 5:33:57 网站建设 项目流程

YOLO11推理服务封装:Flask API部署实战教程

YOLO11是Ultralytics公司推出的最新目标检测算法,延续了YOLO系列“又快又准”的核心优势。相比前代版本,它在模型结构、训练策略和推理效率上做了进一步优化,尤其在小目标检测和复杂场景下的鲁棒性表现突出。无论是工业质检、智能安防还是自动驾驶,YOLO11都能提供稳定高效的视觉感知能力。但光有模型还不够,如何将训练好的模型快速部署为可调用的服务,才是落地的关键一步。

本文将带你从零开始,把YOLO11模型封装成一个可通过HTTP请求调用的RESTful API服务。我们使用轻量级Web框架Flask实现接口封装,并基于提供的完整深度学习镜像环境进行操作,确保整个过程开箱即用、无需额外配置依赖。无论你是刚接触模型部署的新手,还是想快速搭建演示系统的开发者,这篇教程都能帮你高效完成任务。

1. 环境准备与项目结构

你所使用的深度学习镜像已经预装了YOLO11所需的全部依赖库,包括PyTorch、Ultralytics官方包、OpenCV、Flask等,省去了繁琐的环境配置过程。这意味着你可以直接进入开发阶段,专注于服务封装本身。

首先登录到你的开发环境。该镜像支持两种主流接入方式:Jupyter Lab 和 SSH 远程连接,可根据个人习惯选择。

1.1 使用 Jupyter Lab 开发

如果你更喜欢图形化界面和交互式编程,推荐使用 Jupyter Lab。通过浏览器访问指定端口后,你会看到熟悉的文件浏览界面。点击进入ultralytics-8.3.9目录,即可查看项目文件结构:

  • train.py:用于启动模型训练
  • detect.py:推理脚本,可用于测试单张图片或视频流
  • models/:存放不同规模的YOLO11模型定义(如yolo11n, yolo11s)
  • data/:数据集配置文件目录
  • runs/:训练结果保存路径

Jupyter Notebook 的优势在于可以分块运行代码、实时查看输出图像,非常适合调试模型效果。

1.2 使用 SSH 命令行开发

对于熟悉终端操作的用户,可以通过SSH远程登录服务器,在命令行中执行训练和部署任务。这种方式更适合自动化脚本管理和长期运行任务。

使用SSH客户端(如Terminal、PuTTY)连接主机后,首先进入项目主目录:

cd ultralytics-8.3.9/

然后可以直接运行训练脚本:

python train.py

训练完成后,模型权重会自动保存在runs/detect/train/weights/best.pt路径下。这是后续API服务加载的核心文件。

如图所示,训练过程中的损失曲线、mAP指标和验证集检测效果图都会实时展示,帮助你判断模型收敛情况。

2. 构建 Flask 推理服务

现在我们已经有了训练好的模型,下一步就是将其封装为Web服务。我们将创建一个简单的Flask应用,接收上传的图片,用YOLO11进行目标检测,返回带有标注框的结果图和JSON格式的检测信息。

2.1 创建项目目录结构

为了保持整洁,我们在主目录外新建一个专门用于部署的文件夹:

mkdir yolo11_api && cd yolo11_api

创建以下文件:

  • app.py:Flask主程序
  • static/uploads/:临时存储上传图片
  • static/results/:保存带检测框的输出图片

2.2 编写 Flask 应用代码

app.py中写入以下内容:

from flask import Flask, request, jsonify, send_from_directory import cv2 import numpy as np from ultralytics import YOLO import os from datetime import datetime # 初始化Flask应用 app = Flask(__name__) # 加载预训练的YOLO11模型(请根据实际路径调整) model = YOLO('../ultralytics-8.3.9/runs/detect/train/weights/best.pt') # 配置上传和结果目录 UPLOAD_FOLDER = 'static/uploads' RESULT_FOLDER = 'static/results' os.makedirs(UPLOAD_FOLDER, exist_ok=True) os.makedirs(RESULT_FOLDER, exist_ok=True) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['RESULT_FOLDER'] = RESULT_FOLDER @app.route('/') def index(): return ''' <h3>YOLO11目标检测API服务</h3> <p>使用方法:</p> <ul> <li>POST /detect - 上传图片并返回检测结果</li> </ul> ''' @app.route('/detect', methods=['POST']) def detect(): if 'file' not in request.files: return jsonify({'error': '未上传文件'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'error': '文件名为空'}), 400 # 读取图像 img_bytes = file.read() nparr = np.frombuffer(img_bytes, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) if img is None: return jsonify({'error': '无法解码图像'}), 400 # 使用YOLO11进行推理 results = model(img) # 提取检测结果 detections = [] for result in results: boxes = result.boxes.cpu().numpy() for box in boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) conf = float(box.conf[0]) cls_id = int(box.cls[0]) label = model.names[cls_id] detections.append({ 'class': label, 'confidence': conf, 'bbox': [x1, y1, x2, y2] }) # 在原图上绘制框和标签 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, f'{label} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) # 生成唯一文件名保存结果图 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") result_filename = f"result_{timestamp}.jpg" result_path = os.path.join(app.config['RESULT_FOLDER'], result_filename) cv2.imwrite(result_path, img) # 返回结果URL和检测数据 result_url = f"/results/{result_filename}" return jsonify({ 'detections': detections, 'result_image_url': result_url }) @app.route('/results/<filename>') def serve_result(filename): return send_from_directory(app.config['RESULT_FOLDER'], filename) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False)

2.3 代码说明

这段代码实现了以下几个关键功能:

  • 模型加载:使用YOLO()类加载之前训练好的.pt模型权重。
  • 图像处理:通过cv2.imdecode将上传的二进制数据转为OpenCV图像对象。
  • 推理执行:调用model(img)完成前向推理,获取边界框、类别和置信度。
  • 结果可视化:在原图上绘制绿色矩形框和文字标签。
  • 结构化输出:以JSON格式返回每个检测对象的类别、置信度和坐标。
  • 静态资源服务:通过/results/<filename>路由提供结果图访问。

注意:debug=False是为了防止在生产环境中意外开启调试模式导致安全风险。

3. 启动并测试API服务

完成编码后,就可以启动Flask服务了。

3.1 运行Flask应用

在终端中执行:

python app.py

如果一切正常,你会看到类似以下输出:

* Running on http://0.0.0.0:5000

这表示API服务已在本地5000端口监听外部请求。

3.2 测试接口功能

我们可以使用curl命令来测试API是否正常工作。假设有一张名为test_car.jpg的汽车图片:

curl -X POST \ http://localhost:5000/detect \ -F "file=@test_car.jpg" \ | python -m json.tool

预期返回如下格式的JSON响应:

{ "detections": [ { "class": "car", "confidence": 0.96, "bbox": [120, 80, 350, 200] }, { "class": "person", "confidence": 0.89, "bbox": [200, 150, 280, 300] } ], "result_image_url": "/results/result_20250322_143012.jpg" }

同时,打开浏览器访问http://<your-server-ip>:5000/results/result_20250322_143012.jpg即可查看带检测框的输出图像。

3.3 前端简易集成示例

如果你想嵌入网页使用,可以添加一个HTML页面作为前端界面。创建templates/index.html

<h3>上传图片进行检测</h3> <form id="uploadForm" enctype="multipart/form-data"> <input type="file" name="file" accept="image/*" required /> <button type="submit">检测</button> </form> <div id="result"></div> <script> document.getElementById('uploadForm').onsubmit = async (e) => { e.preventDefault(); const formData = new FormData(e.target); const res = await fetch('/detect', { method: 'POST', body: formData }); const data = await res.json(); document.getElementById('result').innerHTML = ` <p>共检测到 ${data.detections.length} 个物体</p> <img src="${data.result_image_url}" style="max-width:600px;" /> `; }; </script>

重启Flask服务后访问根路径即可看到上传界面。

4. 实际应用建议与优化方向

虽然当前的API已经具备基本功能,但在真实项目中还可以做进一步优化。

4.1 性能提升建议

  • 启用GPU加速:确认PyTorch已正确识别CUDA设备,可在推理时添加device=0参数强制使用GPU:
    model = YOLO('best.pt').to('cuda')
  • 批量处理支持:修改接口支持多图同时上传,提高吞吐量。
  • 异步处理队列:对于高并发场景,可引入Celery + Redis实现异步任务调度。

4.2 安全性增强

  • 文件类型校验:限制只允许上传.jpg,.png,.jpeg等图片格式。
  • 大小限制:设置最大上传尺寸(如10MB),避免内存溢出。
  • 防DDoS机制:结合Nginx或使用限流中间件(如Flask-Limiter)控制请求频率。

4.3 日志与监控

添加日志记录有助于排查问题:

import logging logging.basicConfig(level=logging.INFO) @app.route('/detect', methods=['POST']) def detect(): app.logger.info(f"收到新请求,文件名: {request.files['file'].filename}") # ...其余逻辑...

4.4 部署扩展

当需要对外提供服务时,建议不要直接使用Flask内置服务器。可采用以下方案:

  • 使用Gunicorn + Nginx部署,提升稳定性与并发能力
  • 通过Docker容器化打包应用,便于迁移和复制
  • 结合HTTPS反向代理保障通信安全

5. 总结

5.1 总结

本文详细演示了如何将YOLO11模型封装为可通过HTTP调用的RESTful API服务。我们利用预置的深度学习镜像快速搭建环境,通过Flask框架编写了一个简洁高效的推理接口,实现了图片上传、目标检测、结果标注和结构化返回的全流程功能。

整个过程无需手动安装任何依赖,只需几段核心代码就能让模型真正“跑起来”。无论是用于内部测试、客户演示还是集成到更大系统中,这种部署方式都极具实用价值。

更重要的是,这套方法不仅适用于YOLO11,也可以轻松迁移到其他YOLO系列模型或自定义检测任务上。只要替换模型权重和类别名称,就能快速构建专属的视觉识别服务。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询