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)

模型運行結構

 

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