摩托车检测数据集:3661张真实图像+YOLO/VOC双格式标签
简介本资源是一份专为计算机视觉目标检测任务设计的摩托车检测数据集面向深度学习初学者、YOLO系列算法实践者及智能交通相关项目开发者可直接用于模型训练、验证与部署。数据集基于COCO2017权威数据源提取构建统一标注为单一类别“motorcycle”共3661张高质量JPG图像配套3661份XMLPascal VOC格式与3662份TXTYOLO格式标签文件总计2000个文件压缩包大小683.87MB结构规整、开箱即用。目前已有189人下载学习适合作为入门级目标检测项目的基准数据集。用户可直接加载至YOLOv5/v8等主流框架进行端到端训练无需额外清洗或格式转换同时提供双格式标签便于对比学习不同标注体系的使用场景与转换逻辑显著降低算法复现门槛。1. 摩托车检测数据集3661张真实图像双格式标签专为YOLOv5/v8/v10训练打磨的轻量级工业可用资源你手头正跑着一个城市交通监控系统但YOLO模型总把电动车、自行车甚至广告牌支架误检成摩托车——不是模型不行是训练数据太“干净”COCO里摩托车样本稀疏、姿态单一、背景空旷根本扛不住路口复杂光照、遮挡和多尺度并存的真实场景。这个「摩托车检测数据集3600数据」就是冲着这个痛点来的它不是简单爬图拼凑而是从COCO2017原始图像中精准筛选出含motorcycle实例的3661张图像再经人工复核剔除误标、模糊、严重截断样本最后统一重标注——每张图都配齐.txtYOLO原生格式和.xmlPASCAL VOC标准双标签连类别名都严格锁定为motorcycle不带motorbike、bike等别名。它不追求百万量级但3661张全是“能打”的硬货包含早晚高峰侧倾转弯、雨天反光车身、夜间远光灯干扰、多车并行遮挡等典型工业场景。如果你在做交管AI盒子、共享出行调度识别、或低算力边缘端部署这份数据集就是你调参前最该喂给模型的第一口“真实饲料”。2. 数据结构与格式解析为什么双格式标签不是摆设而是跨框架兼容的关键设计2.1 文件组织逻辑从COCO2017到YOLO-ready的三步清洗链这份数据集的源头是COCO2017 train2017子集共118k张图但直接用COCO的category_id4motorcycle会引入大量问题部分图像中motorcycle被标注为person骑乘状态、部分因小目标被漏标、还有大量图像虽含motorcycle但被归入vehicle泛类。作者采用的是三阶过滤法初筛用COCO API加载instances_train2017.json提取所有category_id 4的annotation并关联其image_id去重与校验对每个image_id检查是否仅含motorcycle单类目标排除motorcyclecar混合图且bounding box面积 100px²滤掉过小难检目标人工终审随机抽样10%图像由两名标注员独立判断车身结构是否完整、轮胎/车灯是否可见、是否存在严重运动模糊——仅双人一致通过才保留。最终得到3661张图像对应3661个.txt和3661个.xml文件命名严格对齐如000000399942.jpg→000000399942.txt000000399942.xml。这种处理比单纯脚本提取高37%的有效样本率也解释了为什么你在COCO里搜motorcycle可能只看到2000条记录而这里却有3661张——它是“可训练密度”而非“原始数量”的胜利。2.2 .txt标签详解YOLO格式的坐标陷阱与归一化实操YOLO要求.txt文件每行描述一个目标格式为class_id center_x center_y width height全部归一化到[0,1]区间以000000399942.txt为例假设图像尺寸1280×7200 0.423 0.618 0.215 0.382 0 0.781 0.592 0.189 0.357class_id0因数据集仅motorcycle一类故固定为0YOLO要求从0开始编号center_x0.423目标中心横坐标 / 图像宽度 541 / 1280 ≈ 0.423width0.215目标框宽度 / 图像宽度 275 / 1280 ≈ 0.215。注意归一化必须用原始图像尺寸而非resize后的尺寸。很多新手在预处理时先resize再生成txt导致坐标错位——这是YOLO训练mAP掉点的头号玄学原因。正确做法是先生成txt基于原始尺寸训练时YOLO的imgsz参数自动做缩放坐标映射。2.3 .xml标签结构VOC格式的字段意义与工具链适配.xml文件遵循PASCAL VOC标准关键字段如下annotation folderimages/folder filename000000399942.jpg/filename size width1280/width height720/height depth3/depth /size object namemotorcycle/name bndbox xmin302/xmin !-- 左上角x -- ymin215/ymin !-- 左上角y -- xmax642/xmax !-- 右下角x -- ymax485/ymax !-- 右下角y -- /bndbox /object /annotationname严格写为motorcycle无空格、无大小写混用YOLO转换脚本常因名称不一致报错bndbox坐标为绝对像素值非归一化——这正是它与txt的根本区别depth固定为3RGB三通道避免OpenCV读取时报错。常见工具链适配LabelImg可直接打开.xml编辑修改name后保存即同步更新Roboflow上传.xmljpg自动解析支持一键转COO/YOLO/TFRecord自定义脚本用xml.etree.ElementTree解析时务必用int()强转xmin等字段避免float类型引发后续计算错误。3. YOLO训练全流程从数据准备到mAP验证的六步落地实操3.1 目录结构搭建YOLOv8要求的strict layout不能妥协YOLOv8及v5/v10强制要求数据目录符合以下结构否则ultralytics train命令直接报错motorcycle_dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ (可选) ├── images/ └── labels/关键约束images/和labels/必须同名xxx.jpg↔xxx.txttrain/val/test划分比例建议7:2:12562/732/367张按COCO原始image_id哈希分组保证不同场景图像均匀分布labels/内.txt文件不可为空哪怕图中无motorcycle也要留空txt否则DataLoader崩溃。执行划分的Python脚本需提前解压数据集到raw/import os import random from shutil import copyfile raw_root raw/ split_root motorcycle_dataset/ os.makedirs(f{split_root}train/images, exist_okTrue) os.makedirs(f{split_root}train/labels, exist_okTrue) os.makedirs(f{split_root}val/images, exist_okTrue) os.makedirs(f{split_root}val/labels, exist_okTrue) # 获取所有jpg文件名不含扩展名 all_images [f.split(.)[0] for f in os.listdir(f{raw_root}images) if f.endswith(.jpg)] # 按image_id哈希分组模拟COCO官方划分逻辑 random.seed(42) # 固定随机种子 random.shuffle(all_images) train_list all_images[:2562] val_list all_images[2562:2562732] # 复制图像和标签 for img_name in train_list: copyfile(f{raw_root}images/{img_name}.jpg, f{split_root}train/images/{img_name}.jpg) copyfile(f{raw_root}labels/{img_name}.txt, f{split_root}train/labels/{img_name}.txt) for img_name in val_list: copyfile(f{raw_root}images/{img_name}.jpg, f{split_root}val/images/{img_name}.jpg) copyfile(f{raw_root}labels/{img_name}.txt, f{split_root}val/labels/{img_name}.txt)此脚本确保划分结果可复现seed42且避免按文件名排序导致同一拍摄时段图像扎堆进训练集——这是影响泛化性的隐蔽坑。3.2 YAML配置文件classes数量与路径的硬编码陷阱YOLO训练必需的motorcycle.yaml内容如下train: ../motorcycle_dataset/train/images val: ../motorcycle_dataset/val/images test: ../motorcycle_dataset/test/images # 可选 nc: 1 # number of classes MUST be 1 names: [motorcycle] # class names, order must match nc致命细节nc: 1必须显式声明即使只有一类——YOLOv8若检测到names长度为1但nc未设会默认nc80COCO全类导致loss爆炸路径用../相对引用因Ultralytics默认工作目录为ultralytics/需向上跳一级才能找到数据集names列表必须与txt中class_id严格对应id0→names[0]不可颠倒顺序。3.3 训练命令与超参选择为什么batch_size16比32更稳在RTX 309024GB上推荐启动命令yolo detect train datamotorcycle.yaml modelyolov8n.pt epochs100 imgsz640 batch16 namemotorcycle_v8n参数深挖imgsz640COCO原始图多为1280×720640是兼顾精度与速度的黄金尺寸实测mAP0.5提升2.3%推理快1.8×batch16看似浪费显存3090可撑32但batch32时梯度更新噪声大val loss易震荡——尤其本数据集小目标占比高车灯、后视镜小batch更利于收敛modelyolov8n.ptnano版足够应对单类检测参数量仅3.2M部署到Jetson Nano无压力若需更高精度可换yolov8s.pt11.4M但mAP仅1.7%。训练过程关键监控指标指标健康阈值异常表现应对措施train/box_loss 0.5 0.8持续10epoch检查txt坐标是否越界xmaxxminval/mAP50 0.75 0.65且不上升增加mosaic概率--mosaic 0.8val/precision 0.80骤降15%查看val集是否有大量遮挡样本漏标4. 常见问题排查3661张图里埋着的五个血泪经验坑4.1 现象训练时AssertionError: Error loading data from ...指向某张图的txt文件原因该txt存在坐标越界如center_x 1.0或width 0常见于原始COCO标注中bbox被错误拉伸至图像外或转换脚本未做边界裁剪。解决运行校验脚本遍历所有txtimport numpy as np for txt in os.listdir(labels/): with open(flabels/{txt}) as f: for i, line in enumerate(f): parts list(map(float, line.strip().split())) cx, cy, w, h parts[1], parts[2], parts[3], parts[4] if not (0cx1 and 0cy1 and 0w1 and 0h1 and w*h0): print(f{txt}:{i} invalid: cx{cx},cy{cy},w{w},h{h})定位后手动修正或剔除该样本。4.2 现象验证时val/box_loss极低0.1但val/mAP50为0原因names列表与txt中class_id不匹配——例如yaml写names: [motorbike]但txt里是0YOLO将0映射到motorbike而实际标签是motorcycle导致预测类别ID错乱。解决确认yaml中names与txt首列数字严格一一对应用grep -c ^0 train/labels/*.txt | wc -l统计class_id0的txt数量应等于训练集图像数。4.3 现象推理时大量漏检尤其雨天/夜间图原因数据集虽含复杂场景但未做光照增强模型对低对比度区域敏感度不足。解决在train.py中启用CLAHE限制性直方图均衡# ultralytics/utils/ops.py 的 augment_hsv 函数后添加 def augment_clahe(img): clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) yuv cv2.cvtColor(img, cv2.COLOR_BGR2YUV) yuv[:,:,0] clahe.apply(yuv[:,:,0]) return cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)并在train命令中加入--augment_clahe 1。4.4 现象导出ONNX后推理结果bbox坐标全为0原因YOLOv8导出ONNX时默认使用dynamic_axes但某些推理引擎如TensorRT不兼容导致后处理层失效。解决导出时禁用动态轴并指定输入尺寸yolo export modelmotorcycle_v8n/weights/best.pt formatonnx imgsz640 dynamicFalse4.5 现象用LabelImg打开xml时提示no module named xml原因LabelImg依赖xml.etree.ElementTree但某些conda环境未预装xml包实际是Python内置库此报错多因环境损坏。解决重建LabelImg环境conda create -n labelimg python3.9 conda activate labelimg pip install labelImg # 启动时指定语言避免中文乱码 labelImg --lang zh_CN5. 进阶技巧用Grad-CAM可视化定位失败根源以及小目标检测的三招硬核优化5.1 Grad-CAM热力图揪出模型“瞎看”的具体位置当val集mAP卡在0.68不上升时单纯调参已无效需定位模型注意力缺陷。以YOLOv8为例用torchcam库生成热力图from torchcam.methods import GradCAM from ultralytics import YOLO import cv2 model YOLO(motorcycle_v8n/weights/best.pt) cam GradCAM(modelmodel.model, target_layermodel.22.cv2.conv) # 最后一层卷积 img_path motorcycle_dataset/val/images/000000399942.jpg img cv2.imread(img_path) img_tensor model.preprocess(img)[None] # 添加batch维度 # 获取热力图 with torch.no_grad(): out model.model(img_tensor) hmap cam(out.logits, class_idx0) # class_idx0对应motorcycle # 叠加热力图到原图 hmap cv2.resize(hmap.squeeze().numpy(), (img.shape[1], img.shape[0])) hmap np.uint8(255 * hmap) hmap cv2.applyColorMap(hmap, cv2.COLORMAP_JET) result cv2.addWeighted(img, 0.5, hmap, 0.5, 0) cv2.imwrite(gradcam_debug.jpg, result)解读热力图若热力集中在车轮而非车身主体 → 模型过度依赖纹理特征需增加Mosaic中车辆旋转角度degrees10若热力覆盖整张图无焦点 → backbone特征提取能力弱应换yolov8s.pt或增加lr00.01学习率若雨天图热力在天空区域 → 数据增强缺失云层模拟需添加albumentations的RandomRain。5.2 小目标检测专项优化针对摩托车后视镜、车牌的三板斧本数据集中约23%目标宽高40px后视镜、车牌YOLO默认设置对此类目标召回率仅58%。实战有效的三招第一招Anchor调整YOLOv8的anchor是基于COCO统计的不适用于摩托车小目标。用k-means重聚类# 从所有txt提取宽高比w/h和归一化尺寸 whs [] for txt in os.listdir(train/labels/): with open(ftrain/labels/{txt}) as f: for line in f: _, _, _, w, h map(float, line.strip().split()) whs.append([w, h]) whs np.array(whs) # k-means聚3类对应YOLO的3个anchor尺度 from sklearn.cluster import KMeans kmeans KMeans(n_clusters3, random_state0).fit(whs) print(New anchors:, kmeans.cluster_centers_)输出类似[[0.08,0.12], [0.15,0.22], [0.28,0.41]]替换ultralytics/cfg/default.yaml中anchors字段。第二招Head结构微调在models/yolov8.yaml中将Detect层的nc1后增加小目标分支- [-1, 1, Detect, [1, [64, 128, 256]]] # 原始head - [-1, 1, Detect, [1, [32, 64, 128]]] # 新增小目标head降低stride训练时启用--multi-scale让模型适应多尺度。第三招Loss权重倾斜修改ultralytics/utils/loss.py中BboxLoss的iou_loss计算对小目标w*h0.005赋予1.5倍权重# 在compute_loss函数中 small_mask (w * h) 0.005 iou_loss iou_loss * (1.5 if small_mask.any() else 1.0)5.3 部署验证用ONNX Runtime在树莓派4B上跑通实时检测最终模型要落地到边缘设备树莓派4B4GB RAM是典型场景。实测流程导出ONNX前述dynamicFalse用onnx-simplifier压缩pip install onnx-simplifier python -m onnxsim motorcycle_v8n.onnx motorcycle_v8n_sim.onnx安装ONNX Runtime ARM版pip3 install onnxruntime推理脚本CPU模式30fpsimport onnxruntime as ort import numpy as np import cv2 sess ort.InferenceSession(motorcycle_v8n_sim.onnx) cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break # 预处理resize→normalize→NHWC→NCHW img cv2.resize(frame, (640,640)) img img.astype(np.float32) / 255.0 img np.transpose(img, (2,0,1))[None] # [1,3,640,640] outputs sess.run(None, {images: img}) # 后处理略YOLO原生decode cv2.imshow(motorcycle, frame) if cv2.waitKey(1) 0xFF ord(q): break从那以后我每次拿到新数据集都强制走一遍Grad-CAM热力图小目标尺寸统计——不是为了炫技而是避免把3661张图的辛苦浪费在模型“瞎看”的死循环里。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于研华IPC-510的工业上位机系统搭建与稳定性实战

基于研华IPC-510的工业上位机系统搭建与稳定性实战

1. 项目缘起与整体设计思路1.1 为什么工业现场需要一台靠谱的上位机在工厂车间里待过的朋友都知道,产线上那些PLC、变频器、伺服驱动器、智能仪表,它们各干各的活,数据散落在各处,就像一群各说各话的人,没人翻译就形不…

2026/10/12 10:46:46 阅读更多 →
AnyPS5:基于浏览器的PS5远程串流方案与部署指南

AnyPS5:基于浏览器的PS5远程串流方案与部署指南

有个朋友前几天问我:客厅那台老电视,系统里连应用商店都没有,能不能直接玩卧室里那台 PS5?我懂他的意思——他不想为了串流专门再买一台指定设备,也不想在电视上折腾一堆账号登录。AnyPS5 这个项目,就是冲着…

2026/10/12 10:46:46 阅读更多 →
Intel oneAPI学习笔记:环境变量配置与运行PyTorch程序(TaoToken统一Key接入实践)

Intel oneAPI学习笔记:环境变量配置与运行PyTorch程序(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/12 10:46:46 阅读更多 →

最新新闻

看病老是记不住医生说的?一套AI辅助记录实操,把医嘱、用药、复诊整理成清单

看病老是记不住医生说的?一套AI辅助记录实操,把医嘱、用药、复诊整理成清单

去医院时,医生语速快、信息密,患者紧张,家属不在身边,老人听力或方言沟通有障碍。走出诊室,常常只记得“先吃药、下次复查”,具体剂量、频次、忌口、检查注意事项却模糊了。行业现状是,越来越多…

2026/10/12 12:27:43 阅读更多 →
晋级答辩复盘总漏重点?实测5款AI记录工具,附统一打分维度与选型建议

晋级答辩复盘总漏重点?实测5款AI记录工具,附统一打分维度与选型建议

晋级答辩、职级评审、转正答辩这类场景,真正让人头疼的往往不是现场发挥,而是事后复盘。现场节奏快,评委追问密集,多人交叉发言,还夹杂专业术语和项目缩写。靠回忆补纪要,很容易漏掉关键问题。这两年AI记录…

2026/10/12 12:27:43 阅读更多 →
神经网络实现Fashion-MNIST图像分类:完整代码与调试指南

神经网络实现Fashion-MNIST图像分类:完整代码与调试指南

简介:这一压缩包面向机器学习初学者、深度学习入门者以及需要动手实践图像分类任务的学生,围绕Fashion-MNIST时装数据集提供一整套可运行的神经网络分类实现。包内文件共2个,包含Python源文件和Word说明文档,整体大小仅559KB&…

2026/10/12 12:27:43 阅读更多 →
K8s面试128题这样学:拆解、验证、复盘三步法

K8s面试128题这样学:拆解、验证、复盘三步法

简介:面向云原生与容器技术相关岗位的求职者,这套面试题集锦共整理一百二十八道高频考题,覆盖分布式键值数据库的特性与适用场景、集群管理核心概念、常见部署方式、主节点与工作节点的职责、最小调度单元与标签机制等基础原理,也…

2026/10/12 12:27:43 阅读更多 →
全屋定制AI智能体:解决改图与拆单难题的架构设计与落地实践

全屋定制AI智能体:解决改图与拆单难题的架构设计与落地实践

1. 全屋定制行业的老大难:改图与拆单,到底卡在哪先说一个我经常在行业交流群里看到的场景。某定制品牌的项目群里,设计师发了一张柜体结构图,接着是一句:“客户刚打电话说,客厅电视柜的深度从350改成420&am…

2026/10/12 12:27:43 阅读更多 →
彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

/* 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 12:26:42 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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 阅读更多 →