FEATURED · 精选文章

YOLOv8姿态估计+状态机:篮球走步与二运AI判罚系统全解析

发布时间 / 2026/8/31 15:33:43
来源 / 创域科博编辑部
栏目 / 资讯中心
YOLOv8姿态估计+状态机:篮球走步与二运AI判罚系统全解析 简介本资源是一套基于YOLOv8实现的篮球运动违例智能判罚系统面向计算机、人工智能、自动化等专业的在校学生、教师及初级开发者解决篮球比赛中走步traveling与二次运球double dribble实时识别与判罚的技术落地问题适用于课程设计、毕业设计、AI体育项目原型开发及算法学习进阶。压缩包共166个文件含62个Python源码涵盖数据预处理、模型训练、视频推理与违例逻辑判定、50个YAML/YML配置文件定义模型结构、数据路径与超参、9个Shell脚本支持一键训练/推理/环境部署、7个Markdown文档含详细部署指南、算法原理说明与测试报告整体大小为21.74MB。已有134人下载学习代码经完整测试并成功通过毕业答辩评审平均分96分配套提供可运行的Dockerfile含CPU/ARM64多平台支持、模型权重.pt、示例图像与Jupyter Notebook交互式演示结构清晰、注释完备便于理解判罚逻辑、复现实验结果或二次开发扩展至其他球类规则识别。 做这个项目的起因挺简单我们球馆搞训练营教练每天要反复回看比赛录像给学员讲走步、二运的问题一帧一帧翻视频效率太低有时候一个违例要来回拖拽十几遍。后来我们商量了一下干脆用视觉模型把这套判罚逻辑给自动化了——这就是现在这套基于YOLOv8的AI篮球走步、二运违例判罚系统的由来。项目最终交付了完整的Python源码和文档说明整个框架可以抽象成“姿态感知 目标检测 规则状态机”三层结构先用YOLOv8-pose提取运动员的关键点和关节角度再用一个轻量检测模型单独锁定篮球位置最后把两路结果送进规则引擎按篮球规则做走步、二运判定。这篇文章会把整个项目的设计思路、数据标注、判定逻辑、训练部署和踩坑记录完整拆开讲一遍正在做体育AI、姿态估计落地或者准备往运动分析方向走的朋友可以直接参考。1. 从裁判视角到算法视角这个项目到底在解决什么问题1.1 为什么不能用纯分类模型直接“一键判罚”很多人第一次听到“AI判罚篮球违例”第一反应都是那我直接拿视频训一个分类模型输入一段动作输出“走步”或者“没走步”不就行了我的答案是不行至少在现有条件下非常不靠谱。原因有三个。第一违规动作是长尾事件。在整场比赛中“走步”和“二运”出现的次数极少正常动作占绝大多数这种极度不平衡的数据分布会让分类模型几乎学不到真正的违例特征。第二违例判罚依赖严格的时序关系。走步不是某一帧的静态姿态而是“持球瞬间中枢脚位置、随后脚步移动、球是否离手”这一连串事件的因果链条普通分类网络很难显式表达这种逻辑。第三也是落地层面最致命的——纯分类模型是黑盒它只告诉你“走步了”但不告诉你“为什么走步”。裁判和教练要看的是依据比如中枢脚是哪只脚、哪一帧开始移动的、球当时离没离手。没有这些可解释信息系统根本没法在真实场景里被信任。所以这个项目从一开始就定了基调**模型不负责“判罚”模型只负责“感知”真正判罚交给规则状态机去完成。**这样既保证了判罚过程可控可解释又让模型训练变得简单——只需要做姿态估计和篮球检测不需要专门去买违例样本。1.2 系统整体设计四层架构整个系统在工程上拆成了四层每一层职责单一方便单独调试和替换。感知层用YOLOv8-pose模型对视频帧中的运动员做人体关键点检测输出17个COCO骨架点同时用单独的YOLOv8检测模型识别篮球输出球框中心坐标。这一层不关心规则只负责把画面里的物理信息抽出来。特征层把原始关键点坐标和球坐标做归一化、去抖动、时序平滑计算辅助特征比如脚踝到髋部的相对距离、手到球心的距离、球的垂直速度、球是否被手掌包住等。规则层核心部分是两套状态机——走步判定状态机和二运判定状态机。状态机根据特征层的时序输入做状态迁移一旦满足违例触发条件就记录违规类型、违规发生时刻、当前帧号和证据帧。输出层把判定结果同步给业务端比如发出响哨信号、保存证据片段、在画面上标注违规位置和中枢脚信息方便裁判复核。这套分层设计最大的好处是模型换掉不影响规则层规则改参数不需要重新训练模型。项目后期我们把YOLOv8从n版本换到s版本规则层一行代码没动这就是分层带来的收益。2. 技术选型为什么是YOLOv8-pose而不是OpenPose或MediaPipe2.1 姿态估计方案横向对比做人体姿态估计市面上常见的方案有MediaPipe、OpenPose、MMPose系列以及YOLOv8-pose。我为什么最终选了YOLOv8-pose可以看下面这组实测对比。方案速度单帧1080PGTX 1660Ti关键点稳定性部署难度训练成本MediaPipe Pose约15ms较弱遮挡时抖动明显极低不可自定义训练OpenPose约200ms以上较强高依赖Caffe/CMU高训练流程繁琐YOLOv8-pose约12msn模型/ 约25mss模型较强Ultralytics持续迭代低pip即可安装中支持自定义数据集微调MediaPipe虽然速度快但它的模型结构是固定的不能针对篮球场景做微调而且实际测试在快速交叉步、转身等动作下脚踝关键点抖动很厉害这对走步判罚是致命的。OpenPose精度确实不错但部署实在太痛苦Python环境、模型文件、依赖库都要手工适配做研究可以做工程效率太低。YOLOv8-pose正好卡在中间——单帧速度管够、精度够用、还能用Ultralytics的统一API做自定义训练和导出。我用GTX 1660Ti跑了两个星期YOLOv8n-pose速度能稳定在60fps以上YOLOv8s-pose在30fps左右完全能满足实时判罚的要求。2.2 为什么还需要单独训练一个篮球检测器这里必须纠正一个容易踩的坑YOLOv8-pose模型本身不会检测篮球。它的输出是人体边界框和关键点不带任何物体类别。篮球在画面里是一个独立的小目标需要单独的目标检测模型来处理。我在项目里额外训练了一个YOLOv8n检测模型只分两个类别basketball和rim篮筐类别别贪多多一个类别就多一份标注成本和误检风险。球和篮筐的检测结果会和姿态关键点做关联——判断是不是某个运动员控制着球依据就是手部关键点和球中心点的距离是否低于阈值。这里顺带说一个替代方案如果场景是固定的机位也可以用传统视觉方法比如背景差分、颜色阈值分割来找篮球效果在固定室内灯光下其实不错。但一遇到镜头切换、光线变化或者观众席背景杂乱传统方法就崩了。用深度学习检测模型的好处是鲁棒性高坏处是需要提前准备一批带球标注的数据。考虑到这项目最终要部署到不同球馆我选择了YOLOv8n检测器。对比下来球检测模型训练成本不高标个几千张图就能达到实用效果。3. 数据准备与标注决定判罚准确率的天花板3.1 数据来源和预处理整个项目里数据准备是最耗时的环节但也是决定判罚准确率上限的关键。模型结构、参数再怎么调数据不对都是白搭。我的数据来源主要有三个公开篮球比赛视频片段、自己用手机在球馆拍的训练视频、以及少量从网络收集的篮球教学视频。三种来源各有用途——比赛视频提供高对抗场景自拍视频提供固定视角下的连续动作教学视频提供标准动作样本。拿到原始视频后第一步是抽帧。我按10fps的间隔抽帧一段10分钟的视频大概得到6000张图再剔除掉模糊帧、重复帧和没有运动员的纯空场帧实际有效帧大约4000张。这个抽帧密度是有讲究的太密了相邻帧重复度高标注浪费太疏了又覆盖不到快速动作的中间态。10fps是我反复试验后性价比最高的选择。抽完帧还要做一次分辨率和色调统一我的做法是统一缩放到1280x720并做轻度色彩校正这样模型训练时输入分布更稳定。3.2 标注工具与规范标注工具我用了两套人体关键点用X-AnyLabeling篮球和篮筐用CVAT。为什么分开用因为X-AnyLabeling对人体的骨骼点标注更顺手自带COCO骨架模板直接点关节位置就能生成17个点的JSON格式而CVAT在视频序列标注上有优势可以在前后帧之间做插值标篮球这种高速运动的小目标能省很多时间。关键点标注的COCO 17点骨架里我重点关注的是左右脚踝第15、16点、左右膝盖第13、14点和左右髋部第11、12点。脚踝点是走步判定的核心依据膝盖点帮助判断腿的弯曲状态髋部点用来估算人体重心位置。标注的时候有几个容易忽略的细节遮挡时不要瞎猜关节位置宁可标低置信度也不要给出错误坐标。Ultralytics训练时关键点坐标自带置信度字段标不清的点把置信度拉到0附近模型会自动降低对它的学习权重。这个细节我是在反复训练后踩坑才明白的一开始为了追求标注完整度遮挡帧也硬标结果模型学到了大量错误位置推理时反而在遮挡场景飘得很厉害。篮球的标注规范就比较简单紧密外接矩形框住整个球体框边界尽量贴合球边缘不要留太多空白。这里有个经验值——篮球直径在1080P画面里通常只有20到40个像素属于典型的小目标检测器对这种目标不太敏感。我的解决办法是在标注时专门把球放大两倍再做一次增强训练让模型见过更多“大球”样本推理时对小球的响应会更稳定。3.3 数据增强不是越多越好YOLOv8内置了Mosaic、MixUp、随机仿射变换等数据增强策略但用在姿态估计上要克制。我踩过一个坑把Mosaic增强开到默认值1.0训练出的模型在正常单人画面上精度不错一到多人交错场景就开始把关键点张冠李戴。原因是Mosaic把四张图拼接后人体经常被裁切成半截模型学会了“半截人体”的特征推理时遇到遮挡也会倾向于输出半截骨架。最终我调整成Mosaic设为0.5关闭MixUp开启轻度随机亮度和对比度增强随机旋转角度限制在±10度以内。旋转超过10度会破坏人体骨架的物理结构让模型误以为人可以歪着站这对脚部位置判断非常不利。亮度增强和对比度增强对篮球场景很有用因为球馆灯光经常不均匀不同区域明暗差距大模型需要适应这种光照变化。4. 走步违例判罚核心就是“中枢脚”状态机4.1 从篮球规则到判定条件走步违例是篮球规则里最复杂、最难量化的判罚之一。要写成代码首先得把规则拆成计算机能理解的离散条件。简单归纳判罚走步的关键事件链是这样的运动员结束运球双手持球或单手完全控制球此时裁判会观察哪只脚是中枢脚。中枢脚的定义如果双脚同时着地先抬起的脚是中枢脚如果移动中接球先着地的脚是中枢脚。持球后中枢脚不能先于球离地。也就是说启动运球时必须是球先离手中枢脚才能抬起如果中枢脚先离地了就是走步。三步上篮是合法例外持球后可以先走两步再出手但中枢脚抬起后另一只脚在落地前必须把球投出去。翻译成算法语言系统需要持续跟踪以下三个核心特征持球时刻检测到手部关键点与篮球中心距离持续低于阈值且球的速度发生了突变比如从快变慢认为运动员控制住了球。中枢脚判定在持球时刻的连续帧里分别计算左右脚踝的位移量先发生明显位移的那只脚就是中枢脚如果双脚都静止则先离开地面的是中枢脚。违例触发在确认中枢脚离地之后检查球是否已经离手。如果球还处于被控制状态就触发走步违例。这套逻辑看起来清晰但落地时有一个非常棘手的问题——怎么确定“脚离地”。单目摄像头没有深度信息不能直接判断脚是否腾空。我的做法是引入一个近似把人体髋部关键点作为参考平面计算脚踝点和髋部的相对高度差。当某一侧脚踝相对髋部明显上抬且该脚的垂直速度超过阈值时认为该脚处于离地状态。这个近似在大多数直拍视角下是可靠的但从正侧面低角度拍摄时误差会明显增大属于方案本身的局限需要在部署时对机位做约束。4.2 状态机实现走步判定用经典的四状态迁移来实现比连续打分更可控。状态A无球/运球中。此时不检测持球只更新篮球轨迹。状态B刚持球。检测到持球事件后进入记录此刻双脚位置和球位置。用之后3帧的脚部位移判断中枢脚。状态C中枢脚确立。明确中枢脚后持续监测该脚状态和球的离手状态。状态D疑似走步。当中枢脚离地且球未离手触发走步信号锁定证据帧。每个状态迁移都要求特征持续满足一定帧数才生效比如持球判定不是单帧手离球5像素就算而是连续3帧以上距离都小于阈值才算。这个“连续帧确认”机制极大减少了误判因为单帧的关键点抖动实在太常见了。下面是核心代码片段我做了删减保留主干逻辑class TravelingDetector: def __init__(self, dist_thresh30, min_frames3): self.dist_thresh dist_thresh # 手与球的距离阈值像素 self.min_frames min_frames # 状态确认所需最少帧数 self.state dribbling self.hold_frames 0 self.pivot_foot None self.pivot_lift_frames 0 self.ball_in_hand False def update(self, keypoints, ball_center): hand_left keypoints[9] # 左手腕 hand_right keypoints[10] # 右手腕 ankle_left keypoints[15] ankle_right keypoints[16] hip_center (keypoints[11] keypoints[12]) / 2 # 1. 判断球是否在手中左右手到球心的最小距离 d_left distance(hand_left, ball_center) d_right distance(hand_right, ball_center) d_min min(d_left, d_right) if d_min self.dist_thresh: self.hold_frames 1 else: self.hold_frames 0 # 2. 状态迁移 if self.state dribbling: if self.hold_frames self.min_frames: self.state holding self.pivot_foot None self.pivot_lift_frames 0 elif self.state holding: if self.pivot_foot is None: # 用脚踝相对髋部的垂直位置变化来判定哪只脚先移动 left_lift hip_center[1] - ankle_left[1] right_lift hip_center[1] - ankle_right[1] if abs(left_lift - right_lift) 5: self.pivot_foot left if left_lift right_lift else right else: # 3. 判断中枢脚是否离地且球未离手 if self.pivot_foot left: foot_lifted (hip_center[1] - ankle_left[1]) 12 else: foot_lifted (hip_center[1] - ankle_right[1]) 12 if foot_lifted: self.pivot_lift_frames 1 else: self.pivot_lift_frames 0 # 球是否离手手到球距离大于阈值 ball_released d_min self.dist_thresh * 1.5 if self.pivot_lift_frames self.min_frames and not ball_released: return True # 触发走步 return False这段代码只展示了单人的核心逻辑。实际项目里还要加多目标跟踪和ID关联不然画面上有多个队员时状态机会串。我用的方案是ByteTrack做目标追踪按照检测框的IOU和关键点相似度把同一运动员的检测帧关联起来保证状态机只针对同一个人。4.3 阈值调参经验这个项目里最烦人的就是阈值调参。手到球的距离阈值dist_thresh在1080P画面下我最终定的是30像素。这个值不能盲目照搬和机位距离、画面分辨率都有关。我的调试方法是录制10段包含不同运球节奏的测试视频用可视化脚本把每一帧的手球距离打印出来画成曲线观察持球瞬间距离的典型分布区间再取一个能覆盖大部分持球帧的值。脚踝离地判断阈值12像素也是一样的思路。先统计正常站立、走动、上篮三种姿态下脚踝相对髋部高度差的分布取能区分“平稳站立”和“抬脚动作”的分界值。这里有个小技巧可以把阈值暴露在配置文件里不做硬编码这样到不同球场部署时直接改配置文件就能适配机位高度和角度不用改代码重新打包。5. 二运违例判罚用“球权状态机”跟踪运球周期5.1 判定逻辑二运违例的规则比走步相对简单但涉及对“运球动作周期”的刻画同样是一个状态机问题。二运的定义是运球结束后双手持球或单手托住球再次运球。也就是说运动员必须先有一次合法的运球然后结束运球把球控制住再开始第二次运球——这个“二次开始”才是违例。如果运球过程中球中途弹起再接着拍比如背后运球、胯下运球这些都不算二运因为球没有被“控制住”。算法上的核心挑战在于区分“球弹起后再次接触手”和“球被控制住”。我用的特征是手到球心的距离 球的垂直速度方向 球与手的接触时长。如果球从地板弹起后向上运动手部接近球又迅速分开这是正常运球。如果球弹起后向上运动手部接近球并且球在手中停留超过一定帧数比如5帧说明运动员把球拿住了运球结束。如果在拿住球之后球又开始做“向下-向上”的弹跳运动说明运动员进行了第二次运球。5.2 球权状态机实现二运状态机相比走步要更关注时间窗口我用了一个滑动窗口数组来保存最近30帧的球垂直速度和手球距离这样判断“接触时长”时不需要维护复杂的帧计数直接看窗口里的数据模式即可。class DoubleDribbleDetector: def __init__(self, window_size30, hold_frames5): self.window deque(maxlenwindow_size) self.hold_start None self.dribble_count 0 self.state dribbling def update(self, hand_pos, ball_pos, ball_vel_y): dist distance(hand_pos, ball_pos) timestamp len(self.window) # 判断手与球接触距离近 球垂直速度绝对值低球在手中停留 touching dist 25 and abs(ball_vel_y) 0.3 self.window.append({ dist: dist, vel_y: ball_vel_y, touching: touching }) # 统计最近连续接触帧数 contact_count 0 for item in reversed(self.window): if item[touching]: contact_count 1 else: break # 状态迁移 if self.state dribbling: if contact_count self.hold_frames: self.state holding self.dribble_count 1 elif self.state holding: # 持球后再次出现连续拍球动作球先远离再靠近 if contact_count 0 and self._detect_new_dribble(): self.dribble_count 1 if self.dribble_count 2: return True # 触发二运 self.state dribbling return False def _detect_new_dribble(self): # 检查最近窗口中是否有“球向下-向上”的速度模式 recent list(self.window)[-10:] if len(recent) 5: return False min_vel min(item[vel_y] for item in recent) max_vel max(item[vel_y] for item in recent) return min_vel -0.5 and max_vel 0.5这个判定逻辑里最容易被忽略的是篮球检测的稳定性。篮球在快速运动时经常出现漏检一两帧的情况如果漏检正好发生在持球瞬间会让接触帧数统计断掉导致本该判二运的漏掉。我的补救策略是检测到球漏帧时用上一帧球的位置和速度外推当前帧位置把外推结果补进窗口。这个“插值补帧”机制实测能挽回大约30%的漏判效果显著。5.3 二运误判的典型场景二运状态机最大的误判来源是“球砸脚弹回”。运动员运球时球碰到脚面弹起来后又被手接住这个过程球的轨迹会出现“非手部触球”的中断。如果球碰脚后弹起速度快状态机会误判为“二次运球开始”。解决方法是引入球的轨迹连续性判断如果球在两次手部接触之间发生了意外的水平速度突变疑似碰到了脚或其他障碍物就不触发二运而是先进入“球权待定”状态等下一帧再确认。这个机制虽然会稍微增加判罚延迟但能大幅降低误罚率值得权衡。6. 实战训练与部署GTX 1660Ti也能跑但需要点点优化6.1 训练参数与预训练权重模型训练部分用的是Ultralytics官方框架没做太多魔改。YOLOv8-pose和YOLOv8检测模型都从COCO预训练权重开始微调。关键参数如下参数数值说明输入尺寸 imgsz640速度与精度的平衡点不要轻易上1280批量大小 batch161660Ti 6GB显存的上限附近训练轮数 epochs100再多就过拟合了实测80轮后val loss已收敛优化器AdamW比SGD收敛快适合小数据集微调学习率 lr00.001微调场景下别用默认0.01会破坏预训练权重数据增强 mosaic0.5前面讲过姿态估计要克制增强训练数据量我最终标注了大约5000帧关键点数据、8000个篮球标注框。这个量级不算大但因为都是篮球单场景模型收敛后效果足够用。如果数据量充足也可以尝试YOLOv8m-pose精度会再上来一截但1660Ti跑实时推理就吃力了我最终还是回到s版本。6.2 推理部署从PyTorch到TensorRTPyTorch模型直接推理在1660Ti上跑YOLOv8s-pose大约25ms一帧加上球检测和状态机逻辑整体Pipeline在30fps左右勉强跑满CPU占用也高。如果只做离线录像分析这个速度没问题但想做实时裁判辅助我建议做一次TensorRT加速。Ultralytics导出TensorRT很简单yolo export modelyolov8s-pose.pt formatengine device0 halfTrue yolo export modelball_detector.pt formatengine device0 halfTrue导出成FP16的engine文件后推理速度能提升一倍左右1660Ti上s模型可以缩到12ms以内。如果还想更快可以把检测输入尺寸从640降到480精度损失不大但速度又能提升30%。这里注意降分辨率后手球距离阈值、脚踝离地阈值都要相应等比缩小否则状态机判定会失真这是我被坑过一次的细节。6.3 实测效果与性能统计我在两段测试视频上做了离线评测一段是训练营拍的5v5对抗一段是教学视频里的单人动作演示。结果如下走步判罚召回率约78%精确率约82%。误判主要集中在转身动作转身时中枢脚判定容易因为脚踝遮挡而错乱。二运判罚召回率约71%精确率约85%。漏判集中在快速连续运球中球在手中极短停留的情况状态机的帧率上限限制了它。单帧整体延迟约35ms含球检测、姿态估计、状态机满足实时性要求。说实话这个指标还达不到商用裁判系统的要求但作为训练辅助工具是完全够用的。教练回放时能看到违例标记和证据帧省掉了大量手动翻视频的时间。7. 常见问题与排查这些坑我踩过7.1 关键点抖动导致误判这是占比最高的误判来源。脚踝关键点在快速运动时经常出现2到5像素的随机抖动这种抖动在状态机里可能被放大成“脚离地”信号。我的解决方案有两条对输入状态机的关键点做指数移动平均平滑alpha取0.3既保留动作趋势又滤掉高频噪声。状态机的“连续帧确认”机制里把帧数从3提高到5代价是判罚延迟增加约100ms但误判减少非常明显。7.2 篮球检测丢失或错检球速快时检测框经常飞掉这时要优先保证“球轨迹连续”。我的做法是在球检测模块外面套一层卡尔曼滤波器预测下一帧球的位置和检测结果做融合。实测卡尔曼滤波预测能覆盖最多5帧的检测丢失窗口。另外球在运动员手中被遮挡时检测器会把球框打成运动员身体的一部分这个要去除——规则是如果球框和人体框的IOU超过0.8就认为球被遮挡暂时不更新球轨迹。7.3 多目标串状态画面上同时有多名运动员时状态机一定要绑定到具体的人不能全局共用一套。我的做法是ByteTrack跟踪每个人体框给每个运动员分配独立的TravelingDetector和DoubleDribbleDetector实例。篮球归属判断也很关键球离哪个运动员的手最近就归谁所有这个归属每帧更新但要加一个“归属切换滞回”机制避免球在两个队员之间来回传递时状态频繁跳动。7.4 机位角度影响明显这套系统对机位有硬性要求最好架在球场中线附近高度3到5米视角尽量平行于地面。如果机位过低脚踝遮挡严重如果机位过高脚离地判断的“相对高度差”特征基本失效。如果要部署到多个球馆建议先录一段10分钟的标定视频看关键点检测的稳定性再决定是否调整阈值。7.5 训练数据过拟合数据量只有几千张时模型容易对特定场地、特定球衣颜色过拟合。换到新球馆测试精度可能直接掉10个百分点。缓解办法是数据层面增加场地多样性每个训练批次都混入不同场馆、不同光照的样本。我自己实测数据里包含5个以上不同场地后泛化能力明显提升。8. 扩展思路这套框架还能怎么用最后再分享一点我在项目收尾时的体会篮球走步、二运判罚只是“姿态估计 目标检测 规则状态机”这套框架的一个应用样例换一套规则文件它能适配很多类似的运动分析场景。比如足球手球判定把“球与手部距离”和“手臂是否张开”组合起来做状态判断。网球发球踩线用关键点的脚部坐标和球场线检测结果做位置关系判断。羽毛球击球动作分析检测球拍位置和人手关键点判断击球点是否过腰。这些场景的共同点是动作是否违规往往取决于几个可量化的几何关系和时序事件而不是整个动作的长程语义。模型负责感知规则负责裁决这个思路在体育AI落地时能省掉大量不必要的数据标注成本。回到这个项目本身我建议动手复现的朋友先从单人运球视频入手把状态机逻辑调到够稳再考虑多人场景。一上来就挑战5v5全场比赛大概率会被关键点遮挡、目标跟踪、球归属这些并发问题搞得焦头烂额。小步快跑先把核心判定链跑通再逐步增加对抗性场景才是这类体育AI项目最务实的路径。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻