第26章:ViT+InceptionDW+FocalLoss改进|CT骨折影像二分类完整Pytorch实现(含PyQt5推理GUI)

摘要:CT是临床诊断骨折的核心影像学手段,隐匿性细微骨折依靠人工阅片容易发生漏检。本文基于Pytorch框架,对ViT((1‑pt)^\gamma)B/16模型进行改进,在Transformer编码层后加入自研InceptionDW多分支深度可分离卷积模块增强局部多尺度特征提取,同时引入Focal Loss损失函数解决难样本学习问题,完成CT骨折/正常骨骼二分类任务。数据集总量3700余张CT切片,类别标签0:fracture骨折,1:normal正常。本文从业务背景、数据集说明、改进网络原理、网络结构图、代码模块拆解、训练策略、全套医学评价指标、GUI推理系统、实验缺陷与优化方向进行完整解析。

1 研究背景与意义

骨骼骨折是医院急诊科高频就诊病症,外力撞击、摔伤极易引发骨骼断裂,其中部分细微隐匿骨折在CT切片上表现微弱,和周围骨质灰度差异小,对放射科医生临床经验要求较高。急诊大批量CT影像下长时间人工阅片,疲劳会进一步增加漏诊风险。计算机辅助诊断CAD系统利用深度学习对CT切片自动判别是否存在骨折病灶,可以作为医生的辅助参考,降低漏诊概率,提升诊断效率。

传统CNN卷积网络擅长局部纹理提取,但对图像全局长距离关联建模能力有限;Vision Transformer(ViT)依靠多头自注意力机制,可以建立图像patch之间的全局依赖关系,适合捕捉骨折病灶与周围正常骨质的全局上下文关系。但原生ViT将图像切分为固定大小patch,对于骨折裂纹这类细粒度局部边缘特征提取能力弱于卷积网络;同时医学数据集中,大部分正常CT切片属于简单样本,少量隐匿骨折为难样本,训练过程简单样本会主导损失,造成模型对细微骨折识别能力不足。

针对以上痛点,本方案做两处核心改进:①在ViT编码器输出后增加InceptionDW多分支深度可分离卷积模块 ,融合1×1、3×3、5×5多尺度感受野,强化局部细粒度骨折特征;②采用Focal Loss损失函数 ,调制难易样本损失权重,提高模型对隐匿骨折难样本的学习力度。数据集共3700多张CT二维切片,完成fracture、normal二分类任务。

2 数据集说明

数据集为CT二维骨骼切片图像,总样本3700+,二分类标签定义:

json 复制代码
{
    "0": "fracture",
    "1": "normal"
}

数据集采用ImageFolder目录格式组织:

复制代码
data
├─train
│  ├─fracture
│  └─normal
├─val
│  └─fracture
│  └─normal
└─test(可选独立测试集)

项目代码新增数据集分布统计功能,自动绘制训练集、验证集样本数量分布柱状图,直观查看正负样本是否失衡。

数据预处理流水线:

  • Resize到256,随机旋转90°做数据增强;
  • CenterCrop裁剪224×224输入尺寸;
  • ToTensor转换张量,使用ImageNet均值方差归一化mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225]。

注意:原始DICOM CT文件需要提前转为RGB图像;本项目输入为已经预处理完成的三通道CT切片,使用ImageNet预训练权重做迁移学习,借助自然图像底层纹理边缘特征适配医学影像任务。

3 改进网络整体架构与网络结构图

3.1 整体网络文字结构图(可直接用于论文绘图、Mermaid绘图参考)
复制代码
输入图像:3 × 224 × 224
    ↓
ViT\((1‑pt)^\gamma\)B/16 输入处理:图像分patch + 位置编码 + class_token拼接
    ↓
ViT Transformer Encoder(多层多头自注意力+MLP)
    ↓
拆分:class_token + patch_tokens
    ↓
patch_tokens变形为特征图(B,768,H,W)
    ↓
【InceptionDW多分支深度可分离卷积模块】 ← 本文新增改进模块
├─分支1:1×1卷积+BN+ReLU6
├─分支2:3×3深度可分离卷积+1×1投影+BN+ReLU6
├─分支3:5×5深度可分离卷积+1×1投影+BN+ReLU6
└─分支4:MaxPool+1×1卷积+BN+ReLU6
    ↓
多分支输出concat拼接,还原patch token序列
    ↓
拼接回class_token
    ↓
取出class_token特征向量
    ↓
ViT Heads 分类头 → 输出2维(fracture / normal)
3.2 InceptionDW模块内部子结构
复制代码
输入特征图(B,768,H,W)
├─路径1 1×1 Conv → BN → ReLU6
├─路径2 3×3 DWConv(分组卷积) → BN → ReLU6 → 1×1 pointwise Conv → BN → ReLU6
├─路径3 5×5 DWConv(分组卷积) → BN → ReLU6 → 1×1 pointwise Conv → BN → ReLU6
└─路径4 MaxPool3×3 →1×1 Conv → BN → ReLU6
    ↓
4路特征在通道维度concat拼接输出
3.3 改进思路解析
  1. 为什么选择在Encoder后接入InceptionDW?

    ViT Encoder输出的token已经完成全局自注意力建模,此时patch tokens包含全局上下文信息,将一维token序列reshape回二维特征图送入InceptionDW多分支卷积,使用不同尺寸深度可分离卷积,捕捉骨折裂纹、骨质边缘的多尺度局部细节。深度可分离卷积控制参数量与计算量,不会带来巨大推理开销。处理完成后再转回token序列,和class((1‑pt)^\gamma)token拼接送入分类头。实现Transformer全局建模 + 卷积多尺度局部特征提取的优势互补。

  2. Focal Loss损失函数作用

    传统CrossEntropy损失平等对待每一个样本,大量简单正常样本会主导梯度更新;部分细微隐匿骨折样本特征微弱属于难样本,损失贡献占比低,模型学不好。Focal Loss引入调制因子KaTeX parse error: Can't use function '\(' in math mode at position 3: (1\̲(̲(1‑pt)^\gamma\)...,降低高置信简单样本损失权重,放大难样本损失梯度;同时设置alpha类别权重,缓解类别不均衡,更加适配CT骨折识别任务,降低隐匿骨折漏检。

4 核心代码模块解读

项目一共四份核心代码:train.py训练脚本、utils.py工具库(网络、损失、评估、绘图)、infer_QT.py PyQt5可视化推理程序。

4.1 utils.py核心模块
  1. ViT_With_InceptionDW:改进ViT模型,加载vit_b_16预训练权重,在encoder之后接入InceptionDW模块,替换分类头适配二分类输出。
  2. InceptionDWConv2d:多分支深度可分离卷积实现,4条并行分支,融合1×1、3×3、5×5感受野。
  3. FocalLoss:损失函数实现,gamma=2.0,alpha=0.25,针对难样本做损失调制。
  4. ConfusionMatrix混淆矩阵类:计算Accuracy、Precision精确率、Recall召回率、Specificity特异度、F1((1‑pt)^\gamma)score。骨折筛查任务中Recall召回率最重要,代表真实骨折样本被检出的比例,直接关系漏诊率;特异度代表正常骨骼识别正确率,控制误诊率。
  5. 新增绘图工具:plot_dataset_distribution()数据集分布柱状图;plot_roc_curve()ROC曲线;plot_pr_curve()PR曲线;同时支持loss((1‑pt)^\gamma)acc曲线、学习率曲线、P/R/S/F1指标曲线绘制。
  6. get_data()、gen_json()、get_optim():数据集加载、生成类别json、优化器选择,支持SGD/Adam/AdamW。
  7. train_one_epoch()、evaluate()训练与验证一轮,训练全程使用FocalLoss作为损失。
4.2 train.py训练脚本流程
  1. 初始化,创建自定义结果保存文件夹,自动清空上一轮训练产物;获取训练设备cuda/cpu。
  2. 解析超参数:模型、预训练开关、batch((1‑pt)^\gamma)size、epoch、优化器、学习率、训练集验证集路径、是否开启独立测试集。
  3. 加载数据集,自动绘制训练集、验证集样本分布柱状图,生成class_indices.json类别映射文件。
  4. 构建改进ViT((1‑pt)^\gamma)InceptionDW模型,thop工具统计总参数量、可训练参数量、FLOPs计算量。
  5. 优化器 + LambdaLR余弦退火学习率调度器。
  6. epoch循环:训练一轮→更新学习率→验证一轮;保存best.pth(验证集最优权重)、last.pth(最后epoch权重);每epoch保存全部指标到json日志文件。
  7. 训练结束自动绘制loss((1‑pt)^\gamma)accuracy曲线、学习率曲线、P/R/S/F1曲线;加载best权重绘制训练集、验证集混淆矩阵;计算并绘制ROC曲线、PR曲线。
  8. 可选:读取独立test测试集,输出测试集全套指标保存为test_results.json。

医学训练关键技巧:开启预训练迁移学习;FocalLoss的gamma和alpha可根据数据集难易程度调参;余弦退火学习率缓解后期震荡;观察ROC((1‑pt)^\gamma)AUC评估模型整体区分能力。

4.3 infer_QT.py PyQt5图形化推理系统

搭建GUI桌面程序,无需命令行操作。

  1. 加载训练产出的best.pth权重与class_indices.json类别映射;
  2. 窗口界面分为图像显示区、结果输出区;点击按钮本地选择CT图像;
  3. 完成图像预处理,模型前向推理,输出top((1‑pt)^\gamma)2类别与百分比概率;
  4. 界面直接展示原始图片和预测结果,适合做演示原型。

注意代码中需要将create_model的模型名称修改匹配本项目ViT((1‑pt)\gamma)With((1‑pt)\gamma)InceptionDW,才能正确加载权重。

5 训练超参数与医学评价指标说明

参考默认超参数配置:

  • Backbone:vit_b_16,开启imagenet预训练
  • batch((1‑pt)^\gamma)size:16
  • epochs:30
  • 优化器:AdamW,lr=0.0001,lrf=0.0001
  • 损失函数:FocalLoss(alpha=0.25,gamma=2.0)
  • 学习率策略:余弦退火LambdaLR

本任务:Positive=fracture骨折;Negative=normal正常骨骼

  1. Accuracy准确率:全部样本预测正确占比;
  2. Precision精确率:预测为骨折的样本中真实骨折占比,反映误诊情况;
  3. Recall召回率(灵敏度Sensitivity):真实骨折样本被识别出来的比例,骨折筛查核心指标,越低代表漏诊越多;
  4. Specificity特异度:真实正常骨骼被判断正常的比例;
  5. F1((1‑pt)^\gamma)score:精确率召回率调和平均;
  6. ROC((1‑pt)^\gamma)AUC:衡量模型整体区分骨折与正常样本的能力;
  7. PR曲线:样本不均衡场景下比ROC更能反映模型性能。

训练脚本会自动输出全部曲线与json日志;如果训练集指标很高,验证集指标明显偏低,代表发生过拟合,医学数据集常见,可以增加数据增强、适当降低epoch、引入dropout、使用正则化缓解。

6 项目运行流程

  1. 环境依赖:pytorch、torchvision、opencv((1‑pt)\gamma)python、matplotlib、thop、tqdm、scikit((1‑pt)\gamma)learn、PyQt5、pillow
  2. 数据集放到对应目录data/train、data/val,子文件夹fracture、normal存放图片。
  3. 启动训练命令:
bash 复制代码
python train.py --model vit --batch-size 16 --epochs 30 --pretrained True --optim AdamW --lr 0.0001 --lrf 0.0001
  1. 训练输出目录(默认runs):best.pth、last.pth权重;class_indices.json;数据集分布图、loss((1‑pt)^\gamma)acc、lr、roc、pr、混淆矩阵图片;train_log_results.json完整日志。
  2. 图形界面推理:
bash 复制代码
python infer_QT.py

打开窗口,选择CT切片图像即可得到fracture/normal预测概率。

7 现有方案不足与后续优化方向

  1. 当前输入为2D单张CT切片,没有利用CT三维空间信息;后续可以设计2.5D输入,堆叠相邻多张切片,或者3D((1‑pt)^\gamma)CNN网络挖掘三维骨骼结构信息,进一步提升细微骨折检出能力。
  2. 数据增强手段比较基础,可增加医学影像专用增强:Gamma灰度变换、模拟不同窗宽窗位、高斯噪声,模拟医院不同设备输出CT图像。
  3. 输入整张CT切片,存在大量无关软组织背景干扰;可以增加骨骼ROI分割预处理,只保留骨骼区域送入分类网络,屏蔽无关背景。
  4. InceptionDW模块可以对比不同卷积分支组合、对比CBAM、CA注意力模块,做消融实验验证模块有效性。
  5. FocalLoss的alpha、gamma超参数可以做网格搜索调参,适配本骨折数据集难易样本分布。
  6. GUI程序可进一步扩展:支持批量文件夹推理、结果导出csv报告,更贴近演示原型系统。

8 总结

本文实现了ViT((1‑pt)^\gamma)B16结合InceptionDW多分支深度可分离卷积 + Focal Loss的CT骨折二分类完整开源项目,数据集3700多张CT切片,区分fracture骨折与normal正常骨骼。架构融合ViT自注意力全局建模与多分支卷积局部细粒度特征提取,Focal Loss损失解决隐匿骨折难样本学习问题。项目覆盖数据集统计、训练、全套医学指标评估(混淆矩阵、ROC、PR)、PyQt5图形推理GUI整套流程。该方案可以作为CT骨折计算机辅助诊断的基线原型,在此基础上做消融实验与迭代优化,对临床急诊CT骨折智能筛查具备参考价值。

基于 ViT‑InceptionDW 结合 Focal Loss 的 CT 骨折二分类研究

相关推荐
ShineWinsu2 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
songyuc5 小时前
【Manskill3】TableSceneBuilder学习笔记
pytorch·笔记·学习
sycmancia6 小时前
Qml——Image和AnimatedImage使用
qt
黑十7 小时前
PyTorch 报 “no CUDA GPUs are available“ 怎么办?3 步排查
服务器·网络·人工智能·pytorch·python
lhbweilai10 小时前
QT(了解各个控件和布局)上
数据库·qt
tellmewhoisi12 小时前
深度学习28:PyTorch:参数更新方法(AdaGrad和RMSProp)
人工智能·pytorch·深度学习
ShineWinsu15 小时前
对于Qt:QLabel常见属性的解析
c++·qt·面试·笔试·gui·标签·qlabel
雨晨源码(同名B站)16 小时前
深度学习毕业设计选题推荐:基于卷积神经网络的无人机影像建筑裂缝裂纹检测分类与分割系统(LeNet-5 二分类模型、GCN-Res50分割模型)
深度学习·信息可视化·分类·cnn·毕业设计·无人机·课程设计
小徐不徐说16 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计