Split Bregman算法MATLAB实现:TV去噪与压缩感知
简介Split Bregman 算法是一种常用于图像去噪、复原与压缩感知的优化方法这份MATLAB源码资源完整呈现其核心实现适合有一定MATLAB与优化基础的研究人员、工程师及研究生参考学习。压缩包共11个文件以m源码文件为主并辅以jpg示意图、md说明文档、mat测试数据和license授权信息整体约20.4MB。代码包含ART重建、二维与三维全变分去噪等多个可运行示例配套示例图片与测试数据读者可直观观察算法在稀疏重建和图像恢复中的表现。目录将主程序、函数与说明文档分开组织便于按模块阅读。已有918人学习下载作为兼顾理论与实践的工具包可帮助读者快速上手Split Bregman迭代流程理解数据拟合、正则化与Bregman重投影等关键步骤并基于现有函数扩展至实际项目或进一步对比不同重建策略。1. Split Bregman 算法为什么处理 L1 优化问题的 MATLAB 实现绕不开它假设你在做图像去噪或压缩感知重建用最速下降法去解带 L1 范数的目标函数迭代上千次仍在原地震荡。这通常不是代码写错而是目标函数在不可微点附近的行为决定了普通梯度类方法必然走得又慢又抖。Split Bregman 算法是这类 L1 优化问题的高效解法它把难啃的耦合项拆成两个好解的子问题再用 Bregman 残差强制收敛。对 TV 去噪、压缩感知、去模糊这类任务MATLAB 核心实现只要几十行且不需要优化工具箱。这篇文章给出一份可直接运行的 MATLAB 源码、参数取值范围和翻车清单适合要快速复现算法或想搞懂分裂迭代原理的从业者。你照着把代码粘进编辑器就能在自己的测试图上验证。2. 分裂迭代的核心逻辑从 TV 去噪目标函数到两个可解子问题2.1 目标函数拆开之前TV 去噪为什么难解TV 去噪的目标是求解带全变分正则的最小化问题min_u ||∇u||_1 μ/2·||u − f||²其中u是要恢复的干净图像f是观察到的含噪图像∇u是图像梯度。第一项||∇u||_1是 L1 范数它鼓励梯度稀疏平坦区域梯度接近零边缘处梯度大但数量少这样既能去噪又能保住边缘。麻烦出在 L1 范数本身不可微。梯度在u为常数的区域里大量取零在这些点上 L1 项没有普通导数只有次梯度。用梯度下降去解时迭代到平滑区域附近就容易在零点和非零点之间来回跳动步长必须不断缩小否则数值上会震荡。你经常能看到的现象是前面几百步效果明显后面几千步几乎纹丝不动误差曲线拖一条长长的尾巴。2.2 变量分裂与 Bregman 残差一个中间变量解决不可微问题Split Bregman 的常见做法是引入辅助变量d令d ∇u把原问题改写成min_{u,d} ||d||_1 μ/2·||u − f||² λ/2·||d − ∇u − b||²这里的b是 Bregman 残差向量。和普通惩罚法不一样的是b不是固定值每一轮迭代都会按约束误差更新一次让惩罚项的参考点不断逼近真正的约束。直观地讲b像是一个“记账本”记录上一轮里d和∇u差了多少下一轮惩罚时就按这个差额修正。这样拆完之后两个变量被解耦固定d和b求解u是一个光滑二次型问题法方程为(μI λDᵀD)u μf λDᵀ(d − b)在周期边界下可以用 FFT 一步求解。固定u求解d是一个 L1 近端问题闭式解就是软阈值收缩d shrink(∇u b, 1/λ)。两个子问题都不需要求次梯度也不需要手工调步长这就是它好实现的根本原因。2.3 收敛为什么快和普通梯度类方法的差距梯度下降每一轮只沿着当前点的最速下降方向挪一小步步长受 Lipschitz 常数限制碰到不可微点附近还要减速。Split Bregman 每一轮都在“解一个接近常规最小二乘的子问题”再用 Bregman 残差把上一轮的差值带回来相当于同时做了优化和误差补偿。一个一维方块信号去噪的简单实验里普通梯度下降跑 3000 次误差还在10⁻²量级Split Bregman 五十次左右就能到10⁻⁴。这个框架和 ADMM 在数学上高度相关同样是交替最小化加对偶残差更新只是迭代顺序略有差异。写过 ADMM 再看 Split Bregman 的代码几乎是无缝切换。这也是为什么很多开源图像恢复库里去噪、去模糊、压缩感知三个模块用的是同一套核心循环。3. 用 MATLAB 写一个可运行的 Split Bregman 去噪程序3.1 主函数骨架与参数入口下面这段是函数签名和初始化部分直接保存成split_bregman_tv_demo.m。输入f是含噪灰度图要求是double类型且数值范围在 0 到 1 之间mu是保真项权重越大结果越贴近原图lambda是分裂惩罚权重影响收敛路径n_iters是最大迭代次数。function u split_bregman_tv_demo(f, mu, lambda, n_iters) % Split Bregman TV 去噪 % 输入: % f 含噪灰度图, double, 范围 [0,1] % mu 保真项权重, 典型范围 0.5~5 % lambda 分裂惩罚参数, 典型范围 0.05~1 % n_iters 最大迭代次数, 典型范围 50~200 % 输出: % u 去噪结果 [rows, cols] size(f); u f; % 初始化解 d zeros(rows, cols, 2); % 辅助变量, 第1通道存 x 方向梯度, 第2通道存 y 方向 b zeros(rows, cols, 2); % Bregman 残差向量 % 周期边界下 DD 的特征值, 用于频域对角化 wx 2*pi*(0:cols-1)/cols; wy 2*pi*(0:rows-1)/rows; [KX, KY] meshgrid(4*sin(wx/2).^2, 4*sin(wy/2).^2); K KX KY; % 拉普拉斯算子的频域表示 denom mu lambda * K; % u 子问题频域分母初始化里最关键的是denom。它对应μI λDᵀD在周期边界下做 FFT 对角化后的特征值后面 u 子问题只用一次逐点除法就能解出来完全不需要构造稀疏矩阵。meshgrid的两个维度顺序要和图像行列一致第一维对应行方向第二维对应列方向。3.2 四大步骤的代码实现u 子问题、软阈值、Bregman 更新主循环体一共四步算 u 子问题、算 d 子问题、更新 Bregman 残差、判断是否继续。把下面这段接到 3.1 的初始化后面就是一个完整函数。for k 1:n_iters % ---- 第一步: u 子问题 ----------------------------------- % 求解 (mu*I lambda*D*D) u mu*f lambda*D*(d-b) dfx d(:,:,1) - b(:,:,1); dfy d(:,:,2) - b(:,:,2); rhs mu*f lambda * dtx_plus_dty(dfx, dfy); u real(ifft2(fft2(rhs) ./ denom)); % ---- 第二步: d 子问题, 矢量软阈值 ------------------------ [dxu, dyu] forward_diff(u); [d(:,:,1), d(:,:,2)] shrink2(dxu b(:,:,1), dyu b(:,:,2), 1/lambda); % ---- 第三步: Bregman 残差更新 ---------------------------- b(:,:,1) b(:,:,1) (dxu - d(:,:,1)); b(:,:,2) b(:,:,2) (dyu - d(:,:,2)); endu 子问题里fft2(rhs) ./ denom是逐点除法不是矩阵除法。因为μI λDᵀD在周期边界下是循环矩阵FFT 后正好是对角占优逐点除一次就完成了求解。d 子问题里的shrink2是矢量软阈值它同时处理 x 和 y 两个方向的梯度分量按幅值收缩、保留原有方向——这一步直接决定边缘质量不能用两个独立的一维软阈值代替。3.3 局部函数差分算子与矢量软阈值主函数依赖三个局部函数。它们可以放在同一个.m文件末尾也可以单独存成文件。function [dxu, dyu] forward_diff(u) % 周期边界的水平/垂直前向差分 dxu u(:,[2:end,1]) - u; dyu u([2:end,1],:) - u; end function g dtx_plus_dty(px, py) % 计算 Dx*px Dy*py, 即后向差分形式的负散度 g px([end,1:end-1],:) - px py(:,[end,1:end-1]) - py; end function [sx, sy] shrink2(px, py, thr) % 矢量软阈值: 梯度的两个分量按幅值一起收缩 mag sqrt(px.^2 py.^2); scale max(mag - thr, 0) ./ (mag eps); sx px .* scale; sy py .* scale; endforward_diff用循环移位而不是diff函数因为diff会缩短一个像素破坏与转置算子的对偶关系。dtx_plus_dty里的倒移相减必须和forward_diff严格配对符号错一位频域分母就对不上结果会整体漂移。shrink2里的eps是防止平滑区域幅值为零时除零出 NaN。3.4 跑通 Demo 的命令与效果验证在命令行里造一张含噪图直接调用img im2double(imread(cameraman.tif)); rng(42); noisy img 0.05 * randn(size(img)); u split_bregman_tv_demo(noisy, 1.0, 0.1, 100); imshow([img, noisy, u]);cameraman.tif是 MATLAB 常见内置测试图没有这张图就用自己的灰度图只要保证输入转成double且范围在 0 到 1。rng(42)是固定随机种子方便重复对比实验不固定种子每次噪声不同调参时不好判断是算法变好还是噪声变轻。如果只想快速验证算法本身用一维方块信号更直接一个跳变信号加上随机噪声跑完看跳变沿是否保留、平坦段是否拉平。这一节跑通之后再进入参数调优。4. 三个关键参数怎么定μ、λ、迭代次数与收敛判据4.1 μ 和 λ 的取值范围与图像归一化的坑μ 控制保真度和平滑度的平衡。μ 越大结果越接近含噪图噪声残留越多μ 越小图像越平滑但细节也跟着被抹掉。对 0 到 1 范围的灰度图常见取值在 0.5 到 5 之间。低于 0.01 会把整张图拉成近乎平坦高于 100 则几乎不去噪。λ 是分裂惩罚权重它在数学上不影响最终收敛点但影响收敛路径。λ 太大两个子问题之间的“协商”变慢迭代次数要增加λ 太小软阈值收缩过头中间结果偏糊同样拖慢收敛。实践经验里λ 取 0.05 到 1 之间都比较稳和 μ 配合时建议先固定 μ1扫几组 λ 看能量曲线再回头调 μ。参数典型范围调大后果调小后果mu0.5~5保留更多噪声过度平滑lambda0.05~1收敛变慢中间结果偏糊n_iters50~200耗时增加可能未收敛一个最常见的坑是图像像素范围不归一。同样的 μ 值对 0 到 255 量级的 uint8 图像和 0 到 1 量的 double 图像效果天差地别。无论你用哪张图进函数前先做f double(f)/255或mat2gray(f)再套上面的经验范围否则会得出“这个算法不好用”的错误结论。4.2 迭代次数与停止准则别傻跑Split Bregman 收敛快但不代表每次都该把迭代次数设满。更稳妥的做法是用解的变化量做停止判断当相邻两次迭代的 u 相对变化小于1e-4且连续满足三轮时直接退出。在循环里加这样一段for k 1:n_iters % ... 前三步迭代 ... % 停止判断: 在 b 更新之前计算, 避免残差修正干扰 if k 1 change norm(u - u_prev, fro) / norm(u, fro); if change 1e-4 fprintf(在第 %d 轮收敛, 相对变化 %.2e\n, k, change); break; end end u_prev u; endnorm(..., fro)是 Frobenius 范数对图像矩阵就是所有像素平方和开根号。这个判断必须放在 b 更新之前因为 b 更新本身会带来一个较大的数值变化你真正关心的是解 u 的稳定程度不是残差的波动。连续判断三轮是经验做法防止单轮恰好停在零点附近造成假收敛。4.3 用能量和 RMSE 两条曲线验证收敛只盯着结果图容易自我感觉良好。建议在迭代循环里同时记录两样东西完整目标函数值E sum(abs(d(:))) (mu/2)*norm(u-f,fro)^2以及在模拟实验里已知真值时的 RMSE。循环结束后画两条曲线figure; subplot(1,2,1); plot(energy_hist); title(目标函数能量); subplot(1,2,2); plot(rmse_hist); title(和真值的 RMSE);能量曲线应该在几十轮内快速下降后趋于平缓。如果一直小幅震荡多半是 λ 太小或边界条件不匹配。RMSE 曲线如果在尚未收敛时就拐头上升说明 μ 太大算法开始把噪声当信号拟合果断调小 μ 重跑。这两条曲线配合使用能帮你分辨“算法没收敛”和“参数不合适”两种完全不同的故障。5. 避坑指南Split Bregman 实现中常见的六个翻车现场5.1 逐分量软阈值导致边缘“方块化”现象去噪结果出现类似马赛克的方块感水平和垂直边缘的平滑度不一致原本斜向的边缘变成阶梯状。原因把二维梯度拆成 x 和 y 两个分量分别做一维软阈值破坏了梯度方向的耦合关系。解决使用shrink2按幅值收缩两个分量乘同一个缩放系数梯度方向保持不变。检查代码时只要看到shrink函数分别作用在d(:,:,1)和d(:,:,2)基本可以断定翻车点在这。5.2 边界伪影非周期差分与频域分母不匹配现象图像四条边出现一到两个像素宽的暗边或亮边内部区域正常。原因有人为了省事直接用diff(u,1,2)做差分但diff会缩短图像尺寸导致 Dᵀ 运算和频域特征值denom之间对不上边界附近的残差全部泄漏出去。解决统一使用 3.3 里的循环移位实现差分。如果一定要用中心差分就不能再用 FFT 对角化求解 u 子问题得换成共轭梯度之类的迭代法。5.3 大图像内存爆炸现象2048×2048 以上的图像运行到一半报内存不足。原因显式构造了稀疏差分矩阵 D 或拉普拉斯矩阵 L再参与矩阵乘法有些实现甚至把辅助变量也展开成稠密矩阵。解决本文代码里的所有算子都用循环移位实现没有显式矩阵。对特别大的图像注意fft2的结果也是完整复数矩阵可以分块处理或改用single类型省一半内存。5.4 d 初始化为零导致前几轮明显过平滑现象迭代第 5 轮的结果比第 50 轮模糊得多感觉算法一上来就把图像抹平了。原因d 初始化为零意味着算法认为初始梯度假定处处为零前几轮 u 子问题会强行把图像拉向平坦解。解决用输入图像的梯度初始化 d[da, db] forward_diff(f); d(:,:,1) da; d(:,:,2) db;b 仍然从零开始。这个改动对只看前三轮效果的演示非常关键能显著降低前期的过平滑现象。5.5 收敛判据写在 b 更新之后现象图像已经稳定但循环一直运行到最大迭代次数日志里相对变化始终偏大。原因收敛判据用了“解的变化”但位置放在了 b 更新之后把 Bregman 残差修正误算成了解的变化。解决按 4.2 的写法在 u 更新后、b 更新前计算相对变化并且连续多轮满足阈值才 break。这条坑很隐蔽因为结果是对的只是白白多跑几十轮。5.6 图像类型没转换到 double现象uint8 图像直接参与计算结果里随机出现黑点和白点噪声不但没去掉反而更严重。原因MATLAB 对 uint8 做减法会截断到 0u(:,[2:end,1]) - u的结果全是非负值差分算子的符号完全丢失。解决函数入口加一句f double(f)输出前做u min(max(u, 0), 1)并转回原类型。这条看起来是基本功但在快速原型验证时最容易漏。6. 进阶把同一套分裂框架从去噪搬到压缩感知与去模糊6.1 统一接口思路当观测模型变成min_u ||∇u||_1 μ/2·||Au − f||²时迭代框架完全不用动只需要改 u 子问题原来的(μI λDᵀD)变成(μAᵀA λDᵀD)右端项变成μAᵀf λDᵀ(d−b)。如果 A 是周期边界下的模糊算子AᵀA照样能用 FFT 对角化如果 A 是任意采样算子就用共轭梯度法迭代求解。function u sb_cs_demo(f, A, At, mu, lambda, n_iters) % A: 观测算子, At: 共轭算子, 只需要能作用在向量上 ... rhs mu * At(f) lambda * dtx_plus_dty(dfx, dfy); u pcg((x) mu*At(A(x)) lambda*laplacian_op(x), rhs, 1e-6, 50); ... endpcg是 MATLAB 内置的共轭梯度法适合这种每次迭代只需要算子作用而不需要显式矩阵的问题。这样写的好处是去噪、去模糊、压缩感知共用同一套主循环换任务只需要换 A 和 At。6.2 验证方法别只信视觉效果。最稳的验证方式是模拟设计一个块状图作为真值加上观测噪声用你的代码重建画 RMSE 随迭代次数的曲线确认曲线在几十轮内降到低点。这套验证习惯能直接帮你判断方向值不值得投入——如果目标任务里 TV 先验不明显RMSE 曲线会立刻告诉你这个假设不成立。我现在的习惯是任何新改动先跑一遍 3.4 的模拟实验用能量和 RMSE 两条曲线同时确认再到真实数据上微调 μ。这套流程让我在不同应用之间迁移时少走了很多弯路。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI日报系统设计与实践指南

AI日报系统设计与实践指南

我无法根据当前输入生成符合要求的博文。原因如下:输入中仅提供了项目标题"AI 日报2026-10-04",但未提供任何实质性的【项目正文】、【关键词】或【摘要描述】。所谓“相关热搜词”和“最新网络热词”字段为空,下方的“基于标题及热…

2026/10/13 22:39:08 阅读更多 →
C++ string 深度解析:从 SSO 到 string_view 的性能优化与避坑指南

C++ string 深度解析:从 SSO 到 string_view 的性能优化与避坑指南

1. 为什么 string 值得单独拎出来讲C 里没有哪个类型比std::string更“日用而不知”了。写业务代码的人天天用它拼日志、传参数、做解析;写底层的人又嫌它重、嫌它慢、嫌它和const char*之间来回转换烦。但真要把 string 用明白,其实能避开不少性能坑和逻…

2026/10/13 22:39:08 阅读更多 →
Litellm:大模型API统一调用的协议桥接层

Litellm:大模型API统一调用的协议桥接层

1. 一个被严重低估的“协议翻译官”:Litellm到底在解决什么真问题?很多人第一次看到litellm这个名字,下意识会以为是某个新出的轻量级大模型、或者某种训练框架的缩写。其实完全不是——它压根不碰模型训练,也不做推理优化&#x…

2026/10/13 22:39:08 阅读更多 →

最新新闻

多Agent协作为什么容易互相“甩锅”?从任务分配到结果验证设计协作工作流

多Agent协作为什么容易互相“甩锅”?从任务分配到结果验证设计协作工作流

一、引言:多 Agent 系统里的"责任真空" 把单 Agent 拆成 Planner、Retriever、Coder、Reviewer、Executor 之后,很多团队会遇到一个反直觉的现象:**系统的单点能力提升了,端到端的成功率反而下降,而且失败后…

2026/10/13 23:44:36 阅读更多 →
HDFS读写链路深度拆解:从数据块到副本放置与故障恢复

HDFS读写链路深度拆解:从数据块到副本放置与故障恢复

1. 从一次数据写入说起:HDFS 不只是“能存”这么简单做大数据的人都知道,HDFS 是整个生态的地基。你辛辛苦苦搭好集群、调好参数,跑起 Spark、Flink、Hive,但数据落到最后,全部要进 HDFS。所以 HDFS 的水平直接决定了上…

2026/10/13 23:44:36 阅读更多 →
大模型调用成本越来越高怎么办?从Token统计到缓存复用,搭建LLM成本管理系统

大模型调用成本越来越高怎么办?从Token统计到缓存复用,搭建LLM成本管理系统

一、引言:Token 账单正在成为新的"云成本黑洞" 过去两年,大部分团队把 LLM 当作一个"调用即付费"的外部 API:模型能力在涨、单价在跌,似乎不需要精打细算。但真实账单往往给出相反的结论——单 token 价格下降…

2026/10/13 23:44:36 阅读更多 →
Linux CFS调度器原理与实战调优指南

Linux CFS调度器原理与实战调优指南

1. 什么是CFS调度器:一个让CPU时间分配更公平的底层引擎CFS Scheduler,全称Completely Fair Scheduler(完全公平调度器),是Linux内核自2.6.23版本起默认启用的进程调度核心模块。它不是某个用户可见的图形工具&#xf…

2026/10/13 23:44:36 阅读更多 →
HDFS进阶核心:高可用、元数据、联邦与纠删码实践

HDFS进阶核心:高可用、元数据、联邦与纠删码实践

1. HDFS进阶内容概览这应该是HDFS系列的第四篇了。前三篇聊了集群搭建、Shell操作、客户端读写,基本把日常运维和开发常用的东西过了一遍,但很多人在这个阶段都会遇到同一个问题:单NameNode不够用的时候怎么办,或者集群规模上去了…

2026/10/13 23:44:36 阅读更多 →
GitHub热门项目趋势解析:从榜单看开源技术新风向

GitHub热门项目趋势解析:从榜单看开源技术新风向

如果你和我一样,每天早上的第一件事不是看天气,而是点开 GitHub Trending,那你应该能体会那种感觉——明明昨晚睡前刚刷过一遍,今天一早又变天了。GitHub 热门项目排行榜,或者说 Trending,已经不只是一个简…

2026/10/13 23:43:35 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →