一维卷积直接处理振动信号:轴承故障诊断实战
简介本资源是一份基于PaddlePaddle框架实现的一维卷积神经网络1D CNN轴承故障识别完整复现方案面向深度学习初学者、工业智能方向研究者及设备故障诊断实践工程师。项目严格复现《基于卷积神经网络的轴承故障诊断算法研究》论文方法聚焦西储大学轴承数据集这一经典工业时序数据源解决旋转机械关键部件早期故障精准识别的实际问题。压缩包共156个文件含52组模型参数.pdparams与优化器状态.pdopt40个.mat格式原始/预处理振动信号样本8个VisualDL训练日志.log用于性能追踪以及核心训练/验证脚本.py和Jupyter实验记录.ipynb整体达606.09MB结构清晰、模块解耦便于调试、复现与二次开发。目前已有1551人学习下载读者可直接获取从数据加载、网络构建、训练监控到多指标评估的全流程可运行代码配套日志与检查点更支持训练中断恢复与结果复现显著降低工业时序建模入门门槛。1. 这不是又一个“跑通MNIST就收工”的CNN玩具项目它用纯一维卷积在西储大学轴承数据集上复现了论文级故障识别效果专治工业现场振动信号分类的“玄学调参”病你手头有一台正在运行的电机加速度传感器实时回传着20kHz采样率的一维时序振动波形——这不是图像没有RGB通道也没有空间局部性可言但偏偏传统方法包络谱人工特征在早期微弱裂纹、复合故障场景下频频翻车。这个项目就是冲着这个痛点来的它不转成频谱图、不拼接伪二维、不依赖STFT预处理而是用PaddlePaddle原生支持的一维卷积层直接在原始时序片段长度2048点上建模时序依赖最终在西储大学轴承数据集10类故障正常工况上稳定达到98.3%以上准确率。它不是教学Demo而是从论文《基于卷积神经网络的轴承故障诊断算法研究》中抠出来的可落地实现——所有数据加载、标签映射、滑动切片、归一化策略、模型结构定义、训练循环、评估脚本全部打包为开箱即用的Python工程。如果你正被工业设备预测性维护的POC卡在“信号怎么喂给CNN”这一步或者想绕过TensorFlow/PyTorch生态里那些封装过深、改不动底层卷积逻辑的库这个Paddle项目就是你的后悔药。2. 环境准备与数据就位从零搭建可复现的训练环境西储数据集不用手动解压拼路径2.1 环境依赖PaddlePaddle 2.5 是唯一强依赖其他全是可选但推荐这个项目对框架版本有明确要求必须使用 PaddlePaddle ≥ 2.5。原因很实在——低版本中paddle.nn.Conv1D的padding_modecircular支持不完整而我们在时序切片阶段需要对短于2048的原始信号做环形填充避免零填充引入虚假边界这个特性在2.5才真正稳定。安装命令如下pip install paddlepaddle-gpu2.5.2 # 若有NVIDIA GPU推荐 # 或 pip install paddlepaddle2.5.2 # CPU版仅用于验证流程提示不要用paddlepaddle2.5这种模糊写法。实测2.5.0存在DataLoader多进程下内存泄漏问题2.5.2已修复。这是某开发者在连续训练72小时后翻车总结出的血泪经验。其余依赖极简numpy1.23.5高版本与Paddle 2.5.2兼容性更稳scipy1.10.1用于信号重采样和滤波matplotlib3.7.1绘图非训练必需全部写在requirements.txt中执行pip install -r requirements.txt即可完成初始化。2.2 西储大学轴承数据集官方原始文件结构即用无需转换格式西储数据集官网提供的是.mat文件MATLAB v7.3格式但本项目不依赖MATLAB或scipy.io.loadmat——因为该函数在加载大型.mat时会触发Python内存暴涨且对嵌套结构解析不稳定。项目采用自研轻量解析器utils/mat_loader.py直接用h5py打开并提取指定变量# utils/mat_loader.py 核心逻辑 import h5py import numpy as np def load_cwru_signal(filepath: str, signal_key: str X097) - np.ndarray: 从CWRU .mat文件中安全提取指定通道振动信号 with h5py.File(filepath, r) as f: # CWRU数据中信号存储为列向量shape(N, 1)需squeeze signal np.array(f[signal_key]).squeeze() return signal.astype(np.float32)数据目录结构严格遵循官方发布规范见项目根目录data/data/ ├── 12kDriveEndFault/ # 12kHz采样率驱动端故障 │ ├── B01_0.mat # 内圈故障0HP负载 │ ├── B02_0.mat # 内圈故障1HP负载 │ └── ... ├── 12kFanEndFault/ # 风扇端故障同采样率 ├── 12kNormal/ # 正常状态 ├── 48kDriveEndFault/ # 48kHz采样率本项目默认用12k因论文复现基准一致 └── label_map.json # 故障类型到整数ID的映射含Normal, B01, IR01, OR01等10类注意label_map.json不是随便写的。它完全对齐论文中定义的10类故障划分如OR01外圈故障6点位置IR02内圈故障3点位置且ID顺序决定模型输出logits索引。修改此处将导致评估指标全盘失效。2.3 数据预处理流水线滑动窗口Z-score归一化环形填充三步锁定时序特征预处理不是“扔进StandardScaler就完事”。工业振动信号存在明显幅值漂移和直流偏置直接全局归一化会抹掉故障冲击特征。本项目采用分段滑动局部Z-score策略# dataset/cwru_dataset.py 片段 def _sliding_window(self, signal: np.ndarray, window_size: int 2048, step: int 1024) - List[np.ndarray]: 按步长step对信号切片不足window_size时环形填充 segments [] for start in range(0, len(signal) - window_size 1, step): seg signal[start:start window_size] if len(seg) window_size: # 环形填充[a,b,c] → [a,b,c,a,b]非零填充 pad_len window_size - len(seg) seg np.concatenate([seg, seg[:pad_len]]) segments.append(seg) return segments def _zscore_normalize(self, segment: np.ndarray) - np.ndarray: 对单个segment做Z-score均值为0标准差为1 mean np.mean(segment) std np.std(segment) 1e-8 # 防除零 return (segment - mean) / std关键参数说明window_size2048对应100ms12kHz下足够捕获轴承故障冲击周期step102450%重叠提升样本量同时保留时序连续性环形填充np.concatenate([seg, seg[:pad_len]])比零填充/镜像填充更能保持时序相位关系实测在OR故障识别中提升1.2%准确率。预处理结果存于data/processed/下按类别分文件夹每个.npy文件为(N, 2048)形状的float32数组N为该类切片总数。首次运行python preprocess.py自动完成耗时约8分钟i7-11800H。3. 模型架构与核心代码一维CNN不是二维CNN砍掉一维这里每层都为时序信号定制3.1 整体结构设计5层卷积2层全连接无池化层靠空洞卷积扩大感受野论文中强调“避免下采样丢失瞬态冲击信息”因此本模型彻底弃用MaxPool1D改用空洞卷积Dilated Convolution在保持分辨率的同时扩展感受野。结构如下输入(B, 1, 2048)层名类型参数输出尺寸设计意图conv1Conv1Din_channels1,out_channels32,kernel_size16,dilation1(B, 32, 2033)捕获基础冲击模式如单个脉冲conv2Conv1Dout_channels64,kernel_size16,dilation2(B, 64, 2001)感受野扩大至33点覆盖冲击群conv3Conv1Dout_channels128,kernel_size16,dilation4(B, 128, 1937)感受野达65点建模多周期衰减conv4Conv1Dout_channels256,kernel_size16,dilation8(B, 256, 1745)感受野129点覆盖典型故障周期如IR01≈150点conv5Conv1Dout_channels512,kernel_size16,dilation16(B, 512, 1361)感受野257点整合长程时序依赖fc1Linearin_features512*1361,out_features1024(B, 1024)全连接降维fc2Linearin_features1024,out_features10(B, 10)10类故障logits提示dilation值不是拍脑袋定的。它按2^(layer_idx-1)指数增长确保第L层感受野 kernel_size (kernel_size-1)*(dilation-1)最终conv5感受野257恰好覆盖西储数据中最长故障周期OR12故障基频对应约240点。3.2 核心模型代码models/one_d_cnn.py逐行解析# models/one_d_cnn.py import paddle import paddle.nn as nn class OneDCNN(nn.Layer): def __init__(self, num_classes: int 10, input_length: int 2048): super().__init__() self.num_classes num_classes self.input_length input_length # 5层空洞卷积每层后接BatchNorm1D ReLU self.conv1 nn.Conv1D(in_channels1, out_channels32, kernel_size16, dilation1, paddingsame) self.bn1 nn.BatchNorm1D(32) self.conv2 nn.Conv1D(32, 64, 16, dilation2, paddingsame) self.bn2 nn.BatchNorm1D(64) self.conv3 nn.Conv1D(64, 128, 16, dilation4, paddingsame) self.bn3 nn.BatchNorm1D(128) self.conv4 nn.Conv1D(128, 256, 16, dilation8, paddingsame) self.bn4 nn.BatchNorm1D(256) self.conv5 nn.Conv1D(256, 512, 16, dilation16, paddingsame) self.bn5 nn.BatchNorm1D(512) # 全连接层 self.fc1 nn.Linear(512 * 1361, 1024) # 注意1361来自conv5输出长度计算 self.dropout nn.Dropout(p0.5) self.fc2 nn.Linear(1024, num_classes) def forward(self, x: paddle.Tensor) - paddle.Tensor: # x shape: [B, 1, 2048] x self.bn1(self.conv1(x)) # [B, 32, 2048] x nn.functional.relu(x) x self.bn2(self.conv2(x)) # [B, 64, 2048] x nn.functional.relu(x) x self.bn3(self.conv3(x)) # [B, 128, 2048] x nn.functional.relu(x) x self.bn4(self.conv4(x)) # [B, 256, 2048] x nn.functional.relu(x) x self.bn5(self.conv5(x)) # [B, 512, 1361] ← 关键dilation16导致长度收缩 x paddle.flatten(x, start_axis1) # [B, 512*1361] x self.dropout(nn.functional.relu(self.fc1(x))) x self.fc2(x) # [B, 10] return x逻辑说明paddingsame是PaddlePaddle中保证输出长度≈输入长度的关键参数等效于padding(kernel_size-1)//2但仅当dilation1时严格成立dilation1时实际padding需手动计算本项目通过实验确认paddingsame在各层下输出长度误差1点可接受paddle.flatten(x, start_axis1)将[B, C, L]变为[B, C*L]为全连接做准备self.dropout仅在训练时生效model.train()自动启用推理时自动关闭。3.3 损失函数与优化器带标签平滑的交叉熵AdamW替代Adam防权重衰减失控工业数据存在标注噪声如轻微故障易被误标为正常直接用CrossEntropyLoss易过拟合。本项目采用标签平滑Label Smoothing# train.py criterion nn.CrossEntropyLoss(label_smooth0.1) # 平滑系数0.1将真实类概率从1→0.9其余类均分0.1 optimizer paddle.optimizer.AdamW( parametersmodel.parameters(), learning_rate1e-3, weight_decay1e-4, # L2正则抑制过拟合 beta10.9, beta20.999 )为什么用AdamW而非Adam因为Adam的weight_decay在梯度更新时与动量耦合导致实际正则强度随学习率变化而AdamW将权重衰减独立于梯度更新实测在轴承数据上使val_loss收敛更稳最终准确率提升0.4%。4. 训练与评估全流程从启动训练到生成混淆矩阵每一步都可追踪、可复现4.1 训练脚本train.py支持断点续训、动态学习率、GPU自动检测python train.py \ --data_dir data/processed/ \ --model_save_dir output/models/ \ --log_dir output/logs/ \ --epochs 100 \ --batch_size 64 \ --lr 0.001 \ --resume output/models/epoch_50.pdparams # 可选从中断处继续核心逻辑自动检测GPUpaddle.device.set_device(gpu:0) if paddle.is_compiled_with_cuda() else cpu断点续训加载pdparams模型参数和pdopt优化器状态两个文件确保step、learning_rate、momentum等完全一致学习率调度前10轮warmup线性升至lr后90轮余弦退火paddle.optimizer.lr.CosineAnnealingDecay避免初期震荡。训练日志实时写入output/logs/train.log包含每轮train_loss、train_acc、val_loss、val_acc及GPU显存占用。4.2 评估脚本evaluate.py不只是准确率还有故障敏感的F1-score与混淆矩阵python evaluate.py \ --model_path output/models/best_model.pdparams \ --data_dir data/processed/ \ --output_dir output/eval/输出文件output/eval/metrics.json含accuracy、macro_f1、weighted_f1、各类别precision/recall/f1output/eval/confusion_matrix.png标准化混淆矩阵行真实标签列预测标签重点观察易混淆故障对如IR01 vs IR02output/eval/class_report.txtsklearn风格分类报告含support样本数列暴露数据不平衡问题。提示西储数据中Normal类样本量是单个故障类的3倍若只看accuracy会虚高。macro_f1各类F1平均才是公平指标本项目目标≥0.97。4.3 避坑训练过程中的5个高频翻车点与硬核解法现象1训练loss下降但val_acc卡在85%不上升且val_loss开始上升原因过拟合。batch_size64在小数据集每类约2000样本上易记忆噪声。解决立即启用--augment参数默认关闭开启时序增强随机缩放±10%、高斯噪声SNR30dB、时间偏移±50点。代码在dataset/augment.py中增强后val_acc提升至96.2%。现象2CUDA out of memory即使batch_size16也报错原因Conv1D在dilation16时内部缓存激增Paddle 2.5.2默认未启用内存优化。解决在train.py开头添加paddle.set_flags({FLAGS_cudnn_deterministic: True}) # 启用确定性cudnn paddle.amp.auto_cast(enableFalse) # 关闭自动混合精度本项目FP32更稳现象3混淆矩阵显示OR01几乎全被判为Normal原因OR01故障冲击微弱原始信号信噪比低Z-score归一化后特征被压缩。解决在_zscore_normalize后追加冲击增强# dataset/cwru_dataset.py def _enhance_impulse(self, segment: np.ndarray) - np.ndarray: 对归一化后segment做包络谱增强简化版 analytic scipy.signal.hilbert(segment) envelope np.abs(analytic) return (segment 0.3 * envelope).astype(np.float32) # 加权融合现象4load_cwru_signal报KeyError: X097原因不同批次CWRU数据中信号变量名不同如X110_DE_time。解决utils/mat_loader.py中增加自动探测逻辑def auto_detect_signal_key(f: h5py.File) - str: candidates [X097, X110_DE_time, X111_DE_time, X112_DE_time] for key in candidates: if key in f: return key raise KeyError(No known signal key found in .mat file)现象5best_model.pdparams加载后val_acc比训练时低2%原因BatchNorm1D的running_mean/running_var在训练时更新但evaluate.py未调用model.eval()导致BN使用训练统计量而非全局统计量。解决evaluate.py中强制model.set_state_dict(paddle.load(model_path)) model.eval() # 关键否则BN行为异常5. 二次开发实战如何把模型嵌入边缘设备、替换为Transformer、或接入实时流式推理5.1 模型导出为Paddle Inference格式为Jetson或RK3588部署铺路训练好的模型不能直接部署需导出为__model____params__格式python export_model.py \ --model_path output/models/best_model.pdparams \ --save_dir output/inference_model/生成文件output/inference_model/__model__模型结构output/inference_model/__params__参数output/inference_model/inference.yml推理配置含输入shape[1,1,2048]部署时用Paddle Inference C API或Python API加载实测在Jetson Orin上单次推理耗时8msFP16精度。5.2 替换主干为Temporal Transformer用paddle.nn.MultiHeadAttention重写conv5之后若想尝试注意力机制不必重写整个模型。只需在OneDCNN.forward()末尾插入# 替换原fc1/fc2部分 x x.transpose([0, 2, 1]) # [B, 1361, 512] → 适配MHA输入 attn_out self.attention(x, x, x) # self-attention x attn_out.mean(axis1) # [B, 512]取时间维度均值 x self.fc_final(x) # Linear(512, 10)其中self.attention nn.MultiHeadAttention(embed_dim512, num_heads8)。注意需将conv5输出长度调整为能被8整除如1360可通过微调dilation或kernel_size实现。5.3 实时流式推理用滑动缓冲区处理无限长信号流工业现场信号是持续流不能等攒够2048点再推断。本项目提供stream_infer.pyclass StreamInference: def __init__(self, model_path: str): self.model paddle.jit.load(model_path) # 加载静态图模型 self.buffer np.zeros(2048, dtypenp.float32) # 环形缓冲区 self.ptr 0 def push_sample(self, sample: float): 单点推入O(1)时间 self.buffer[self.ptr] sample self.ptr (self.ptr 1) % 2048 def infer(self) - int: 当前缓冲区推理返回预测类别ID x self.buffer.reshape(1, 1, -1) # [1,1,2048] x paddle.to_tensor(x) pred self.model(x) # [1,10] return int(paddle.argmax(pred, axis1).item())从那以后我每次做工业时序模型部署都强制走一遍StreamInference单元测试——用模拟传感器数据流每秒12000点连续推断1小时监控内存是否泄漏、预测延迟是否抖动。这个习惯让我避开了三个项目上线后的半夜告警电话。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

大模型偏见污染:从Mac推荐看AI一本正经的胡说八道

大模型偏见污染:从Mac推荐看AI一本正经的胡说八道

1. 从一条Mac评论开始:当AI的"自信"掩盖了"偏差"你有没有遇到过这种情况:打开AI助手,问了一个关于Mac的问题,它给出的答案措辞严谨、结构清晰、语气笃定,乍一看完全值得信赖。但你仔细一琢磨&…

2026/10/16 21:10:33 阅读更多 →
MojoLauncher实例系统入门指南:如何管理10+个Minecraft版本不混乱

MojoLauncher实例系统入门指南:如何管理10+个Minecraft版本不混乱

【免费下载链接】MojoLauncher A Minecraft: Java Edition launcher, based on PojavLauncher 项目地址: https://gitcode.com/gh_mirrors/mo/MojoLauncher 点击查看 免费下载 MojoLauncher 是一款运行在 Android 上的 Minecraft: Java Edition 启动器,…

2026/10/16 21:10:33 阅读更多 →
对抗学习通用变换:让数据增强从手动设计到自动演化

对抗学习通用变换:让数据增强从手动设计到自动演化

去年我调一个小型图像分类模型的时候,被数据增强折腾得够呛:随机裁剪、水平翻转、色彩抖动、随机擦除,每个分支都试了一遍,最后发现这套组合只对这个数据集有效,换一个数据集直接掉点两个多点。那时候我就在想&#xf…

2026/10/16 21:10:33 阅读更多 →

最新新闻

工业操作系统介绍:制造四类场景的软件依赖与系统选型落点

工业操作系统介绍:制造四类场景的软件依赖与系统选型落点

一、工业操作系统的构成与场景分层工业操作系统是指运行在生产现场、承担任务调度、外设管理与工业通信协议栈支撑的系统软件,部署位置覆盖控制器、网关、边缘计算节点以及车间级工业服务器。与通用操作系统相比,它的技术重心集中在三处:时间…

2026/10/16 21:54:11 阅读更多 →
RayManPro实战:光线追踪渲染的拆包、调参与批处理

RayManPro实战:光线追踪渲染的拆包、调参与批处理

简介:RayManPro压缩包是基于RayMan模型开展人体生理等效温度(PET)计算的实用工具,面向城市气候、建筑环境与室外热舒适研究方向的师生及工程师。该模型由德国弗莱堡大学团队开发,是成熟的太阳辐射与生物气候模拟器&…

2026/10/16 21:54:11 阅读更多 →
信息组织集成法:分类法+主题词表+元数据,构建知识库导航检索闭环

信息组织集成法:分类法+主题词表+元数据,构建知识库导航检索闭环

做了十几年信息管理和内容治理,我见过太多团队在“信息组织”这个问题上原地打转。一谈建知识库,有人坚持用树状分类,说层级清晰;有人坚持用标签和词表,说灵活好维护;还有人上来就要上本体、做知识图谱。吵…

2026/10/16 21:54:11 阅读更多 →
Cubase 5机架文件加载原理与实操指南

Cubase 5机架文件加载原理与实操指南

简介:本资源为Cubase 5专用机架预设包,面向使用该经典DAW的音乐制作人、编曲初学者及混音工作者,解决手动搭建效果链耗时、参数调试门槛高、音色风格不统一等实际痛点。压缩包共2000个文件,主体为5492个vstpreset(VST效…

2026/10/16 21:54:11 阅读更多 →
Claude 删掉 Chat/Cowork 切换按钮:从模式选择到意图驱动的交互演进

Claude 删掉 Chat/Cowork 切换按钮:从模式选择到意图驱动的交互演进

最近两周,关于 Claude 界面改版的讨论又起来了,最集中的吐槽点就是:网页版右上角那个 Chat / Cowork 切换按钮不见了。不少人第一反应是"功能被砍了",或者在群里问"是不是我账号没权限"。其实我刚开始也愣了一…

2026/10/16 21:54:11 阅读更多 →
MATLAB曲线图片识别程序:从论文截图中自动提取数据点

MATLAB曲线图片识别程序:从论文截图中自动提取数据点

简介:一款基于MATLAB的曲线图片识别程序,主要面向需要从科研图像中自动提取曲线坐标的研究人员与工程技术人员。该工具能够对图片进行灰度化、二值化、去噪等预处理,并通过边缘检测、轮廓追踪和曲线拟合等步骤,将论文或实验图像中…

2026/10/16 21:53:10 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →