Chest-X-Ray-Images-Pneumonia肺炎X射线图像识别健康或肺炎患者,基于tensorflow2.0 CNN

github:https://github.com/zoe9698/Chest-X-Ray-Images-Pneumonia-

参考文献:https://tensorflow.google.cn/tutorials

 

数据集

  • 数据集观察:肺炎肺有雾化的阴影
  • 数据预处理:
'''
图片预处理
'''
def preprocess_image(image):
    '''
    image=img_raw
    '''
    image = tf.image.decode_png(image,channels=3)
    
    image = tf.image.resize(image,[128,128]) #裁剪大小
    image /= 255.0 #归一化
    return image

def load_and_preprocess_image(path):
    '''
    param:img_path
    return:img_raw
    '''
    image = tf.io.gfile.GFile(img_path, 'rb').read()
    return preprocess_image(image)
  • 从文件夹中取得所有图片的path:
'''
所有图片的path

list
'''
import os

all_image_paths = os.listdir('D:/kaggle/feiyan/postcrop_train/NORMAL/')
all_image_paths = all_image_paths+(os.listdir('D:/kaggle/feiyan/postcrop_train/PNEUMONIA/'))
#from_tensor_slices:将字符串数组切片,得到一个字符串数据集
path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
print(path_ds)
  •  调用上面的函数得到所有图片数据集----img-raw
'''
来动态加载每一个图片进入函数load_and_preprocess_image
'''
image_ds = path_ds.map(load_and_preprocess_image, num_parallel_calls=tf.data.experimental.AUTOTUNE)
  •  制作标签数据集
'''
添加一个标签数据集
'''
label_names = {0:'NORMAL', 1:'PNEUMONIA'}
all_image_labels = []
for i in range(1341):
    all_image_labels.append(0)
for i in range(1341,5216):
    all_image_labels.append(1)
    
print(len(all_image_labels))
# print(all_image_labels[1340],all_image_labels[1341])

label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels,tf.int64))
print(label_ds)
for label in label_ds.take(10):
    print(label_names[label.numpy()])
  • 整合为(img,label) 
'''
image_ds 和 label_ds打包成一个(图片,标签)数据集
格式:ZipDataset
'''
image_label_ds = tf.data.Dataset.zip((image_ds,label_ds))
print(image_label_ds)
  •  为模型准备数据
'''
1.打乱数据
2.分割数据
3.重复数据
4.在处理当前元素时准备后面的元素
'''
BATCH_SIZE = 32
image_count = 5216
# 设置一个和数据集大小一致的 shuffle buffer size(随机缓冲区大小)以保证数据
# 被充分打乱。
ds = image_label_ds.shuffle(buffer_size=image_count)
ds = ds.repeat()
ds = ds.batch(BATCH_SIZE)
#这允许在处理当前元素时准备后面的元素
ds = ds.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
ds
  • CNN模型结构
from tensorflow.keras import datasets, layers, models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(2))
a
# model.summary()
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model.fit(ds, epochs=10,steps_per_epoch=12)

模型运行结构

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章