新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLO26数据准备全攻略:从格式转换到标注质量验证

发布时间:2026/9/4 22:08:18来源:尧图网络
YOLO26数据准备全攻略:从格式转换到标注质量验证
做计算机视觉久了会发现一件特别有意思的事大家聊YOLO26的时候讨论最多的是网络结构、改进思路、训练技巧可一旦把一个项目从 demo 推向真正能用的状态决定成败的往往不是模型那部分而是数据集和标注这边。我自己接过不少计算机视觉项目也带过新人用YOLO26训练自己的数据集几乎每一次项目卡壳追根溯源都是数据环节出了问题要么类别文件顺序错乱要么框画得不够准要么一个类别只有几十张图就硬着头皮训练要么标注工具选得不对导致返工成本翻倍。这篇内容想把 YOLO26 数据准备的完整链路梳理一遍——格式怎么选、公开数据集怎么找、自采数据有哪些有效手段、标注文件到底怎么被训练脚本消费、CVAT这类工具怎么落地、训练前怎么验证标注质量。如果你正准备在自己的数据集上跑 YOLO26或者在做某个计算机视觉大作业、实际工程项目时被数据卡住了这篇可以当一份实操地图来用。1. 为什么我会把数据集放在网络结构前面聊1.1 YOLO26 本质上在学什么目标检测这事的本质是让模型学会从图像到“边界框 类别标签”的映射。YOLO26 无论结构怎么演进骨干网络怎么设计、检测头怎么改进它在训练阶段需要的东西始终是大量带标注的样本模型从这些样本里学出视觉特征与目标位置之间的规律。很多朋友喜欢先看 YOLO26 结构图研究改进点在哪个模块这当然没错但结构改进解决的是“同样数据下能拟合得多好”的问题而数据本身解决的是“模型能学到的上限在哪”的问题。一个很直白的比喻模型像一个学生结构是他的智商和学习方法数据集就是教材和题库。教材本身错误百出、习题覆盖不全面再聪明的学生也考不出好成绩。实际项目中数据质量和标注一致性对最终 mAP 的影响往往远大于结构层面的一次小改进。比如人员入侵检测这类任务如果训练数据里只在“人完整出现”的场景下标注了框没有覆盖遮挡、远距离小人、逆光、夜间红外这类实际场景模型部署后就很容易漏报。反过来说如果负样本区域频繁出现类似人形的东西树影、动物、机械臂你又没在数据里让模型学会区分误报就会源源不断。这些问题的根源完全不在网络结构而在数据设计阶段。1.2 YOLO26 训练自定义数据的基本盘回到实操层面训练 YOLO26 自己的数据集图片规模和标注质量需要达到什么底线我按实际项目经验给一组参考值每个类别建议至少有 150 张包含该目标的图像理想情况是 500 张以上每个类别的目标实例总数建议不低于 300 个类别越难小目标、遮挡严重、形态多样实例数要求越高类别数本身不多时比如单类检测单类图片可以适当降低但场景多样性不能降图片分辨率建议不低于 640×640如果原始图片远大于这个尺寸需要考虑切图策略否则目标会被严重压缩。这里有一个常见误区很多人以为数据增强可以弥补数据量的不足。YOLO26 训练时确实默认开启 mosaic、flip、hsv 等增强策略数据增强能提高模型的泛化能力但它改变不了“类别分布严重不均衡”和“同场景图像大量重复”这类根本问题。就像一个学生只反复做同一套模拟卷每次换汤不换药考试换一套题就露馅。我的习惯做法是先做一个小规模的数据集比如每个类别 100~200 张跑通完整的“标注 - 训练 - 验证”闭环确认没有格式问题和标注规范问题后再扩充数据。不要一上来就标注几千张万一中间格式错了几千张全部返工是非常痛苦的。2. 训练之前先把格式定清楚COCO、VOC 还是 YOLO 原生 txt2.1 三种格式有什么本质差异很多 YOLO26 新手第一个懵的点就是数据集格式。明明在 COCO 官网下载了数据集也看到 json 文件里写得清清楚楚但训练时就是报错。原因很简单YOLO 系模型用的是自己的一套 txt 标注格式和 COCO 的 json、VOC 的 xml 都不一样。在动手之前先把三者差异谈清楚。格式存储方式坐标表示适合场景COCO JSON单个 json 文件包含 images、annotations、categories 三个数组像素坐标格式为 x, y, width, heightx, y 是框左上角通用目标检测、实例分割、关键点等统一任务VOC XML每张图片对应一个 xml 文件像素坐标xmin, ymin, xmax, ymax左上角和右下角早期目标检测标准格式很多老数据集都长这样YOLO txt每张图片对应一个 txt 文件归一化坐标class_id, cx, cy, w, hYOLO 系列模型原生格式Ultralytics 框架直接支持VOC 和 COCO 的标注精度都是像素级的人眼看起来直观自己写代码检查也方便。但 YOLO 的 txt 格式会把这些像素坐标全部归一化到 0~1 之间原因很简单训练时模型会把输入图片统一缩放到 640×640或者你配置的 imgsz如果标注坐标是绝对像素值图片一旦缩放标注就和图像内容对不上了。归一化后坐标只表示目标在图片中的相对位置和相对大小不管输入图片缩放到多大标注始终有效。所以实际项目里我建议把 COCO 或 VOC 当作“中间存储格式”也就是数据集原始归档用这类可读性强的格式保存训练前再统一转成 YOLO txt。这样以后换框架比如转成 mmdetection 要用的 COCO 格式或者转成 mmrotate 做旋转目标检测也方便。2.2 VOC 转 YOLO 的完整脚本以及归一化到底怎么算拿最常见的 VOC XML 转 YOLO txt 举例。假设一个 XML 的标注内容大致长这样annotation filenameimg_001.jpg/filename size width1920/width height1080/height /size object nameperson/name bndbox xmin480/xmin ymin360/ymin xmax960/xmax ymax720/ymax /bndbox /object /annotation转换成 YOLO 格式时需要把左上角右下角坐标转成中心点坐标加宽高然后全部除以图片宽高做归一化。转换过程用 Python 可以写成这样import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, out_path, class_names): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in class_names: continue class_id class_names.index(name) box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(out_path, w, encodingutf-8) as f: f.write(\n.join(lines)) class_names [person, car, dog] # 这个列表的顺序必须和后续 data.yaml 中的类别顺序完全一致转换脚本本身不难大部分人栽跟头都在“ class_names 列表顺序”上。YOLO txt 里每一行开头的数字是类别的索引txt 里写的是0就表示该目标属于class_names[0]也就是 person。如果训练时 data.yaml 里的 names 顺序和这个 class_names 不一致比如你训练文件里把 car 排在 person 前面那模型就会把原来的“人”当成“车”来学最后结果自然是全乱套。所以我自己的项目里会固定一个 data.yaml 作为所有类别顺序的唯一来源转换脚本和标注工具里配置的标签顺序都从它同步绝不手动在多个文件里维护一份类别列表。这个习惯救过我很多次强烈建议照做。3. 数据集从哪来公开资源与现实采集的组合策略3.1 可以不从零标注的公开数据集做 YOLO26 训练自己的数据集之前优先考虑一件事能不能直接找到带标注的公开数据集计算机视觉发展了这么多年很多经典数据集已经覆盖了大量通用场景。数据集标注内容适合场景备注COCO80 类目标框/分割/关键点通用目标检测、模型预训练验证官方有 train/val类别编号不是从 0 连续排列转换时注意Pascal VOC20 类目标入门目标检测、格式转换练习XML 格式数量比 COCO 少但结构清晰VisDrone无人机视角下的人、车、自行车等航拍、无人机巡检、人员车辆统计小目标极多适合用来测 YOLO26 的小目标能力X 光安检物品检测数据集安检机视角下的刀具、液体、打火机等违禁品安检场景、危险品识别图像与自然图像差异大需用专业数据集遥感图像检测数据集如 DOTA遥感影像中的飞机、船、储油罐等遥感图像处理、大规模目标检测多数目标有旋转角度普通 YOLO26 检测框只能出水平框需要评估任务形式如果是做计算机视觉课程大作业或者只是想跑通 YOLO26 训练流程直接用 COCO 的某个子集可能是最高效的方式。COCO 官网上就能下载按照 data.yaml 指定的目录格式组织好训练命令敲下去基本不会出问题。X 光安检物品检测数据集这类专业领域的数据只靠公开数据一般不够因为实际现场的光线、物品叠放方式、输送带材料都和你找到的数据有差异。我通常的做法是先用公开数据集验证模型结构和训练配置没问题再针对自己实际场景采集几百张图补充标注最后混合训练。3.2 自采数据最有效的四个手段没有现成数据集的时候只能自己采集。这里分享几个我在实际项目中验证过的做法。第一是视频抽帧。如果有现场监控或实拍视频可以按帧率抽图。ffmpeg 一条命令就能完成ffmpeg -i input.mp4 -vf fps5 -q:v 2 frames/%06d.jpg这个命令每隔 0.2 秒抽一帧。抽帧间隔要根据目标运动速度决定行人缓慢走动可以 1~2 fps高速运动的车辆或传送带上的物体建议 5~10 fps。注意不要贪多同一段视频里连续帧的目标位置和背景几乎没变化标了 100 张等于标了 1 张的有效信息还浪费标注工时。我习惯先每隔 10 秒抽 1 帧看一遍内容再决定正式抽帧频率。第二是难例挖掘。先把已标注数据训练一版模型用这个模型去跑大量未标注的图片或视频帧把置信度低、漏检、误检的样本挑出来优先标注。这一招非常有用——困难样本往往才是决定模型上限的关键全部标注只会浪费时间在简单重复样本上。第三是场景多样化。同样一个目标不同角度、不同光照、不同遮挡程度训练效果差异巨大。采集阶段刻意加入逆光、雨天、夜间、远距离小目标等情况后续模型泛化能力会明显改善。第四是注意类别分布均衡。如果任务是“车人”两类采集时人很容易大量出现车相对少这时要有意识地单独补拍只有车出现的场景避免类别失衡。4. YOLO26 训练脚本到底怎么消费你的标注文件4.1 每张图一个 txt 背后的隐藏约定YOLO 训练的数据组织方式有固定的目录约定常见结构长这样datasets/mydata/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ └── 000002.jpg │ └── val/ │ ├── 000101.jpg │ └── 000102.jpg ├── labels/ │ ├── train/ │ │ ├── 000001.txt │ │ └── 000002.txt │ └── val/ │ ├── 000101.txt │ └── 000102.txt └── data.yamlimages 和 labels 必须在同一个根目录下图片和标签文件的主文件名必须完全一致只是后缀不同。Ultralytics 的 YOLO26 在训练时会根据图片路径自动去找同名的 txt 标签文件如果找不到这张图会被当成无目标负样本跳过。data.yaml 的内容类似这样path: datasets/mydata train: images/train val: images/val names: 0: person 1: car 2: dog某一个 txt 文件的内容可能是0 0.5032 0.4185 0.2417 0.5231 2 0.8120 0.7301 0.0850 0.1203这里的每一行代表一个标注目标。第一个数字是类别索引对应 data.yaml 里的 names 顺序第二和第三个数字是目标中心点的 x、y 坐标相对于图片宽高的比例第四和第五个数字是目标框的宽和高同样相对于图片宽高。整行数字全部落在 0~1 之间是正常状态如果出现大于 1 的数说明标注框已经超出了图片边界训练时大概率出问题。很多人的第一个坑是数据格式看起来没问题但训练时 loss 不降、mAP 为 0。排查方式很简单先检查 labels 目录和图片是不是一一对应再打开几张 txt 看坐标是否合理最后确认 data.yaml 的类别顺序和你标注时约定的顺序一致。这三个地方都对了百分之九十的格式问题都能解决。4.2 标注没大问题但训练“不听话”的隐蔽原因格式都对了模型还是训练不好我会按下面顺序排查一遍。一种是图片和标签的目录组织没错但图片路径中混入了不能正常解码的文件或者部分图片是纯黑图、纯白图。YOLO26 训练时数据加载器通常不会直接报错但会把这些图当作空样本训练浪费数据量还拉低效果。建议训练前用脚本把所有训练图片读一遍统计解码失败的样本直接剔除。另一种是目标框太小。举个例子1000 张 1920×1080 的监控图像里目标可能只有 20×20 像素归一化后的宽高只有 0.01 左右。YOLO26 的主干网络经过多次下采样小目标在最终的多个尺度特征图上可能只占一个点甚至不到一个点模型很难学到有效特征。这类情况单纯调参解决不了要么对原图做切块处理把大图切成训练友好的小图再标注训练要么适当提升输入分辨率比如 imgsz1280。还有一种隐蔽情况是标注框存在大量“骑边”的现象。比如人站在画面边缘半个身子在画面外标注工具里拉出来的框紧紧贴着图像边缘。模型在训练时看到的是一个不完整的目标配上一个贴近边界的框容易学到错误的边界语义。遇到这种情况我倾向于把超过图像边界、主体严重不完整的目标直接删掉不标或者只标注完整出现的目标。数据标注的准则里有一条很重要宁可不标不要标错。这句话在工程里极其管用。5. 标注工具选型CVAT、Label Studio、Make Sense.ai 怎么落地5.1 三种常见工具的取舍标注环节我见过太多团队花了大量时间在选择和折腾工具上。先说结论再展开讲工具差异。工具部署方式适合场景优点缺点CVAT可本机 Docker 部署支持局域网多人协作工程级项目、团队协作、专业数据标注支持目标检测/分割/关键点/跟踪有自动标注插件数据不出本机部署相对复杂需要了解 DockerLabel Studio可本机或在线部署界面友好多模态数据标注、小团队、文本图像混合上手快支持多种任务类型社区版免费大规模纯目标检测标注效率不如 CVATMake Sense.ai纯网页端无需部署几百张图的快速标注、个人学习打开即用支持 YOLO/VOC/COCO 格式导出对大型数据集和复杂任务支持弱数据上传到网页有隐私顾虑如果你的 YOLO26 数据集只有几百张、任务也只是单人完成Make Sense.ai 这类网页工具就够了。上传图片定义标签画框导出 zip整个过程十分钟内能跑通。我自己最早做 YOLO 项目就是从 Make Sense.ai 起步的。如果数据集上千张、多人分工标注或者数据敏感不适合上传公网直接上 CVAT 自托管。CVAT 虽然第一次部署要花点时间但后面多轮迭代、新增类别、多人并行任务管理都省心得多。Label Studio 则更适合既要标图片又要标文本、音频这类多模态数据的情况视觉标注的批处理能力强于前两者。5.2 CVAT 部署与导出 YOLO 格式的实操记录CVAT 部署其实没有想象中复杂装好 Docker 的前提下几条命令就能起来git clone https://github.com/cvat-ai/cvat cd cvat docker compose up -d等服务启动后浏览器访问本机 8080 端口用默认账号登录。首次进去后在用户设置里改掉默认密码然后创建项目时把任务涉及的所有类别都定义好。这里有一个非常关键的点项目里类别顺序要和最终 data.yaml 保持一致。CVAT 的标签顺序会直接影响导出 txt 文件里类别索引的编号顺序不一致转换脚本就要做额外映射麻烦且容易错。标注页面里要注意几个效率设置打开“自动保存”设置短一点的定时保存间隔启动标注时按空格键切换当前类别画框时按住鼠标拖拽到目标边缘。多人协同时CVAT 可以分配任务给不同账号任务分配时建议按“同一段视频由同一个人完成”避免不同人的框画法风格差异过大。我记得最早一次多人标注两个人对“遮挡目标要不要画完整框”有完全不同的理解最后模型怎么训都感觉不稳。后来规定了统一标注规范只要能看到目标主要部分就标被遮挡超过一半就不标差异立刻小了很多。导出时在任务列表里选择“导出数据集”格式选 YOLO 1.1会下载一个 zip 包。里面的目录结构和 Ultralytics 要求的 images/labels 组织方式不同通常需要写个小脚本把图片和 txt 重新归档成 4.1 节里的目录结构并同步生成 data.yaml。5.3 让标注效率翻倍的预标注与批处理技巧标注的核心痛点是慢。解决慢的最有效方式是预标注用一个已经训练好的模型不一定是 YOLO26其他 YOLO 版本也行先对要标注的图片做一轮推理把预测结果导入标注工具作为初始标注再由人工来修框和删错。CVAT 里可以接模型做自动标注也能通过 API 将外部模型的预测结果转成 CVAT 的标注格式再导入。这样做的效率提升非常可观。人工从零画一个框平均需要几秒而修正一个已经画好的框只需要一次拖拽差距接近十倍。尤其对视频抽帧得到的连续图像预标注的效果通常很好人工只需要做校对和纠错。我自己常用的流程是这样的先用现有模型对所有新采集图片做预测筛出预测置信度高的图用预标注结果直接进入人工抽检环节置信度低或没有检测结果的图再安排人工逐张标注。这样的策略让数据迭代速度提升非常明显也让有限的人力集中在模型真正搞不定的困难样本上。还有一个常见场景是处理超高分辨率图像比如遥感图像、无人机航拍图。直接把大图扔给 YOLO26 训练目标往往小到无法辨认标注工具也会因为图片过大而卡顿。我的做法训练前先按固定尺寸比如 1024×1024把大图切成块切块之间保留一些重叠区域避免目标正好被切在边缘被截断然后用切好的小图做标注和训练。推理阶段也用同样的切图-预测-拼合流程精度会有显著提升。mmrotate 这类做旋转检测的工具链里切图几乎是必须的前置步骤这个思路是通用的。6. 训练前最后一道阀门标注质量验证6.1 可视化检查与统计检查并行标注完成不等于可以直接训练。我在每次标注结束后都会做一道强制检查随机抽取训练集里 20%~30% 的图片把标注框画出来用肉眼看一遍是否存在明显的类别错标、框不贴边、漏标等问题。用 OpenCV 就能快速写一个可视化脚本import cv2 image_path datasets/mydata/images/train/000001.jpg label_path datasets/mydata/labels/train/000001.txt class_names [person, car, dog] img cv2.imread(image_path) h, w img.shape[:2] with open(label_path, r, encodingutf-8) as f: for line in f.readlines(): parts line.strip().split() cls int(parts[0]) cx, cy, bw, bh map(float, parts[1:]) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names[cls], (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imwrite(check_000001.jpg, img)同时还要做统计检查。统计每个类别在训练集和验证集中的图片数、实例总数再算一下标注框宽高的分布情况。如果某个类别只有训练集有、验证集一张都没有最终验证时的 mAP 指标就会失真。如果某类目标的框普遍又小又多就要考虑小目标增强策略如果某些框的面积比例接近 1则大概率是整张图被误标成了一个大框需要重点检查。6.2 常见标注错误的清单与修复思路最后整理一个我多年项目里遇到最多的标注错误清单如果你训练效果不理想可以对照排查一下自己的数据集。错误类型表现修复建议类别错标同类物体有的标成 A 有的标成 B重新统一规范抽回含该类别的图片逐张核对框不贴边框比实际目标大一圈或切掉目标一部分设定统一标注标准边缘要紧贴目标外接矩形漏标重叠目标多个目标堆叠时只标了露在外面的规定重叠目标凡主体可见必须逐个标注遮挡目标处理不一致同一项目有人标完整的框有人标可视部分的框统一标准只标注可见主体严重遮挡直接剔除边界目标目标被图像边缘切断框贴边主体缺失过半的目标删除或忽略类别不平衡某类几百个框另一类几十个框补充采集少样本类别或考虑对少样本类别调高 loss 权重空标注文件过多大量图片没有对应有效标注确认是负样本还是标注遗漏负样本图也要有策略地加入训练标注错误基本不可怕可怕的是错误类型不一致。数据标注这件事主观判断空间很大同一个目标有人觉得需要把人连同手里的工具都包进去有人觉得只包身体躯干就行。多人协作时这个问题会被进一步放大。所以团队每个人的标注口径必须一致动手标注之前先立规矩比事后返工重要得多。在我自己的 YOLO26 项目里数据集和标注相关工作通常占整个项目 70% 的精力模型训练和调参反而只占很小一段。很多人喜欢追着结构改进跑但最后把模型从“能跑”推到“能用”的往往还是数据这一侧。如果你刚开始尝试 YOLO26 训练自己的数据集我的建议是不要一上来就标几千张图先拿 100 张图跑通“标注 - 训练 - 检测 - 可视化”全流程确认每一步没有坑再扩展到完整数据集。这个流程跑过一遍之后那些格式、目录、类别顺序的坑就都提前踩完了后面扩数据只是重复劳动而已。数据标注说白了就是把你对目标边界的理解翻译给模型听翻译得准确、一致模型才能学得又快又稳。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SAP CO成本管理模块全解析:从配置到实战的51个核心要点 2026/9/5 4:39:41

SAP CO成本管理模块全解析:从配置到实战的51个核心要点

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

阅读更多 →
ADC省IO读取多档旋钮与Modbus RTU浮点字节序调试实战 2026/9/5 4:39:41

ADC省IO读取多档旋钮与Modbus RTU浮点字节序调试实战

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

阅读更多 →
指数移动平均与一阶低通滤波:同一个递推式的工程实践 2026/9/5 4:39:41

指数移动平均与一阶低通滤波:同一个递推式的工程实践

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

阅读更多 →
电机反接制动:速度与时间继电器控制方案详解与实操 2026/9/5 4:39:41

电机反接制动:速度与时间继电器控制方案详解与实操

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

阅读更多 →
ClaudeCode三件套:构建可定制、成本可控的AI编程工作流 2026/9/5 4:39:41

ClaudeCode三件套:构建可定制、成本可控的AI编程工作流

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

阅读更多 →
微服务架构中的系统内耗:从通信断裂到数据不一致的解决方案 2026/9/5 4:36:41

微服务架构中的系统内耗:从通信断裂到数据不一致的解决方案

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞