连日来,新型冠状病毒感染的肺炎疫情,牵动的不仅仅是全武汉、全湖北,更是全国人民的心,大家纷纷以自己独特的方式为武汉加油!我们相信坚持下去,终会春暖花开。

今天让我们以简单实用的神经网络模型,来检测肺炎的CT影像。

第一步:导入我们需要的库

from keras.preprocessing.image import ImageDataGenerator, load_img
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, ZeroPadding2D, Conv2D, MaxPooling2D, Activation
from keras.optimizers import Adam, SGD, RMSprop
from keras.callbacks import EarlyStopping
from keras import backend as K import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9
K.tensorflow_backend.set_session(tf.Session(config=config)) import os
import numpy as np
import pandas as np
import cv2 from glob import glob import matplotlib.pyplot as plt
%matplotlib inline

第二步:数据查看

2.1 先确认下我们数据的目录结构:

在chest_xray文件夹中,我们将数据分成了训练病例数据(train), 测试病例数据(test), 验证病例数据(val);

每个训练数据,测试数据,验证数据的文件夹中我们又分成了正常的病例数据(normal), 肺炎病例数据(pneumonia)。

print("训练病例数据")
print(os.listdir("chest_xray"))
print(os.listdir("chest_xray/train"))
print(os.listdir("chest_xray/train/"))

训练病例数据

['test', 'train', 'val', '.DS_Store']

['NORMAL', '.DS_Store', 'PNEUMONIA']

['NORMAL', '.DS_Store', 'PNEUMONIA']

print("测试病例数据")
print(os.listdir("chest_xray"))
print(os.listdir("chest_xray/test"))
print(os.listdir("chest_xray/test/"))

测试病例数据

['test', 'train', 'val', '.DS_Store']

['NORMAL', '.DS_Store', 'PNEUMONIA']

['NORMAL', '.DS_Store', 'PNEUMONIA']

print("验证病例数据")
print(os.listdir("chest_xray"))
print(os.listdir("chest_xray/val"))
print(os.listdir("chest_xray/val/"))

验证病例数据

['test', 'train', 'val', '.DS_Store']

['NORMAL', '.DS_Store', 'PNEUMONIA']

['NORMAL', '.DS_Store', 'PNEUMONIA']

2.2 用matpolt 来可视化我们的病例数据:

2.2.1 没有肺炎的20个病例的CT图片:

multipleImages = glob('chest_xray/train/NORMAL/**')
i_ = 0
plt.rcParams['figure.figsize'] = (10.0, 10.0)
plt.subplots_adjust(wspace=0, hspace=0)
for l in multipleImages[:25]:
im = cv2.imread(l)
im = cv2.resize(im, (128, 128))
plt.subplot(5, 5, i_+1) #.set_title(l)
plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)); plt.axis('off')
i_ += 1

2.2.2 有肺炎的20个病例的CT图片:

multipleImages = glob('chest_xray/train/PNEUMONIA/**')
i_ = 0
plt.rcParams['figure.figsize'] = (10.0, 10.0)
plt.subplots_adjust(wspace=0, hspace=0)
for l in multipleImages[:25]:
im = cv2.imread(l)
im = cv2.resize(im, (128, 128))
plt.subplot(5, 5, i_+1) #.set_title(l)
plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)); plt.axis('off')
i_ += 1

第三步:数据预处理

3.1 首先先定义一些我们需要使用到的变量

# 图片尺寸
image_width = 226
image_height = 226

3.2 处理下图片的通道数在输入数据中的格式问题

if K.image_data_format() == 'channels_first':
input_shape = (3, image_width, image_height)
else:
input_shape = (image_width, image_height, 3)

3.3 数据加载和增强

这个案例,我们使用Keras的

ImageDataGenerator来加载我们的数据,并且做数据增强跟处理。

ImageDataGenerator

是keras.preprocessing.image模块中的图片生成器,同时也可以在batch中对数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等。

3.3.1 定义训练数据的ImageDataGenerator

  • 训练数据的ImageDataGenerator我们做了如下几个处理:
  • 将像素值归一化 (rescale)
  • 剪切强度(逆时针方向的剪切变换角度),强度为0.2
  • 随机缩放的幅度, 当前为0.2
  • 水平翻转
train_data_gen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)

3.3.2 定义测试数据的ImageDataGenerator

测试数据我们只做了归一化处理

test_data_gen = ImageDataGenerator(rescale=1. / 255)

3.4 使用我们定义好的ImageDataGenerator从文件夹中读取数据, 其中target_size参数会把我们读入的原始数据缩放到我们想要的尺寸

3.4.1 训练数据读取

train_generator = train_data_gen.flow_from_directory(
'chest_xray/train',
target_size=(image_width, image_height),
batch_size=16,
class_mode='categorical')

Found 5216 images belonging to 2 classes.

3.4.2 验证数据读取

validation_generator = test_data_gen.flow_from_directory(
'chest_xray/val',
target_size=(image_width, image_height),
batch_size=16,
class_mode='categorical')

Found 16 images belonging to 2 classes.

3.4.3 测试数据读取

test_generator = test_data_gen.flow_from_directory(
'chest_xray/test',
target_size=(image_width, image_height),
batch_size=16,
class_mode='categorical')

Found 624 images belonging to 2 classes.

第四步:模型构建

4.1 定义我们的模型

我们的模型层次采用VGG16 网络模型,

原模型链接:

https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3

4.1.1 VGG

VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。

该模型参加2014年的 ImageNet图像分类与定位挑战赛,取得了优异成绩:在分类任务上排名第二,在定位任务上排名第一。

VGG结构图:

4.1.2 VGG16

VGG模型有一些变种,其中最受欢迎的当然是 VGG-16,这是一个拥有16层的模型。你可以看到它需要维度是 224x224x3 的输入数据。

VGG16输入224x224x3的图片,经过的卷积核大小为3x3x3,stride=1,padding=1,pooling为采用2x2的Max Pooling方式:

  • 输入224x224x3的图片,经过64个卷积核的两次卷积后,采用一次Max Pooling
  • 再经过两次128的卷积核卷积之后,采用一次Max Pooling
  • 再经过三次256的卷积核的卷积之后,采用Max Pooling
  • 重复两次三个512的卷积核卷积之后再Max Pooling
  • 三次FC

VGG 16结构图

下面我们使用Keras 建立VGG 16 模型

model = Sequential()
model.add(ZeroPadding2D((1,1),input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2))) model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2))) model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2))) model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2))) model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2))) model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

4.2 查看下模型概况

model.summary()

4.3 编译模型

我们使用Adam优化器,并且设置learning rate为0.0001,对验证集的精确度添加early stopping monitor,并且patinece设置成3,这个参数的意思,当我们有3个连续的epochs没有提升精度,我们就停止训练,防止过拟合。

optimizer = Adam(lr = 0.0001)
early_stopping_monitor = EarlyStopping(patience = 3, monitor = "val_accuracy", mode="max", verbose = 2)
model.compile(loss="categorical_crossentropy", metrics=["accuracy"], optimizer=optimizer)

第五步:肺炎CT模型训练

5.1 训练模型

history = model.fit_generator(epochs=5, callbacks=[early_stopping_monitor], shuffle=True,
validation_data=validation_generator, generator=train_generator,
steps_per_epoch=500, validation_steps=10,verbose=2)

5.2 模型在训练过程中,训练数据集的精度和损失值会发生变化。

有次可见,我们的模型在训练的时候,精度不断提高,因此看到我们的模型在逐渐收敛到最佳的状态。

plt.plot(history.history['accuracy'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['train'], loc='upper left')
plt.show()
plt.plot(history.history['loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['train'], loc='best')
plt.show()

第六步: 模型在测试集数据上的使用

scores = model.evaluate_generator(test_generator)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

具体的数据结果,欢迎各自进行尝试实验

当前 “新冠肺炎防控-肺炎CT检测” 案例镜像已经在矩池云GPU云共享平台正式上线。

感兴趣的小伙伴可以通过官网“机器租赁” — “我要租赁” — “选择镜像” — “Jupyter 教程 Demo”中尝试使用。

矩池云 | 新冠肺炎防控:肺炎CT检测的更多相关文章

  1. 矩池云助力科研算力免费上"云",让 AI 教学简单起来

    矩池云是一个专业的国内深度学习云平台,拥有着良好的深度学习云端训练体验,和高性价比的GPU集群资源.而且对同学们比较友好,会经常做一些大折扣的活动,最近双十一,全场所有的RTX 2070.Platin ...

  2. 矩池云上使用nvidia-smi命令教程

    简介 nvidia-smi全称是NVIDIA System Management Interface ,它是一个基于NVIDIA Management Library(NVML)构建的命令行实用工具, ...

  3. 如何使用 VS Code 远程连接矩池云主机

    Visual Studio Code(以下简称 VS Code)是一个由微软开发的代码编辑器.VS Code 支持代码补全.代码片段.代码重构.Git 版本控制等功能. VS Code 现已支持连接远 ...

  4. 矩池云 | 利用LSTM框架实时预测比特币价格

    温馨提示:本案例只作为学习研究用途,不构成投资建议. 比特币的价格数据是基于时间序列的,因此比特币的价格预测大多采用LSTM模型来实现. 长期短期记忆(LSTM)是一种特别适用于时间序列数据(或具有时 ...

  5. 矩池云 | Tony老师解读Kaggle Twitter情感分析案例

    今天Tony老师给大家带来的案例是Kaggle上的Twitter的情感分析竞赛.在这个案例中,将使用预训练的模型BERT来完成对整个竞赛的数据分析. 导入需要的库 import numpy as np ...

  6. 矩池云 | 使用LightGBM来预测分子属性

    今天给大家介绍提升方法(Boosting), 提升算法是一种可以用来减小监督式学习中偏差的机器学习算法. 面对的问题是迈可·肯斯(Michael Kearns)提出的:一组"弱学习者&quo ...

  7. 矩池云 | 神经网络图像分割:气胸X光片识别案例

    在上一次肺炎X光片的预测中,我们通过神经网络来识别患者胸部的X光片,用于检测患者是否患有肺炎.这是一个典型的神经网络图像分类在医学领域中的运用. 另外,神经网络的图像分割在医学领域中也有着很重要的用作 ...

  8. 矩池云里查看cuda版本

    可以用下面的命令查看 cat /usr/local/cuda/version.txt 如果想用nvcc来查看可以用下面的命令 nvcc -V 如果环境内没有nvcc可以安装一下,教程是矩池云上如何安装 ...

  9. 在矩池云上复现 CVPR 2018 LearningToCompare_FSL 环境

    这是 CVPR 2018 的一篇少样本学习论文:Learning to Compare: Relation Network for Few-Shot Learning 源码地址:https://git ...

随机推荐

  1. 初识 oracle!

    /** * 一.oracle的简介? * 1.是一个关系型数据库,强大! * * 软件名 开发商 用途 * * oracle oracle 专门的软件公司 收费!1.连接的用户数,2.服务器的cpu的 ...

  2. ApacheCN Linux 译文集 20211129 更新

    笨办法学 Linux 中文版 练习 0:起步 练习 1:文本编辑器,vim 练习 2:文本浏览器,少即是多 练习 3:Bash:Shell..profile..bashrc..bash_history ...

  3. ApacheCN PHP 译文集 20211101 更新

    PHP 入门指南 零.序言 一.PHP 入门 二.数组和循环 三.函数和类 四.数据操作 五.构建 PHP Web 应用 六.搭建 PHP 框架 七.认证与用户管理 八.建立联系人管理系统 使用 PH ...

  4. HOW2J 全套教程整理:Java、前端、数据库、中间件、第三方、项目、面试题

    考虑到部分同学寝室会断网,原站的所有的免费内容都提供了一个离线版本以供使用.但是它直接提供了静态页面,并不方便在手机上阅读,因为我将其转换为 EPUB. 目录 HOW2J J2EE 教程.epub H ...

  5. CF1399F Yet Another Segments Subset

    首先注意一下题面要求,使得选出的线段两两要么包含要么不相交,也就是说一条线段可能会出现不相交的几条线段,而这些线段上面也可能继续这样包含线段.然后我们可以发现我们要做的实际上是在这条线段上选取几条线段 ...

  6. VC中如何将资源打包并释放到指定文件夹

    转载请注明来源:https://www.cnblogs.com/hookjc/ 很多时候,我们可能要将某些文件打包到资源中,然后当程序执行的时候,发现缺少某些文件时,进行自我修复,以维持程序的正常执行 ...

  7. JVM学习十四 - (复习)类文件结构

    类文件结构 JVM 的"无关性" 谈论 JVM 的无关性,主要有以下两个: 平台无关性:任何操作系统都能运行 Java 代码 语言无关性: JVM 能运行除 Java 以外的其他代 ...

  8. 解决手机unauthorized错误

    手机:xiaomi-note(OS: Android 6.0) 手机开发者选项中USB调试已经打开,在电脑命令行下输入adb devices,显示手机未认证 D:\develop\androidroo ...

  9. 模拟dom结构

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. rsync 远程同步部署——上下行同步

    rsync 远程同步部署--上下行同步 1.rsync (Remote Sync,远程同步) : 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用 ...