0


基于LIDC-IDRI肺结节肺癌数据集的人工智能深度学习分类良性和恶性肺癌(Python 全代码)全流程解析(二)

基于LIDC-IDRI肺结节肺癌数据集的人工智能深度学习分类良性和恶性肺癌(Python 全代码)全流程解析(二)

第一部分内容的传送门
第三部分传送门

1 环境配置和数据集预处理

1.1 环境配置

环境配置建议使用anaconda进行配置。核心的配置是keras和tensorflow的版本要匹配。
环境配置如下:
tensorboard 1.13.1
tensorflow 1.13.1
Keras 2.2.4
numpy 1.21.5
opencv-python 4.6.0.66
python 3.7

1.1 数据集预处理

数据集的预处理分为两个关键步骤。首先是图片处理,我们使用cv2库将图片转换为矩阵格式。这些矩阵随后被堆叠,并放入一个列表中,以便于深度学习模型的读取和处理。

其次是标签处理。我们从保存肺癌恶性程度信息的label.csv文件中逐行读取数据。通过切片和提取,我们获取了肺癌的恶性程度评级,这些评级在1到5之间。我们将大于3的评级归类为恶性,小于3的评级归类为良性。为了让模型更好地理解这些标签,我们用1表示良性,0表示恶性,最后将标签数据转换为one-hot编码格式。

输出与处理的函数如下:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import keras
  4. import cv2
  5. import os
  6. from keras.preprocessing.image import img_to_array
  7. from keras.utils import to_categorical, plot_model
  8. defload_data(label_path,data_path):
  9. data_x =[]
  10. labels =[]
  11. f =open(label_path)
  12. label = f.readlines()for Pathimg in os.listdir(os.path.join(data_path,'x')):
  13. Path = os.path.join(os.path.join(data_path,'x'),Pathimg)#print(Path)
  14. image = cv2.imread(Path)
  15. image = img_to_array(image)
  16. data_x.append(image)#处理label
  17. index_num =int(Pathimg.split('.')[0])# print(labels)用索隐处理,
  18. a = label[index_num]
  19. label_ =int(a[-3:-2])
  20. label_1 =1if label_ >3else0
  21. labels.append(label_1)print(labels)# print(data)#guiyihua
  22. data_x = np.array(data_x,dtype='float')/255.0
  23. labels = np.array(labels)#转化标签为张量
  24. labels = to_categorical(labels)#载入data——y
  25. data_y =[]for Pathimg in os.listdir(os.path.join(data_path,'y')):
  26. Path = os.path.join(os.path.join(data_path,'y'),Pathimg)#print(Path)
  27. image = cv2.imread(Path)
  28. image = img_to_array(image)
  29. data_y.append(image)#guiyihua
  30. data_y = np.array(data_y,dtype='float')/255.0#处理Z
  31. data_z =[]for Pathimg in os.listdir(os.path.join(data_path,'z')):
  32. Path = os.path.join(os.path.join(data_path,'z'),Pathimg)#print(Path)
  33. image = cv2.imread(Path)
  34. image = img_to_array(image)
  35. data_z.append(image)#guiyihua
  36. data_z = np.array(data_y,dtype='float')/255.0return labels,data_x,data_y,data_z

我们定义好数据预处理的函数后读取数据。图片的数据的格式如下:
其中有875个图片,每个图片的大小为50*50和3个通道
在这里插入图片描述
label的格式如下:
在这里插入图片描述

2 深度学习模型训练和评估

2.1 深度学习模型训练

我们已经在另一个文件中创建了一个深度学习模型,并且定义了一个函数来导入这个模型。在这里,我们将实例化这个函数。该函数会返回模型的结构以及模型训练的记录信息。

这个模型的输入是来自三个不同角度的图像和对应的标签。模型将被训练 5 个周期,每个周期训练 50 个图像。我们将使用 TensorBoard 查看模型的训练记录。

  1. #######搭建模型
  2. model,callbacks = create_model()#模型训练
  3. H = model.fit([data_x,data_y,data_z],[labels],
  4. epochs=5,batch_size=50, callbacks=callbacks)

训练结果如下:
我们可以看到训练的准确率还可以为0.7451左右
在这里插入图片描述

训练完成后我们将模型储存起来方便对模型进行评估。

  1. #######save model to diskprint('info:saving model.....')
  2. model.save(os.path.join(result_path,'model_44.h5'))

2.1 深度学习模型评估

模型的评估我们首先使用了,分类模型训练的损失函数和准确率来评估模型的训练过程。之后我们还会介绍模型的评估的其他指标。包括混淆矩阵,ROC曲线,AUC值,等

  1. #准确率损失曲线绘制
  2. plt.style.use('ggplot')
  3. plt.figure()
  4. N =5
  5. fig = plt.plot(np.arange(0, N), H.history["loss"], label="train_loss")#plt.plot(np.arange(0, N), H.history["val_loss"], label="val_loss")
  6. plt.plot(np.arange(0, N), H.history["acc"], label="train_acc")#plt.plot(np.arange(0, N), H.history["val_acc"], label="val_acc")
  7. plt.title("Training Loss and Accuracy on traffic-sign classifier")
  8. plt.xlabel("Epoch #")
  9. plt.ylabel("Loss/Accuracy")
  10. plt.legend(loc="lower left")#plt.show()
  11. plt.savefig('a.jpg',dpi=800)

训练结果如下:

笑话一则开心一下喽

今天去买水果,我问一个摊主:别人家的瓜都写着不甜包退,你怎么不敢写呢,瓜不好吧。摊主:不买滚,我他么卖的是苦瓜……

深度学习,医学图像处理,机器学习精通,需要帮助的联系我(有偿哦)

完整代码如下:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import keras
  4. import cv2
  5. import os
  6. os.chdir('F:\工作\博客\sort_lung')from models import create_model
  7. from load_datas import load_data
  8. label_path =r'F:\test\data\label.txt'
  9. data_path =r'F:\test\data\train'
  10. result_path =r'F:\test\result'#读取预处理数据
  11. labels,data_x,data_y,data_z = load_data(label_path,data_path)#######搭建模型
  12. model,callbacks = create_model()#模型训练
  13. H = model.fit([data_x,data_y,data_z],[labels],
  14. epochs=5,batch_size=50, callbacks=callbacks)#save model to diskprint('info:saving model.....')
  15. model.save(os.path.join(result_path,'model_44.h5'))#准确率损失曲线绘制
  16. plt.style.use('ggplot')
  17. plt.figure()
  18. N =5
  19. fig = plt.plot(np.arange(0, N), H.history["loss"], label="train_loss")#plt.plot(np.arange(0, N), H.history["val_loss"], label="val_loss")
  20. plt.plot(np.arange(0, N), H.history["acc"], label="train_acc")#plt.plot(np.arange(0, N), H.history["val_acc"], label="val_acc")
  21. plt.title("Training Loss and Accuracy on traffic-sign classifier")
  22. plt.xlabel("Epoch #")
  23. plt.ylabel("Loss/Accuracy")
  24. plt.legend(loc="lower left")#plt.show()
  25. plt.savefig('a.jpg',dpi=800)

模型文件如下

深度学习模型讲解—待续

  1. # -*- coding: utf-8 -*-"""
  2. Created on Sun Apr 14 21:08:01 2024
  3. @author: dell
  4. """from keras.preprocessing.image import ImageDataGenerator
  5. from keras.optimizers import Adam
  6. from sklearn.model_selection import train_test_split
  7. from keras.preprocessing.image import img_to_array
  8. from keras.utils import to_categorical, plot_model
  9. from keras.models import Model
  10. #from imutils import pathsimport matplotlib.pyplot as plt
  11. import numpy as np
  12. import keras
  13. import cv2
  14. import os
  15. #定义模型from keras.models import Sequential
  16. from keras.layers import Conv2D, MaxPooling2D
  17. from keras.layers import Activation, Dropout, Flatten, Dense, Input,Concatenate
  18. defcreate_model():
  19. model = Sequential()#############定义多输入
  20. input1 = Input(shape=(50,50,3),name ='input1')
  21. input2 = Input(shape=(50,50,3),name ='input2')
  22. input3 = Input(shape=(50,50,3),name ='input3')#############定义多输入
  23. x1 = Conv2D(32,(3,3),padding='same')(input1)#input is height,width,deep
  24. x1 = Activation('relu')(x1)
  25. x1 = Conv2D(32,(3,3),padding='same')(x1)
  26. x1 = Activation('relu')(x1)
  27. x1 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x1)
  28. x1 = Conv2D(48,(3,3),padding='same')(x1)
  29. x1 = Activation('relu')(x1)
  30. x1 = Conv2D(48,(3,3),padding='same')(x1)
  31. x1 = Activation('relu')(x1)
  32. x1 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x1)
  33. x1 = Conv2D(64,(3,3),padding='same')(x1)
  34. x1 = Activation('relu')(x1)
  35. x1 = Conv2D(64,(3,3),padding='same')(x1)
  36. x1 = Activation('relu')(x1)
  37. x1 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x1)# the model so far outputs 3D feature maps (height, width, features)#base_model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
  38. x1 = Flatten()(x1)
  39. x1 = Dense(256)(x1)
  40. x1 = Activation('relu')(x1)
  41. x1 = Dropout(0.5)(x1)
  42. category_predict1 = Dense(100, activation='softmax', name='category_predict1')(x1)# Three loss functions#定义三个全连接层
  43. x2 = Conv2D(32,(3,3),padding='same')(input2)#input is height,width,deep
  44. x2 = Activation('relu')(x2)
  45. x2 = Conv2D(32,(3,3),padding='same')(x2)
  46. x2 = Activation('relu')(x2)
  47. x2 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x2)
  48. x2 = Conv2D(48,(3,3),padding='same')(x2)
  49. x2 = Activation('relu')(x2)
  50. x2 = Conv2D(48,(3,3),padding='same')(x2)
  51. x2 = Activation('relu')(x2)
  52. x2 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x2)
  53. x2 = Conv2D(64,(3,3),padding='same')(x2)
  54. x2 = Activation('relu')(x2)
  55. x2 = Conv2D(64,(3,3),padding='same')(x2)
  56. x2 = Activation('relu')(x2)
  57. x2 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x2)# the model so far outputs 3D feature maps (height, width, features)#base_model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
  58. x2 = Flatten()(x2)
  59. x2 = Dense(256)(x2)
  60. x2 = Activation('relu')(x2)
  61. x2 = Dropout(0.5)(x2)
  62. category_predict2 = Dense(100, activation='relu', name='category_predict2')(x2)
  63. x3 = Conv2D(32,(3,3),padding='same')(input3)#input is height,width,deep
  64. x3 = Activation('relu')(x3)
  65. x3 = Conv2D(32,(3,3),padding='same')(x3)
  66. x3 = Activation('relu')(x3)
  67. x3 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x3)
  68. x3 = Conv2D(48,(3,3),padding='same')(x3)
  69. x3 = Activation('relu')(x3)
  70. x3 = Conv2D(48,(3,3),padding='same')(x3)
  71. x3 = Activation('relu')(x3)
  72. x3 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x3)
  73. x3 = Conv2D(64,(3,3),padding='same')(x3)
  74. x3 = Activation('relu')(x3)
  75. x3 = Conv2D(64,(3,3),padding='same')(x3)
  76. x3 = Activation('relu')(x3)
  77. x3 = MaxPooling2D(pool_size=(2,2),strides =(2,2))(x3)# the model so far outputs 3D feature maps (height, width, features)#base_model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
  78. x3 = Flatten()(x3)
  79. x3 = Dense(256)(x3)
  80. x3 = Activation('relu')(x3)
  81. x3 = Dropout(0.5)(x3)
  82. category_predict3 = Dense(100, activation='relu', name='category_predict3')(x3)#融合全连接层
  83. merge = Concatenate()([category_predict1,category_predict2,category_predict3])#定义输出
  84. output = Dense(2,activation='sigmoid', name='output')(merge)
  85. model = Model(inputs=[input1, input2, input3], outputs=[output])
  86. callbacks =[keras.callbacks.TensorBoard(
  87. log_dir='my_log_dir',)]
  88. model.compile(optimizer=Adam(lr=0.001,decay=0.01),
  89. loss='binary_crossentropy',
  90. metrics=['accuracy'],)return model,callbacks

本文转载自: https://blog.csdn.net/a721867783/article/details/137755854
版权归原作者 雷博士 所有, 如有侵权,请联系我们删除。

“基于LIDC-IDRI肺结节肺癌数据集的人工智能深度学习分类良性和恶性肺癌(Python 全代码)全流程解析(二)”的评论:

还没有评论