基于深度学习的锂电池SOH评估:Python实战与避坑指南
简介这份资源围绕锂电池健康状态SOH评估展开采用深度学习方法对NASA锂电池容量衰退数据集进行建模并进一步分析引入运行可监测数据后对SOH预测效果的影响。内容适合计算机、人工智能、电子信息、数学等相关专业学生及企业员工可用于毕业设计、课程设计、大作业或初期项目立项演示兼具入门练习与进阶借鉴价值。压缩包共15个文件约1.17MB包含3个Python源码文件、6个XML配置、2个CSV数据集、1个TXT依赖说明及README文档等代码覆盖1D-CNN、BiLSTM与Attention组合模型等实现结构清晰、便于复现。目前已有627人学习下载。读者可据此掌握从数据读取、特征构建到模型训练与评估的完整流程理解容量衰退趋势建模思路并参考项目说明快速搭建实验环境、排查运行问题为后续课题拓展提供可复用的代码基础。1. 锂电池 SOH 评估为什么深度学习值得你花时间锂电池健康状态SOH评估这件事做过的人都知道传统方法要么依赖实验室级别的充放电测试要么靠经验公式硬拟合一旦电池进入真实工况容量衰减曲线就开始“玄学”起来。而深度学习方法的介入本质上是把 SOH 评估从“手工特征经验模型”转向“数据驱动自动表征”。你手里如果有一个带 Python 源码和项目说明的 SOH 评估方案它大概率覆盖了从数据预处理、特征构建、模型训练到结果可视化的完整链路。这篇文章面向的是想把这个方向跑通的人不管你是刚接触深度学习的新手还是已经在做 BMS 算法、想看看别人怎么落地的熟手下面会从数据怎么组织、模型怎么选、参数怎么调、坑在哪一步步拆开讲。适合谁适合手里有电池充放电数据、想用 Python 快速验证 SOH 评估可行性的人。2. 数据准备与特征工程SOH 评估的地基怎么打2.1 电池数据从哪来、长什么样做 SOH 评估第一步不是写模型而是搞清楚你手里的数据是什么形态。常见的锂电池数据集来自 NASA PCoE、CALCE、Oxford 等公开源也有从 BMS 实车采集的工况数据。不管来源如何核心字段通常包括循环次数、电压、电流、温度、放电容量。SOH 的定义一般是当前最大可用容量与额定容量的比值公式为 SOH C_current / C_rated × 100%。这意味着你的标签不是直接给出的而是需要从充放电曲线中提取每次循环的放电容量再除以额定容量。原始数据往往是多通道时间序列采样频率从 1Hz 到 10Hz 不等。直接喂给模型效果通常不好因为序列太长、噪声大、冗余多。常见做法是先按循环切分每个循环提取若干统计特征或等间隔重采样。我一般会先把每个循环的放电段截出来然后统一重采样到固定长度比如 128 个点这样后续模型输入维度就固定了。import pandas as pd import numpy as np from scipy.signal import resample def extract_soh_label(cycle_data, rated_capacity): 从单个循环数据中提取放电容量并计算 SOH cycle_data: DataFrame包含 voltage, current, temperature, time rated_capacity: 额定容量单位 Ah # 放电段通常电流为负取电流小于阈值的区间 discharge_mask cycle_data[current] -0.1 discharge_data cycle_data[discharge_mask] if len(discharge_data) 10: return None # 安时积分法计算放电容量 time_diff discharge_data[time].diff().fillna(0) capacity np.abs(discharge_data[current] * time_diff).sum() / 3600 soh capacity / rated_capacity return soh def resample_cycle(cycle_data, target_length128): 将放电段电压、电流、温度重采样到固定长度 discharge_mask cycle_data[current] -0.1 discharge_data cycle_data[discharge_mask] if len(discharge_data) target_length: return None features [] for col in [voltage, current, temperature]: resampled resample(discharge_data[col].values, target_length) features.append(resampled) return np.stack(features, axis-1) # shape: (128, 3)上面两个函数分别负责标签提取和特征重采样。extract_soh_label用安时积分算容量注意时间单位要统一如果time是秒除 3600 转小时。resample_cycle把变长序列压到固定长度方便批量训练。参数target_length我一般设 128 或 256太小会丢动态信息太大则增加计算量且容易过拟合。2.2 特征工程除了原始序列还能喂什么原始电压电流序列当然可以直接送进 CNN 或 LSTM但如果你想让模型更快收敛、泛化更好手工特征仍然值得加。常见的派生特征包括放电电压平台均值、电压下降速率、温度最大值、温度上升斜率、放电中期内阻估计等。这些特征物理意义明确和 SOH 的相关性往往比原始序列更高。我通常会把每个循环的特征整理成一张表每行是一个循环列包括统计特征和 SOH 标签。这样你可以先用随机森林或 XGBoost 跑一个基线看看特征本身能解释多少 SOH 变化。如果树模型效果已经不错再上深度学习对比提升幅度心里有数。def build_feature_table(cycle_features, soh_labels): cycle_features: list of dict每个循环的统计特征 soh_labels: list of float对应 SOH df pd.DataFrame(cycle_features) df[SOH] soh_labels # 去掉缺失值过多的列 df df.dropna(axis1, thresh0.8 * len(df)) df df.fillna(df.median()) return df def stat_features(cycle_data): 提取单个循环的统计特征 discharge_mask cycle_data[current] -0.1 d cycle_data[discharge_mask] feats { voltage_mean: d[voltage].mean(), voltage_std: d[voltage].std(), voltage_min: d[voltage].min(), current_mean: d[current].mean(), temp_max: d[temperature].max(), temp_mean: d[temperature].mean(), temp_std: d[temperature].std(), duration: d[time].max() - d[time].min(), } return featsbuild_feature_table把特征字典列表转成 DataFrame 并处理缺失值stat_features提取了 8 个基础统计量。这些特征计算成本低适合快速验证。注意duration是放电时长和容量强相关但不同工况下可能引入偏差建议在跨工况评估时谨慎使用。2.3 数据集划分别让时间泄漏毁了你的评估SOH 评估里最常见的翻车点之一是随机划分训练集和测试集。电池数据是时间序列同一块电池的相邻循环高度相关随机打乱会让测试集里混入训练集附近的样本导致评估结果虚高。正确做法是按循环顺序划分比如前 70% 循环做训练后 30% 做测试或者按电池划分用一部分电池训练另一部分电池测试这样更能反映跨电池泛化能力。如果你做的是跨电池评估还要注意不同电池的额定容量可能不同SOH 标签本身已经归一化但电压电流的绝对数值可能因电池型号而异。常见做法是对输入特征做标准化用训练集的均值和方差去变换测试集而不是对全体数据做标准化。from sklearn.preprocessing import StandardScaler def split_by_cycle(df, train_ratio0.7): 按循环顺序划分避免时间泄漏 n len(df) train_end int(n * train_ratio) train_df df.iloc[:train_end].copy() test_df df.iloc[train_end:].copy() feature_cols [c for c in df.columns if c ! SOH] scaler StandardScaler() train_df[feature_cols] scaler.fit_transform(train_df[feature_cols]) test_df[feature_cols] scaler.transform(test_df[feature_cols]) return train_df, test_df, scaler这段代码按顺序切分并且只在训练集上拟合标准化参数。train_ratio一般设 0.7 到 0.8如果数据量少可以设 0.8。注意测试集不要参与任何拟合过程包括缺失值填充的均值也应该从训练集计算。3. 深度学习模型选型与训练CNN、LSTM 还是混合3.1 为什么 1D-CNN 是 SOH 评估的稳妥起点在 SOH 评估任务里输入通常是固定长度的多通道序列1D-CNN 能有效提取局部退化模式比如电压平台的缓慢下移、放电初期的电压跌落。相比 LSTMCNN 训练更快、参数更少在小数据集上不容易过拟合。我一般会先搭一个 3 层卷积加全局平均池化的结构作为基线模型。import torch import torch.nn as nn class SOHCNN(nn.Module): def __init__(self, input_channels3, seq_len128): super().__init__() self.conv1 nn.Conv1d(input_channels, 32, kernel_size5, padding2) self.conv2 nn.Conv1d(32, 64, kernel_size5, padding2) self.conv3 nn.Conv1d(64, 128, kernel_size3, padding1) self.pool nn.AdaptiveAvgPool1d(1) self.fc nn.Sequential( nn.Linear(128, 64), nn.ReLU(), nn.Dropout(0.3), nn.Linear(64, 1) ) self.relu nn.ReLU() def forward(self, x): # x: (batch, channels, seq_len) x self.relu(self.conv1(x)) x self.relu(self.conv2(x)) x self.relu(self.conv3(x)) x self.pool(x).squeeze(-1) return self.fc(x)这个网络输入维度是(batch, 3, 128)对应电压、电流、温度三个通道。卷积核大小 5 和 3 是常见选择padding 保持序列长度不变。全局平均池化把每个通道压成一个标量减少全连接层参数。Dropout 设 0.3 是经验值数据量小可以调到 0.5。输出一个标量直接回归 SOH。3.2 LSTM 与 CNN-LSTM 混合什么时候值得上如果你的数据采样频率低、循环内序列短CNN 可能抓不到足够的时间依赖这时候 LSTM 或 GRU 更合适。LSTM 能建模长程依赖但训练慢、容易过拟合。我通常会在 CNN 后面接一层 LSTM让 CNN 先提取局部模式LSTM 再建模循环内演化。这种混合结构在 SOH 评估里比较常见效果通常比纯 CNN 或纯 LSTM 稳。class CNNLSTM(nn.Module): def __init__(self, input_channels3, seq_len128, hidden_size64): super().__init__() self.conv nn.Sequential( nn.Conv1d(input_channels, 32, 5, padding2), nn.ReLU(), nn.Conv1d(32, 64, 5, padding2), nn.ReLU(), ) self.lstm nn.LSTM(64, hidden_size, batch_firstTrue, bidirectionalFalse) self.fc nn.Linear(hidden_size, 1) def forward(self, x): # x: (batch, channels, seq_len) x self.conv(x) # (batch, 64, seq_len) x x.permute(0, 2, 1) # (batch, seq_len, 64) out, (h, c) self.lstm(x) return self.fc(h[-1])CNNLSTM先卷积再 LSTM最后取最后一个时间步的隐藏状态做回归。hidden_size设 64 是平衡表达能力和计算量的选择数据量大可以加到 128。注意batch_firstTrue让输入维度是(batch, seq, feature)permute 那一步别漏。3.3 训练循环与关键参数学习率、批次、早停训练 SOH 回归模型损失函数用 MSE 或 HuberLoss。HuberLoss 对异常值更鲁棒如果数据里有标注错误的循环用 Huber 更稳。优化器选 Adam学习率从 1e-3 开始配合 ReduceLROnPlateau 在验证损失不降时减半。批次大小 32 或 64取决于数据量。早停耐心值设 10 到 20 个 epoch。def train_model(model, train_loader, val_loader, epochs100, lr1e-3, patience15): device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) criterion nn.HuberLoss() optimizer torch.optim.Adam(model.parameters(), lrlr) scheduler torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, patience5, factor0.5) best_val_loss float(inf) wait 0 for epoch in range(epochs): model.train() train_loss 0 for x, y in train_loader: x, y x.to(device), y.to(device) optimizer.zero_grad() pred model(x).squeeze() loss criterion(pred, y) loss.backward() optimizer.step() train_loss loss.item() model.eval() val_loss 0 with torch.no_grad(): for x, y in val_loader: x, y x.to(device), y.to(device) pred model(x).squeeze() val_loss criterion(pred, y).item() val_loss / len(val_loader) scheduler.step(val_loss) if val_loss best_val_loss: best_val_loss val_loss torch.save(model.state_dict(), best_soh_model.pth) wait 0 else: wait 1 if wait patience: print(fEarly stop at epoch {epoch}) break return best_val_loss训练循环里每个 epoch 记录训练损失和验证损失验证损失用于调度器和早停。patience15表示验证损失连续 15 个 epoch 不降就停。保存最佳模型权重后续评估用。注意pred.squeeze()把输出从(batch, 1)压成(batch,)和标签维度对齐。4. 避坑与排查SOH 评估里那些血泪经验4.1 现象验证损失比训练损失低很多原因数据划分时验证集和训练集分布不一致或者验证集太小导致波动大。更隐蔽的原因是标准化参数从全体数据计算验证集信息泄漏到训练过程。解决严格按时间或电池划分标准化只在训练集拟合。如果验证损失仍然异常低检查验证集是否包含和训练集同一循环的重复样本。4.2 现象模型在测试集上 SOH 预测值几乎不变原因输入特征没有区分度或者模型退化成输出均值。常见于特征未标准化、学习率过大导致模型直接收敛到常数解。解决先检查输入特征的方差如果某些通道方差接近零说明该通道没有信息。降低学习率到 1e-4增加 Dropout或者先用树模型验证特征是否有效。4.3 现象训练初期损失直接变成 NaN原因学习率太大、输入数据包含 NaN 或无穷值、HuberLoss 的 delta 参数设置不当。解决检查数据里是否有缺失值用df.isnull().sum()排查。学习率从 1e-4 开始试。HuberLoss 默认 delta1.0如果 SOH 标签在 0 到 1 之间这个值合理如果标签范围大需要调整。4.4 现象跨电池评估时误差翻倍原因不同电池的电压平台、内阻、温度特性不同模型学到了训练电池的特定模式无法泛化。解决增加训练电池数量做数据增强比如加噪声、时间缩放。或者改用更鲁棒的特征比如电压差分、温度相对变化率减少对绝对值的依赖。4.5 现象推理时显存溢出原因批量大小太大或者序列长度设得过长。1D-CNN 对序列长度敏感128 和 512 的显存占用差很多。解决减小批次大小或者用梯度累积模拟大批量。序列长度根据实际采样率调整不必追求过长。5. 进阶技巧用注意力机制和迁移学习提升 SOH 评估精度5.1 给 CNN 加一个轻量注意力模块CNN 提取的特征在所有时间步上权重相同但 SOH 退化信息往往集中在放电中后期。加一个通道注意力或时间注意力模块能让模型聚焦关键片段。我常用 SE 模块Squeeze-and-Excitation加在卷积层后面参数量增加很少效果提升明显。class SEBlock(nn.Module): def __init__(self, channels, reduction8): super().__init__() self.fc nn.Sequential( nn.Linear(channels, channels // reduction), nn.ReLU(), nn.Linear(channels // reduction, channels), nn.Sigmoid() ) def forward(self, x): # x: (batch, channels, seq_len) w x.mean(dim-1) # (batch, channels) w self.fc(w).unsqueeze(-1) # (batch, channels, 1) return x * wSEBlock 先对时间维做全局平均得到每个通道的权重再乘回原特征。reduction8控制中间层压缩比例通道数少时可以设 4。把这个模块插在卷积层之后、激活函数之前通常能提升 1 到 2 个百分点的 R²。5.2 迁移学习用源电池数据预训练目标电池微调跨电池 SOH 评估数据少是常态。一个实用技巧是先在数据量大的电池上预训练然后冻结卷积层只微调全连接层。如果目标电池数据极少甚至可以只微调最后一层。微调时学习率设小一点比如 1e-4避免破坏预训练特征。def fine_tune(model, target_loader, epochs30, lr1e-4): # 冻结卷积层 for param in model.conv.parameters(): param.requires_grad False optimizer torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lrlr) criterion nn.HuberLoss() model.train() for epoch in range(epochs): for x, y in target_loader: optimizer.zero_grad() pred model(x).squeeze() loss criterion(pred, y) loss.backward() optimizer.step() return model微调时只更新全连接层参数卷积层冻结。如果目标数据有几百个循环可以解冻最后一层卷积一起微调。注意微调前先保存预训练权重避免翻车后没有后悔药。5.3 验证方法别只看 MSE看 SOH 误差分布回归任务常用 MSE 或 MAE但 SOH 评估更关心误差是否在可接受范围内。我习惯画预测 SOH 和真实 SOH 的散点图看是否集中在对角线附近。另外计算最大绝对误差和误差标准差如果最大误差超过 5%即使 MSE 很低实际使用也可能出问题。指标含义建议阈值MAE平均绝对误差 2%RMSE均方根误差 3%Max Error最大绝对误差 5%R²拟合优度 0.9这些阈值不是绝对的取决于你的应用场景。储能系统对 SOH 精度要求可能比消费电子宽松。关键是把误差分布看清楚而不是只报一个平均值。我自己的习惯是每次训练完先把测试集预测结果按 SOH 区间分桶看低 SOH 段和高 SOH 段的误差是否一致。如果低 SOH 段误差明显更大说明模型对衰退后期的模式学得不够需要补充后期样本或调整损失权重。这个习惯帮我省了很多次返工。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

9Router 自托管部署指南:把 AI 网关搬进自己的服务器

9Router 自托管部署指南:把 AI 网关搬进自己的服务器

9Router 自托管部署指南:把 AI 网关搬进自己的服务器 【免费下载链接】9router Unlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40 providers. Auto-fallback, RTK -40% tokens, never…

2026/10/10 21:39:27 阅读更多 →
算家云上线IndexTTS-2.5专用镜像:云端跑TTS的时代来了?

算家云上线IndexTTS-2.5专用镜像:云端跑TTS的时代来了?

算家云上线IndexTTS-2.5专用镜像:云端跑TTS的时代来了? 【免费下载链接】IndexTTS-2.5 项目地址: https://ai.gitcode.com/hf_mirrors/IndexTeam/IndexTTS-2.5 开源TTS圈最近有一类声音越来越密集:模型权重免费、代码公开&#xff0c…

2026/10/10 21:38:25 阅读更多 →
MegaSR C105 RAID驱动安装与蓝屏排错实战指南

MegaSR C105 RAID驱动安装与蓝屏排错实战指南

简介:MegaSR C105 RAID控制器驱动包专为服务器存储环境准备,面向系统运维、硬件维护及服务器搭建人员,用于解决操作系统无法识别磁盘阵列、RAID卡不工作、硬盘状态不能正常监控等问题。该驱动支持Windows Server 2003及其后续系统的x86/x64环…

2026/10/10 21:38:25 阅读更多 →

最新新闻

2026亲测有效:6款降AI工具盘点,教你如何彻底降低AIGC机器痕迹

2026亲测有效:6款降AI工具盘点,教你如何彻底降低AIGC机器痕迹

辛苦熬夜码字大半个月,查重绿了,结果AIGC检测直接爆表飘红,连自己逐字敲的段落都被判定为AI生成,那种无奈真让人抓狂。 盲目替换同义词不仅改得语无伦次,降ai效果也微乎其微。为解决这痛点,我花半个月测遍市…

2026/10/10 22:25:12 阅读更多 →
OpenSkill 论文逐段拆解:Agent 靠“技能自进化“刷出多项 SOTA,原理并不玄

OpenSkill 论文逐段拆解:Agent 靠“技能自进化“刷出多项 SOTA,原理并不玄

OpenSkill 论文逐段拆解:Agent 靠"技能自进化"刷出多项 SOTA,原理并不玄 【免费下载链接】skills Skills Catalog for Codex 项目地址: https://gitcode.com/GitHub_Trending/skills4/skills 2026 年的开源生态里,"Ski…

2026/10/10 22:25:12 阅读更多 →
三步给 Worktrunk 接上 CI 网关:让 Agent 每次改动都先过测试再合入主干

三步给 Worktrunk 接上 CI 网关:让 Agent 每次改动都先过测试再合入主干

三步给 Worktrunk 接上 CI 网关:让 Agent 每次改动都先过测试再合入主干 【免费下载链接】worktrunk Worktrunk is a CLI for Git worktree management, designed for parallel AI agent workflows 项目地址: https://gitcode.com/GitHub_Trending/wo/worktrunk …

2026/10/10 22:25:12 阅读更多 →
Fine语言窗口组件详解:从声明式语法到工程实践

Fine语言窗口组件详解:从声明式语法到工程实践

如果你做过GUI开发,一定知道“窗口组件”这四个字在不同的语言和框架里含义差得很远。有的语言里它指一个系统级窗口句柄,有的框架里它指一套可拖拽的控件库,而在Fine语言里,“窗口组件”是一个完整的界面描述体系——从顶层窗口到…

2026/10/10 22:25:11 阅读更多 →
基于SpringBoot的高校课程智能选课系统-附源码

基于SpringBoot的高校课程智能选课系统-附源码

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/10/10 22:24:11 阅读更多 →
多层内支撑基坑的ABAQUS模拟:从地应力平衡到收敛调试

多层内支撑基坑的ABAQUS模拟:从地应力平衡到收敛调试

从基坑开挖模拟入手,很多刚接触ABAQUS的朋友第一反应是:不就是把土挖掉吗?模型建好,边界设好,跑一下就出来了。可一旦真做起来,尤其是碰到多层内支撑的工况,问题一个接一个往外冒:地…

2026/10/10 22:23:11 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

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/10 11:14:25 阅读更多 →
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/10 1:36:08 阅读更多 →
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/10 11:14:58 阅读更多 →

月新闻

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