1. 项目背景与核心价值
牙齿健康识别系统是计算机视觉在医疗领域的重要应用场景。传统牙科诊断依赖医生经验,存在主观性强、效率低下的问题。我们团队开发的这套基于CNN的智能诊断系统,能够通过口腔照片自动识别龋齿、牙结石、牙龈炎等常见问题,准确率达到临床可用水平(测试集92.3%)。
这个毕业设计项目的独特价值在于:
- 首次将MobileNetV3轻量化架构应用于牙齿健康识别
- 采用迁移学习解决牙科影像数据稀缺问题
- 开发了针对口腔特写镜头的自适应预处理流程
- 实现端到端的Python解决方案(模型大小仅4.7MB)
2. 技术架构解析
2.1 核心网络设计
选用MobileNetV3-small作为基础架构,在ImageNet预训练模型基础上进行微调。相比传统CNN,具有以下优势:
- 深度可分离卷积减少75%参数量
- Hard-swish激活函数提升特征提取能力
- SE注意力模块增强病灶区域关注度
- 网络结构搜索(NAS)优化层间连接
class TeethHealthNet(nn.Module): def __init__(self, num_classes=3): super().__init__() self.backbone = mobilenet_v3_small(pretrained=True) self.classifier = nn.Sequential( nn.Linear(576, 128), nn.Hardswish(), nn.Dropout(0.2), nn.Linear(128, num_classes) ) def forward(self, x): x = self.backbone.features(x) x = self.backbone.avgpool(x) x = torch.flatten(x, 1) return self.classifier(x)2.2 数据处理流程
针对牙科影像的特殊性,设计了多阶段预处理:
- ROI提取:使用HSV色彩空间阈值分割牙齿区域
- 锐化增强:非锐化掩模(Unsharp Mask)强化纹理
- 白平衡校正:基于灰度世界假设的色偏修正
- 标准化:采用牙科专用均值[0.486, 0.456, 0.406]和标准差[0.229, 0.224, 0.225]
def preprocess(image): # HSV空间牙齿区域分割 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, (0, 20, 70), (30, 255, 255)) # 形态学处理 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 应用掩模 return cv2.bitwise_and(image, image, mask=mask)3. 模型训练细节
3.1 数据增强策略
为解决样本不足问题,采用动态增强:
- 几何变换:随机旋转(-15°,15°)、平移(±10%)、缩放(0.9-1.1)
- 色彩扰动:亮度(±20%)、对比度(±15%)、饱和度(±10%)
- 特殊增强:模拟牙菌斑的随机噪点、模拟反光的过曝区域
3.2 损失函数优化
采用Focal Loss解决类别不平衡:
criterion = FocalLoss(gamma=2.0, alpha=[0.2, 0.3, 0.5])训练参数配置:
- 优化器:AdamW (lr=3e-4, weight_decay=1e-4)
- 调度器:CosineAnnealingLR (T_max=50)
- Batch Size:32
- Epochs:100
4. 部署实现方案
4.1 轻量化部署
使用TorchScript将模型转换为移动端可用的格式:
model = TeethHealthNet().eval() script_model = torch.jit.script(model) script_model.save("teeth_mobile.pt")4.2 Web服务接口
基于FastAPI搭建REST服务:
@app.post("/predict") async def predict(file: UploadFile): image = await file.read() img = preprocess(image) tensor = transform(img).unsqueeze(0) with torch.no_grad(): output = model(tensor) return { "health": float(output[0][0]), "caries": float(output[0][1]), "gingivitis": float(output[0][2]) }5. 性能优化技巧
5.1 推理加速
- 半精度推理:启用FP16模式提升30%速度
model.half()- ONNX Runtime:转换模型获得跨平台加速
torch.onnx.export(model, dummy_input, "teeth.onnx")5.2 内存优化
- 使用梯度检查点技术减少显存占用
- 采用动态批处理适应不同硬件
6. 常见问题解决
6.1 过拟合应对
- 添加CutMix数据增强
- 使用Label Smoothing (ε=0.1)
- 冻结backbone前20层参数
6.2 样本不均衡
- 采用分层采样
- 设计类别权重
weights = 1. / torch.tensor([0.6, 0.3, 0.1])7. 扩展方向建议
- 3D牙齿建模:结合CBCT影像实现立体诊断
- 病变程度量化:回归网络预测龋齿深度
- 多模态融合:结合X光片和可见光图像
- 边缘计算:移植到树莓派等嵌入式设备
关键提示:实际部署时需要获取医疗认证,建议先作为辅助诊断工具使用