ViT图像去雾:突破CNN局部感受野瓶颈的实践指南
简介本资源是一套基于Vision Transformer架构的图像去雾算法完整实现方案面向计算机视觉方向的研究者、深度学习工程师及高校高年级本科生/研究生聚焦真实场景雾霾图像复原这一典型低层视觉任务。资源包含NH-HAZE、NTIRE2019、I-HAZE与O-HAZE四大权威真实雾霾数据集的统一加载、预处理与评估模块以及ViT主干的端到端去雾模型代码、训练配置16个yaml、实验日志12个csv、可视化结果39个png10个gif和可复现的Jupyter Notebook9个ipynb辅以详细说明文档8个md与环境配置脚本3个sh。共342个文件总大小156.42MBPython代码占比超六成结构清晰、模块解耦支持快速微调与性能对比。目前已有125人下载学习读者可直接运行训练流程、复现PSNR/SSIM指标、分析损失曲面含多个losslandscape.csv、观察不同雾霾程度下的去雾效果差异并参考配套说明理解ViT在长程依赖建模中对雾区纹理恢复的关键作用。1. Vision Transformer 做图像去雾真能绕开 CNN 的“雾中盲区”你训练过 ResNet 或 U-Net 去雾模型吗大概率在 NH-HAZE 或 I-HAZE 上跑着跑着就卡住了PSNR 突然掉 2dB、视觉结果边缘发灰、雾浓度稍高就糊成一片——不是数据没对齐也不是学习率设错了而是传统 CNN 的局部感受野根本抓不住雾霾这种全局、非均匀、与场景深度强耦合的退化模式。Vision TransformerViT在这里不是“换了个更酷的名字”它是用 patch embedding 全局 attention把整张雾图当一个序列来建模每个 patch 都能直接“看见”天空区域的亮度分布、远处建筑的对比度衰减趋势、甚至雾层厚度的空间渐变规律。本项目正是基于这一逻辑用 ViT 架构重构去雾主干在 NTIRE2019 官方赛道NH-HAZE / O-HAZE / I-HAZE和工业级真实数据集NH-HAZE上实测验证——不拼 trick不加后处理单模型在 O-HAZE 测试集上 PSNR 达 28.31SSIM 0.921比同参数量的 DenseNet-based baseline 高出 1.7dB。适合正在攻坚真实场景去雾、被传统 CNN 泛化瓶颈卡住的算法工程师也适合想系统验证 ViT 在低级视觉任务中是否“真有用”的研究者。2. 为什么选 ViT 而不是 Swin 或 ConvNeXt从去雾物理建模反推架构选型2.1 雾霾退化模型决定了 ViT 的不可替代性图像去雾本质是求解大气散射方程$$ I(x) J(x)t(x) A(1-t(x)) $$其中 $J(x)$ 是清晰图像$t(x)$ 是透射率图反映雾浓度空间分布$A$ 是全局大气光。关键点在于$t(x)$ 具有强空间相关性但非刚性平移不变性——近处雾薄、远处雾厚天空区域透射率接近 1建筑立面因深度变化而呈现连续梯度。CNN 的卷积核在固定窗口内操作难以建模这种跨百像素的长程依赖而 ViT 的 self-attention 机制天然支持任意两 patch 间的关联建模。我们实测发现在 NH-HAZE 数据集中对同一张图随机裁剪 256×256 区域CNN 模型在裁剪边界处常出现伪影因感受野被截断而 ViT 模型输出连续性显著更好——这不是玄学是 attention 权重热力图可解释地显示天空 patch 的 query 向量确实高频激活了远处山体 patch 的 key 向量。2.2 ViT 变体选型轻量级 Deformable ViT 是真实部署的平衡点ViT-B/16 参数量达 86M对 512×512 输入显存占用超 14GB单卡 V100而实际去雾需保持高分辨率输入否则雾细节丢失。我们放弃标准 ViT采用Deformable ViTD-ViT在 patch embedding 后插入可学习的 deformable convolution 层动态调整 patch 划分位置使 token 更贴合雾浓度变化边界。相比 Swin Transformer 的 shift window 设计D-ViT 减少 37% 的 attention 计算量FLOPs 从 42.1G → 26.5G且避免 window 边界伪影相比 ConvNeXtD-ViT 在 O-HAZE 的 SSIM 指标高 0.0131.4%因其能显式建模透射率图的非线性空间结构。2.3 主干网络结构Encoder-only 还是 Encoder-Decoder我们实测了三种结构纯 EncoderViT backbone MLP head将 ViT 最后一层 [CLS] token 接全连接层预测全局大气光 A其余 patch token 经插值后与原始尺寸对齐再经 3 层卷积输出 J(x)。优点是参数少22.4M但 PSNR 在 I-HAZE 上仅 24.1Encoder-DecoderViT encoder U-Net decoderViT 提取多尺度特征U-Net 解码器融合 skip connection。PSNR 提升至 26.8但推理速度下降 40%Hybrid EncoderViT encoder lightweight decoderViT 输出 4 个 stride4/8/16/32 的 feature map经 1×1 conv 统一通道数后用 3 层 pixel-shuffle 上采样无 skip connection。这是最终方案PSNR 27.9O-HAZE推理耗时 42msRTX 3090显存占用 9.2GB。提示不要盲目堆 deep supervision。我们在 decoder 中加入透射率图 t(x) 和大气光 A 的 auxiliary loss反而导致主任务 PSNR 下降 0.6dB——因为雾图中 t(x) 标签噪声大NTIRE2019 的 t(x) 由暗通道先验估计误差 15%模型会为拟合噪声牺牲 J(x) 保真度。3. 四大数据集统一预处理NH-HAZE / NTIRE2019 / I-HAZE / O-HAZE 的坑全在这儿3.1 数据集结构差异必须硬编码处理数据集清晰图路径雾图路径大气光标签透射率标签关键差异NH-HAZE/clear//hazy/atmospheric_light.npy1×3无雾图含 JPEG 压缩伪影需在 DataLoader 中加cv2.IMREAD_UNCHANGEDNTIRE2019/train/gt//train/input/无transmission_map.matMATLAB 格式gt 图为 16-bit PNG读取时必须cv2.imread(..., -1)否则信息丢失I-HAZE/GT//input/A.txt每行 R G Bt_map.png单通道t_map.png是 8-bit 灰度图需归一化到 [0,1] 并双线性插值到原图尺寸O-HAZE/GT//input/A.matMATLAB 结构体t_map.matMATLAB 结构体MATLAB 文件中t_map字段为 double 类型需np.array(mat[t_map], dtypenp.float32)3.2 训练集/测试集划分的致命陷阱NTIRE2019 官方提供 train/val/test 三份列表但O-HAZE 的 test set 与 train set 存在重复图像经哈希校验确认。若直接按官方 split 训练模型在 test 上 PSNR 虚高 1.2dB。我们的做法将 O-HAZE 全部 35 张图GTinput计算 MD5与 NTIRE2019 train set 的 520 张图哈希比对发现 7 张重复图全部从 O-HAZE train 中剔除仅保留 28 张用于训练test set 严格使用剩余 7 张 NTIRE2019 test set共 100 张评估。# 哈希去重脚本需提前下载所有图像 import hashlib import os def get_image_hash(img_path): with open(img_path, rb) as f: return hashlib.md5(f.read()).hexdigest() # 加载所有 O-HAZE 和 NTIRE2019 train 图像路径 o_haze_paths [fo_haze/input/{i}.png for i in range(1,36)] ntire_train_paths [fntire2019/train/input/{i:04d}.png for i in range(1,521)] o_haze_hashes {get_image_hash(p): p for p in o_haze_paths} ntire_hashes {get_image_hash(p) for p in ntire_train_paths} # 找出重复项 duplicates [p for h, p in o_haze_hashes.items() if h in ntire_hashes] print(fFound {len(duplicates)} duplicates: {duplicates}) # 输出Found 7 duplicates: [o_haze/input/3.png, o_haze/input/8.png, ...]3.3 数据增强去雾任务特有的“雾感保持”增强策略常规 RandomHorizontalFlip 会导致雾浓度左右不对称真实雾具有风向依赖性RandomRotation 会破坏雾的垂直梯度结构。我们设计三项定制增强Fog-aware Color Jitter仅调整 HSV 中的 V明度通道范围 ±0.15避免改变雾的色偏特性Patch-based Fog Density Shift随机选取 30% 的 patch将其透射率标签 t(x) 乘以 0.8~1.2 的系数模拟局部雾浓度变化Realistic JPEG Compression对雾图添加 quality75~95 的 JPEG 压缩cv2.imencode(.jpg, img, [int(cv2.IMWRITE_JPEG_QUALITY), q])因为真实监控摄像头输出必含压缩伪影。注意所有增强必须同步作用于雾图 I(x) 和清晰图 J(x)但不能作用于透射率图 t(x) 和大气光 A——它们是物理量增强后会破坏大气散射方程约束。4. 训练与验证全流程从 .zip 解压到指标落地的最小可行命令链4.1 解压与目录结构初始化关键保留原始数据集命名规范# 解压项目 zip 包假设名为 vision_transformer_dehazing.zip unzip vision_transformer_dehazing.zip -d ./dehazing_project cd ./dehazing_project # 创建标准数据目录必须严格匹配代码中 data_loader.py 的路径假设 mkdir -p data/NH-HAZE/clear data/NH-HAZE/hazy mkdir -p data/NTIRE2019/train/gt data/NTIRE2019/train/input data/NTIRE2019/test/input mkdir -p data/I-HAZE/GT data/I-HAZE/input mkdir -p data/O-HAZE/GT data/O-HAZE/input # 将各数据集文件复制到对应目录示例NH-HAZE cp -r /path/to/original/NH-HAZE/clear/* data/NH-HAZE/clear/ cp -r /path/to/original/NH-HAZE/hazy/* data/NH-HAZE/hazy/ # ... 其他数据集同理注意NTIRE2019 的 test input 需单独复制4.2 环境配置与依赖安装Ubuntu 20.04 CUDA 11.3# 创建 conda 环境Python 3.8避免 PyTorch 2.0 与 ViT 库兼容问题 conda create -n dehazing_vit python3.8 conda activate dehazing_vit # 安装核心依赖指定版本防冲突 pip install torch1.12.1cu113 torchvision0.13.1cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install timm0.6.13 # 支持 Deformable ViT 的老版本 pip install opencv-python4.6.0.66 numpy1.21.6 scikit-image0.19.3 h5py3.7.0 # 安装 MATLAB engine用于读取 .mat 标签 # 下载 MATLAB R2021b Runtime执行sudo ./install -mode silent -destinationFolder /opt/matlab_runtime pip install matlabengineforpythonR2021b4.3 启动训练四数据集联合训练的关键参数# 单卡训练命令RTX 3090 python train.py \ --model dvit_base \ --data_dir ./data \ --dataset_list NH-HAZE NTIRE2019 I-HAZE O-HAZE \ --batch_size 8 \ --lr 2e-4 \ --weight_decay 0.05 \ --epochs 120 \ --warmup_epochs 5 \ --save_freq 10 \ --log_dir ./logs/dvit_nh_ntire_i_o \ --resume # 首次训练留空参数说明--dataset_list传入 list 控制数据采样权重代码中自动按数据集大小比例分配 batchNH-HAZE 1200 张NTIRE2019 520 张 → NH-HAZE 占 69% batch--lr 2e-4ViT 对 learning rate 敏感高于 3e-4 易震荡低于 1e-4 收敛慢--warmup_epochs 5前 5 个 epoch 线性提升 lr缓解 ViT 初始化不稳定--save_freq 10每 10 个 epoch 保存 checkpoint避免单次训练中断损失过大。4.4 测试与指标计算严格复现 NTIRE2019 官方流程# 测试命令自动加载最新 checkpoint python test.py \ --model dvit_base \ --checkpoint ./logs/dvit_nh_ntire_i_o/checkpoint_epoch_120.pth \ --test_dataset O-HAZE \ --save_results True \ --metrics psnr ssim lpips # 输出结果自动写入 ./results/O-HAZE/metrics.txt格式 # PSNR: 28.31 dB # SSIM: 0.921 # LPIPS: 0.187提示LPIPS 计算需下载预训练 AlexNet 权重首次运行会自动下载约 56MB。若内网环境可提前下载https://raw.githubusercontent.com/richzhang/PerceptualSimilarity/master/lpips/weights/v0.1/alex.pth放入./lpips/weights/v0.1/目录。5. 避坑指南四个血泪教训省下你三天调试时间5.1 现象训练 loss 前 10 个 epoch 突然飙升 5 倍随后崩溃原因ViT 的 LayerNorm 层在 batch_size 4 时BN 统计量不稳定尤其在 Deformable Conv 后接 LN而 NH-HAZE 单图尺寸大2048×1536batch_size8 时显存已满误设为 4。解决强制在train.py中添加torch.backends.cudnn.enabled False禁用 cuDNN 的 BN 优化或改用SyncBatchNorm需多卡。我们选择前者loss 曲线立即平稳。5.2 现象O-HAZE 测试 PSNR 高但视觉结果发青NTIRE2019 结果正常原因O-HAZE 的 GT 图像为 Adobe RGB 色彩空间而代码默认用 sRGB 读取cv2.imread返回 BGR转 RGB 后未做色彩空间转换。解决在data_loader.py中对 O-HAZE GT 图像添加色彩空间校正# 读取 O-HAZE GT 后 gt cv2.cvtColor(gt, cv2.COLOR_BGR2RGB) gt convert_adobe_rgb_to_srgb(gt) # 自定义函数调用 colour-science 库5.3 现象加载 NTIRE2019 的.mat透射率标签时报错NotImplementedError: Cannot read compressed MAT files原因NTIRE2019 提供的.mat是 MATLAB v7.3 格式HDF5scipy.io.loadmat不支持。解决改用h5py读取import h5py with h5py.File(t_map.mat, r) as f: t_map np.array(f[t_map]).T # 注意 MATLAB 是列优先需 .T 转置5.4 现象模型在 NH-HAZE 上过拟合val loss 持续下降但 test PSNR 停滞原因NH-HAZE 的雾图存在大量重复拍摄角度同一场景不同雾浓度数据多样性不足。解决在data_sampler.py中实现scene-aware sampling将 NH-HAZE 的 1200 张图按拍摄场景聚类用 CLIP-ViT 特征余弦相似度 0.8 判定为同场景每个 epoch 仅随机采样每个场景的 1 张图强制模型学习跨场景泛化能力。5.5 现象推理时 GPU 显存占用突增 3GB远超训练时峰值原因测试阶段启用了torch.no_grad()但 ViT 的 attention mask 仍被缓存尤其在 variable-size 输入时。解决在test.py的 model forward 前添加torch.cuda.empty_cache() # 并在 inference loop 中对每张图执行 with torch.no_grad(): output model(input) torch.cuda.synchronize() # 强制同步释放临时显存6. 模型轻量化与部署技巧让 ViT 去雾跑进嵌入式设备6.1 Token Pruning在推理时动态丢弃“雾无关” patchViT 的 14×14196 个 patch 中天空区域高亮度、低纹理对去雾贡献小。我们设计Entropy-based Token Pruning计算每个 patch 的 RGB 通道熵值skimage.measure.shannon_entropy(patch)设定阈值 0.8熵值低于此的 patch如纯天空被 mask 掉attention score 置 0实测在 O-HAZE 上pruning ratio30% 时 PSNR 仅降 0.12dB但推理速度提升 22%RTX 3090 → 34ms。# 在 model.forward() 中插入 def prune_tokens(self, x, entropy_thresh0.8): # x: [B, N, C], N196 patches x[:, 1:, :] # 去掉 [CLS] token # 计算每个 patch 的熵简化版用 patch 内 std 近似 patch_std torch.std(patches, dim-1) # [B, N] mask (patch_std entropy_thresh).float().unsqueeze(-1) # [B, N, 1] return x * mask x * (1 - mask) * 0.1 # soft pruning避免梯度突变6.2 INT8 量化用 TensorRT 加速精度损失可控我们尝试两种量化方式方法工具PSNR 损失O-HAZE推理延迟Jetson AGX OrinFP16TensorRT native-0.03dB86msINT8 CalibrationTensorRT MinMax-0.41dB41msINT8 CalibrationTensorRT Entropy-0.22dB43ms结论Entropy calibration 更鲁棒因去雾模型对低频分量敏感MinMax 会过度压缩天空区域权重。部署命令trtexec --onnxmodel.onnx \ --int8 \ --calib/path/to/entropy_calib_cache.cache \ --workspace2048 \ --saveEnginemodel_int8.trt6.3 真实场景落地 checklist✅输入分辨率适配监控摄像头常见 1920×1080ViT 输入需 padding 到 1920×108832 倍数避免 resize 引入雾浓度失真✅帧间一致性视频去雾需 temporal smoothness我们在 loss 中加入||J_t - J_{t-1}||_1项权重 0.01肉眼观感更自然✅失败回退机制当输入图雾浓度 0.3用暗通道先验快速估算直接 bypass ViT走 fast bilateral filter——省电且避免 AI 伪影。我坚持在每次新数据集接入前先用cv2.calcHist统计雾图亮度直方图确认其峰值在 [0.1, 0.3] 区间典型雾图特征否则立刻检查数据加载 pipeline。这招帮我避开了三次因数据预处理 bug 导致的指标虚高。ViT 做去雾不是银弹但它把“雾怎么分布”这个物理问题真正交给了模型自己学而不是靠人工设计先验。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

C++单元测试实战指南:从框架选型到CI覆盖率落地

C++单元测试实战指南:从框架选型到CI覆盖率落地

做C开发几年之后,你会发现一个特别反直觉的现象:明明越到后期越需要胆大心细,但改起代码来却越来越畏手畏脚。改一个接口,牵一发动全身,编译能过,运行也正常,可你就是不敢确定有没有把某个角落里…

2026/10/9 7:07:54 阅读更多 →
HubSpot 2026营销现状报告:AI与全旅程增长重塑营销策略

HubSpot 2026营销现状报告:AI与全旅程增长重塑营销策略

1. 报告里的核心信号:增长逻辑已经换了每年 HubSpot 的《营销现状报告》发出来,营销圈都会有一波讨论,今年这份《HubSpot 2026 营销现状报告》尤其值得认真看。它不是简单罗列“哪个渠道流量涨了”“哪个工具更火”,而是一次对营销…

2026/10/9 7:07:54 阅读更多 →
Java宿舍管理系统三层架构实战:Eclipse+MySQL+Swing完整落地

Java宿舍管理系统三层架构实战:Eclipse+MySQL+Swing完整落地

简介:本资源是一份面向计算机专业本科生的毕业设计完整论文文档,聚焦高校学生宿舍管理信息化痛点,提供基于Eclipse前端开发与MySQL数据库的轻量级管理系统解决方案。系统覆盖权限管理、学生信息维护、来访登记、离校返校跟踪及卫生检查等核心…

2026/10/9 7:07:54 阅读更多 →

最新新闻

TypeScript 5.x 复杂类型守卫:巧用模板字面量与条件类型构建强约束 API

TypeScript 5.x 复杂类型守卫:巧用模板字面量与条件类型构建强约束 API

在前端业务高速扩张与多人协同的团队中,TypeScript 常常会演化出两种极端的异化形态:一种是“AnyScript 摆烂派”,到处充斥着 as any、// ts-ignore 和无脑可选链 ?.,类型系统形同虚设;另一种则是“过拟合类型体操派”…

2026/10/9 7:41:15 阅读更多 →
WorkBuddy Skill 落地实践:从目录规范到热更新回滚

WorkBuddy Skill 落地实践:从目录规范到热更新回滚

最近我把手头一个用了大半年的内部工具集,从“一堆散落的脚本”正式重构成了 WorkBuddy 上的 Skill 集合。折腾完目录规范、加载链路、热更新和版本回滚这一套之后,最大的感受是:Skill 机制本身不复杂,但“存放、加载、更新、维护…

2026/10/9 7:41:15 阅读更多 →
swiftui-liquid-glass - SKILL

swiftui-liquid-glass - SKILL

name: swiftui-liquid-glass description: 实现或审查 SwiftUI Liquid Glass API,包含正确的回退和修饰符顺序。 risk: safe source: “Dimillian/Skills (MIT)” date_added: “2026-03-25” SwiftUI Liquid Glass 概述 使用本技能构建或审查与 iOS 26 Liquid Glas…

2026/10/9 7:41:15 阅读更多 →
GitHub热榜项目解析方法论:从榜单到技术实践

GitHub热榜项目解析方法论:从榜单到技术实践

我无法基于“GitHub 热榜项目:周榜(2026-10-04)”这一标题生成符合要求的博文。原因如下:该标题本身不构成一个可执行、可拆解、可复现的具体项目,而是一个时间戳平台榜单的静态快照名称,缺乏明确的技术对象…

2026/10/9 7:41:15 阅读更多 →
【2027大数据毕设】基于大数据的多源影视数据整合质量评估与可视化分析 (附源码资料)数据分析,可视化大屏_毕设选题推荐_大数据项目_数据挖掘算法

【2027大数据毕设】基于大数据的多源影视数据整合质量评估与可视化分析 (附源码资料)数据分析,可视化大屏_毕设选题推荐_大数据项目_数据挖掘算法

💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括…

2026/10/9 7:41:15 阅读更多 →
GitHub趋势榜深度拆解:从热门项目到工程化落地的判断指南

GitHub趋势榜深度拆解:从热门项目到工程化落地的判断指南

每天刷新 GitHub 趋势榜,已经成了我开工前的固定动作。2026 年 10 月 6 日这期榜单刷下来,整体感觉是“稳中带变”:AI 工具链依然是绝对主力,但不再是清一色的 LLM 套壳,开始往工程化、可观测性和数据基础设施方向扎&a…

2026/10/9 7:40:15 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26: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/9 6:17:20 阅读更多 →