肺部CT多病种智能诊断资源包实战:从DICOM到多标签分类全流程
简介由2019年天池“数字人体”赛场一肺部CT多病种智能诊断比赛衍生出的算法资料包面向医学影像AI开发者、深度学习初学者及比赛复现研究者聚焦CT图像中肺炎、肺结核、肺癌等多病种自动识别与分类任务可帮助理解医疗图像预处理、模型训练与结果验证的完整流程。压缩包共25个文件约147KB按ori_code、data、code等目录组织代码目录集中训练、测试及数据生成脚本另有README说明文档与样例图片可供参考文件以Python脚本14个py、编译缓存6个pyc、YOLOv3配置文件cfg、说明文档md/txt和示例图片jpg为主类型覆盖开发、运行与查阅所需。目前已有149人学习适合作为医疗影像深度学习的参考实现。资源内提供涵盖数据生成与增强、图像与标签提取、ResNet分类训练、YOLOv3检测及格式转换等环节的多个Python脚本并附YOLOv3网络配置、锚框聚类工具与README说明文档能清晰呈现从数据到模型再到评估的完整工程链路借助目录结构与脚本分工可快速定位所需环节相比零散资料更适合系统复现、二次开发与比赛方案复盘。1. 拿到这份肺部CT多病种智能诊断资源包后先别急着跑训练2019年全球数据智能大赛“数字人体”赛场一的这道肺部CT多病种智能诊断题当时把医学图像的多标签分类问题推到了很多普通算法工程师面前。这份资源包的核心价值是它几乎完整复刻了那一套从原始DICOM文件到最终提交结果的技术链路数据说明、标签文件、预处理逻辑、训练脚本、推理与提交模板都在里面。比我预期中更实用的一点是它的标签设计方式值得反复研究多标签不是简单的多个二分类而是同现关系非常强的病种组合。如果你是刚接触CT影像的入门者跟着这份资源把流程跑通等于把医学图像分类的主干道走了一遍如果你已经在做医疗AI相关业务这套预训练权重、五折划分和阈值扫描的细节也能直接搬进自己的项目。判断要不要下载就看一个标准你是否需要一份能在本地完整复现的肺部CT多标签分类基线。2. 数据与标签处理从DICOM到可训练样本的两个门槛2.1 读进CT的原生格式pydicom读取、斜率与截距CT切片在资源包里大多以DICOM格式存储但也有部分数据被预先转成了PNG或JPG。直接对PNG像素做归一化就进模型是这个任务上最常见的翻车起点因为CT图像的像素值有明确的物理意义它是Hounsfield单位HU而DICOM文件里存储的通常是经过缩放和截断的整数不经过rescale处理就无法还原真实的CT值。很多预处理脚本因为漏掉了这一步导致训练数据范围飘忽不定模型学到的是不同扫描设备之间的差异而不是病变本身的特征。读取单张DICOM并转为HU值的代码是这样import pydicom import numpy as np dcm pydicom.dcmread(path/to/slice.dcm) img dcm.pixel_array.astype(np.float32) # DICOM存储值和真实CT值之间的换算关系 slope float(dcm.RescaleSlope) intercept float(dcm.RescaleIntercept) hu img * slope intercept # 肺窗常用设置窗宽1500窗位-650对应范围[-1400, 100] window_width, window_level 1500, -650 lower window_level - window_width / 2 upper window_level window_width / 2 hu np.clip(hu, lower, upper)这里有两个参数值得解释清楚。RescaleSlope和RescaleIntercept在绝大多数胸部CT序列里分别是1和-1024但比赛资源包里往往会混入重建参数不同的序列如果把它们写死部分切片的HU值会整体偏移导致肺窗截断失去意义。窗口截断的作用是压缩动态范围空气的HU值在-1000左右骨骼在1000以上软组织集中在-100到100之间不截断的话模型会把大量注意力放在背景和骨骼边缘上抑制病灶的特征表达。肺窗[-1400, 100]对肺结节、实变和肺气肿这类病灶比较友好如果你的任务还涉及纵隔淋巴结等区域推理阶段可以再叠加一个纵隔窗[-200, 200]做双窗融合这个技巧在后面推理章节会展开。2.2 标签表的多标签处理与病种共现检查标签文件一般放在资源包的某个配置目录下命名为类似train_label.csv的文件。这套比赛使用的标签维度是“病种级”一个样本可能同时标记出多种病变例如肺结节患者同时有肺气肿和肺大泡这就是典型的多标签分类问题。标签列的取值通常包含0、1、-1其中-1表示“此病种在该样本上无法确认”直接把它当成负样本会压制阳性样本的召回直接当正样本又会污染训练信号。我的处理方式是这样import pandas as pd df pd.read_csv(label.csv) label_cols [c for c in df.columns if c.startswith(class_)] # 先把缺失值填0再把所有正数统一为1 for c in label_cols: df[c] df[c].fillna(0).astype(int) df[c] (df[c] 0).astype(int) y df[label_cols].values.astype(np.float32) # 打印共现矩阵检查病种之间的同现关系 co_occurrence df[label_cols].T.dot(df[label_cols]) print(co_occurrence)逻辑说明标签里的-1我建议先用0占位但在训练时构造loss mask让这一类的样本不参与该病种的梯度计算这是比赛里拿高分的小技巧。共现矩阵的价值在于揭示病种之间的耦合关系比如“肺气肿”和“肺大泡”出现次数几乎一致时模型很容易同频输出这类干扰在单模型里很难消除后处理阶段可以利用病种先验做修正。这一步做得越仔细后面五折交叉验证的标签分布统计就越可靠因为你是在真正理解了标签语义之后才做的划分。3. 数据划分与模型选型五折交叉验证与预训练权重两个定调动作3.1 多标签下的StratifiedKFold替代方案这是整个资源包流程里最容易埋雷的一步。sklearn自带的StratifiedKFold要求y是1D数组直接把多标签的y矩阵传进去会报错即使强行用某些方式拉平每个fold的标签分布也会完全失真。另一个更隐蔽的问题是数据组织方式医疗影像比赛的数据是按病人组织的一个病人对应几十张甚至上百张切片如果按行随机划分同一个病人的数据会同时出现在训练集和验证集里模型等于在验证时看到了训练过的病人身份分数虚高到没有参考价值。正确做法是病人级别的分组划分再加上多标签分层。这里推荐用iterative-stratification库from iterative_stratification import MultilabelStratifiedKFold import numpy as np group df[patient_id].values mskf MultilabelStratifiedKFold(n_splits5, shuffleTrue, random_state42) for fold, (tr_idx, va_idx) in enumerate(mskf.split(Xdf, yy, groupsgroup)): np.save(ffold_{fold}_train_idx.npy, tr_idx) np.save(ffold_{fold}_valid_idx.npy, va_idx)参数说明n_splits选5是因为这套CT数据集中有效的病人数量通常只有几千折数太多会导致每个验证集样本太少指标方差大折数太少则超参选择容易过拟合。random_state固定为42是让实验可复现如果两次划分的索引不一致不同模型之间的对比就失去意义。split方法里的groups参数会保证同一个patient_id的所有行被分到同一侧这是病人级别划分的关键。若不想引入额外依赖也可以对每个标签单独做StratifiedKFold后取交集但交集会让有效训练样本大幅减少尽量别这么做。五折划分完之后验证集的作用是确定学习率和数据增广策略不要用官方测试集反复调试否则本质上是在测试集上过拟合。每折训练完成后保存最佳权重推理时把五折模型的输出做平均通常比单一模型在F1上提升0.5到1个点这是做CT比赛性价比最高的集成方式。3.2 预训练主干ResNet34与EfficientNetB0的取舍从ImageNet预训练权重出发是医学图像小数据集上最稳的路径因为病种样本量不足以支撑随机初始化的深层网络收敛。选择具体主干时要考虑输入尺寸、显存占用、训练时长以及网络对CT图像的适配程度。我在这份资源包里实测过几个候选整理成一张表供参考主干参数量推荐输入尺寸显存占用(bs32)训练速度CT任务表现ResNet3421.8M256x256约3.6G快稳定ResNet5025.6M256x256约5.8G中等略好EfficientNetB05.3M224x224约2.9G中等需调参我一般把ResNet34作为第一折基线原因是官方预训练权重最成熟、翻车概率最低训练速度足够在8G显存的卡上用50到70个epoch跑完。EfficientNetB0参数量更小看起来更省资源但它在医学小数据集上容易过拟合需要更强的数据增广和更小的学习率调参成本明显更高。对于刚接触这个资源包的人直接用ResNet34把流程跑通再考虑换ResNet50提点。这里还有一个输入通道的细节ImageNet预训练模型的第一个卷积层接收3通道RGB而CT图像是单通道。常见做法是把单通道复制成3通道简单直接另一个做法是把首个卷积层改成1通道并把原有3通道权重按均值合并这样既保留预训练信息又减少重复计算。两个方案实测差距在0.001以内优先选代码改动更小的复制方案减少出错的可能性。4. 训练循环与损失多标签下没有“正确标签”只有“存在标签”4.1 BCEWithLogitsLoss 与同现阈值先明确一个核心区别多病种分类不能直接套softmax交叉熵因为肺结节和肺气肿不是互斥的一个病人可以同时有多个标签softmax的输出概率和为1本质上强制类别之间互相挤压与标签定义矛盾。多标签训练的标准做法是每个类别独立输出一个logit再用BCEWithLogitsLoss把每个病种当成独立的二分类任务来优化。这个损失函数内部通过log-sum-exp做了数值稳定处理能避免在极端logit下sigmoid梯度上溢所以训练时不要手动加sigmoid直接拿logits算loss推理时再单独sigmoid取概率。多标签的另一个特点是“没有正确标签只有存在标签”因为医学标注存在不确定性一个病种没有被标记不代表真的没有这个病可能是标注遗漏。这解释了为什么验证集F1往往比AUC更值得关注AUC只看排序F1要看阈值和实际提交逻辑一致。4.2 训练脚本的最小闭环给出一个可运行的训练循环骨架数据加载部分需要结合前面生成的fold索引和预处理npy文件import torch import torch.nn as nn from torch.utils.data import Dataset, DataLoader from timm import create_model class CTDataset(Dataset): def __init__(self, img_paths, labels, idx, trainTrue): self.paths img_paths[idx] self.labels labels[idx] self.train train def __len__(self): return len(self.paths) def __getitem__(self, i): img np.load(self.paths[i]) x torch.from_numpy(img).repeat(3, 1, 1).float() y torch.from_numpy(self.labels[i]).float() # 医学图像只做水平翻转不做垂直翻转避免解剖结构颠倒 if self.train and torch.rand(1) 0.5: x torch.flip(x, dims[2]) return x, y model create_model(resnet34, pretrainedTrue, num_classesnum_labels) loss_fn nn.BCEWithLogitsLoss() optimizer torch.optim.AdamW(model.parameters(), lr1e-4, weight_decay1e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxepochs) scaler torch.cuda.amp.GradScaler() for epoch in range(epochs): model.train() for x, y in loader: x, y x.cuda(), y.cuda() with torch.cuda.amp.autocast(): logits model(x) loss loss_fn(logits, y) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() optimizer.zero_grad() scheduler.step()几个关键参数说清楚。lr1e-4是稳定区间的起点把主更换成EfficientNet时要降到3e-5到5e-5因为它对学习率更敏感。weight_decay开到1e-4CT图像样本量小正则太弱容易过拟合。混合精度在显存16G以下的卡上是刚需fp32下bs32配ResNet34很容易吃满显存开启后显存占用能降接近一半训练速度也有提升。CosineAnnealingLR和AdamW的组合在CT任务上比step decay稳定因为多标签的收敛曲线本身波动大余弦退火的平滑下降过程更有助于收敛到平稳区域。这个闭环里最容易出错的是模型输出维度训练时改了标签列数量推理脚本里没有同步修改num_classes导致维度不匹配。我在本地复现时就把训练标签从6类改成8类推理时忘了改直接报错花了十分钟才定位到问题。建议把标签列数量和列名固定成常量在训练和推理脚本里共用。5. 常见问题排查数据、训练与推理四个踩坑点5.1 病人切片混进验证集指标虚高现象训练过程的验证AUC达到0.98远超预期的0.88到0.92但提交测试集结果明显回落。原因划分训练集和验证集时按行随机split同一个病人的几十张切片被同时分到两侧模型记住了病人身份而不是病征特征验证时看到的是训练过的病人的切片。解决划分必须带group参数group对应patient_id使用MultilabelStratifiedKFold按病人级别分组。实际操作中可以先按病人分组再把病人ID映射到行索引确保同一个病人的所有切片只出现在训练集或验证集的一侧。5.2 直接用ImageNet的均值和方差做归一化现象loss能正常下降但验证指标起伏剧烈训练曲线震荡幅度明显大于正常水平。原因ImageNet的mean和std是针对三通道RGB自然图像的统计值而CT图像经过窗口截断后像素分布集中在[-1400, 100]之间用自然图像的统计量做标准化输出分布和预训练权重的预期输入完全不匹配。解决对训练集全量计算CT图像的mean和std保存成npy文件训练和推理都使用同一份统计值。切不可在推理阶段重新计算否则会引入分布偏移。5.3 多标签预测误用softmax现象两个经常同现的病种比如肺气肿和肺大泡预测概率之和恒等于1一个升高另一个必然下降与标签的实际分布矛盾。原因softmax的输出概率和为1本质上是互斥分类的假设用在多标签任务上强行让类别互相竞争。解决模型输出logits推理时对每个类别单独做sigmoid每个类独立判断。阈值不取默认的0.5而是在验证集上扫描0.3到0.7之间的值选F1最高点作为提交阈值。5.4 显存不足直接降到小batch现象第一个epoch就OOM很多人直接把batch从32降到8结果loss曲线震荡严重最终F1比正常训练低一截。原因batch过小时BatchNorm的统计量不稳定医学图像中病灶区域在整张切片里占比又低小batch让梯度更新被正常切片主导。解决优先把输入尺寸从256降到224或开启混合精度这两步能释放大量显存。保持batch大于16是底线低于这个值无论怎么调学习率都很难稳定收敛。6. 推理与提交从sigmoid到提交模板的边界动作6.1 独立sigmoid、阈值扫描与多折集成推理部分看起来简单实际上有三个容易忽略的细节。第一个是模型输出必须先在验证集上做一次完整的推理流程得到每个类的概率分布再扫描阈值确定最优切分点。第二个细节是测试时增强医学图像分类通常只做水平翻转把原始图像和翻转图像的sigmoid概率平均能在不训练新模型的情况下获得稳定提升。第三个细节是多折集成把五折模型的输出概率直接取平均比先取每折的硬标签再投票更平滑。推理代码示意import numpy as np import torch import torch.nn.functional as F def predict(model, loader, use_ttaTrue): model.eval() probs [] with torch.no_grad(): for x in loader: x x.cuda() logits model(x) p torch.sigmoid(logits).cpu().numpy() if use_tta: p_flip torch.sigmoid(model(torch.flip(x, dims[2]))).cpu().numpy() p (p p_flip) / 2 probs.append(p) return np.concatenate(probs, axis0) # 阈值扫描在验证集上找到每个类别的最优阈值 best_thresholds [] for i in range(num_labels): best_f1, best_thr 0, 0.5 for thr in np.arange(0.3, 0.7, 0.05): pred (valid_probs[:, i] thr).astype(int) f1 f1_score(valid_labels[:, i], pred) if f1 best_f1: best_f1, best_thr f1, thr best_thresholds.append(best_thr)逻辑说明TTA的翻转轴是宽方向对应水平翻转不会改变解剖结构的左右语义。阈值扫描的步长0.05在生产中可以精确到0.01但数据集不大时0.05的粒度足够稳定。每类独立阈值比分统一阈值更合理因为不同病种的阳性率差异很大。6.2 提交模板的表头顺序与npy落盘资源包里通常包含示例提交文件格式可能是这样的patient_idclass_1class_2class_3class_4P0010.870.120.340.76P0020.210.910.450.08有两个易错点。表头顺序必须和训练用的label_cols完全一致不能按字母排序也不能因为某列全为0就删除。输出格式如果是概率值就直接提交sigmoid结果如果是0/1就套用阈值扫描得到的最优阈值。我建议在本地先把提交格式的列名逐字对齐再输出npy或CSV避免提交阶段才发现维度对不上。这份资源包最有价值的地方不在于某个单模型的精度而在于它把多标签CT分类的完整链路都串起来了。从那以后我拿到任何肺部CT相关的比赛资源包都会先做三件事按病人级别重划分数据、验证窗口截断参数、把标签列名和提交模板逐字对齐。这三步能挡掉大部分后期返工的坑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

面向复杂审批流的动态自适应表单设计与状态机编排实践

面向复杂审批流的动态自适应表单设计与状态机编排实践

在企业级数字化转型与协同办公的浩瀚版图中,“复杂审批流(Complex Approval Workflow)”向来是业务逻辑最为严密、权限控制最为苛刻的“修罗场”。无论是涉及数千万资金的重大投资决议、跨国集团高管的人事任免、还是高度敏感的安全合规审查&…

2026/10/14 0:04:28 阅读更多 →
运营商笔试计算机网络高频考点:时延、循环冗余校验与子网划分详解

运营商笔试计算机网络高频考点:时延、循环冗余校验与子网划分详解

简介:这是一份面向中国电信计算机岗位笔试的备考资料,内容聚焦计算机网络核心考点,覆盖网络分类、电路交换与分组交换对比、分组最优长度计算、因特网边缘与核心部分、客户服务器与对等通信、性能指标、时延计算、数据通信方式、信道容量与信…

2026/10/12 21:52:56 阅读更多 →
Redis AI增强:从缓存到AI记忆层的架构演进

Redis AI增强:从缓存到AI记忆层的架构演进

1. 整体设计:Redis为什么一定要长AI能力2026年再回头看我手上这几个AI应用的架构,Redis这名字出现的频率高得吓人。以前大家提起Redis,想到的只有缓存、分布式锁、排行榜这一套。但现在AI应用跑起来之后,最尴尬的反而不是模型效果…

2026/10/13 23:31:23 阅读更多 →

最新新闻

GAN演进之路:从原始博弈到StyleGAN的生成对抗实践

GAN演进之路:从原始博弈到StyleGAN的生成对抗实践

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

2026/10/14 1:10:05 阅读更多 →
电动汽车性能开发目标模板解析与应用

电动汽车性能开发目标模板解析与应用

1. 项目概述:电动汽车性能开发的导航图在电动汽车研发领域,性能目标设定就像建筑师的蓝图,直接决定了整车开发的方向和边界。这份Ford性能目标模板的独特价值在于,它将传统汽车巨头数十年的整车集成经验与电动化特性深度融合&…

2026/10/14 1:10:05 阅读更多 →
公开课回顾|提示词自我迭代进化:从静态 Prompt 到可进化系统

公开课回顾|提示词自我迭代进化:从静态 Prompt 到可进化系统

本次公开课的核心主题是“提示词自我迭代进化”。虽然课程最后还有一个演示没有完全跑完,但整体方法论已经讲清楚:重点不是一次写出完美提示词,而是让提示词在训练、评估、反馈中不断更新,最终形成可迭代、可回归、可版本化的提示…

2026/10/14 1:10:05 阅读更多 →
strchr函数误用与CTF实战:从qwb2019_one看指针返回值陷阱

strchr函数误用与CTF实战:从qwb2019_one看指针返回值陷阱

1. 从一道CTF题看strchr的真实行为1.1 这道题到底在考什么qwb2019_one 这道题,我第一次看到的时候觉得挺简单——不就是个字符串处理吗?结果上手之后才发现,坑全在strchr这个函数的返回值判断上。题目本身逻辑不复杂,给了你一段输…

2026/10/14 1:10:05 阅读更多 →
SAP S/4HANA采购主数据与货源确定实战避坑指南

SAP S/4HANA采购主数据与货源确定实战避坑指南

简介:本资源是SAP S4 HANA采购模块(S4520)的官方级中文教程PDF,专为应用顾问、项目经理及企业最终用户设计,系统解决SAP S/4HANA环境下端到端采购业务落地难题。内容覆盖采购主数据维护(含物料主记录视图分…

2026/10/14 1:10:05 阅读更多 →
八字排盘四千年:节气计算与儒略日工程实践

八字排盘四千年:节气计算与儒略日工程实践

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

2026/10/14 1:09:04 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战: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 阅读更多 →