学习
实践
活动
工具
TVP
写文章

深度学习算法对磁共振图像序列的识别

前言

面对大数据和人工智能,已经跨过门槛的各路小伙伴们利用深度学习算法不断的炼丹,都已经在各行各业中大显身手,DL给我们带来的不仅是技术革命,更是对世界的重新认识,比如多维、古老而神秘的算法重燃青春、具备自我学习和进化的程序以及对庞大数据的特征提取及预测等等。煲完鸡汤,上干货~

直观的看,程序可以很健壮的识别磁共振图像序列,尽管因运动,图像出现较大伪影,程序仍能正确识别序列。

本文主要汇报的内容为利用PyTorch建立一个深度残差神经网络,并完成对MR图像序列的自动识别,网络输入为jpg或dicom格式的磁共振图像,网络输出结果为多分类数据,包括:T2、T1、T2 Flair。输入的磁共振图像不限部位,尽管最初创建模型时使用的是头部磁共振图像作为训练集和验证集,但是测试时为了检验下泛化能力,我用了一副腹部T2图像,也是完全可以正确识别的,这就是黑盒子的威力!利用交叉验证精确度约为93%,训练好的模型已经上传到了github上,下载地址在文末,本文仅演示使用Qt来可视化模型的应用,若需要了解更多信息,请移步“关于”联系作者。

简介

超简单的介绍下ResNet - 残差神经网络,网上关于此的内容很多,这里只说说自己的理解,深度学习的训练过程其实就是函数拟合过程,随着神经网络层数不断加深,尤其是卷积神经网络,动不动就几十层甚至上百层,随着层数的增加,优化梯度很容易消失或爆炸,导致模型训练饱和,甚至退化。2015年,微软大神何明凯的团队提出的残差网络获得了ILSVRC2015的分类任务第一名,使得尽管网络可以达到152层,不但梯度不会消失,训练误差也比传统卷积神经网络低很多,详见paper原文。以我自己的理解,就是用H(x)来表示最优解映射,但我们不去拟合这个函数,而却拟合另一个映射F(x),并另F(x)=H(x)-x,而F(x)是我们已知的拟合方程,我们只需要找到x的极小值就完成了函数拟合。

写这篇文章时,手贱更新了pytorch,从0.3.0更新到了0.3.1,这么微小的版本变动,竟然就不支持我的显卡了!怪不得深度学习门槛高,不但要有计算机语言门槛,还有硬件门槛,烧脑又烧钱啊!顺便说一句,以个人感受而言,建议涉猎深度学习的小伙伴们,离不开tensorflow是肯定的,但不妨关注下pytorch,首选炼丹神器!

实现

使用Qt作为前端,主要是尝试将模型与实际应用更好的结合起来,因为绝大部分的深度学习文章或应用都是基于matplotlib,pil,或者opencv,程序与用户不能做到很好的交互。

核心代码如下,其中已经包含了必要注释,就不过多解释了:

遇到的问题

1、程序支持JPG和DICOM格式的图像识别,分别需要通过opencv和pydicom读取,并在Qt的label上显示,如果选取的图像是DICOM格式,那还好,普通dcm文件只是256位或者512位的灰度图像,即只有一个灰度通道,但是jpg文件会存在三个颜色通道,而不同的图像处理库对于通道处理顺序是不同的,OpenCV图像通道是BGR,而Qt或matplotlib或pillow等图像通道则是 RGB,处理时应小心。

2、pytorch和Qt原生支持pillow,即PIL,若使用pillow,在qt中可以直接赋值给QImage类,并通过像素映射QPixmap进行显示。但如果因为需要复杂的控制和处理图像而使用了opencv,必须进行颜色通道以及像素位数的转换,以供Qt使用,如下:

以上代码运行在 Ubuntu 16.04 + Python 3.6 + PyTorch 0.3.0 + Qt 5.6 下。

训练好的模型点击以下链接下载:

http://www.douruixin.com/download/mr_serials_recognition_params.pkl

全部源码可以在github上下载:

https://github.com/douruixin/HeadMRSerialsRecognition

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180705G1A8C800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券