棉花病害目标检测实战:YOLO标注格式解析与训练避坑指南
简介棉花植物病害图像目标检测标注数据面向深度学习目标检测入门与进阶开发者可用于YOLO系列模型训练、调参及改进实践。数据覆盖枯萎病、卷曲、灰霉、叶斑病及健康叶片等六类常见状态并已划分训练集、验证集与测试集类别映射参考classes文件可直接用于模型训练与指标评估。资源包共两千个文件以一千九百九十九个YOLO格式文本标注文件为主另含一个Python可视化脚本压缩包整体约一百五十七兆字节。目前已有四十七人学习数据规模对应约四千六百张棉花病害图像的标注信息配合可视化脚本可快速审查标签质量降低人工校验成本。对正在实践YOLOv5或目标检测改进方案的学习者而言这套标注数据能节省大量数据准备时间便于将精力集中在模型结构设计与参数优化上。1. 棉花植物病害图像目标检测数据4,600张标注图能做什么做棉花巡检项目的人最容易卡在第一步图拍回来了病害区域却没人标YOLO训练脚本写得再顺也无处发力。棉花植物病害图像目标检测数据这类已标注数据集价值就是把最费人力的图片采集、病斑框标注和格式整理一次做完约4,600张图和配套标签按YOLO标注格式的txt文件放好解压后可以直接进入目标检测训练流程。它适合两类人一是刚接触YOLO的工程师想在一个干净数据集上跑通“数据读取→训练→评估→部署”全链路二是做农业病害识别落地的团队先用它验证方案可行性再补自己的田间数据。它能解决冷启动问题但替代不了现场采样后续效果取决于标注质量、病害类别分布和你对数据的分割方式。2. 读懂YOLO标注格式标签结构、可视化验证与格式转换2.1 YOLO标签一行五个数类别ID加归一化坐标所谓YOLO标注格式并不是图片里直接写了框而是每张jpg旁边放一个同名的txt文件。打开任意一个txt里面每一行描述一个病斑或受害区域。比如一行是1 0.512 0.483 0.214 0.168第一个数字是类别ID后四个数字依次是框中心点x、中心点y、宽度、高度全部做了归一化处理。归一化意味着坐标已除以图片像素尺寸取值落在0到1之间。不管原始图片是1024×768还是4000×3000标签都不受分辨率影响。训练时YOLO把自己设置的imgsz重新缩放图片标签不需要重新计算这套设计让YOLO格式能跨分辨率通用。字段含义取值范围第一个数类别ID从0开始0到nc-1第二个数框中心点x坐标除以图片宽0到1第三个数框中心点y坐标除以图片高0到1第四个数框宽度除以图片宽大于0通常不超过1第五个数框高度除以图片高大于0通常不超过1一张图有几个病斑txt里就写几行。没有病害目标的图不生成txt或者保留0字节txt。“已标注”在这里的含义是图片和txt一一对应而不是给你一个看不懂的JSON压缩包。拿到数据后先别急着训练打开几个文件确认上面这套结构是成立的。如果发现某行只有四个数或者类别ID从1开始而不是从0开始说明这批数据可能经过其他工具导出必须做一次格式统一。2.2 把标签画回原图训练前最便宜的质量检查我拿到任何检测数据第一步都是把标签画回原图。标注质量直接影响模型上限尤其“已标注”这种描述更要自己验证一遍。框是紧贴病斑边缘还是包住半张叶子类别有没有标反这些靠肉眼扫几十张图就能发现比训练完再查指标快得多。import cv2 from pathlib import Path # 示例类别清单实际以数据集的类别顺序为准 class_names [炭疽病, 角斑病, 枯萎病, 棉铃虫为害] out_dir Path(preview) out_dir.mkdir(exist_okTrue) for img_path in Path(images).glob(*.jpg): txt_path Path(labels) / (img_path.stem .txt) if not txt_path.exists(): print(f[缺标签] {img_path.name}) continue img cv2.imread(str(img_path)) if img is None: print(f[坏图] {img_path.name}) continue h, w img.shape[:2] lines txt_path.read_text(encodingutf-8).strip().splitlines() if not lines: print(f[空标签] {img_path.name}) continue for line in lines: parts line.strip().split() if len(parts) ! 5: print(f[格式错] {img_path.name}: {line}) continue cls_id, xc, yc, bw, bh map(float, parts) # 归一化坐标换算回像素坐标 x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.putText(img, class_names[int(cls_id)], (x1, max(0, y1 - 6)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.imwrite(str(out_dir / img_path.name), img)脚本逻辑很简单按图片名找到同名txt逐行解析把归一化坐标乘回图片宽高画框和类别名。有个细节容易踩坑img.shape[:2]拿到的是(高, 宽)不是(宽, 高)新手在这里翻车框全部画歪。另外glob(*.jpg)只匹配jpg如果数据里有png改成glob(*.*)再判断后缀。strip().splitlines()会把空文件变成空列表顺带查出0字节标签。参数说明class_names的顺序必须和data.yaml里的names一一对应否则框上显示的文字和实际内容对不上。预览图建议随机抽100张以上不要只看前10张文件排序时同一批采集图片往往排在一起看前10张等于只看了一个场景。2.3 从YOLO转成COCO或VOC不是必须但要知道边界不少人对“标准格式”有执念拿到YOLO txt还想转成COCO。常见做法是写一个转换函数把归一化框换算回像素坐标。COCO里bbox是像素单位[x_min, y_min, width, height]类别ID在不同框架里有从0开始和从1开始两种约定需要额外留意。def yolo_line_to_coco(line, img_w, img_h): cls_id, xc, yc, bw, bh map(float, line.strip().split()) x_min (xc - bw / 2) * img_w y_min (yc - bh / 2) * img_h return int(cls_id), [x_min, y_min, bw * img_w, bh * img_h]这个函数只做了坐标单位换算并没增加任何新信息。所以什么时候才值得转你要把数据喂给MMDetection、DETR等框架或者合作方只认COCO格式。如果就是用Ultralytics的YOLO训练直接保留txt即可转换只会多一层出错可能。从VOC的XML转YOLO时也要小心XML里是像素单位的xmin, ymin, xmax, ymax转成中心点坐标时要先除以图片宽高常见的错误是忘记归一化直接把像素值写进txt训练时loss直接乱掉。3. 用4,600张已标注数据训练棉花病害目标检测模型目录配置与参数选择3.1 数据目录与data.yaml先让YOLO认识这批数据Ultralytics YOLO的默认约定是图片目录和标签目录分开train/val各建一套子目录。拿到数据后我一般会先重排成下面这种结构后续训练和查错都方便。cotton_disease/ ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ └── ... │ └── val/ │ ├── 0101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── 0001.txt │ │ └── ... │ └── val/ │ ├── 0101.txt │ └── ... └── data.yaml这套排布不是硬性要求data.yaml里的路径与实际位置对上就行。标签目录不用写进yamlUltralytics会自动在images同一级目录下找labels。path: /home/user/datasets/cotton_disease train: images/train val: images/val nc: 4 names: 0: anthracnose 1: angular_leaf_spot 2: fusarium_wilt 3: bollworm_damagepath写绝对路径最稳相对路径取决于执行命令时的工作目录经常有人在这里对不上。nc必须等于类别数量names顺序要和txt里的类别ID一一对应。验证方法把上面那个画框脚本里的class_names按这里names的顺序填回去如果框上方类别名和图内容对不上说明映射反了。3.2 第一次训练最小命令行和必调参数环境准备就是pip install ultralytics第一次接触YOLO的零基础读者也可以先跑通再细看参数。第一个训练命令我用得很保守yolo detect train \ modelyolov8s.pt \ datadatasets/cotton_disease/data.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns \ namecotton_base这条命令做了三件事加载COCO预训练权重、读取数据集配置、开始训练并把结果写到runs/cotton_base。第一次跑不要急着堆参数建议先把epochs临时设成1确认目录和代码无误后再改回去。否则训练到中途才发现data.yaml路径写错白跑几小时。参数的选择逻辑要清楚。modelyolov8s.pt里的s是YOLOv8系列的小规格对农业目标检测是稳妥的起步点。4,600张图量级不算大用x规格容易过拟合n规格虽然快但对小病斑的拟合能力弱。换用Ultralytics的v11也是同一套命令模型文件换成新权重即可。imgsz640是训练分辨率棉花病斑往往只占图片很小区域如果小目标多优先升到960代价是训练时间几乎线性变长。batch16取决于显存爆显存就降到8或4。batch过小会导致BN统计不稳定表现为loss震荡明显。device0指第一块GPU用CPU训练速度慢得多不建议。3.3 训练完看哪些文件mAP50、mAP50-95和混淆矩阵训练结束后runs/cotton_base目录下会生成一串文件。重点只看四个weights/best.pt、weights/last.pt、results.png和confusion_matrix.png。前两个是权重后两个是评估依据。指标含义判断经验mAP50IoU阈值0.5时的平均精度比较容易到0.8以上但不足以代表真实可用mAP50-95IoU从0.5到0.95逐档平均更严格一般比mAP50低10到20个百分点精确率P预测框里有多少是对的误检多时下降召回率R真实框有多少被找到漏检多时下降混淆矩阵类别间的互相错检棉花叶片相似症状常互相串mAP50-95是把IoU阈值从0.5逐步提到0.95每档算一次平均精度再取平均它比mAP50更看重框和真实位置的贴合度。如果mAP50不错但mAP50-95上不去多半是框的边界不够紧或者病斑太小带来的定位误差。训练完后做一次推理验证也是必须的yolo detect predict \ modelruns/cotton_base/weights/best.pt \ sourcedatasets/cotton_disease/images/val \ imgsz640 \ saveTrue生成的预测图会保存在runs/detect下。不要只看数字把预测图翻出来尤其看验证集里那些标了框但模型没检出来的图。这比任何指标都直观。4. 棉花病害数据避坑训练前后最常遇到的5个问题4.1 类别ID对不上训练能跑但指标莫名其妙低现象训练全程不报错但验证集mAP50一直很低或者某个类别永远检不出来。把推理图打开发现框的位置是对的框上的类别名却是错的。原因YOLO标签里cls_id是数字类别含义完全靠data.yaml的names顺序翻译。如果这批数据是从其他标注工具导出的类别ID顺序很可能和你写的names不一致。常见情况是原数据集按类别名首字母排序而你按自己的印象写names两边错位。解决训练前做两件事。第一用画框脚本把标签和names一起画回原图抽100张肉眼核对。第二写几行统计代码确认每个类别ID在train/val里都有样本ID是0到nc-1连续且没有跳号。如果发现ID错位训练前一次性批量修正而不是在训练途中补。4.2 归一化坐标越界训练中期loss会变成NaN现象模型训练到某几个epochloss突然变成nan或inf之后不再恢复。也有人训练没崩但推理时预测框超出图片一大截。原因标签里出现负数、大于1的坐标或者width/height被标成0。这多半是标注工具导出时没有对图像边缘的框做裁切或者手工编辑txt时手误。YOLO对越界框的容错有限极端值会在损失计算时把梯度冲爆这是许多人遇到NaN后最先应该查的地方。解决训练前跑一遍检查脚本把越界行找出来。from pathlib import Path nc 4 # 按实际类别数修改 def check_labels(label_dir): bad [] for txt_path in Path(label_dir).glob(*.txt): for line in txt_path.read_text().strip().splitlines(): parts line.strip().split() if len(parts) ! 5: bad.append((txt_path, 列数错误, line)) continue cls_id, xc, yc, bw, bh map(float, parts) if not (0 cls_id nc): bad.append((txt_path, 类别ID越界, line)) if not (0 xc 1 and 0 yc 1): bad.append((txt_path, 中心点越界, line)) if bw 0 or bh 0 or bw 1.5 or bh 1.5: bad.append((txt_path, 宽高异常, line)) return bad bad_list check_labels(labels/train) for item in bad_list: print(item)这段脚本按“能否被YOLO安全消费”做底线检查类别ID、中心点、宽高三个维度都会查。宽高上限我留了1.5的余量因为手工标注边缘框时偶尔会略微超界。如果这批数据边缘框很多先用裁剪脚本把框裁到图像边缘再重新归一化比在训练时硬扛更稳。4.3 空标签与纯背景图负样本比例不能失控现象训练完成后某个类别的precision高但recall低或者在验证集上把纯背景框出一推目标。翻数据一看不少图没有txt或者txt是0字节。原因采集时把没发病的叶片、土壤背景也一起打包了。YOLO把无标签图片当负样本参与训练少量负样本能压误检但比例太高模型就学不出“这里到底该不该框”。解决先统计无标签图片数量。如果只有几十张可以保留在训练集里当负样本占比控制在10%以内如果超过20%优先检查图片采集合围再决定是否删图。验证集里不要放无标签图否则每张无目标的验证图都会被强行参与计算mAP被明显拉低。4.4 类别不均衡张数和框数是两个口径现象整体mAP50不错但看混淆矩阵A类把大量B类样本错检成AB类召回率只有0.3。训练日志里B类loss也降不下去。原因棉花病害天然不均衡。炭疽病病斑小而多枯萎病可能整株才一两个框。4,600张是“图像张数”不是“标注框数”统计时要按框数看。某个类别虽然出现在很多张图里但每张只有一个框总框数占比可能只有5%模型对它的学习严重不足。解决先按类别统计训练集的框数分布from pathlib import Path from collections import Counter counter Counter() for txt_path in Path(labels/train).glob(*.txt): for line in txt_path.read_text().strip().splitlines(): counter[int(line.split()[0])] 1 print(counter)counter统计的是每个类别ID出现的框数。如果发现某个类的框数不到多数类的十分之一少样本类优先做图像级增强比如复制粘贴病斑块、局部放大裁剪比直接调类别损失权重更稳。把imgsz提高到960也会帮小目标占优。最有效的还是补数据模型学不到数据里不存在的外观特征。4.5 train/val划分串图指标虚高的假象现象训练时mAP50到0.9以上拿到另一块地的照片一测掉到0.5。随手按0.8/0.2随机划分训练集和验证集里出现了同一株棉花的连续照片。原因很多数据集打包时按采集批次排列随机分割很容易把同一植株、同一病害的不同角度照片分到两边。模型看着在测验证集实际在考背诵记忆换一批真正没见过的田间照片就露馅。解决划分前先按采样来源分组。常见做法是给图片文件名加地块编号或拍摄日期前缀然后用GroupShuffleSplit按组划分保证同一组图片只出现在训练集或验证集里。如果数据本身没给这些信息至少按文件名前缀聚类后再随机抽样。验证集宁可少也不要交叉。5. 评估再进一步交叉验证、难例收集和部署前的吞吐实测模型训练完不要只盯着mAP。先把4,600张数据跑一次5折交叉验证用每一折mAP的均值和方差评估数据集本身的稳定性。随机划分对4,600张这种量级来说偶然性很大某一折如果明显掉点先查那一折的验证集是不是恰好集中了某个稀有类别。这样做能提前发现数据分割问题而不是等部署后再翻车。还要主动收集难例。在每折验证集上导出预测图凡是你自己看着像病斑、模型却漏掉或误检的样本单独挑出来。枯叶边缘、虫粪、水滴反光、药害斑点这些都会让模型产生假阳性。把它们收成一个难例文件夹后期补标比盲目加数据更有效。我在一个项目里试过只靠难例补标误检率下降比加普通图快得多。最后是部署前的实测。把best.pt导出成ONNX或TensorRT engine在目标设备上用实际工作分辨率做一次连续检测压力测试。不要只看单帧FPS要看视频流接入后延迟是否稳定、显存占用有没有缓慢上涨。通过导出命令yolo export modelbest.pt formatonnx做完转换后在目标设备上跑一段真实采集数据观察中间帧的预处理和后处理是否成为瓶颈。多个项目里结论都一样卡顿往往不在网络推理而在图像缩放和框后处理队列。有一回我图省事跳过画框预览直接训练结果类别ID错位跑了一周才发现后来每次拿到新数据都老老实实先做可视化检查。4,600张已标注数据是很好的起点但从这份数据开始养成验证习惯比它本身更有价值。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

SQL Server 2000 数据库深度压缩实战:从20GB到8GB的瘦身指南

SQL Server 2000 数据库深度压缩实战:从20GB到8GB的瘦身指南

简介:这份资源聚焦SQL Server 2000数据库文件的深度压缩,面向仍在使用该版本数据库的运维与开发人员,解决企业管理器“收缩数据库”效果不佳、删除数据后冗余空间无法彻底释放的问题。资源包共1个docx文档,约256KB,以图…

2026/10/11 14:41:41 阅读更多 →
企业微信API对接Java SDK封装实战:Token管理与回调验签

企业微信API对接Java SDK封装实战:Token管理与回调验签

做企业微信API接口对接这两年,我最大的感受是:大部分团队写集成代码,不是做不出来,而是把整个项目写成了一个"大泥球"。登录逻辑、HTTP调用、Token缓存、错误处理、回调验签全部塞在同一个工具类里,一个类上…

2026/10/11 14:41:41 阅读更多 →
手撸词法分析器:从正则表达式到最小化DFA的完整实现

手撸词法分析器:从正则表达式到最小化DFA的完整实现

简介:本资源是西南科技大学《编译原理》课程配套的词法分析实验报告,面向计算机专业本科生及编译技术初学者,聚焦编译器前端核心环节——词法分析程序的设计与实现。报告系统覆盖正则表达式建模、NFA构造与确定化、DFA最小化、单词分类规则定…

2026/10/11 14:41:41 阅读更多 →

最新新闻

让 GitHub README 动起来还不超重:beautify-github-readme 动效 GIF 生产完整指南

让 GitHub README 动起来还不超重:beautify-github-readme 动效 GIF 生产完整指南

【免费下载链接】beautify-github-readme 整理并设计仓库 README,让项目价值、真实案例、安装方式与使用边界更容易理解。 项目地址: https://gitcode.com/gh_mirrors/be/beautify-github-readme 点击查看 免费下载 beautify-github-readme 是一个为 Gi…

2026/10/11 15:30:07 阅读更多 →
CoreCoder上下文管理原理揭秘:三层压缩策略如何让AI Agent扛住超长编程任务

CoreCoder上下文管理原理揭秘:三层压缩策略如何让AI Agent扛住超长编程任务

【免费下载链接】CoreCoder Minimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder. 项目地址: https://gitcode.com/gh_mirrors/co/CoreCoder 点击查看 免费下载 …

2026/10/11 15:30:07 阅读更多 →
Ender如何管理浏览器依赖树?依赖解析、排序与buildTree可视化深度剖析

Ender如何管理浏览器依赖树?依赖解析、排序与buildTree可视化深度剖析

开发工具 【免费下载链接】Ender the no-library library: open module JavaScript framework 项目地址: https://gitcode.com/gh_mirrors/en/Ender 点击查看 免费下载 Ender 是一款面向浏览器的 JavaScript 包管理工具,被称为"NPM 的小妹妹"…

2026/10/11 15:30:07 阅读更多 →
鲁米星高铝硅玻璃 表面粗糙度Ra<1nm 可加工AG防眩与AF防指纹 覆盖新能源汽车仪表盘及充电桩屏幕 现货供应

鲁米星高铝硅玻璃 表面粗糙度Ra<1nm 可加工AG防眩与AF防指纹 覆盖新能源汽车仪表盘及充电桩屏幕 现货供应

从一块玻璃看新能源产业的面子工程 近年来,随着新能源汽车渗透率不断攀升,车内人机交互界面正在发生一场静悄悄的。仪表盘从机械指针转向全液晶显示,中控屏幕越做越大、集成度越来越高,充电桩也从单纯的供电设备演变为带显示屏的智…

2026/10/11 15:30:07 阅读更多 →
CDP 7.3.1(Cloudera Runtime 7.3.1)VS Acceldata ODP 3.3.6.4 核心引擎详细版本对比

CDP 7.3.1(Cloudera Runtime 7.3.1)VS Acceldata ODP 3.3.6.4 核心引擎详细版本对比

CDP Private Cloud Base 7.3.1(Cloudera Runtime 7.3.1)VS Acceldata ODP 3.3.6.4 核心引擎详细版本对比说明:CDP 7.3.1:所有组件为 Cloudera 基于 Apache 社区分支做定制增强,带 Cloudera 私有补丁;无 Tri…

2026/10/11 15:30:06 阅读更多 →
autobind-decorator API速查表:boundMethod与boundClass完整参考指南

autobind-decorator API速查表:boundMethod与boundClass完整参考指南

【免费下载链接】autobind-decorator Decorator to automatically bind methods to class instances 项目地址: https://gitcode.com/gh_mirrors/au/autobind-decorator 点击查看 免费下载 autobind-decorator 是一个轻量级 JavaScript 装饰器库,能自动…

2026/10/11 15:29:06 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →