FEATURED · 精选文章

YOLOv8+PySide6摔倒检测桌面应用实战:从训练到部署

发布时间 / 2026/9/2 2:05:07
来源 / 创域科博编辑部
栏目 / 资讯中心
YOLOv8+PySide6摔倒检测桌面应用实战:从训练到部署 摔倒检测不是新概念但要把检测模型、桌面界面和批量视频分析串成一套能实际去用的系统工作量全在工程整合上。这次我们聊的是这样一套组合YOLOv8/YOLOv5 负责目标检测PySide6 负责桌面端界面目标场景就是摔倒跌倒识别。你会发现模型本身并不难跑通真正影响落地体验的是显存占用、模型切换、视频来源、批量任务和结果展示这些工程细节。这套系统的核心价值在于你不用在“训练脚本”和“显示界面”之间来回切换。模型训练好后打开 PySide6 桌面端就能加载权重选择本地视频、摄像头或单张图片进行检测检测结果实时显示在界面上还能继续接 API 服务做批量分析。对开发者来说这是一个很典型的“YOLO 检测 桌面 GUI 可扩展服务”的完整形态。这篇文章会带你走一遍完整链路环境准备、模型训练与验证、PySide6 桌面端搭建、推理接口封装、批量视频处理、资源占用观察和常见问题排查。文章基于通用部署实践整理具体版本号和显存占用要以你本机环境为准。如果你正准备用 YOLOv8 或 YOLOv5 做一个摔倒检测桌面应用这篇文章可以直接收藏。1. 核心能力速览能力项说明项目类型目标检测 桌面端可视化应用检测算法YOLOv8 / YOLOv5可切换权重界面框架PySide6基于 Qt6 的 Python 绑定推理后端PyTorch可导出 ONNX / TensorRT核心功能摔倒识别、跌倒检测、视频目标追踪支持输入图片、视频文件、USB 摄像头、RTSP 流推荐硬件CPU 可运行GPU 推理建议 4GB 以上显存训练建议 6GB 以上显存具体以实际模型版本为准支持平台Windows、Linux启动方式命令行启动 Python 脚本启动API 支持可通过 Flask / FastAPI 自行封装推理服务批量任务支持批量图片、批量视频目录处理适合场景居家老人监护、养老机构、医院走廊、工地安全提醒这里要说明一点YOLOv8n 和 YOLOv5s 这类轻量权重在 4GB 显存的显卡上就能跑推理如果只是测试一张图或一段视频6GB 显存的老显卡也能扛住。但如果要训练自己的摔倒数据集显存占用会明显上升建议优先用小模型、低批次和合理分辨率起步。2. 适用场景与使用边界摔倒检测的核心场景非常清晰检测画面中的人是否发生了跌倒姿态变化。和普通的人体检测不同摔倒检测更关注“人的状态变化”而不是单纯的“有没有人”。所以模型训练时除了给出「人」的类别更重要的是给出「摔倒」这个动作类别或者用关键点 姿态变化规则来判断。常见的落地场景包括养老机构、康复病房的走廊和活动室监控独居老人的居家监护工地、仓库等高风险作业区域的跌倒提醒地铁站、商场等公共场所的安全辅助运动康复场景下的姿态异常预警从技术形态看这套系统分两层YOLOv8/YOLOv5 做目标识别PySide6 做结果展示。YOLO 负责把每一帧画面中的「人」和「摔倒的人」框出来PySide6 负责把视频流里的检测结果画到界面上并保留操作入口。使用边界也必须说清楚摔倒检测系统本质上是“辅助判断工具”不是医疗诊断设备。模型输出的是基于视觉特征的概率判断不能替代医护人员和监护人。同时使用摄像头进行人体监测会涉及肖像权和隐私保护落地前需要明确告知、获得授权并在系统中控制数据留存范围。如果你要在医院、养老院等场景部署建议优先用本地推理视频数据不出内网如果做批量历史视频分析也要先确认视频来源是否合法、是否已脱敏。人脸、声音、身体姿态都属于敏感信息这个边界不可越过。3. 环境准备与前置条件先说结论这套系统的环境准备不算复杂但版本匹配问题容易踩坑。核心依赖是 Ultralytics YOLO、PyTorch、PySide6 和 OpenCV。3.1 操作系统与 Python 版本PySide6 和 Ultralytics 都支持 Windows 和 Linux。Windows 10/11 是桌面端最常见的运行环境。Python 建议使用 3.9 到 3.11 之间的版本。新版 PySide6 对 Python 3.12 的兼容性已经改善但如果你的项目需要长时间稳定运行更稳妥的选择是 Python 3.10 或 3.11。3.2 GPU 与 CUDA 环境PyTorch 的 GPU 版依赖 CUDA 和 cuDNN。在开始之前先在命令行确认 NVIDIA 驱动是否正常nvidia-smi如果能看到显卡型号和驱动版本说明驱动没问题。接下来安装 PyTorch 时要根据显卡驱动版本选择匹配的 CUDA 版本。以 CUDA 11.8 为例pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果你的显卡较老或者没有 NVIDIA GPU直接安装 CPU 版 PyTorch 也能跑推理只是速度会明显下降。6GB 显存的 GTX 1660 Ti 这类老显卡跑 YOLOv8 推理是够用的训练时把批次调小即可。50 系显卡需要确认 PyTorch 和 CUDA 版本是否支持以实际官方发布为准。3.3 依赖清单需要安装的核心依赖如下pip install ultralytics pip install pyside6 pip install opencv-python pip install pyyaml pip install requests如果后续要封装 API 服务还需要pip install flask # 或 pip install fastapi uvicornOpenCV 的安装有时候会和 PySide6 出现 Qt 插件路径冲突具体表现为程序报 “could not load platform plugin xcb” 或 “This application failed to start because no Qt platform plugin could be initialized”。这种情况常见于 Linux 环境Windows 上较少见。排查时先确认 PySide6 是否完整安装再检查环境变量是否覆盖了 Qt 插件目录。3.4 磁盘空间与目录规划建议保留至少 10GB 磁盘空间。模型权重文件本身不大但训练过程中的日志、权重输出和视频素材会持续占用空间。目录规划如下fall_detection/ ├── weights/ # 预训练权重和训练好的权重 ├── datasets/ # 摔倒检测数据集 ├── videos/ # 测试视频 ├── outputs/ # 检测结果输出 ├── ui/ # PySide6 界面代码 ├── utils/ # 工具脚本 └── main.py # 桌面端入口4. 安装部署与启动方式4.1 创建虚拟环境建议使用虚拟环境隔离依赖避免和系统 Python 环境冲突。python -m venv venvWindows 激活虚拟环境venv\Scripts\activateLinux/macOS 激活虚拟环境source venv/bin/activate激活后终端提示符前面会出现(venv)说明当前已经在虚拟环境中。4.2 安装依赖pip install --upgrade pip pip install ultralytics pyside6 opencv-python pyyaml requests flask到这里环境就准备完毕了。4.3 启动桌面端项目入口是main.py命令行启动方式python main.py正常启动后会弹出 PySide6 主窗口。窗口中一般包含模型选择下拉框加载 YOLOv8 或 YOLOv5 权重视频文件选择按钮摄像头打开按钮检测结果显示区域置信度阈值滑块开始/停止检测按钮如果启动后界面没有弹出优先检查是否缺少 PySide6 依赖或者 Python 版本不兼容。4.4 命令行快速验证不打开界面直接用命令行验证模型可以正常推理yolo predict modelyolov8n.pt sourcetest.jpg如果能输出检测结果图说明 Ultralytics 环境正常。接下来可以加载自己训练的摔倒检测权重。5. YOLOv8/YOLOv5 模型训练与验证摔倒检测要落地核心步骤是训练一个能识别“摔倒”类别的模型。这里给出一套完整流程你可以直接复制使用。5.1 准备摔倒检测数据集摔倒检测数据集一般包含两个类别person和fall。你要将标注文件整理成 YOLO 格式即每个图片对应一个同名 txt 文件每行格式为class_id x_center y_center width height类别 0 对应person类别 1 对应fall。坐标是归一化后的值取值在 0 到 1 之间。公开的摔倒检测数据集例如 UR Fall Detection、Le2i 等通常提供了摔倒和日常行为两类视频你可以从中抽帧后转换格式。如果自己标注推荐使用 LabelImg 或 LabelStudio。这里提供一份 YOLO 格式数据集的目录结构参考fall_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── fall.yamlfall.yaml内容如下path: ./fall_dataset train: images/train val: images/val names: 0: person 1: fall训练集和验证集的图片不要混用。摔倒类别属于典型的小样本场景负样本正常走路、坐着、蹲下等尽量多收集一些否则模型会把“蹲下”误判为“摔倒”。5.2 训练命令以 YOLOv8 为例训练命令如下yolo detect train datafall.yaml modelyolov8n.pt epochs100 imgsz640 batch8如果你的显存较小把batch降为 4 或 2同时把imgsz改成 480 也能跑。模型文件建议用yolov8n.pt或yolov8s.pt起步训练速度快显存占用低适合验证数据标注是否正确。如果使用 YOLOv5命令类似python train.py --data fall.yaml --weights yolov5s.pt --img 640 --batch 8 --epochs 100YOLOv5 的训练脚本需要从官方仓库下载这里以官方仓库的train.py为准。训练过程中可以打开 TensorBoard 观察损失曲线tensorboard --logdir runs正常情况下训练损失会整体下降验证集的 mAP50 和 mAP50-95 会逐渐上升。如果验证集 loss 一直不降优先检查数据标注是否正确。5.3 模型验证与导出训练完成后会在runs/detect/train/weights/目录下生成best.pt和last.pt。使用best.pt进行验证yolo detect val datafall.yaml modelruns/detect/train/weights/best.pt验证输出中重点看两个指标mAP50当 IoU 阈值为 0.5 时的平均精度摔倒检测场景建议达到 0.8 以上mAP50-95更严格的综合指标越高说明模型定位和分类越稳定导出 ONNX 格式便于后续用其他推理框架加速yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640导出 ONNX 后可以脱离 Ultralytics 环境用 ONNX Runtime 做 CPU 推理部署更轻量。6. PySide6 桌面端功能测试与效果验证模型训练完成后重点就转到桌面端了。PySide6 在这里的作用是把模型能力包装成带界面的工具让非技术人员也能使用。6.1 主窗口结构设计一个最小可用的摔倒检测桌面端包含以下控件QComboBox选择模型权重路径QPushButton选择视频文件QPushButton打开摄像头QLabel或QGraphicsView显示检测画面QSlider调节置信度阈值QTextEdit显示检测日志界面布局可以简单用垂直布局完成不追求美观先把功能跑通。6.2 PySide6 主程序示例下面给出一个最简可运行示例帮助你理解界面和 YOLO 模型如何联动。import sys from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog from PySide6.QtGui import QImage, QPixmap from PySide6.QtCore import Qt, QTimer import cv2 from ultralytics import YOLO class FallDetectionWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(摔倒检测系统) self.setGeometry(100, 100, 960, 640) self.model YOLO(weights/best.pt) # 替换为你的权重路径 self.video_capture None self.timer QTimer() self.timer.timeout.connect(self.update_frame) central_widget QWidget() self.setCentralWidget(central_widget) layout QVBoxLayout(central_widget) self.video_label QLabel(选择视频或打开摄像头) self.video_label.setAlignment(Qt.AlignCenter) self.video_label.setMinimumSize(832, 480) layout.addWidget(self.video_label) self.open_video_btn QPushButton(打开视频文件) self.open_video_btn.clicked.connect(self.open_video) layout.addWidget(self.open_video_btn) self.open_camera_btn QPushButton(打开摄像头) self.open_camera_btn.clicked.connect(self.open_camera) layout.addWidget(self.open_camera_btn) self.stop_btn QPushButton(停止检测) self.stop_btn.clicked.connect(self.stop_detection) layout.addWidget(self.stop_btn) def open_video(self): file_path, _ QFileDialog.getOpenFileName( self, 选择视频, ./videos, Video Files (*.mp4 *.avi *.mov) ) if file_path: self.video_capture cv2.VideoCapture(file_path) self.timer.start(30) # 约 33 帧每秒 def open_camera(self): self.video_capture cv2.VideoCapture(0) self.timer.start(30) def stop_detection(self): self.timer.stop() if self.video_capture: self.video_capture.release() def update_frame(self): if self.video_capture is None: return ret, frame self.video_capture.read() if not ret: self.timer.stop() return results self.model.predict(frame, conf0.5, verboseFalse) for result in results: boxes result.boxes for box in boxes: x1, y1, x2, y2 map(int, box.xyxy[0]) cls_id int(box.cls[0]) conf float(box.conf[0]) label f{result.names[cls_id]} {conf:.2f} color (0, 0, 255) if result.names[cls_id] fall else (0, 255, 0) cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2) cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) rgb_image cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch rgb_image.shape bytes_per_line ch * w qt_image QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888).copy() self.video_label.setPixmap(QPixmap.fromImage(qt_image)) def closeEvent(self, event): self.stop_detection() event.accept() if __name__ __main__: app QApplication(sys.argv) window FallDetectionWindow() window.show() sys.exit(app.exec())这段代码可以直接保存为main.py运行。它做了四件事加载 YOLO 权重、打开视频或摄像头、逐帧检测并画框、在界面实时显示。6.3 测试维度与判断标准桌面端验证时按下面的顺序测试基础加载测试启动程序选择best.pt权重确认界面不报错。图片检测测试输入一张包含摔倒姿态的图片确认输出框类别为fall置信度大于 0.5。视频文件测试输入一段包含摔倒过程的视频观察检测框是否连续、是否闪烁、是否漏检。摄像头测试测试本地 USB 摄像头确认界面能实时显示画面并且延迟可以接受。置信度阈值测试把置信度阈值从 0.8 调到 0.3观察误报数量变化。阈值越低检出越多误报也越多。判断成功的标准摔倒事件在视频中被连续 5 帧以上框出且没有把正常行走、坐下、弯腰误判为摔倒。常见失败原因模型权重路径错误、视频解码失败、摄像头索引不对、OpenCV 和 Qt 的图像格式转换出错。7. 接口 API 与批量任务桌面端能满足实时交互但工程落地还需要考虑两件事怎么给其他系统提供接口怎么批量处理大量历史视频。7.1 用 Flask 封装推理 APIYOLOv8 本身支持直接调用但外部系统不会直接操作 PySide6 界面。更合理的做法是单独封装一个推理服务桌面端和 API 服务共用同一个模型权重。下面是一个基于 Flask 的推理接口示例from flask import Flask, request, jsonify import cv2 import numpy as np from ultralytics import YOLO app Flask(__name__) model YOLO(weights/best.pt) app.route(/detect, methods[POST]) def detect(): file request.files.get(image) if file is None: return jsonify({error: no image uploaded}), 400 image_bytes np.frombuffer(file.read(), np.uint8) image cv2.imdecode(image_bytes, cv2.IMREAD_COLOR) results model.predict(image, conf0.5, verboseFalse) detections [] for result in results: for box in result.boxes: x1, y1, x2, y2 box.xyxy[0].tolist() conf float(box.conf[0]) cls_id int(box.cls[0]) detections.append({ class: result.names[cls_id], confidence: round(conf, 4), bbox: [int(x1), int(y1), int(x2), int(y2)] }) return jsonify({detections: detections}) if __name__ __main__: app.run(host127.0.0.1, port5000)启动服务python server.py用 curl 测试接口Windows 命令行需要调整引号建议用 Python 请求curl -X POST -F imagetest.jpg http://127.0.0.1:5000/detectPython 调用示例import requests import json url http://127.0.0.1:5000/detect files {image: open(test.jpg, rb)} response requests.post(url, filesfiles, timeout30) print(json.dumps(response.json(), indent2, ensure_asciiFalse))预期返回结果{ detections: [ { class: fall, confidence: 0.87, bbox: [120, 200, 320, 480] } ] }7.2 批量视频处理如果要批量分析多个视频不建议在 Flask 进程里同步处理因为视频推理耗时长会阻塞接口。更实用的方式是写一个独立脚本扫描目录下所有视频逐帧检测并输出结果。import cv2 from ultralytics import YOLO from pathlib import Path model YOLO(weights/best.pt) input_dir Path(./videos) output_dir Path(./outputs) output_dir.mkdir(exist_okTrue) video_paths list(input_dir.glob(*.mp4)) video_paths list(input_dir.glob(*.avi)) for video_path in video_paths: cap cv2.VideoCapture(str(video_path)) fps cap.get(cv2.CAP_PROP_FPS) width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) out_path output_dir / f{video_path.stem}_result.mp4 writer cv2.VideoWriter(str(out_path), cv2.VideoWriter_fourcc(*mp4v), fps, (width, height)) frame_count 0 fall_frames 0 while True: ret, frame cap.read() if not ret: break results model.predict(frame, conf0.5, verboseFalse) fall_detected False for result in results: for box in result.boxes: cls_id int(box.cls[0]) if result.names[cls_id] fall: fall_detected True x1, y1, x2, y2 map(int, box.xyxy[0]) label f{result.names[cls_id]} {box.conf[0]:.2f} color (0, 0, 255) if result.names[cls_id] fall else (0, 255, 0) cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2) cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) if fall_detected: fall_frames 1 writer.write(frame) frame_count 1 cap.release() writer.release() print(f{video_path.name}: 总帧数 {frame_count}, 检测到摔倒帧数 {fall_frames})批量处理建议加上日志和失败重试机制。比如在处理每个视频之前先写一条日志video_name started正常结束后写video_name finished如果中间出现异常捕获后写video_name failed然后继续处理下一个视频不要让整个循环中断。批量任务设计上还有一个经验如果视频文件很多建议先用小批量测试 3 个视频确认输出路径和编码格式没问题后再跑全量任务。8. 资源占用与性能观察做本地部署显存和内存占用是绕不开的话题。这里给出一套观察方法具体数字以你的实际运行环境为准。8.1 显存占用怎么看Windows 下可以用任务管理器 - 性能 - GPU 查看显存占用。Linux 下直接用nvidia-smi观察推理一个视频时的显存峰值同时留意 GPU 利用率。如果 GPU 利用率一直处于 20% 以下说明推理瓶颈可能不在 GPU而在视频解码或数据读取环节。8.2 CPU 推理和 GPU 推理的差异CPU 推理不需要 CUDA环境配置简单但速度会慢很多。以 YOLOv8n 为例CPU 处理一帧 640x640 图片可能需要几百毫秒到一秒以上GPU 则通常在几十毫秒以内。实时视频检测建议用 GPU离线批量任务如果对速度不敏感CPU 也能跑。GTX 1660 Ti 这类 6GB 显存显卡跑 YOLOv8 的推理是完全可行的但要控制输入分辨率。把imgsz从 640 降到 480速度会有明显提升精度损失在可接受范围内。8.3 对性能影响最大的三个因素输入分辨率分辨率越高计算量越大。摔倒检测场景建议分辨率在 640 到 1280 之间太高对老显卡不友好。批次大小批量处理时batch越大显存占用越高。推理时逐帧处理更稳定。模型大小YOLOv8n 和 YOLOv8x 的参数量差距很大。先从小模型验证效果不够再加模型规模。8.4 降低显存占用常见手段使用yolov8n.pt或yolov5s.pt轻量权重推理时降低imgsz关闭摄像头预览的高分辨率显示导出为 ONNX 或 TensorRT 后推理减少框架开销批量任务中逐帧写入结果不要把所有检测结果都保存在内存里8.5 端口冲突和进程残留如果使用 Flask API 服务默认端口是 5000。如果端口被占用启动时换一个端口python server.py --port 5001Windows 下如果服务卡死用下面的命令查找端口占用netstat -ano | findstr :5000找到 PID 后结束进程taskkill /PID 12345 /F9. 常见问题与排查方法问题现象可能原因排查方式解决方案pip install 安装失败Python 版本不兼容或网络问题检查 Python 版本尝试换国内镜像源pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple模型加载报错权重文件路径错误或模型文件损坏检查路径是否存在重新下载权重确认使用best.pt而不是last.ptCUDA 不可用PyTorch 装成了 CPU 版python -c import torch; print(torch.cuda.is_available())按 CUDA 版本重新安装 PyTorch显存不足批次过大、分辨率过高查看训练日志中的显存报错调小 batch 和 imgszPySide6 界面启动闪退Qt 插件缺失或依赖冲突终端运行python main.py看报错重新安装 PySide6检查 OpenCV 是否覆盖 Qt 库摄像头打不开摄像头被其他程序占用关闭其他使用摄像头的程序更换摄像头索引例如VideoCapture(1)检测框闪烁单帧预测不稳定观察连续 10 帧结果降低置信度阈值或者增加帧间平滑处理频发误报训练数据中正常行为样本不足统计验证集误报情况增加负样本重新训练模型批量任务中途卡住单个视频解码失败或内存不足看日志中卡住的视频文件加入 try/except单文件失败后跳过接口返回超时视频帧处理耗时太长用单张图片测试接口延迟降低输入分辨率优化推理模型这里有一条通用排查顺序先看命令行报错再检查模型路径接着确认 GPU 环境最后核对输入数据格式。大多数问题都能在这一步定位到。10. 最佳实践与使用建议这套系统从“能跑”到“好用”还有很多工程细节值得打磨。第一次先跑小参数测试。训练时不要一上来就yolov8x batch 16 epochs 300。先用yolov8n batch 4 epochs 10跑通全流程确认数据集格式、训练脚本和权重输出都正常再逐渐增加训练时长和模型规模。保留一套最小可运行配置。把环境依赖写入requirements.txt把命令记录下来。这样换机器时只需要一条命令就能恢复环境。pip install -r requirements.txt模型文件、输入素材、输出结果分目录管理。训练权重放在weights/视频素材放在videos/检测结果放在outputs/。不要让所有文件混在同一个目录里否则批量任务跑完后找结果会很痛苦。批量任务要加日志和失败重试。每个视频处理前打印开始信息处理完成后打印结果异常时捕获并记录。大规模任务建议一次只跑 20 个视频观察没有问题再继续。接口服务要限制访问范围。如果只是本机测试绑定127.0.0.1如果要给局域网提供接口也要确认网络环境可信。不要在公网服务器上直接暴露没有鉴权的推理接口。尊重隐私和版权。使用摄像头做实时检测、用历史视频做批量分析都必须确保获得授权。涉及医院、养老机构、居家环境时建议只保留检测结果元数据不保留原始视频帧。涉及人脸、声音等敏感信息时要做到本地处理、加密存储、及时删除。发布前做效果复核。模型在训练集上的表现不代表实际场景的表现。正式上线前至少用一段真实拍摄的、模型没见过的视频做验证统计误报和漏报情况。11. 总结与下一步这套组合最值得尝试的地方在于YOLOv8/YOLOv5 负责把检测问题解决掉PySide6 负责把结果变成可操作的工具Flask 接口负责把能力开放给其他系统。三个环节各自成熟组合起来就是一套完整可用的摔倒检测方案。如果你准备动手建议按这个顺序来先跑通 YOLOv8 官方预训练模型的推理再用公开摔倒数据集训练自己的best.pt然后接 PySide6 界面最后封装 API 和批量脚本。每一步的验证结果都明确了再往后走。最容易踩的坑有三个数据集标注质量差导致误报率高、PySide6 和 OpenCV 的 Qt 依赖冲突、批量任务没有日志导致卡住后无法定位问题。提前了解这些坑能省下大量调试时间。后续可以扩展的方向很多加入人员追踪和轨迹判断来减少误报导出 ONNX 或 TensorRT 提升推理速度接入告警推送机制把检测结果存入数据库形成统计分析看板。先把这套基础跑通摔倒检测的工程化能力会自然生长出来。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻