尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenCV与YOLO实战:两个月从零搭建实时目标检测系统

OpenCV与YOLO实战:两个月从零搭建实时目标检测系统 这次我们来看一个面向计算机视觉初学者的实战项目如何用两个月时间从零入门到完成一个基于 OpenCV 和 YOLO 的实时目标检测系统并以此为基础产出 AI 交叉领域的学术论文或毕业设计。对于很多非计算机专业如机械、电子、生物医学的学生或研究者来说快速掌握一个能跑通、能出成果的 AI 视觉项目是刚需。这个项目的核心不是让你成为算法专家而是提供一个清晰、可复现的路径让你在有限时间内把深度学习模型真正用起来解决实际问题。项目的核心思路非常直接利用成熟的 YOLO 系列模型如 YOLOv5、YOLOv8进行目标检测再结合 OpenCV 进行图像/视频的读取、处理和结果可视化最终搭建一个从摄像头或视频文件输入到实时显示检测结果的完整流程。整个过程不涉及复杂的模型研发重点在于环境搭建、代码集成、效果调优和结果分析。对于毕设或交叉论文这套流程能快速产出可视化结果和数据是性价比极高的选择。本文将带你完整走一遍这个流程。你会了解到需要准备什么硬件和软件环境如何一步步安装部署如何运行一个基础的检测脚本以及如何将这个 demo 扩展成支持批量处理、自定义模型和简易 API 的实用工具。更重要的是我们会讨论如何基于这个项目整理出符合学术规范的技术报告或论文初稿。无论你是想完成课程设计、毕业设计还是为交叉学科研究寻找一个 AI 视觉切入点这篇文章都能提供一条明确的行动路线。1. 核心能力速览在深入细节之前我们先快速了解这个技术方案的核心能力和门槛帮助你判断是否适合自己。能力项说明技术栈Python OpenCV PyTorch YOLO (Ultralytics 实现)核心功能图片/视频/摄像头流的实时目标检测与框选显示硬件门槛较低。支持 CPU 推理速度慢GPU 加速推荐 NVIDIA 显卡显存 2GB 可获得较好体验。环境依赖Python 3.8, PyTorch, OpenCV-Python, Ultralytics 库。启动方式命令行运行 Python 脚本或封装为函数/类供其他程序调用。是否支持 API原生不支持但可轻松封装为 Flask/FastAPI 服务提供 HTTP 接口。是否支持批量任务是。可遍历文件夹处理所有图片/视频结果保存至指定目录。适合场景学术研究原型验证、毕业设计/课程设计、交叉学科应用 demo、个人学习与实验。产出物可运行的检测程序、带标注的结果图像/视频、检测指标数据如 mAP、可用于论文的流程图和结果对比图。从表格可以看出这个方案的优势在于技术栈成熟、社区资源丰富、入门曲线相对平缓。你不需要从零训练模型而是直接利用预训练模型进行推理这大大降低了前期时间成本。2. 适用场景与使用边界2.1 谁适合这个项目高校学生计算机、自动化、电子信息、机械工程、生物医学工程等专业需要完成与 AI 视觉相关的课程设计或毕业设计。科研人员从事交叉学科研究如智慧农业、工业质检、医疗影像分析需要快速验证某个视觉检测想法是否可行。开发者/爱好者希望快速上手计算机视觉构建一个具有实用价值的演示程序。2.2 能解决什么问题目标检测与识别识别图像或视频中的特定物体如人、车、动物、安全帽、缺陷等并用边界框标出。实时视频分析连接摄像头对实时视频流进行持续分析可用于安防监控、行为分析等场景原型。数据标注辅助对大量未标注图片进行预检测生成带有初步标注框的结果可大幅减少人工标注工作量。学术成果孵化基于该流程更换数据集进行微调训练、对比不同版本 YOLO 性能、或与其他传统算法如 Haar 特征对比即可形成一篇技术报告或论文的核心实验部分。2.3 不适合什么场景超高精度要求工业级、医疗诊断级的高精度检测需求需要对模型进行深度定制和大量高质量数据训练。极端实时性要求毫秒级延迟的自动驾驶等场景需要对模型进行剪枝、量化、部署到边缘设备如 Jetson等优化本项目仅为 PC 端原型。无编程基础虽然代码量不大但仍需基本的 Python 读写和命令行操作能力。完全零基础需要先补充 Python 和深度学习基础概念。2.4 合规与伦理边界数据合规使用的图片、视频数据应确保拥有合法使用权避免使用涉及个人隐私、商业秘密或受版权保护的素材进行公开演示或论文发表。模型用途YOLO 预训练模型如yolov8n.pt通常基于 COCO 等公开数据集可用于研究和学习。若用于特定商业场景如特定产品缺陷检测建议使用自有数据训练专属模型。安全提醒基于摄像头的实时检测系统应注意使用场景的合法性不得用于非法监控、侵犯他人隐私等活动。3. 环境准备与前置条件工欲善其事必先利其器。下面列出搭建环境所需的全部前置条件请逐项核对。3.1 硬件与操作系统操作系统Windows 10/11, Ubuntu 18.04/20.04/22.04, 或 macOS。本文以Windows为例Linux/macOS 命令略有不同。CPU现代多核处理器即可。内存建议 8GB 以上。显卡可选但推荐NVIDIA GPUGTX 1060 6G 或更高用于 GPU 加速推理。请确保已安装最新版的显卡驱动。磁盘空间至少预留 5GB 空间用于安装 Python、库和模型文件。3.2 软件与工具Python 3.8从 Python官网 下载并安装。安装时务必勾选 “Add Python to PATH”。代码编辑器VS Code、PyCharm 或任何你熟悉的编辑器。终端/命令行Windows 可使用 PowerShell 或 CMDLinux/macOS 使用系统终端。3.3 核心 Python 库我们将通过pip安装以下库。它们的版本兼容性已经过验证建议按顺序安装。PyTorch深度学习框架YOLO 基于它实现。Ultralytics YOLO一个非常易用的 YOLO 训练和推理库。OpenCV-Python计算机视觉基础库用于图像/视频的读写和显示。其他辅助库如matplotlib用于绘图pandas用于数据处理。4. 安装部署与启动方式环境检查无误后我们开始一步步安装依赖并运行第一个检测程序。4.1 创建并激活虚拟环境强烈推荐使用虚拟环境可以隔离项目依赖避免版本冲突。# 打开终端Windows PowerShell 或 CMD # 1. 创建虚拟环境命名为 cv_yolo_env python -m venv cv_yolo_env # 2. 激活虚拟环境 # Windows (PowerShell) .\cv_yolo_env\Scripts\Activate.ps1 # Windows (CMD) .\cv_yolo_env\Scripts\activate.bat # Linux/macOS source cv_yolo_env/bin/activate # 激活后命令行提示符前应显示 (cv_yolo_env)4.2 安装 PyTorch根据有无 GPU 选择访问 PyTorch 官网 获取最新安装命令。以下为参考有 NVIDIA GPUCUDA 11.8pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118仅 CPUpip install torch torchvision torchaudio安装后可在 Python 中验证import torch print(torch.__version__) # 输出 PyTorch 版本 print(torch.cuda.is_available()) # 输出 True 表示 GPU 可用4.3 安装 OpenCV 和 Ultralytics YOLO# 安装 OpenCV基础版即可 pip install opencv-python # 安装 Ultralytics YOLO 库它包含了 YOLOv5/v8 等模型 pip install ultralytics # 可选安装常用数据科学和可视化库 pip install matplotlib pandas4.4 验证安装与下载模型创建一个简单的 Python 脚本test_install.py来测试环境并自动下载 YOLO 预训练模型。# test_install.py import cv2 import torch from ultralytics import YOLO print(fPyTorch version: {torch.__version__}) print(fCUDA available: {torch.cuda.is_available()}) print(fOpenCV version: {cv2.__version__}) # 尝试加载一个最小的 YOLOv8 模型首次运行会自动下载 try: model YOLO(yolov8n.pt) # 下载 nano 版本模型约 6MB print(YOLO model loaded successfully!) except Exception as e: print(fError loading model: {e})在激活的虚拟环境中运行此脚本python test_install.py如果看到成功信息并且当前目录下生成了一个yolov8n.pt文件说明环境配置成功。5. 功能测试与效果验证环境就绪现在进入核心环节编写并运行目标检测程序。我们从最简单的图片检测开始逐步扩展到视频和摄像头。5.1 基础图片检测创建一个名为detect_image.py的脚本。# detect_image.py import cv2 from ultralytics import YOLO # 1. 加载预训练模型 model YOLO(yolov8n.pt) # 使用 nano 模型速度快 # 2. 读取图片 image_path test_image.jpg # 请替换为你自己的图片路径 image cv2.imread(image_path) if image is None: print(fError: Could not read image from {image_path}) exit() # 3. 执行推理 results model(image) # 返回一个 Results 对象列表 # 4. 可视化结果 annotated_frame results[0].plot() # 绘制检测框和标签 # 5. 显示并保存结果 cv2.imshow(YOLO Detection, annotated_frame) cv2.waitKey(0) # 按任意键关闭窗口 cv2.destroyAllWindows() # 保存结果图片 output_path output_image.jpg cv2.imwrite(output_path, annotated_frame) print(fResult saved to {output_path}) # 6. 打印检测到的物体信息 for result in results: boxes result.boxes # 边界框信息 if boxes is not None: for box in boxes: # 获取坐标、置信度、类别ID x1, y1, x2, y2 box.xyxy[0].tolist() conf box.conf[0].item() cls_id int(box.cls[0].item()) cls_name result.names[cls_id] print(fDetected: {cls_name} ({conf:.2f}) at [{x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f}])运行与验证将一张包含常见物体如人、车、狗的图片命名为test_image.jpg放在与脚本相同的目录。运行脚本python detect_image.py。观察会弹出一个窗口显示带检测框的图片控制台会打印每个检测到的物体类别和位置。成功标准窗口正常显示图片上物体被正确框出例如人、车控制台有对应的打印信息。5.2 实时摄像头检测这是实现“实时目标检测”的关键。创建detect_webcam.py。# detect_webcam.py import cv2 from ultralytics import YOLO # 加载模型 model YOLO(yolov8n.pt) # 打开摄像头0 通常代表默认摄像头 cap cv2.VideoCapture(0) if not cap.isOpened(): print(Error: Could not open webcam.) exit() print(Press q to quit.) while True: # 读取一帧 ret, frame cap.read() if not ret: print(Error: Failed to grab frame.) break # 执行 YOLO 推理 results model(frame, verboseFalse) # verboseFalse 关闭冗余日志 # 在帧上绘制结果 annotated_frame results[0].plot() # 显示结果 cv2.imshow(YOLO Real-Time Detection, annotated_frame) # 按 q 键退出循环 if cv2.waitKey(1) 0xFF ord(q): break # 释放资源 cap.release() cv2.destroyAllWindows()运行与验证确保摄像头可用。运行脚本python detect_webcam.py。观察会打开一个实时视频窗口你出现在画面中应被检测为 “person”其他物体如“cell phone”、“cup”等也会被识别。性能观察注意窗口左上角的 FPSFrames Per Second信息Ultralytics 默认会显示。在 GPU 上YOLOv8n 通常能达到 30 FPS实现流畅实时检测在 CPU 上FPS 可能较低如 2-5 FPS。成功标准视频流流畅取决于硬件检测框能实时跟随物体移动。5.3 视频文件检测与处理处理视频文件与处理摄像头流类似只是输入源不同。创建detect_video.py。# detect_video.py import cv2 from ultralytics import YOLO # 加载模型 model YOLO(yolov8n.pt) # 输入视频路径 input_video_path input_video.mp4 # 输出视频路径 output_video_path output_video.mp4 # 打开视频文件 cap cv2.VideoCapture(input_video_path) if not cap.isOpened(): print(fError: Could not open video {input_video_path}) exit() # 获取视频属性用于创建 VideoWriter frame_width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps int(cap.get(cv2.CAP_PROP_FPS)) # 定义视频编码器并创建 VideoWriter 对象 fourcc cv2.VideoWriter_fourcc(*mp4v) # 或 XVID out cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height)) print(fProcessing video: {input_video_path}) frame_count 0 while True: ret, frame cap.read() if not ret: break # 视频结束 # 推理 results model(frame, verboseFalse) annotated_frame results[0].plot() # 写入输出视频 out.write(annotated_frame) frame_count 1 if frame_count % 30 0: # 每处理30帧打印一次进度 print(fProcessed {frame_count} frames...) # 释放资源 cap.release() out.release() cv2.destroyAllWindows() print(fVideo processing complete. Output saved to {output_video_path})运行与验证准备一个input_video.mp4文件。运行脚本python detect_video.py。观察控制台会打印处理进度处理完成后会在当前目录生成output_video.mp4。成功标准生成的输出视频能正常播放且每一帧都包含了检测框。6. 接口 API 与批量任务将检测功能封装成 API 服务或批量处理脚本能极大提升项目的实用性和工程价值。6.1 封装为简易 Flask API 服务创建一个app.py文件提供图片检测的 HTTP 接口。# app.py from flask import Flask, request, jsonify, send_file import cv2 import numpy as np from ultralytics import YOLO import io from PIL import Image app Flask(__name__) model YOLO(yolov8n.pt) # 全局加载一次模型 app.route(/detect, methods[POST]) def detect(): 接收图片文件返回检测结果的 JSON 和标注后的图片。 if file not in request.files: return jsonify({error: No file part}), 400 file request.files[file] if file.filename : return jsonify({error: No selected file}), 400 # 读取图片 img_bytes file.read() nparr np.frombuffer(img_bytes, np.uint8) img cv2.imdecode(nparr, cv2.IMREAD_COLOR) # 推理 results model(img) annotated_img results[0].plot() # 带标注的图片 # 准备返回的检测信息 detections [] for result in results: boxes result.boxes if boxes is not None: for box in boxes: x1, y1, x2, y2 box.xyxy[0].tolist() conf box.conf[0].item() cls_id int(box.cls[0].item()) cls_name result.names[cls_id] detections.append({ class: cls_name, confidence: conf, bbox: [x1, y1, x2, y2] }) # 将标注后的图片转为字节流供直接返回 _, img_encoded cv2.imencode(.jpg, annotated_img) img_io io.BytesIO(img_encoded.tobytes()) # 可以选择返回 JSON 或图片 # 这里我们返回一个简单的 JSON包含检测列表和图片的 base64可选 # 实际应用中可能需要将图片保存到服务器并返回 URL return jsonify({ detections: detections, message: Detection complete }) if __name__ __main__: # 启动服务默认端口 5000 app.run(host0.0.0.0, port5000, debugTrue)启动与测试安装 Flaskpip install flask。运行服务python app.py。使用curl或 Postman 测试 APIcurl -X POST -F filetest_image.jpg http://127.0.0.1:5000/detect服务将返回一个 JSON包含所有检测到的物体信息。6.2 实现批量图片处理任务对于学术研究经常需要处理整个数据集。创建batch_process.py。# batch_process.py import os import cv2 from ultralytics import YOLO from pathlib import Path def batch_detect_images(input_dir, output_dir, model_pathyolov8n.pt): 批量处理一个文件夹内的所有图片。 # 加载模型 model YOLO(model_path) # 确保输出目录存在 Path(output_dir).mkdir(parentsTrue, exist_okTrue) # 支持的图片格式 supported_ext (.jpg, .jpeg, .png, .bmp, .tiff) # 遍历输入目录 for filename in os.listdir(input_dir): if filename.lower().endswith(supported_ext): input_path os.path.join(input_dir, filename) output_path os.path.join(output_dir, fdetected_{filename}) print(fProcessing: {filename}) # 读取图片 img cv2.imread(input_path) if img is None: print(f Skipped (cannot read): {filename}) continue # 推理 results model(img) annotated_img results[0].plot() # 保存结果 cv2.imwrite(output_path, annotated_img) print(f Saved to: {output_path}) print(Batch processing completed!) if __name__ __main__: # 配置路径 INPUT_DIR ./input_images # 存放待检测图片的文件夹 OUTPUT_DIR ./output_images # 存放结果图片的文件夹 batch_detect_images(INPUT_DIR, OUTPUT_DIR)运行与验证创建input_images文件夹放入多张测试图片。运行脚本python batch_process.py。观察控制台会打印处理进度处理完成后所有带检测框的图片会保存在output_images文件夹中文件名以detected_开头。扩展可以修改脚本将检测结果类别、坐标、置信度同时保存到一个 CSV 或 JSON 文件中便于后续统计分析。7. 资源占用与性能观察了解程序运行时的资源消耗对于优化和选择部署方式至关重要。7.1 如何观察资源占用Windows 任务管理器打开“性能”选项卡查看 GPU 和内存的使用情况。Linuxnvidia-smi在终端运行nvidia-smi -l 1可以每秒刷新一次 GPU 使用情况。Python 代码内监控可以使用torch.cuda相关 API 或psutil库。7.2 典型性能数据参考以下数据基于 YOLOv8n 模型在不同硬件上的近似表现实际结果以你的测试为准硬件配置推理后端输入分辨率近似 FPS显存占用 (GPU)CPU 占用NVIDIA RTX 3060 (6GB)GPU (CUDA)640x64080-100~1.2 GB较低NVIDIA GTX 1060 (6GB)GPU (CUDA)640x64030-40~1.0 GB较低Intel i7-12700HCPU640x6403-5不适用高 (80%)Apple M1CPU (ARM)640x6408-12不适用中等关键观察点GPU 加速效果显著从 CPU 切换到 GPU速度提升可达 10 倍以上。模型大小影响yolov8n.pt(nano) 模型最小最快但精度较低。yolov8s.pt(small)、yolov8m.pt(medium) 等更大模型精度更高但速度更慢显存占用更大。分辨率影响YOLO 默认将输入图像缩放到 640x640。如果使用更高分辨率通过imgsz参数设置会显著增加计算量和显存占用降低 FPS。7.3 性能优化建议选择合适模型在速度和精度间权衡。对于实时演示yolov8n或yolov8s通常是好选择。调整推理参数model.predict(source, imgsz320, conf0.5, ...)中降低imgsz如 320可提速提高conf置信度阈值可减少检测框数量。使用半精度如果 GPU 支持使用 FP16 半精度推理可以提升速度并减少显存占用。Ultralytics 通常会自动启用。批处理对于图片批量处理可以设置batch参数一次性处理多张图效率更高。8. 常见问题与排查方法在部署和运行过程中你可能会遇到以下问题。这里提供排查思路。问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named ultralyticsUltralytics 库未安装或不在当前 Python 环境。在终端输入pip list查看是否有ultralytics。在正确的虚拟环境中运行pip install ultralytics。CUDA out of memory显卡显存不足。运行nvidia-smi查看显存使用。1. 换用更小的模型如yolov8n。2. 降低推理图片分辨率 (imgsz)。3. 关闭其他占用显存的程序。4. 使用 CPU 模式devicecpu。摄像头打不开 (Could not open webcam)摄像头被占用、索引错误或驱动问题。尝试其他软件如系统相机是否能打开摄像头。1. 更改摄像头索引cv2.VideoCapture(1)。2. 重启电脑关闭可能占用摄像头的软件。3. 检查摄像头驱动。检测结果框不准或漏检1. 模型能力有限COCO 预训练模型未包含特定物体。2. 物体太小或遮挡严重。3. 置信度阈值 (conf) 设置过高。1. 查看 COCO 数据集类别列表。2. 可视化原图分析目标特征。1. 使用更大模型 (yolov8m,yolov8l)。2. 针对特定场景收集数据并微调模型。3. 调整conf参数如降至 0.25。运行速度非常慢 (FPS 很低)1. 在使用 CPU 推理。2. 模型太大。3. 输入分辨率太高。1. 确认torch.cuda.is_available()。2. 检查模型文件名。3. 检查代码中imgsz参数。1. 确保 PyTorch 安装了 CUDA 版本。2. 换用yolov8n.pt。3. 将imgsz设为 320 或 480。导入 OpenCV 报错 (ImportError)OpenCV 安装不完整或环境冲突。尝试pip install opencv-python-headless。重新安装pip uninstall opencv-python opencv-python-headless -y然后pip install opencv-python。Flask API 服务无法访问防火墙阻止、端口占用或绑定地址错误。1. 检查服务是否启动成功。2. 用netstat -ano查看端口占用。3. 尝试用curl localhost:5000/detect本地测试。1. 更换端口号如port7860。2. 确保客户端和服务端网络互通。3. 开发时可用debugTrue便于排查。9. 最佳实践与使用建议为了让项目更稳健并顺利过渡到毕设或论文阶段遵循以下实践会事半功倍。环境隔离与依赖管理始终坚持使用虚拟环境如venv或conda。将项目依赖保存到requirements.txtpip freeze requirements.txt。这样在任何新机器上都能一键复现环境pip install -r requirements.txt。代码模块化不要把所有功能写在一个脚本里。将检测逻辑、视频处理、工具函数分别封装成模块.py文件通过import调用。这会让代码更清晰也便于论文中展示代码结构。数据与结果管理建立清晰的目录结构。例如project/ ├── data/ │ ├── raw/ # 原始数据 │ ├── processed/ # 处理后的数据 │ └── annotations/ # 标注文件 ├── models/ # 存放模型文件 ├── src/ # 源代码 ├── outputs/ # 检测结果图片、视频 ├── logs/ # 运行日志 └── docs/ # 项目文档、论文草稿实验记录与可视化对于学术研究记录每次实验的参数模型、分辨率、置信度阈值等和结果mAP、FPS、显存占用。使用matplotlib或seaborn绘制性能对比图如不同模型的精度-速度曲线这些图可以直接用在论文里。从原型到论文问题定义在你的交叉领域目标检测能解决什么具体问题如检测农田害虫、识别工业零件缺陷、统计教室人数。方法描述清晰描述你采用的流程数据准备 - 模型选择/微调 - 推理部署 - 结果分析。实验设计设计对比实验。例如对比 YOLOv5、YOLOv8、Faster R-CNN 在你数据集上的表现对比不同分辨率下的检测速度和精度。结果分析不要只展示图片要提供量化指标Precision, Recall, mAP, FPS并进行分析讨论。结论与展望总结你的工作指出其价值并讨论局限性及未来改进方向如使用更大数据集、尝试最新模型 YOLOv9、部署到嵌入式设备等。合规与版权论文中使用的所有图片、视频数据必须是自己拍摄、公开数据集获取或已获得明确授权。引用使用的开源项目如 Ultralytics YOLO, OpenCV和参考的文献。10. 总结与下一步通过以上步骤你已经完成了一个完整的、可运行的 OpenCV YOLO 实时目标检测系统。从环境搭建、基础功能测试到 API 封装和批量处理这条路径清晰地展示了如何将前沿的 AI 模型快速应用于实际场景。这个项目最值得尝试的点在于其极低的入门门槛和清晰的产出路径。你不需要理解 YOLO 复杂的网络结构也能借助 Ultralytics 这样优秀的库在几小时内让模型跑起来并看到效果。这对于需要快速验证想法、完成项目原型的同学来说效率极高。最先应该验证的功能就是实时摄像头检测。它能给你最直观的反馈让你立刻感受到 AI 视觉的能力和当前硬件的性能边界。如果摄像头检测流畅那么图片和视频处理基本不会有问题。最容易踩的坑集中在环境配置尤其是 PyTorch 的 CUDA 版本与显卡驱动的匹配。严格按照官网指引安装并善用torch.cuda.is_available()验证能避开大部分问题。后续可以继续扩展的方向非常丰富模型微调使用你自己的数据集如特定种类的零件、植物对 YOLO 模型进行微调让它更擅长你的专属任务。多模态融合结合其他传感器数据如将检测结果与深度相机如 Intel RealSense的点云数据结合实现三维定位。部署优化使用 TensorRT、ONNX Runtime 或 OpenVINO 对模型进行加速并尝试部署到边缘设备如 NVIDIA Jetson、树莓派AI加速棒。系统集成将检测模块集成到更大的系统中例如开发一个带有图形界面的桌面应用用 PyQt或一个完整的 Web 应用用 Flask Vue.js。建议将本文的代码和思路作为起点结合你的具体课题进行深化。在实践过程中多查阅 Ultralytics 和 OpenCV 的官方文档它们是最权威的资料。当你跑通整个流程并产出一些自己的实验结果时一篇扎实的毕设或交叉论文的核心部分就已经完成了。
返回列表