当前位置: 首页 > 后端技术 > Python

麻糬云-新冠肺炎防控之:肺炎CT检测

时间:2023-03-26 13:36:50 Python

连日来,新型冠状病毒引发的肺炎疫情不仅牵动着整个武汉和湖北,牵动着全国人民的心。为武汉加油!我们相信,坚持不懈,春暖花开。今天,让我们用一个简单实用的神经网络模型来检测肺炎的CT图像。第一步:导入我们需要的库fromkeras.preprocessing.imageimportImageDataGenerator,load_imgfromkeras.modelsimportSequentialfromkeras.layersimportDense,Dropout,Flatten,ZeroPadding2D,Conv2D,MaxPooling2D,Activationfromkeras.optimizersimportAdam,SGDrom,RMSpropkeras.callbacksimportEarlyStopping从kerasimportbackendasKimporttensorflowastfconfig=tf.ConfigProto()config.gpu_options.per_process_gpu_memory_fraction=0.9K.tensorflow_backend.set_session(tf.Session(config=config))importcasimportnvasimportnumfromasglobimportglobimportmatplotlib.pyplotasplt%matplotlibinline第二步:数据查看2.1首先确认我们数据的目录结构:在chest_xray文件夹中,我们将数据分为训练用例数据(train)、测试用例数据(test)、验证用例数据(值);训练数据、测试数据、验证数据各文件夹分为正常病例数据(normal)和肺炎病例数据(pneumonia)。print("trainingcasedata")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("测试用例data")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无肺炎CT20个案例的图像:multipleImages=glob('chest_xray/train/NORMAL/**')i_=0plt.rcParams['figure.figsize']=(10.0,10.0)plt.subplots_adjust(wspace=0,hspace=0)forlinmultipleImages[: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_+=12.2.220例肺炎的CT图像:multipleImages=glob('chest_xray/train/PNEUMONIA/**')i_=0plt.rcParams['figure.figsize']=(10.0,10.0)plt.subplots_adjust(wspace=0,hspace=0)forlinmultipleImages[: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首先定义一些我们需要用到的变量#Imagesizeimage_width=226image_height=2263.2来处理输入数据中图像的通道号的格式ifK.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.2horizo??ntalfliptrain_data_gen=ImageDataGenerator(rescale=1./255,shear_range=0.2,zoom_range=0.2,horizo??ntal_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')找到属于2类的5216张图像。3.4.2验证数据读取validation_generator=test_data_gen_drectory_from'chest_xray/val',target_size=(image_width,image_height),batch_size=16,class_mode='categorical')找到属于2个类的16张图像。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')找到属于2个类的624张图像。第四步:模型构建4.1定义我们的模型。我们的模型层采用VGG16网络模型,原始模型链接:https://gist.github.com/baral...4.1.1VGGVGG是Simonyan和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出的一种卷积神经网络模型。它的名字来源于牛津大学视觉几何组(VisualGeometryGroup)这个模型参加了2014年ImageNet图像分类和定位挑战赛并取得了优异的成绩:在分类任务中排名第二,在定位任务中排名第一。VGG结构图:4.1.2VGG16VGG模型有一些变体,其中最流行的当然是VGG-16,它是一个16层的模型。可以看到需要224x224x3维度的输入数据。VGG16输入一张224x224x3的图片,通过的卷积核大小为3x3x3,stride=1,padding=1,pooling采用2x2的MaxPooling方式:输入一张224x224x3的图片,经过64个卷积核的两次卷积后,使用一个MaxPooling后Pooling然后2个128卷积核卷积,1个MaxPooling和3个256卷积核卷积,用MaxPooling重复3个512卷积核卷积2次MaxPooling3次FCVGG16结构图下面我们用Keras搭建一个VGG16模型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'))模型。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)))模型。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编译模型我们使用AdamOptimizer,并且学习率设置为0.0001,在验证集的准确率上加一个earlystoppingmonitor,设置patinece为3。这个参数的意思是当我们有连续3个epoch没有提高准确率的时候,我们就停止训练防止过度拟合优化器=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)step5:肺炎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('模型精度')plt.ylabel('精度')plt.xlabel('Epoch')plt.legend(['train'],loc='左上')plt.show()plt.plot(history.history['loss'])plt.title('ModelLoss')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))具体数据结果,欢迎大家自己实验。目前,《COVID-19防控-肺炎CT检测》病例图片已上传至巨池云GPU云共享平台,正式上线。有兴趣的小伙伴可以通过官网“机器租赁”-“我要租赁”-“选择镜像”-“Jupyter教程Demo”尝试使用。