前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用fastai和Render进行皮肤癌图像分类

用fastai和Render进行皮肤癌图像分类

作者头像
代码医生工作室
发布2019-06-21 21:08:46
2.8K0
发布2019-06-21 21:08:46
举报
文章被收录于专栏:相约机器人相约机器人

在构建和部署模型以对皮肤病变图像进行分类时,将逐步进行。完成后用户可以将图像上传到网站,模型将对皮肤病变进行分类。

训练设置图像

皮肤癌是最常见的癌症。已经开发了许多应用来对皮肤病变进行分类。通过上传可疑皮肤斑点的图片,可以看到是否应该与皮肤科医生交谈。

这是计划:

  1. 查找数据。
  2. 建立并训练模型。
  3. 部署模型。
  4. 提高模型性能。

步骤

  1. 查找数据。记得在某处看过皮肤痣的数据集 - 也许是UCI,data.world或Kaggle。
  2. 建立并训练模型。将使用fastai,高级PyTorch库来训练模型。Fastai允许应用许多最新技巧,API便于计算机视觉任务。将使用数据增强,迁移学习和学习速率退火。将在云中使用GPU中的Jupyter笔记本进行训练。
  3. 部署模型。Fastai的文档包含在Render上部署模型的指南,每月5美元。
  4. 在部署了模型后,将返回并尝试提高模型性能。

查找数据

发现哈佛研究人员在这里收集了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,可以在笔记本中看到应用程序。

以下是在笔记本中查看应用程序的三个步骤:

  1. 启动Jupyter Lab服务器
  2. 从终端,在本地渲染应用程序文件夹中,启动服务器 python app/server.py serve
  3. 在笔记本单元格中输入以下代码并运行它以创建iframe:
代码语言:javascript
复制
from IPython.display import IFrame

IFrame(‘http://localhost:5042/', width=’100%’, height=500)

应用应该在单元格输出中运行。

改进模型

现在更长时间地训练模型,并尝试通过超参数调整来提高精度。将使用混合精确训练来加速训练。

使用半精度训练和64个批量大小,总共8个时期导致错误率为14%。这听起来不太糟糕。但后来查看了混淆矩阵,发现近一半的黑色素瘤病例被分类为良性标签。那是个问题。

参与了许多潜在的修复工作。最好的模型使用ResNet50转移学习,12个总训练时期,批量大小为64,浮点精度为32。

错误率现在下降到10.7%,这是混淆矩阵:

潜在的未来方向

  • 测试更多超参数组合。
  • 除了图像之外,让用户输入年龄。这些数据可能会提高准确性。但是也会增加摩擦力。
  • 添加测试时间增强(TTA)以获得更好的预测性能。此增强功能非常棘手,因为应用需要根据提供的图像创建多个图像。TTA也会使推文的应用程序略微变慢。或者也可以要求用户上传病变的三张不同图片并进行预测。
  • 将其作为二元分类任务,可以将这些病变分类为危险或非危险。如果这是最终用户真正需要的信息,想如果要发布它,会让应用程序提出建议。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档