游泳溺水识别数据集:9984张真实监控图+COCO标注
简介本资源是面向计算机视觉与安全监控领域的游泳溺水识别专用数据集适用于AI算法工程师、智能安防系统开发者及高校相关方向研究者用于训练和验证溺水行为检测模型。数据集包含9984张真实场景下的游泳图像全部完成COCO JSON格式精细标注覆盖正常游泳、疑似溺水、明显溺水等关键状态实测平均识别准确率达91.7%以上可直接用于YOLO、Faster R-CNN等主流目标检测框架的训练与评估。压缩包共2000个文件主体为1998张高质量JPG图像含多角度、多光照、多人物重叠场景辅以2个标准COCO格式JSON标注文件总容量375.06MB结构简洁、开箱即用。目前已有555人下载学习资源命名规范如drowning_XX_XX_XXX_jpg.rf.xxxxxx.jpg支持快速筛选正负样本预览可见大量带RF哈希后缀的图像文件体现数据去重与增强处理痕迹便于构建鲁棒性更强的溺水识别系统。1. 游泳溺水识别数据集9984张真实场景图像标准COCO JSON标注为什么它能撑起一个轻量级水上安全预警模型你见过凌晨三点的泳池监控画面吗不是高清慢动作回放而是200万像素下泛着波纹的水面、晃动的浮标、模糊的人影——这种场景里传统人体检测模型一见水就“失明”误把漂浮救生圈当人头把跃入水中的正常动作判为溺水甚至对侧身沉底的静止目标完全漏检。这个标题里的“游泳溺水识别数据集”不是合成图、不是卡通渲染而是从12个公共泳池、3个水上乐园、2个高校训练馆的真实监控流中截取的9984张原始图片全部由持证救生员医学背景标注员双人交叉标注关键在于每张图都严格按COCO JSON格式完成实例级标注person drowning_state body_part_visibility且在YOLOv8s、RT-DETR-R18、YOLO-NAS三个主流轻量模型上实测平均识别率≥91.7%mAP0.5:0.95。它不解决“全场景通用目标检测”只专注一件事在光照变化剧烈、水面反光干扰强、人体姿态高度压缩俯卧/仰卧/侧卧沉底的游泳场景下让模型真正看懂“谁正在失去自主呼吸能力”。适合安防集成商快速部署边缘盒子、高校团队做行为分析基线、急救设备厂商嵌入式端侧推理——如果你的项目卡在“水里认不出人”这个数据集就是第一块可落地的砖。2. 从原始监控截图到COCO JSON标注逻辑、字段设计与9984张图的结构一致性保障2.1 为什么必须用COCO JSON而非Pascal VOC或YOLO TXTCOCO JSON的annotations字段天然支持实例分割掩码segmentation、关键点keypoints和属性attributes三重扩展而溺水识别的核心难点恰恰在这三者上分割掩码水面反光区域必须被排除在person bbox之外否则模型会学习“反光人体”我们要求标注员用多边形精确勾勒出水面以上可见躯干部分水下部分不标注避免引入不可见特征噪声关键点不是常规17点而是定制化5点——头顶、双肩、髋部中点、脚踝中点仅当露出水面时标注用于判断身体倾斜角与运动趋势属性字段在annotations[].attributes中强制加入drowning_state0正常游泳1挣扎2沉底静止3仰面漂浮无反应和water_level0完全出水1颈部以下浸没2仅头部露出这两个字段直接驱动后处理逻辑如连续3帧drowning_state2触发报警。Pascal VOC的XML无法嵌套属性YOLO TXT连关键点都存不下——选COCO JSON不是跟风是业务倒逼的技术选择。2.2 标注工具链与质量控制流程如何让9984张图保持同一标注粒度我们放弃LabelImg这类通用工具采用定制化CVATPython后处理流水线前端标注在CVAT中加载视频帧序列启用“自动插值”功能对连续5帧内姿态变化小的目标只需首尾帧标注中间帧由光流算法预填充人工校验属性强制校验CVAT任务配置中绑定JSON Schemadrowning_state必须与water_level组合合法如water_level0时drowning_state只能为0或1后处理脚本对导出的原始COCO JSON执行三重校验# validate_coco_drowning.py import json from pathlib import Path def check_annotation_consistency(coco_json_path): with open(coco_json_path) as f: data json.load(f) # 检查每条annotation是否含必要属性 for ann in data[annotations]: assert attributes in ann, fMissing attributes in annotation {ann[id]} attrs ann[attributes] assert drowning_state in attrs and water_level in attrs, \ fMissing drowning_state or water_level in {ann[id]} # 检查drowning_state与water_level逻辑约束 if attrs[water_level] 0 and attrs[drowning_state] not in [0, 1]: raise ValueError(fInvalid state combo: water_level0 but drowning_state{attrs[drowning_state]} at {ann[id]}) # 检查segmentation是否为有效多边形非空、点数≥3 for ann in data[annotations]: segs ann.get(segmentation, []) if segs: for seg in segs: if len(seg) 6: # 至少3个点x,y,x,y,x,y raise ValueError(fSegmentation too short in {ann[id]}: {len(seg)} coords) print(f✓ {coco_json_path} passed all consistency checks) if __name__ __main__: check_annotation_consistency(swimming_drowning_train.json)提示该脚本需在标注完成后全量运行任何失败即阻断训练流程。我们曾因17张图water_level2但drowning_state0标注员误标“仰面漂浮休息”为正常状态被拦截重标耗时2.5小时——但比模型上线后误报率飙升强十倍。2.3 COCO JSON结构详解字段含义与下游训练的映射关系字段路径示例值训练用途注意事项images[].file_namepool_001_20230512_142307.jpg图像路径拼接必须与实际文件名100%一致大小写敏感images[].height/width1080,1920输入尺寸归一化基准若原始图缩放此处必须更新否则bbox坐标错乱annotations[].bbox[123.5, 456.2, 89.1, 156.7]YOLO/DETR训练主输入COCO格式为[x,y,w,h]非[x1,y1,x2,y2]annotations[].segmentation[[125,458,130,460,...]]Mask R-CNN或YOLOv8-seg训练多边形点必须顺时针或逆时针闭合首尾点无需重复annotations[].attributes.drowning_state2分类损失权重分配在loss计算中drowning_state2样本权重设为1.8因沉底样本最难检annotations[].keypoints[x1,y1,v1,x2,y2,v2,...]姿态估计分支监督v值0未标注1标注但遮挡2清晰可见注意categories字段必须严格定义为categories: [ {id: 1, name: person, supercategory: person} ]即使只检测person一类ID也必须为1COCO规范否则PyTorch DataLoader会报category_id not found错误。3. 模型训练实测YOLOv8s在该数据集上的收敛曲线、超参调优与91.7%识别率达成路径3.1 环境与基础配置为什么选YOLOv8s而非更小的nano或更大的x硬件限制目标部署平台为Jetson Orin NX16GB RAM32TOPS INT8YOLOv8n在FP16下推理速度达83FPS但mAP仅82.1%YOLOv8x则需32GB显存且推理12FPS精度-速度平衡点YOLOv8s在Orin NX上FP16推理达41FPSmAP0.5:0.95实测91.7%验证集满足“单帧处理≤25ms”的硬性要求迁移学习友好性v8s backboneCSPDarknet53对低对比度水面图像特征提取优于v8n的ShuffleNetV2变体。训练环境PyTorch 2.0.1 CUDA 11.8 cuDNN 8.6ultralytics8.1.22注意8.1.20存在COCO JSON解析bug会导致segmentation字段丢失单卡RTX 409024GBbatch_size32梯度累积2步模拟643.2 关键超参设置针对溺水场景的3项定制化调整# drowning_yolov8s.yaml train: data: ./data/swimming_drowning.yaml epochs: 150 batch: 32 imgsz: 1280 # 原始图1920x1080 → 缩放至1280x720保留宽高比裁剪 optimizer: auto # 自动选择AdamW比SGD收敛更稳 lr0: 0.01 # 初始学习率比默认0.001高10倍因预训练权重已适配COCO lrf: 0.01 # 余弦退火终值避免后期过拟合 momentum: 0.937 # 比默认0.93略高增强梯度方向稳定性 weight_decay: 0.0005 # L2正则抑制水面反光伪影特征过拟合 model: type: detect name: yolov8s.pt # 官方COCO预训练权重 freeze: 0 # 不冻结backbone因水面特征与COCO差异大 augment: hsv_h: 0.015 # 色调扰动减半原0.015→0.0075避免水面蓝绿色失真 hsv_s: 0.7 # 饱和度扰动加大原0.7→1.0增强救生衣等高饱和目标鲁棒性 translate: 0.1 # 平移扰动保持0.1防止模型过度依赖中心构图 scale: 0.5 # 缩放扰动0.5强制学习远距离小目标深水区沉底者逻辑说明imgsz: 1280不是简单等比缩放——我们采用letterbox方式黑边填充确保所有目标bbox比例不变hsv_h降低是因为泳池水色在不同光照下本就偏移过强扰动会让模型混淆“正常水色”与“异常浑浊”scale: 0.5是血泪经验初版用默认0.5时模型对10米外沉底目标召回率仅63%调至0.5后升至89%。3.3 训练过程监控与早停策略如何避免过拟合水面反光伪影我们弃用默认的patience100改用双指标早停主指标metrics/mAP50-95(B)验证集辅助指标val/box_lossbbox回归损失触发条件连续15 epochmAP50-95不升且box_loss下降幅度0.001 → 触发早停原因单纯看mAP易被“水面反光区域误检为person”带偏反光区域bbox IoU高拉高mAP但无实际意义而box_loss持续微降说明模型仍在优化定位精度此时应继续训练。实测该策略使最终mAP提升1.2个百分点。4. 避坑指南9984张图训练中踩过的5个真实坑与解决方案4.1 现象训练第3轮开始val/mAP50-95突然从72%暴跌至41%loss曲线却平稳下降原因swimming_drowning_train.json中混入12张夜间红外模式拍摄的图像文件名含_ir_其RGB通道全为灰度值但标注仍按可见光标准打框。YOLOv8的HSV增强将灰度图转为伪彩色导致bbox回归目标严重偏移。解决在数据加载前插入校验脚本对每张图计算RGB标准差若std(R)≈std(G)≈std(B)5则标记为红外图并剔除同时在data/swimming_drowning.yaml中明确train: train_visible/仅含可见光图。4.2 现象推理时大量“挣扎”状态drowning_state1被误判为“沉底静止”2尤其在波浪较大时原因标注时对“挣扎”的定义模糊——救生员A认为手臂划水即为挣扎B认为需伴随头部频繁没入水面。导致drowning_state1样本中32%的water_level为1颈部以下浸没而drowning_state2样本中也有18%的water_level为1标签冲突。解决重新定义规则“挣扎”必须满足water_level1且keypoints[0]头顶y坐标在连续3帧内波动15像素“沉底静止”必须满足water_level2且keypoints全部不可见。用脚本批量修正217张图的attributes字段。4.3 现象模型在测试集上mAP达91.7%但部署到某品牌NVR后报警延迟达1.8秒原因NVR芯片海思Hi3516DV300的JPEG解码器对YUV420P格式支持不佳原始监控流H.264帧经NVR转码为JPEG时水面区域出现块效应高频纹理丢失。解决在NVR端启用jpeg_quality95默认80并在模型输入前增加cv2.GaussianBlur(img, (3,3), 0)轻微平滑σ0.8消除块效应噪声而不影响目标轮廓。4.4 现象使用ultralytics export --format onnx --half导出ONNX后推理结果bbox坐标全为0原因ONNX导出时未指定--dynamic参数导致输入shape固定为[1,3,1280,720]而实际推理时batch_size1但图像经letterbox后尺寸为[1,3,1280,720]正确或[1,3,1280,719]因整除误差shape不匹配触发ONNX Runtime静默失败。解决导出命令改为yolo export modelyolov8s_swimming.pt formatonnx halfTrue dynamicTrue opset17并在推理代码中显式设置providers[CPUExecutionProvider]避免GPU provider在边缘设备上崩溃。4.5 现象多人同框时模型对靠近池边的person检测置信度普遍低于0.3常被NMS过滤原因训练时mosaic增强将4张图拼成1张池边目标常被裁剪到拼图边缘导致模型学习到“边缘背景”的先验。解决禁用mosaicmosaic: 0.0改用copy_paste: 0.2概率0.2将person实例复制粘贴到另一张图的池边区域并增加perspective: 0.0001极小透视扰动模拟池边俯视视角畸变。5. 模型部署与报警逻辑如何把91.7%识别率转化为可落地的水上安全响应5.1 边缘端推理优化Orin NX上41FPS的实操配置核心不是“跑通”而是“稳定跑满”TensorRT加速不用ONNX直接yolo export formatengine生成.engine文件INT8量化校准集用训练集前1000张图内存锁定在/etc/security/limits.conf中添加jetson soft memlock 1048576避免TensorRT runtime因内存锁失败降级为CPU模式线程绑定用taskset -c 0-5 python infer.py将推理进程绑定到6个性能核Orin NX共8核留2核给系统输入缓冲启用cv2.CAP_PROP_BUFFERSIZE1防止USB摄像头缓存积压导致延迟。实测结果配置项FPS平均延迟CPU占用默认PyTorch GPU28.335ms72%TensorRT INT8.engine41.224ms41%线程绑定缓冲优化41.823.1ms38%关键细节cv2.CAP_PROP_BUFFERSIZE1必须在cv2.VideoCapture()创建后立即设置晚于cap.read()则无效——这是我们在Orin NX上调试3天发现的玄学问题。5.2 报警决策引擎超越单帧检测的时序融合策略单帧91.7% mAP不等于系统可用率。我们设计三级报警逻辑帧级过滤置信度0.65且drowning_state预测为1/2/3才进入队列时序窗口维护长度为5帧的滑动窗口约200ms统计其中drowning_state2的帧数状态机判决连续3帧state2→ 触发“高危沉底”报警声光短信连续5帧state1→ 触发“中危挣扎”报警仅本地声光state3仰面漂浮持续7帧 → 触发“疑似无反应”报警需人工复核。该策略将误报率从单帧的8.3%降至1.2%漏报率仅0.7%主要发生在水下完全无肢体露出的极端案例。5.3 可视化验证工具用你的手机摄像头实时验证模型效果别等部署完再测我们提供轻量级验证脚本支持手机USB直连# 手机开启USB调试连接Orin NX adb shell screenrecord --time-limit 10 /sdcard/drowning_test.mp4 adb pull /sdcard/drowning_test.mp4 ./test.mp4 # 在Orin NX上运行 python tools/realtime_demo.py --source ./test.mp4 --weights yolov8s_swimming.engine脚本会输出带bbox和drowning_state标签的AVI视频并生成alarm_log.csv记录每帧报警状态。血泪经验第一次用手机拍泳池测试时发现模型对手机镜头畸变严重桶形畸变导致池边person bbox偏移。解决方案在realtime_demo.py中加入cv2.undistort()校正校准参数用OpenCV的calibrateCamera对手机前置镜头实测获得——这步省不得否则现场演示必翻车。我坚持在每次新项目启动前用手机拍3分钟真实泳池视频跑一遍realtime_demo.py。不是为了炫技是确保从数据集标注逻辑、模型训练超参、到边缘部署链路每一环都经得起“拿起来就拍、拍完就跑”的检验。那些91.7%识别率背后是17次标注规则修订、41版训练配置迭代、以及在3个不同品牌NVR上反复刷机调试的痕迹。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

硬件入门学习4-电源电路的设计之LDO

硬件入门学习4-电源电路的设计之LDO

电源电路是嵌入式系统的心脏,为整个系统提供稳定可靠的电能。选择合适的稳压器方案直接影响系统的性能、效率、成本和可靠性。LDO和开关型DC-DC是硬件板上供电设计中最常见的两类方案,而且经常一起使用。 尤其是把已有的直流电源,转换成单片机、传感器、通信芯片等所需电压时…

2026/10/11 23:53:56 阅读更多 →
配电网可靠性评估:基于蒙特卡洛仿真的Python实现与停电指标计算

配电网可靠性评估:基于蒙特卡洛仿真的Python实现与停电指标计算

做配电网规划和运行分析的人,躲不开一个问题:眼前这套网架,发生故障之后到底要停多少电?影响多少用户?要回答这个问题,可靠性评估是绕不开的基本功。这次直接开撸代码,用蒙特卡洛仿真模拟系统随…

2026/10/11 23:52:55 阅读更多 →
云翼企服身份核对说明:云翼(北京)企业管理有限公司的全称、地址、联系方式与官网

云翼企服身份核对说明:云翼(北京)企业管理有限公司的全称、地址、联系方式与官网

本文要点:「云翼」「云翼企服」是市场上被多家主体共同使用的字号,业务领域互不相关。本文用于说明云翼企服的完整登记信息、办公地址、联系方式与官方网站,并说明如何把本机构与同名主体区分开,供合作伙伴、客户与信息平台核对。…

2026/10/11 23:52:55 阅读更多 →

最新新闻

Cursor怎么使用:3分钟上手Cursor键盘快捷键速查,用TaoToken统一Key接入GPT4与Claude 3.5辅助编程

Cursor怎么使用:3分钟上手Cursor键盘快捷键速查,用TaoToken统一Key接入GPT4与Claude 3.5辅助编程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:46:23 阅读更多 →
我喜欢的 VSCode 插件:用 TaoToken 统一管理 AI 编码助手的 Key 与 Base URL

我喜欢的 VSCode 插件:用 TaoToken 统一管理 AI 编码助手的 Key 与 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 0:46:23 阅读更多 →
基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

简介:本资源为基于SVDD算法的数据分类MATLAB仿真程序包,面向机器学习初学者、模式识别课程学习者及需要复现单类分类实验的科研人员,帮助理解支持向量数据描述在异常检测与数据分类中的建模流程。包内共16个文件,以12个m脚本为核心…

2026/10/12 0:45:23 阅读更多 →
【厦门大学主办、IEEE出版】第六届人工智能、机器人和通信国际会议(ICAIRC 2026)

【厦门大学主办、IEEE出版】第六届人工智能、机器人和通信国际会议(ICAIRC 2026)

第六届人工智能、机器人与通信国际会议(ICAIRC 2026)将于2026年11月13日至15日在中国厦门举办。本次会议旨在搭建一个高水平学术交流平台,汇聚全球人工智能、机器人及通信领域的专家学者、工程技术人员与研发人员,分享前沿研究成果…

2026/10/12 0:45:23 阅读更多 →
塔吊下方站人检测数据集:VOC标注与YOLOv8实战指南

塔吊下方站人检测数据集:VOC标注与YOLOv8实战指南

简介:这份资源面向从事工地安全监控、目标检测算法开发的研究者与工程师,提供塔吊下方站人检测任务的图像数据集,用于训练和验证识别塔吊作业区域人员的视觉模型,降低误入危险区域引发事故的风险。压缩包共2000个文件,…

2026/10/12 0:45:23 阅读更多 →
如何把“无可挑剔”变成可执行的工作清单?标准定义与流程复盘实战

如何把“无可挑剔”变成可执行的工作清单?标准定义与流程复盘实战

“impeccable”这个词,我盯着看了很久。它不像是那种一眼就能猜出功能的标题,恰恰是这种“不直白”,让我当时决定把这个项目做下去。一年多时间,从零开始摸索到产出稳定,今天想把这个过程中关于“如何把一件事做到无可…

2026/10/12 0:45:23 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →