在构建和部署模型以对皮肤病变图像进行分类时,将逐步进行。完成后用户可以将图像上传到网站,模型将对皮肤病变进行分类。
训练设置图像
皮肤癌是最常见的癌症。已经开发了许多应用来对皮肤病变进行分类。通过上传可疑皮肤斑点的图片,可以看到是否应该与皮肤科医生交谈。
这是计划:
步骤
查找数据
发现哈佛研究人员在这里收集了10,015张带有许多皮肤病的图像:
https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/DBW86T
它看起来像有一个在数据-信息的几个方面的年度ISIC比赛在这里。可以看到不同的过滤器的图像这里。
https://www.isic-archive.com/#!/topWithHeader/tightContentTop/challenges
https://www.isic-archive.com/#!/topWithHeader/onlyHeaderTop/gallery
国际标准行业分类
发现在Kaggle上使用相同的数据集来分类皮肤病变。在Kaggle笔记本上查看一下。但是硬盘空间和共享Docker容器内存限制可能无法做到想要的,所以可能需要转移到Colab。
皮肤病变图像被压缩成两个压缩文件夹。没有看到在Kaggle上组合来自两个压缩数据集文件夹的文件的方法。
可以在Kaggle上的一个文件夹中使用这些数据了。
https://www.kaggle.com/discdiver/mnist1000-with-one-image-folder
探索数据
有一个包含元数据的文件:HAM10000_metadata.csv。以下是内容和最初的想法:
病变_id- 每个病变一个。每个病变可以有多个图像。
image_id - 列出每个病变的图像ID。这些也是文件名,sans.jpg。
dx- 诊断。7种类型。
dx_type - 如何进行诊断。
年龄 - 缺少57个值。可以尝试不同的策略来处理。
性别 - 3个值。
本地化 -身体上的位置。15个值。
图像数量多于唯一情况。因为相同的图像包含在不同的放大倍数中。这是一个事实上的数据增加。
初步问题
结果变量有七个分类标签:黑素细胞痣,黑色素瘤,良性角化病,基底细胞癌,光化性角化病,血管病变,皮肤纤维瘤。黑色素瘤是最危险的皮肤癌类型。不需要基底细胞癌因为是最常见的皮肤癌类型。光化性角化病被认为是潜在的癌前病变。
它看起来不像任何图像被分类为多种类型,因此有一个多类问题,但不是多标签问题。
数据不平衡,67%是nv级,代表黑素细胞痣。
需要小心使用不平衡类的报告指标。例如准确性不是一个非常有见地的指标。然而根据fast.ai的Jeremy Howard的说法,在深度学习模型训练时,不需要担心不平衡的数据集。
准备数据
将导入常用的库并配置用于深度学习的东西。因为Kaggle没有最新的PyTorch和fastai库,将打开互联网并安装pip。打开GPU,然后将列出硬件和软件的可重复性。
使用Kaggle API从Kaggle获取数据集并进入Colab。然后合并了图像文件并将其保存在Google云端硬盘文件夹中。现在数据在Drive文件夹中。这里是Colab笔记本。
https://colab.research.google.com/drive/1y1hZS-nmcA3SBH7tF4uttAGMwNS3z9jx
构建模型
正在使用fastai v.1.50.0,torch v1.0.1.post2,torchvision v0.2.2.post3。
首先使用数据的子集进行快速训练,从训练和验证集的1000个图像的随机样本开始,而不是10,015。一旦解决了问题,可以在以后使用完整的数据集。
训练测试拆分 - fastai将数据分成训练和验证集。将留出20%的图片进行验证。
迁转学习 - 先使用ResNet34,之后如果想花更多时间训练以获得更高的准确性,将在稍后转移到ResNet50。
优化器 - 使用默认值:Adam。
图层 - 此处说明CNN的默认fastai图层。这些是具有batchnorm,dropout,linear和Relu函数的PyTorch图层块。最后一组层由2d池化层和平坦化层组成。
学习率 -将根据Leslie Smith的1Cycle政策使用学习率退火。将从第一个时期的fastai默认学习率3E-10开始(经过快速学习速率查找器验证是合适的)。解冻后,将通过学习率查找器和经验法则为1Cycle Policy创建一系列学习率,以将之前的学习率降低10倍。
损失函数 - 有一个多分类项目,因此将使用分类交叉熵。
评估 - 跟踪错误率,精度和灵敏度。深入研究混淆矩阵。
训练了较小的数据子集并使一切正常。然后切换到完整的数据集。经过四个时期的训练,解冻四个时期的训练后,得到了一个误差率为15%的基线模型。
部署
以下是部署模型的五个步骤。
1.Fork fastai GitHub repo示例和克隆。
https://github.com/render-examples/fastai-v3
2.在Render上注册一个帐户。
3.按照fastai Render指南设置项目。
4.在代码编辑器中自定义Render应用程序代码。
5.将代码推送到GitHub。这是在Render上的应用程序的GitHub。
https://github.com/discdiver/fastai-v3?organization=discdiver&organization=discdiver
应用应该在推送时自动部署。可以在“渲染”仪表板中查看应用的事件和日志。
部署应用程序需要几分钟的时间。可以在仪表板中查看进度。在简短经历中,Render得到了很好的客户支持, 很快就通过Slack渠道回答了问题。
可以在这里查看实时应用程序:
https://skin-render.onrender.com/
在Jupyter实验室中本地运行应用程序
可以在本地运行应用程序。如果正在使用Jupyter Lab,可以在笔记本中看到应用程序。
以下是在笔记本中查看应用程序的三个步骤:
from IPython.display import IFrame
IFrame(‘http://localhost:5042/', width=’100%’, height=500)
应用应该在单元格输出中运行。
改进模型
现在更长时间地训练模型,并尝试通过超参数调整来提高精度。将使用混合精确训练来加速训练。
使用半精度训练和64个批量大小,总共8个时期导致错误率为14%。这听起来不太糟糕。但后来查看了混淆矩阵,发现近一半的黑色素瘤病例被分类为良性标签。那是个问题。
参与了许多潜在的修复工作。最好的模型使用ResNet50转移学习,12个总训练时期,批量大小为64,浮点精度为32。
错误率现在下降到10.7%,这是混淆矩阵:
潜在的未来方向