使用深度卷积神经网络对皮肤病变进行分类

本项目旨在利用深度学习进行皮肤病变分类,并创建一个 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% _ _

界面

image image image

数据集

HAM10000 数据集,这是一个包含常见色素性皮肤病变的多种来源的皮肤镜图像的大型集合。

GitHub

查看 Github