脑瘤二值分割的临床鲁棒性:从数据校验到边界精度量化
简介本资源是面向医学图像分析、深度学习分割任务研究者与初学者的大脑磁共振脑瘤二值分割数据集专为训练和验证U-Net等分割模型提供高质量标注样本。数据集严格划分为训练集1099对tif格式MRI原图与对应mask和测试集274对tif图像及mask所有文件已按images/masks目录结构组织开箱即用另附show.py可视化脚本支持一键加载并生成原始图像、真值掩膜及叠加蒙版三图对比便于结果评估与教学演示。资源共2000个文件其中1999个为16位TIFF格式医学影像含TCGA来源多例脑瘤切片1个为Python脚本压缩包仅130.8MB轻量高效。目前已有396人学习下载适合开展医学图像分割入门实践、模型baseline构建、数据预处理流程验证及课程实验设计。1. 为什么脑瘤分割任务总在二值掩膜上“卡壳”这个数据集不是拿来就用的玩具而是照出模型真实缺陷的X光片你手头刚下好那个标着“大脑磁共振脑瘤图像分割”的数据集打开一看T1加权、T2加权、FLAIR三通道原始图配着一张纯黑底纯白病灶区域的PNG掩膜——典型的二值图像分割任务。你兴冲冲跑通U-NetDice系数刷到0.85心里刚冒出“成了”结果一放到临床合作方提供的新扫描仪数据上病灶边缘直接糊成一片灰连肿瘤是弥漫性还是边界清晰都分不清。这不是模型不行是你没看清这个数据集真正的设计意图和隐含约束它本质是一套用于验证“二值判定能力”的基准工具而非端到端临床部署的训练原料。它强制你直面三个硬骨头——模态间强度漂移怎么对齐、小病灶5mm在低信噪比区域如何不漏检、以及最关键的一点所有标注者只标“有/无肿瘤”却从不告诉你“这是胶质母细胞瘤还是转移瘤”。这意味着你若把它当多类别数据用模型学到的只是伪相关若只盯着Dice刷分反而会掩盖定位偏差这种临床致命问题。适合它的人不是想快速出demo的实习生而是正在搭建医学AI质控流程的算法工程师、需要复现论文基线的研究生或是正为注册审批准备可解释性证据的医疗器械研发者。2. 数据结构解剖从文件夹命名规则里读出标注一致性协议这个数据集的目录结构看似简单实则暗藏质量控制逻辑。常见版本如BraTS衍生精简版或私有标注集通常按如下层级组织brats_tumor_binary/ ├── images/ │ ├── patient_001_T1.nii.gz │ ├── patient_001_T2.nii.gz │ ├── patient_001_FLAIR.nii.gz │ └── ... ├── masks/ │ ├── patient_001_mask.png # 二值掩膜0背景255肿瘤 │ └── ... ├── metadata.json # 包含扫描参数、场强、序列TR/TE等 └── train_val_test_split.csv # 明确划分非随机打乱注意.png掩膜文件是关键陷阱。它表面是单通道灰度图但实际只允许像素值为0或255——任何中间值如128都是标注错误。我见过三次因图像处理库自动归一化如OpenCV读取后除以255转float32导致掩膜变成0.0/1.0后续损失函数计算时被误判为概率图训练全程“安静地失败”。2.1 掩膜合法性校验脚本三行代码守住数据入口关import numpy as np from PIL import Image def validate_mask(mask_path): mask np.array(Image.open(mask_path)) unique_vals np.unique(mask) if not np.all(np.isin(unique_vals, [0, 255])): raise ValueError(fMask {mask_path} contains illegal values: {unique_vals}) if mask.dtype ! np.uint8: raise TypeError(fMask {mask_path} dtype is {mask.dtype}, expected uint8) print(f✓ {mask_path}: valid binary mask with {np.sum(mask255)} foreground pixels) # 批量校验 import glob for mask_path in glob.glob(masks/*.png): validate_mask(mask_path)这段代码不是锦上添花是必须前置执行的准入检查。它强制暴露两类问题一是标注员手抖画出的灰色过渡区值为127二是预处理流水线中未重置数据类型的隐性污染。运行后若报错立刻停住——别急着改代码先回溯标注平台导出设置确认是否勾选了“二值化输出”。很多团队栽在这一步花三天调参不如花三分钟跑一遍这个脚本。2.2 原始图像与掩膜的空间对齐验证为什么ITK-SNAP里看起来“严丝合缝”代码里却错位3像素MRI数据的坐标系RAS与PNG掩膜的像素坐标系左上原点天然不兼容。数据集提供者常声称“已配准”但实际只做了粗略仿射对齐。验证方法不是靠肉眼而是用ITK或NiBabel读取原始NIfTI头信息提取affine矩阵再反向映射掩膜坐标import nibabel as nib import numpy as np def check_alignment(image_nii_path, mask_png_path): # 读取NIfTI图像获取空间信息 img_nii nib.load(image_nii_path) affine img_nii.affine # 4x4变换矩阵 img_data img_nii.get_fdata() # 读取PNG掩膜假设已重采样到相同体素尺寸 mask_pil Image.open(mask_png_path) mask_np np.array(mask_pil) // 255 # 转为0/1 # 关键检查shape是否一致忽略通道维度 if img_data.shape[:3] ! mask_np.shape: raise ValueError(fShape mismatch: {img_data.shape[:3]} vs {mask_np.shape}) # 验证中心点是否重合取肿瘤重心 tumor_coords np.where(mask_np 1) if len(tumor_coords[0]) 0: print(⚠ No tumor in mask) return center_mask np.array([np.mean(tumor_coords[i]) for i in range(3)]) # 将掩膜坐标转为世界坐标 center_mask_world np.dot(affine, np.append(center_mask, 1))[:3] # NIfTI图像中心的世界坐标 center_img_world np.dot(affine, np.array([img_data.shape[0]//2, img_data.shape[1]//2, img_data.shape[2]//2, 1]))[:3] distance np.linalg.norm(center_mask_world - center_img_world) if distance 2.0: # 允许2mm误差 print(f❌ Alignment warning: center offset {distance:.2f}mm) else: print(f✓ Alignment OK: center offset {distance:.2f}mm) # 示例调用 check_alignment(images/patient_001_T1.nii.gz, masks/patient_001_mask.png)这个验证的价值在于它把“感觉对齐”变成可量化的毫米级指标。临床场景中1mm偏移可能导致手术导航偏差而模型若在错位数据上训练学到的将是虚假的空间关联。我曾在一个项目中发现因DICOM转NIfTI时丢失了qform矩阵所有掩膜在z轴方向系统性偏移1.8mm——这个数字只有跑完这段代码才敢写进测试报告。3. 模型选型铁律为什么UNet是起点但绝不能是终点二值分割看似简单但在脑瘤场景下UNet的默认结构存在三个结构性短板第一跳跃连接传递的低层特征包含大量血管伪影和脑脊液信号这些在肿瘤区域与背景交界处形成干扰第二标准UNet的末端Sigmoid激活对小目标敏感度不足易产生“毛边”第三它完全忽略MRI序列间的物理相关性——T1像显示解剖结构FLAIR像凸显水肿模型却把它们当独立RGB通道喂进去。3.1 改进型UNet轻量但致命的三处手术刀式修改我们不推全新架构而是在UNet主干上做三处精准干预实测在BraTS-like二值数据上Dice提升2.3%p0.01import torch import torch.nn as nn class TumorUNet(nn.Module): def __init__(self, n_channels3, n_classes1): super().__init__() # 主干沿用UNet但编码器第一层增加通道注意力SE Block self.encoder1 nn.Sequential( nn.Conv3d(n_channels, 64, 3, padding1), nn.ReLU(inplaceTrue), SEBlock(64), # 新增抑制血管伪影通道 ) # 解码器末端不用Sigmoid改用带温度系数的Softmax self.final_conv nn.Conv3d(64, n_classes, 1) self.temperature nn.Parameter(torch.tensor(0.5)) # 可学习温度初始设低值增强锐度 def forward(self, x): x self.encoder1(x) # ... 中间UNet结构省略 ... logits self.final_conv(x) # 关键温度缩放Softmax替代Sigmoid scaled_logits logits / self.temperature return torch.softmax(scaled_logits, dim1)[:, 1:, ...] # 取肿瘤通道 class SEBlock(nn.Module): def __init__(self, channel, reduction16): super().__init__() self.avg_pool nn.AdaptiveAvgPool3d(1) self.fc nn.Sequential( nn.Linear(channel, channel // reduction, biasFalse), nn.ReLU(inplaceTrue), nn.Linear(channel // reduction, channel, biasFalse), nn.Sigmoid() ) def forward(self, x): b, c, _, _, _ x.size() y self.avg_pool(x).view(b, c) y self.fc(y).view(b, c, 1, 1, 1) return x * y.expand_as(x)参数说明SEBlock(64)作用于编码器首层输出让网络自动抑制T2序列中高亮的血管通道这些在肿瘤分割中是噪声temperature0.5温度系数越小Softmax输出越“尖锐”强制模型在边界处做明确0/1决策解决Sigmoid输出模糊问题torch.softmax(...)[..., 1:, ...]虽是二值任务但用2类Softmax能天然引入类别平衡避免Sigmoid在前景稀疏时梯度消失。血泪经验某次我把temperature初始化为1.0训练30轮后Dice停滞在0.82改成0.3并加权重衰减后第12轮就突破0.85。这说明——在医学分割里激活函数的数值稳定性比网络深度更重要。3.2 多序列融合策略不拼通道数而建物理关系模型把T1、T2、FLAIR简单concat成3通道输入是最大误区。正确做法是构建序列感知模块Sequence-Aware Fusion, SAFclass SAFModule(nn.Module): def __init__(self, in_channels64): super().__init__() # 为每个序列分支设计独立卷积捕获模态特异性 self.t1_branch nn.Conv3d(in_channels, in_channels//3, 1) self.t2_branch nn.Conv3d(in_channels, in_channels//3, 1) self.flair_branch nn.Conv3d(in_channels, in_channels//3, 1) # 物理关系门控学习T1-T2、T2-FLAIR的强度比约束 self.gate nn.Sequential( nn.Conv3d(in_channels, 32, 1), nn.ReLU(), nn.Conv3d(32, 3, 1), # 输出3个门控权重 nn.Softmax(dim1) ) def forward(self, t1_feat, t2_feat, flair_feat): # 分支特征提取 t1_f self.t1_branch(t1_feat) t2_f self.t2_branch(t2_feat) flair_f self.flair_branch(flair_feat) # 拼接所有特征用于门控 cat_feat torch.cat([t1_feat, t2_feat, flair_feat], dim1) gate_weights self.gate(cat_feat) # [B,3,D,H,W] # 加权融合 fused (gate_weights[:, 0:1] * t1_f gate_weights[:, 1:2] * t2_f gate_weights[:, 2:3] * flair_f) return fused这个模块的物理意义在于它不假设序列间是平等的而是让网络自己学“T1像解剖结构可靠FLAIR像水肿范围大但边界模糊”这类先验。在消融实验中SAF比简单concat提升Dice 1.7%且推理速度几乎无损——因为所有操作都在特征空间不增加额外分辨率。4. 训练与评估避坑那些让Dice虚高、临床失效的“优雅陷阱”4.1 常见问题排查5条踩过坑才敢写的硬核清单现象训练Loss持续下降Val Dice稳定在0.88但测试集上肿瘤边缘全是“锯齿状”伪影原因数据增强中使用了RandomRotation旋转角度5°导致MRI切片间空间连续性被破坏模型学到的是旋转不变性而非解剖连续性解决禁用旋转改用ElasticDeformationalpha200, sigma15模拟真实形变或仅对2D切片做≤3°微调现象验证时Dice很高但计算Hausdorff DistanceHD95超过25mm临床不可接受原因损失函数仅用Dice Loss未加边界感知项小病灶的边界像素在batch中占比过低梯度被淹没解决采用DiceFocal Loss组合Focal Loss的gamma设为2.0强制模型关注难分像素同时对mask做morphological dilation生成边界标签加权监督现象不同GPU上训练结果差异巨大Dice波动±0.03原因BatchNorm层在小batch如batch2下统计量不稳定尤其MRI数据强度分布宽解决禁用BN改用GroupNormnum_groups8或固定BN统计量model.eval()时冻结BN现象模型在训练集上完美分割但遇到新扫描仪数据如1.5T→3T时Dice暴跌至0.62原因预处理未做强度标准化仅用z-score均值/方差但MRI强度无绝对物理意义解决改用N4BiasFieldCorrectionITK实现做偏置场校正再用PercentileNormalization(1st, 99th)截断归一化现象推理时显存爆满单张3D图像需8GB显存原因直接加载全尺寸NIfTI如240×240×155未按滑动窗口切块解决用nnUNet的patch机制窗口大小设为128×128×64重叠率0.5关键——重叠区域用高斯加权融合而非简单平均避免块效应提示第4条问题最隐蔽。某次我们交付模型给医院对方用自研扫描协议采集数据因未提前做N4校正整个测试集Dice低于0.7。后来补上这步立刻回升到0.86。医学AI的鲁棒性80%取决于预处理而非网络结构。5. 临床级验证不止于Dice用三个可测量指标回答医生灵魂拷问医生不会问“你的Dice多少”他们会问“它能把1cm以下的复发灶标出来吗”、“水肿和肿瘤本体分得清吗”、“切片间会不会突然‘闪断’”。我们必须用可解释、可测量的方式回应。5.1 小病灶召回率Small Lesion Recall, SLR定义与计算SLR专为检测5mm病灶设计避开Dice对大病灶的偏好def calculate_slr(pred_mask, gt_mask, voxel_spacing(1.0,1.0,1.0), min_diameter_mm5.0): pred_mask, gt_mask: 3D numpy arrays (0/1) voxel_spacing: tuple (dx, dy, dz) in mm from scipy import ndimage # 连通域分析 gt_labels, gt_num ndimage.label(gt_mask) pred_labels, pred_num ndimage.label(pred_mask) # 计算每个GT病灶的等效直径 slr_count 0 total_small_gt 0 for i in range(1, gt_num1): gt_component (gt_labels i) volume_voxels np.sum(gt_component) volume_mm3 volume_voxels * np.prod(voxel_spacing) # 球形近似直径 2 * (3*V/4π)^(1/3) diameter_mm 2 * ((3 * volume_mm3) / (4 * np.pi)) ** (1/3) if diameter_mm min_diameter_mm: total_small_gt 1 # 检查该GT是否被pred覆盖IoU0.3 intersection np.sum(gt_component (pred_mask 1)) if intersection / np.sum(gt_component) 0.3: slr_count 1 return slr_count / max(total_small_gt, 1) # 示例对单例计算 slr calculate_slr(pred_array, gt_array, voxel_spacing(0.9,0.9,2.0)) print(fSmall Lesion Recall: {slr:.3f})为什么设IoU阈值0.3临床共识只要覆盖病灶核心区域1/3以上放射科医生即可确认存在。SLR0.5意味着模型对微小复发灶不可靠——这比Dice0.8更值得警觉。5.2 边界精度量化用Signed Distance MapSDM替代主观评价传统HD95只看最远点无法反映整体边界质量。SDM将每个像素映射为到GT边界的有符号距离内部为负外部为正然后计算预测边界与GT边界的L2距离def boundary_distance_score(pred_mask, gt_mask, voxel_spacing(1.0,1.0,1.0)): from scipy.ndimage import distance_transform_edt # 计算GT的有符号距离图 gt_dist distance_transform_edt(gt_mask, samplingvoxel_spacing) gt_dist_inv distance_transform_edt(1-gt_mask, samplingvoxel_spacing) sdm_gt gt_dist - gt_dist_inv # 同样计算Pred的SDM pred_dist distance_transform_edt(pred_mask, samplingvoxel_spacing) pred_dist_inv distance_transform_edt(1-pred_mask, samplingvoxel_spacing) sdm_pred pred_dist - pred_dist_inv # 只在GT边界附近计算±5mm带状区域 boundary_mask (np.abs(sdm_gt) 5.0) (gt_mask | pred_mask) if np.sum(boundary_mask) 0: return float(inf) # L2距离 diff sdm_pred - sdm_gt return np.sqrt(np.mean((diff[boundary_mask] ** 2))) # 示例 bds boundary_distance_score(pred_mask, gt_mask) print(fBoundary Distance Score: {bds:.2f}mm) # 临床接受阈值≤1.5mm这个指标直接对应医生说的“边界是否锐利”。BDS2.0mm时放射科医生在阅片中会明显感到“肿瘤轮廓发虚”即使Dice很高。5.3 切片间一致性Slice-to-Slice Consistency, SSC防止3D推理中的“幽灵病灶”MRI是3D数据但很多模型按2D切片训练导致z轴方向出现孤立的“幽灵病灶”单层有预测上下层全无。SSC用以下公式量化$$ SSC 1 - \frac{1}{N-2}\sum_{z1}^{N-1} \mathbb{I}\left[ \text{pred}z \neq 0 \land (\text{pred}{z-1} 0 \land \text{pred}_{z1} 0) \right] $$其中$\mathbb{I}$为指示函数$N$为切片总数。SSC1.0表示完美连续0.95即存在临床不可接受的断裂。我坚持在每次模型迭代后跑这三项指标不是为了写报告而是当SLR突然掉到0.4我知道该去检查数据增强里的弹性形变参数当BDS升到1.8mm我立刻回滚上一版的温度系数调整。这些数字是模型和临床之间的翻译器没有它们再高的Dice也只是空中楼阁。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

开源AI本地部署,零成本制作产品宣传片全流程

开源AI本地部署,零成本制作产品宣传片全流程

甲方丢过来一句话:“帮我们的新产品做一条宣传片,预算三万,下周要。”这不是段子,是很多做运营、做电商、做自媒体账号的朋友经常碰到的需求。以前接到这种需求,要么找外包烧钱,要么自己拉一堆素材在剪辑软…

2026/10/18 17:53:47 阅读更多 →
Codex实战指南:代码生成的精准翻译与工程化落地

Codex实战指南:代码生成的精准翻译与工程化落地

1. 项目概述:Codex 不是“AI 写代码”,而是“把编程意图精准翻译成可执行逻辑”的工程化工具“这应该是全网最全的 Codex 实战教程了”——这个标题乍看像营销话术,但如果你真花三天时间通读完本篇,会发现它不是夸张,而…

2026/10/18 17:53:47 阅读更多 →
基于SSM+Vue的广告管理系统:四角色权限与业务流全解析

基于SSM+Vue的广告管理系统:四角色权限与业务流全解析

简介:面向计算机相关专业毕业设计与课程设计场景,这份基于SSM框架的广告管理系统以Java为后端、Vue为前端,采用B/S架构和MySQL数据库,完整实现管理员、广告客户、广告商、广告制作商四类角色,围绕广告投放渠道管理、需…

2026/10/18 17:52:47 阅读更多 →

最新新闻

MarkEzd.dll二次开发全攻略:激光打标机与自动化产线集成

MarkEzd.dll二次开发全攻略:激光打标机与自动化产线集成

简介:一套面向激光打标行业开发者与 C# 工程师的 EZCAD 二次开发资源包。EZCAD 是工业激光标记场景下的常用上位机软件,支持图形编辑、文字处理、条形码/二维码生成与序列号递增;EZCAD2 在界面友好度、图形处理能力与自动化流程上进一步升级。…

2026/10/18 19:17:19 阅读更多 →
STM32F407固件库LWIP以太网移植:从PHY配置到TCP通信的排坑指南

STM32F407固件库LWIP以太网移植:从PHY配置到TCP通信的排坑指南

简介:一份面向STM32F407开发者的以太网与LWIP协议栈实战资源包,涵盖固件库驱动到网络协议栈的完整代码,适合嵌入式初学者及希望在ARM平台实现联网功能的中级开发者。压缩包内共2000个文件,包括1041个头文件、881个C源文件和78个文…

2026/10/18 19:17:19 阅读更多 →
SpringBoot+Vue毕业设计实战:抗疫物资管理系统从数据库设计到部署答辩

SpringBoot+Vue毕业设计实战:抗疫物资管理系统从数据库设计到部署答辩

每到毕业设计季,我后台总能收到一堆高相似度的问题:SpringBoot 和 Vue 到底怎么连起来?物资管理系统的数据库表要建几张才够?论文里的测试数据怎么造才不像编的?部署文档写到什么程度才算完整?这些问题背后…

2026/10/18 19:17:19 阅读更多 →
JavaScript鼠标事件总结:从点击到拖拽的完整实战指南

JavaScript鼠标事件总结:从点击到拖拽的完整实战指南

平时接需求的时候,最常见的前端交互就是鼠标点击、拖拽、右键菜单这一类。很多人项目做多了,click用得很顺,但真要把「按住拖动」「滚轮缩放」「自定义右键菜单」做稳,就会发现鼠标事件这套东西比想象中复杂不少。javascript鼠标事…

2026/10/18 19:17:19 阅读更多 →
自监督学习加速药物分子研发:全链路解析与实战调优

自监督学习加速药物分子研发:全链路解析与实战调优

自监督学习这几年在各行各业都火得不行,从自然语言处理到计算机视觉,基本都靠这套思路把数据红利吃干榨净。但真正让我觉得“这技术落进现实能直接换钱”的,还是它在药物分子研发里的表现。我自己拿某跨平台分子表征系统试跑过几轮实验&#…

2026/10/18 19:17:19 阅读更多 →
博客发布全流程测试:从内容准备到SEO优化

博客发布全流程测试:从内容准备到SEO优化

1. 项目概述:一次全新的内容发布测试好久没完整跑一遍博客发布流程了,这次我借“测试一下博文”这个项目,把整套内容生产链从头到尾梳理了一遍。标题起得随意,但背后要做的事一点也不随意:验证写作环境、检查排版渲染、…

2026/10/18 19:16:15 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →