共计 1543 个字符,预计需要花费 4 分钟才能阅读完成。
1. CBCT 影像特点与分割难点
锥形束 CT(Cone Beam CT, CBCT)作为口腔临床常用影像设备,其数据具有以下特征:
- 低对比度 :软组织与骨骼的 HU 值差异较小(约 200-300HU vs 1000+HU)
- 金属伪影 :牙冠填充物导致的射线硬化伪影(Streaking Artifacts)
- 各向异性分辨率 :Z 轴分辨率常为 XY 轴的 1 /3(典型值 0.2mm×0.2mm×0.6mm)
传统分割方法面临的主要挑战:
- 阈值法受限于灰度重叠区域(如牙根与颌骨)
- 区域生长法对初始种子点敏感
- 形态学操作难以处理粘连结构
2. 传统方法与深度学习对比
在 50 例测试数据上的定量对比(Dice Similarity Coefficient, DSC):
| 方法 | 平均 DSC | 推理时间 (s/ 幅) |
|---|---|---|
| 阈值分割 (Otsu) | 0.62 | 0.3 |
| 区域生长 | 0.71 | 2.1 |
| U-Net(base) | 0.89 | 0.8 |
| 本文改进模型 | 0.92 | 0.9 |
3. 核心实现流程
3.1 数据预处理
关键步骤:
- HU 值归一化:将原始 DICOM 数据线性映射到 [0,1]
def normalize_hu(image): return (image - MIN_HU) / (MAX_HU - MIN_HU) # 典型值 [-1000,3000] - ROI 提取:基于阈值法粗定位颌骨区域
3.2 改进 U -Net 架构
主要改进点:
- 跳跃连接加入注意力门(Attention Gate)
- 编码器使用 ResNet34 预训练权重
- 解码器采用转置卷积 + 双线性上采样混合方式

3.3 损失函数设计
复合损失函数公式:
Loss = 0.7*DiceLoss + 0.3*FocalLoss(gamma=2)
4. PyTorch 关键代码
4.1 数据加载
class CBCTDataset(Dataset):
def __init__(self, img_dir):
self.img_files = sorted(glob(f"{img_dir}/*.npy"))
def __getitem__(self, idx):
data = np.load(self.img_files[idx])
image = normalize_hu(data[0]) # 输入图像
mask = data[1].astype(np.float32) # 标注掩膜
return torch.FloatTensor(image), torch.FloatTensor(mask)
4.2 模型定义
class AttentionBlock(nn.Module):
def forward(self, x, g):
theta_x = self.conv(x)
phi_g = self.conv(g)
... # 注意力计算
return attn_map * x
5. 性能评估
5.1 不同 Backbone 对比
| Backbone | DSC | Params(M) |
|---|---|---|
| ResNet18 | 0.87 | 11.2 |
| ResNet34 | 0.89 | 21.3 |
| EfficientNetB4 | 0.91 | 10.6 |
5.2 推理速度
| 设备 | 耗时 (ms) |
|---|---|
| CPU(i7-11800H) | 320 |
| GPU(RTX3060) | 28 |
6. 避坑指南
6.1 金属伪影处理
- 使用 Sinogram 修复算法预处理
- 在损失函数中增加伪影区域权重
6.2 小样本增强
- 弹性变形 (Elastic Transform)
- 模拟金属伪影的数据合成
6.3 ONNX 转换
torch.onnx.export(
model,
dummy_input,
"model.onnx",
opset_version=11, # 必须≥11
dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}}
)
7. 开放性问题
当前模型参数量约 25M,考虑以下轻量化方向:
- 知识蒸馏(Teacher-Student 架构)
- 通道剪枝 (Channel Pruning)
- 量化训练 (QAT)
期待与各位同行探讨更多临床落地可能性!
正文完
