使用深度卷积神经网络对皮肤病变进行分类
本项目旨在利用深度学习进行皮肤病变分类,并创建一个 Flutter 应用,以便为普通大众提供便利。
数据集
方法论
数据集的 EDA 分析、预处理、构建基线并使用预训练模型、微调、集成 2 个最佳模型、测试并选择最佳模型
创建 Flutter 应用
技术问题
所有 Notebooks 使用 Keras 2.2.4 和 Tensorflow 1.11。此版本 Keras 中的 Batch-Norm 层实现方式为:在训练期间,无论 BN 层是否冻结,网络都会始终使用 mini-batch 统计;在推理期间,您也将使用先前冻结的 BN 层的统计。因此,如果您微调顶层,其权重将根据新数据集的均值/方差进行调整。然而,在推理期间,它们将接收因原始数据集的均值/方差被使用而导致缩放不同的数据。因此,如果您使用 Keras 的示例代码微调 Inception V3 或任何带有 batch norm 层的网络,结果将非常糟糕。请参考 issue #9965 和 #9214。一个临时解决方案是
for layer in pre_trained_model.layers:
if hasattr(layer, 'moving_mean') and hasattr(layer, 'moving_variance'):
layer.trainable = True
K.eval(K.update(layer.moving_mean, K.zeros_like(layer.moving_mean)))
K.eval(K.update(layer.moving_variance, K.zeros_like(layer.moving_variance)))
else:
layer.trainable = False
结果
| 模型 | 验证 | 测试 | 深度 | # 参数 |
|---|---|---|---|---|
| 基线 | 77.48% | 76.54% | 11 层 | 2,124,839 |
| 微调的 VGG16(来自最后一个块) | 79.82% | 79.64% | 23 层 | 14,980,935 |
| 微调的 Inception V3(来自最后 2 个 inception 块) | 79.935% | 79.94% | 315 层 | 22,855,463 |
| 微调的 Inception-ResNet V2(来自 Inception-ResNet-C) | 80.82% | 82.53% | 784 层 | 55,127,271 |
| 微调的 DenseNet 201(来自最后一个密集块) | 85.8% | 83.9% | 711 层 | 19,309,127 |
| 微调的 Inception V3(所有层) | 86.92% | 86.826% | _ | _ |
| 微调的 DenseNet 201(所有层) | 86.696% | 87.725% | _ | _ |
| 完全微调的 Inception V3 和 DenseNet 201 的集成 | 88.8% | 88.52% | _ | _ |
界面
数据集
HAM10000 数据集,这是一个包含常见色素性皮肤病变的多种来源的皮肤镜图像的大型集合。


