Ultralytics YOLO预测全攻略:参数调优与结果解析

1. 我为什么建议把预测这件事直接押在Ultralytics上

1.1 传统YOLO预测流程里,真正麻烦的不是模型代码

刚接触YOLO预测的时候,很多人的第一反应是去网上找各种版本的源码仓库,下载权重,再翻半天文档,最后发现还要自己写预处理、写后处理、写NMS、写绘制框的代码。模型本身反而是最省事的,真正耗时的是模型之外那堆“脏活”。

我自己也经历过这个阶段。最早做目标检测预测,光是处理输入图片尺寸就绕了很久:图片要等比例缩放、要补边、要归一化,还得注意颜色通道的顺序。如果中间任何一步和训练时不匹配,模型输出就会变得很奇怪,不是框偏了,就是什么都检不出来。后来切换到Ultralytics库,才意识到这些重复劳动本来就不该让使用者自己扛。

Ultralytics库做的事情,简单说就是把YOLO从“需要自己拼装的零件”变成“插上电就能用的工具”。它对预测场景做了一套完整封装,从加载权重、图像预处理,到推理、非极大值抑制,再到结果对象化和可视化,全部统一在predict接口里。对刚学习Python做预测的读者来说,这是一条成本最低的路径。

1.2 适合入门预测的封装粒度:predict() 到底帮我做了什么

很多教程会直接丢一句model.predict(source),但你如果不知道调用背后发生了什么,出了问题往往无从下手。我习惯把predict拆成四个阶段来理解:

  • 预处理:把输入图片按模型训练时的规则做缩放、填充、归一化;
  • 推理:前向传播,输出一组多维张量;
  • 后处理:把张量解析成边界框、置信度、类别编号,再做NMS去除重叠框;
  • 结果封装:把上面的数据包装成Results对象,同时提供画图、保存、导出等方法。

这四个阶段听起来不多,但每一步都藏着大量边界情况。比如输入是一张手机拍的竖图,训练时模型见惯了横图,预处理就得自动判断长边和短边;比如视频流中某一帧是坏的,预测接口也得能正常跳过而不是直接崩溃。Ultralytics把这些都处理掉了,所以入门者才能用几行代码跑通流程。

这也是我建议先学它再做原理深挖的原因。只有先看见“正确预测”长什么样,回头去研究那些源码细节,才知道每个参数设计得有多讲究。反过来,如果一上来就啃底层实现,很容易迷失在张量维度里。

2. 环境准备与模型文件:先把这个环节做成开箱即用

2.1 版本组合:Python、PyTorch、Ultralytics怎么配

按我的经验,预测场景的环境搭建设有想象中那么复杂,但版本不匹配确实能让人卡一下午。最常见的坑包括:Python版本太老,装不上新版PyTorch;PyTorch是CPU版,结果慢得离谱;Ultralytics库本身依赖与已装包冲突,安装时被强行覆盖。

一个稳妥的组合是:Python 3.9到3.12之间,PyTorch 2.0以上,Ultralytics库保持较新版本。如果你只是做CPU推理,用pip install ultralytics会自动拉取依赖;如果要用GPU加速,建议先把PyTorch装成对应CUDA版本,再装Ultralytics,避免pip自行选择到CPU版。

# 先确认Python版本 python --version # 安装PyTorch GPU版,以CUDA 11.8为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 再安装Ultralytics pip install ultralytics

如果你用的是国内网络环境,装完以后跑一次官方Demo确认安装完毕。注意,不要同时装多个YOLO相关仓库,有些包会互相覆盖名为yolo的命令行入口,最后会出现“命令找不到”或者“命令行为异常”的诡异现象。

2.2 拿到模型文件后先做一次“体检”

很多人拿到一个.pt文件就想直接预测,我建议先做两步体检,能省下很多排查时间。

第一步,看模型文件本身。用Python加载后,直接打印模型摘要:

from ultralytics import YOLO model = YOLO("your_model.pt") print(model)

输出会显示模型类型、层数、参数量、类别数等基本信息。如果类别数和你预期的不一致,说明权重文件不是你要的;如果打印出来是空对象,说明文件加载阶段就出了问题。

第二步,验证推理通道。随便找一张测试图片跑一次预测,不要求结果准确,只要不报错、能输出结果对象就行。这一关过了,说明模型、预处理、后处理链路是通的。之后再换成真实数据调参,心态会稳很多。

2.3 第一次加载模型的常见报错

我整理了几类经常会遇到的报错,建议收藏起来对照排查:

报错现象常见原因处理方式
cannot import name依赖版本太旧,缺少新接口升级torch、torchvision、opencv-python
加载后预测报维度错误写入权重时用的网络结构和加载时不一致确认任务类型:检测、分割、分类不能混用
报缺少yaml文件模型包内配置文件缺失或路径错误重新下载完整权重包
GPU版本正常但速度极慢实际加载到CPU设备显式指定device=0并检查CUDA是否可用

记得有次我帮别人排查,对方一直报KeyError,最后发现是从一个在线训练平台导出的权重,文件的键名格式和本地库版本不兼容。重新用相同版本的库导出一次就正常了。这里也提醒大家,模型文件不是拿到就能用,训练环境与推理环境最好保持版本一致。

3. 一行预测的背后:source、conf、iou、device 的使用逻辑

3.1 最小可运行的预测代码

环境搭好以后,最小可运行的代码就是下面这几行:

from ultralytics import YOLO model = YOLO("yolov8n.pt") results = model.predict(source="image.jpg", conf=0.25, iou=0.45, device="cpu")

这个示例里包含四个最常用的配置:source告诉接口数据从哪里读,conf控制置信度门槛,iou控制重叠框合并的激进程度,device指定计算设备。第一次跑通的人往往容易忽略:result不是一个简单数组,而是一个Results对象列表,用起来需要额外熟悉。

如果你在交互式环境里写代码,可以直接把results打印出来看结构。你会发现每个元素都对应一个输入数据源,包含该源的原始图像信息、处理后的检测框数据、类别数据以及可视化方法。把那几个内置方法摸熟,就能覆盖绝大多数预测需求。

3.2 每个核心参数实际在控制什么

单独看参数名,conf和iou都挺抽象的,我用两句话解释一下:

conf是置信度阈值,低于这个值的候选框会被直接丢弃。比如conf=0.25就相当于说:模型对这个框的判断至少要有25%的把握,不然就别告诉我它是个目标。iou是NMS阶段判断两个框是否算“重叠”的标准,交并比高于阈值的两个框,只保留置信度更高的那个。

你可以把这两个参数理解成筛选漏斗的两层网:conf是初筛网,负责把低质量的预测丢掉;iou是精筛网,负责合并同一物体上重复的框。两者配合,才能既留住真实目标,又避免出现一堆套在一起的方框。

实际调参时我的建议是:先固定iou=0.45不动,单独调整conf。随着项目要求不同,conf可以从0.15调到0.7,但不要一开始就设太高,否则模型输出中原本正确但置信度偏低的检测框会被全部误杀。

3.3 训练时用的 size 和预测时用的 imgsz 为什么不能拍脑袋

再讲一个容易被忽略的参数:imgsz,也就是预测时的输入尺寸。很多人直接用默认值跑测试图片,结果发现小目标的检测效果非常差。

原因在于,训练时模型输入尺寸决定了特征图的分辨率习惯。比如用640训练,模型的浅层特征图已经习惯了某种感受野;中级和高级特征图对不同尺寸目标的响应能力也不一样。预测时如果突然改为更大的imgsz=1280,有时能提升小目标检测率,但会明显增加计算量;如果突然调小到320,速度上去了,但大目标可能因为信息丢失而被漏检。

所以我建议预测尺寸围绕训练尺寸上下浮动,起步先用相同尺寸。想要提高小目标检测,再分档测试768、960、1280这几档,结合自己的硬件跑一遍,选一个速度与精度平衡的点。不要今天觉得慢就调小,明天觉得漏检又调大,那样问题很难归因。

4. 结果对象并不神秘:提取框坐标、置信度和类别

4.1 Results 里到底存了什么

当你拿到results这个对象,可能会好奇它到底存了什么。我一般先告诉读者,把它当成一个“工具箱”就好,里面既有原始输出,也有经过解析的数据,还挂着一组方法。

最常用的是下面这些:

属性/方法作用使用示例
boxes存放检测框信息boxes.xyxy、boxes.conf、boxes.cls
names类别编号到名称的映射字典model.names[0]
plot()把检测结果画在图上result.plot()
save()保存可视化图片result.save(filename="out.jpg")
tojson()导出为JSON格式result.tojson()

从易用到易错的角度看,boxes是最值得仔细读的部分。它里面有xyxy、xywh、conf、cls这几个常用字段。xyxy是标准化的矩形框坐标,也就是左上角和右下角两组坐标;xywh则是中心点坐标加宽高,适合做跟踪或者转成其他格式。

4.2 把结果快速转成自己的数据结构

你迟早会需要把自己的业务参数和检测结果拼在一起。比如只保留置信度大于0.6的框,或者把坐标转成长宽比,再写入数据库。我可以给出一段示例代码,方便直接改:

import numpy as np detections = [] for result in results: boxes = result.boxes if boxes is None: continue xyxy = boxes.xyxy.cpu().numpy() conf = boxes.conf.cpu().numpy() cls = boxes.cls.cpu().numpy().astype(int) names = result.names for i in range(len(cls)): detections.append({ "bbox": xyxy[i].tolist(), "confidence": float(conf[i]), "class_id": int(cls[i]), "class_name": names[int(cls[i])], }) print(detections)

这里有个细节:如果你的模型在GPU上推理,boxes.xyxy拿到的是GPU张量,直接转numpy会报错。所以我在代码里先cpu()再numpy()。这个习惯建议从一开始就养成,不要等报错了再回头补。

如果你用的是分割模型或姿态模型,Results对象里还会有masks或keypoints属性。分割模型通常还会输出二值掩码数组,姿态模型输出各关键点坐标以及置信度,结构类似boxes,同样是张量格式,处理方式一致。

4.3 保存可视化结果时要注意的细节

plot()和save()虽然是封装好的方法,实际使用时仍有一些细节。默认情况下,plot()返回的是带检测框的RGB图像,直接保存没问题;但有时候我想在原本的相机画面里叠加更丰富的信息,会先获取原图数据,再自己用OpenCV画框。

另外要注意保存路径的命名。连续处理多张图片时,重复的save()会不断覆盖同名文件。我的习惯是给输出文件名加上时间戳或者原始文件名后缀,比如result_{filename}.jpg,避免后一张覆盖前一张。

还有一次我发现保存出来的图和显示的颜色不一致,排查以后才知道是因为OpenCV默认用的是BGR通道顺序,而Ultralytics内部已经做过颜色通道的转换。如果自己再转一次,颜色就会错乱。所以要么全程用结果对象里的图像数据做处理,要么统一在转换后处理,不要两头都碰。

5. 从单张图走到视频和摄像头:实时预测的节奏控制

5.1 不同数据源只用改 source,但处理逻辑要跟着改

Ultralytics的predict接口很省心,source参数可以直接传图片路径、文件夹路径、视频路径、摄像头设备号,甚至可以传一个张量。但不要以为换数据源只是改个字符串那么简单,处理逻辑有很大区别。

单张图片预测是一次性任务,跑完就能出结果。视频和摄像头则是一个连续序列,模型需要面对大量相似帧,还要处理时间维度上的冗余。如果每一帧都做完整的预处理和NMS,计算开销会很高,而且相邻帧之间会出现大量重复框。更好的做法是降低处理频率,或者把相邻帧合并后再推理。

从使用角度来说,我建议先跑视频文件,再考虑摄像头。视频文件不会受实时帧率约束,跑慢了也只是等待更久,至少能观察流程是否完整;摄像头实时性要求高,一旦模型推理速度跟不上摄像头采集速度,就会出现丢帧和画面卡顿。

5.2 为什么摄像头预测会丢帧,以及怎么缓解

摄像头预测丢帧是很常见的现象,根本原因是整套处理链路的速度跟不上采集速度。假设摄像头每秒采集30帧,模型推理一帧需要80毫秒,那么单线程处理下每秒最多处理12.5帧,剩下的帧只能被丢弃。

缓解方案大致有三类:

  • 降低输入分辨率,比如imgsz=640改为imgsz=416,速度提升明显;
  • 改用更轻量级的模型,比如从yolov8m降到yolov8n;
  • 把采集线程和推理线程分离,用队列缓存最近的帧,让推理线程专注处理队列中的数据。

第三种方案在工程上最实用。采集线程只负责读摄像头并放入队列,推理线程只负责从队列取帧。这样即使推理速度略慢于采集速度,画面也不会卡死,只会被淘汰掉部分旧帧。相比逐帧同步处理,整体体验会好很多。

5.3 用 stream=True 的正确姿势

predict接口对于视频和摄像头场景,有一个参数叫stream。默认情况下,接口会把所有结果一次性返回,这在处理视频时意味着会将所有帧的结果都攒在内存里,长视频很容易把内存吃满。

所以在处理视频或摄像头时,我的建议是显式设置stream=True,让接口变成生成器,逐帧返回结果:

results = model.predict(source="video.mp4", stream=True) for result in results: # 逐帧处理 boxes = result.boxes

这里有一个很多人踩过的坑:拿到第一个结果后发现,下次迭代的结果又慢了,或者中间出现奇怪的内存增长。原因通常是上一帧的结果对象没有被释放。因此循环体内尽量不要长期持有上一帧的引用,处理完该帧就把结果保存成自己需要的数据,或者直接丢弃。

还有一个容易被忽略的点:视频里可能存在大量不包含任何目标的空帧。在逐帧处理时,result.boxes可能为None,代码要做好判空,否则一遇到空帧就崩溃,整个视频预测就会中断。实际写代码时我习惯加一句:

if result.boxes is None: continue

这样程序才能真正在无人值守的情况下跑完整个视频。

6. 预测结果不对时的排查清单:我最常踩的坑都在这里

6.1 检测不到任何目标,先别急着调阈值

如果你发现模型跑完整张图片,结果一个框都没有,第一反应往往是把conf调到很低。但这么做经常治标不治本。正确的做法是先确认三件事:输入是不是正常、预处理有没有生效、测试目标是不是模型原本训练过的类别。

我遇到过一种情况:图片整体偏暗,模型输出里每个候选框置信度都非常低,调低conf到0.05后勉强出现几个框,但置信度如此低的检测结果根本没法用于业务。这时候更应该考虑的是对图像做亮度均衡或者直方图增强,而不是简单降低阈值。

我还遇到过更基础的错误,传入的图片路径指向的是一张全黑图或透明度很高的PNG。模型自然什么都检不出来。所以建议每次预测前,先用OpenCV读一次图片并检查尺寸和像素均值,确认数据真的是有效图像。

6.2 误检太多的时候,真正该动的是哪个参数

误检太多,就是画面上出现很多错误的目标框。这时候有人会把conf调高,有些场景确实有效;但如果你发现框都是同一类物体上的重复框,问题多半出在iou参数上,而不是置信度。

重复框现象的本质是模型对同一目标生成了多个高置信度候选框,NMS没有把它们合并干净。把iou从0.45降到0.3,合并条件更严,重复框会明显减少。反之,如果你觉得两个离得很近的真实目标被合并成了一个框,就要把iou适当调高一点,比如0.6,让NMS更宽容。

再补充一个经验:不同类别的目标分布密度不同,适合的阈值也会不同。如果你检测的是密集人群,低iou会把人框切得很碎;如果检测的是稀疏的车辆,低iou影响不大。所以正确做法不是背一个固定阈值,而是在自己的验证集上跑一组对比实验,把误检率和漏检率画成曲线再选点。

6.3 类别编号对不上,数据或者模型一定有一方出了问题

这种情况很容易出现在两类场景里:一是自己训练过模型,二是下载了别人的权重。模型输出的cls是整数编号,编号对应的名称在model.names字典里。如果你发现“检出了目标但标签完全对不上”,那多半是类别顺序错位了。

我见过一个典型案例:训练数据时类别顺序是["dog", "cat", "bird"],但推理代码里直接用了网上教程的["person", "car", ...]默认列表做映射。结果模型明明检测得很准,显示出来的标签却完全错误。这种问题非常隐蔽,因为你盯着框看会觉得框的位置都对,只有标签文字在乱跳。

排查的方法是打印出前几个结果的cls以及model.names,逐一比对实际目标是什么。如果你下载的是别人预训练好的权重,也要确认对方使用的数据类别顺序,而不是想当然地以为自己知道。模型不会骗你,它只会按照训练时的编号输出。

这些坑一个个排除下来,你就会发现YOLO预测本身并不是一个黑盒。它更像一组需要理解的参数组合,知道每个参数控制的是哪个环节,遇到问题就能按图索骥,而不是像以前那样盲目乱调。把conf、iou、imgsz、类别映射这四件事玩明白,图像、视频、摄像头场景的基本预测能力也就扎实了。

相关新闻

EmulatorJS 浏览器游戏模拟器完整使用指南:从部署到调参的快速上手

EmulatorJS 浏览器游戏模拟器完整使用指南:从部署到调参的快速上手

EmulatorJS 浏览器游戏模拟器完整使用指南:从部署到调参的快速上手 【免费下载链接】EmulatorJS A web-based frontend for RetroArch 项目地址: https://gitcode.com/GitHub_Trending/em/EmulatorJS 经典掌机和街机模拟器过去依赖桌面客户端,Emu…

2026/10/21 5:25:09 阅读更多 →
深入理解Containerd:容器运行时架构、实操与Kubernetes实践

深入理解Containerd:容器运行时架构、实操与Kubernetes实践

1. 为什么Containerd值得单独拎出来讲很多刚接触云原生的人,一上来就被Kubernetes、Docker、Containerd、CRI-O这一堆名词绕晕。我见过不少项目里的同事,明明宿主机上装着Docker,结果发现Kubernetes集群用的运行时根本不是它,而是…

2026/10/21 5:25:09 阅读更多 →
用Matlab求解二维稳态Navier-Stokes方程:有限元实现与方腔流模拟

用Matlab求解二维稳态Navier-Stokes方程:有限元实现与方腔流模拟

简介:二维稳态Navier-Stokes方程有限元求解程序是一套基于Matlab的完整实现,面向需要掌握有限元法求解流体问题的科研人员、工程师和高年级本科生。程序覆盖从几何离散、基函数定义、变分形式推导到矩阵组装、线性系统求解及后处理的全流程,并…

2026/10/21 5:24:09 阅读更多 →

最新新闻

iOS 15 ATT审核被拒两次?Xcode自动隐私清单解法揭秘

iOS 15 ATT审核被拒两次?Xcode自动隐私清单解法揭秘

1. 项目概述:一次被驳回两次的ATT权限申请,背后藏着什么真实逻辑? “苹果审核iOS 15版本App Tracking Transparency两次被驳回”——这个标题一出来,很多做iOS开发、运营或合规的同学第一反应是:又一个被ATT政策卡住的…

2026/10/21 6:12:29 阅读更多 →
多智能体动态事件触发共识控制的Matlab仿真与实现

多智能体动态事件触发共识控制的Matlab仿真与实现

多智能体系统的分布式协同控制,这些年无论是在学术界还是工业界都是个大热点。以前我们做多机器人编队、无人机集群、卫星星座协同这类课题时,最头疼的问题之一就是:怎么用最少的信息交互,还能保证所有智能体最终达到一致的状态&a…

2026/10/21 6:12:29 阅读更多 →
鸿蒙ArkUI开发:Slider滑块与Progress进度条从入门到工程实践

鸿蒙ArkUI开发:Slider滑块与Progress进度条从入门到工程实践

在鸿蒙应用开发的实际项目中,Slider和Progress这两个组件往往不会像Text、Button那样被单独拎出来讲,但它们恰恰是提升应用完成度与交互质感的关键细节。很多开发者在入门阶段容易忽略这两个控件,直到做播放器、设置页、上传下载状态展示时&a…

2026/10/21 6:12:29 阅读更多 →
ONVIF Java SDK实战:摄像头统一接入、RTSP取流与PTZ控制

ONVIF Java SDK实战:摄像头统一接入、RTSP取流与PTZ控制

简介:这份资源是一套基于Java的ONVIF协议开发SDK,面向需要对接网络摄像头、实现设备发现、鉴权与媒体流控制的开发者。包内共1157个文件,主体为1147个Java源码文件,另有少量jar依赖库(如commons-codec、javaWsDiscover…

2026/10/21 6:12:29 阅读更多 →
知识工作插件实战:搭建高效采集整理输出工作流

知识工作插件实战:搭建高效采集整理输出工作流

“知识工作插件”这几年被反复提起,但真要问它到底是什么——是一类浏览器扩展,还是编辑器里的组件,又或者某个知识管理工具的二次开发能力?我自己的答案是:都不是单独一个,而是围绕“输入→处理→沉淀→输…

2026/10/21 6:12:29 阅读更多 →
机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

做机器人对话系统最头疼的一件事,不是意图识别,也不是自然语言生成,而是把真实世界接进来。用户问一句“我从现在的地方去服务中心怎么走”,你得在几百毫秒内完成坐标解析、路径计算、话术拼接,还得把路线图用卡片发出…

2026/10/21 6:11:29 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

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

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →