【问题标题】:How to feed grayscale images into a pretrained neural network models?如何将灰度图像输入预训练的神经网络模型?
【发布时间】:2021-10-28 00:35:48
【问题描述】:

这里是菜鸟。我一直在使用灰度图像进行有丝分裂分类Here's a sample image I'm working with。我已经使用 VGGnet 来实现这一点。我对如何将灰度图像输入神经网络有一些疑问。我已经阅读了有关在 Imagenet 上接受彩色图像训练的 VGGnet 文档。

我使用 cv2.imread() 并通过挤压成一个数组来读取图像。我发现它的形状是 (227,227,3)。当我处理灰度图像时,不应该是 (227,227,1) 吗?模型准确率也被发现只有 50%。我想知道是数据集本身有问题还是 VGGnet 不适合这个目的。或者我应该使用其他方法读取这些图像以获得灰度图像?

我已经尝试过类似问题中列出的解决方案。我是否以正确的方式阅读图像?

我在这里分享我的代码。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Display Image data 
from PIL import Image
import cv2

from google.colab import drive
drive.mount('/content/drive')

mitotic_image = Image.open('/content/drive/MyDrive/Medical/actualmito1/trainactmito01.jpg')
nonmitotic_image=Image.open('/content/drive/MyDrive/Medical/actualnonmito1/trainactnonmito01.jpg')

 # subplotting image data
 fig = plt.figure(figsize=(15,9))
 ax1 = fig.add_subplot(1, 2, 1)
 img_plot = plt.imshow(nonmitotic_image, cmap = plt.cm.bone)
 ax1.set_title("Non-Mitotic Image")

 ax2 = fig.add_subplot(1, 2, 2)
 img_plot = plt.imshow(mitotic_image, cmap = plt.cm.bone)
 ax2.set_title("Mitotic Image")
 plt.show()

 import os
 yes = os.listdir("/content/drive/MyDrive/Medical/actualmito1")
 no = os.listdir("/content/drive/MyDrive/Medical/actualnonmito1")

 data = np.concatenate([yes, no])
 target_yes = np.full(len(yes), 1)
 target_no = np.full(len(no), 0)

 # Image Target

 data_target = np.concatenate([target_yes, target_no])

 # Generate Image Data

 img = cv2.imread("/content/drive/MyDrive/Medical/actualmito1/trainactmito01.jpg")
 mitosis = cv2.resize(img,(32,32))
 plt.imshow(mitosis)

 X_data = []
 yes = os.listdir("/content/drive/MyDrive/Medical/actualmito1")
 for file in yes:
     img = cv2.imread("/content/drive/MyDrive/Medical/actualmito1/" + file)
     # resizing image data to 32x32
     img = cv2.resize(img, (224,224))
     X_data.append(img) # This will store list of all image data in an array

 no = os.listdir("/content/drive/MyDrive/Medical/actualnonmito1")
 for file in no:
     img = cv2.imread("/content/drive/MyDrive/Medical/actualnonmito1/" + file)
     # resizing image data to 32x32
     img = cv2.resize(img, (224,224))
     X_data.append(img)        # This will store list of all image data in an array

 X = np.squeeze(X_data)
 X.shape

 # Image Pixel Normalization

 X = X.astype('float32')
 X /= 255
 X.shape

 # Train & Test Data

 from sklearn.model_selection import train_test_split
 x_train, x_test, y_train, y_test = train_test_split(X, data_target, test_size = 0.1, 
 random_state = 3)

 x_train2, x_val, y_train2, y_val = train_test_split(x_train, y_train, test_size = 0.15, 
 random_state = 3)

 # VGG16 - Transfer Learning

 from tensorflow.keras.models import Sequential
 from tensorflow.keras.layers import Dense
 from tensorflow.keras.layers import Conv2D, GlobalAveragePooling2D, Flatten, ZeroPadding2D, 
 Dropout, BatchNormalization
 from tensorflow.keras.optimizers import Adam
 from tensorflow.keras.applications import VGG16

 def build_model():
    #use Imagenet = pre-trained models weights called knowledge transfer  
    # image_shape = 32x32x3
    vgg16_model = VGG16(weights = 'imagenet', include_top = False, input_shape=(224,224,3))

    # Input Layer
    model = Sequential()
    # paadding = 'same' = ZeroPadding
    model.add(Conv2D(filters=3, kernel_size=(3,3), padding='same', input_shape = (224,224,3)))

    # add transfer learning model
    model.add(vgg16_model)

    # Average Pooling Layer
    model.add(GlobalAveragePooling2D())
    model.add(BatchNormalization())
    model.add(Dropout(0.5))

    # Fully Connected Layer
    model.add(Dense(units = 512, activation='relu'))
    model.add(Dropout(0.5))
    # Output Layer
    model.add(Dense(units = 1, activation='sigmoid'))

    model.compile(optimizer = 'Adam', loss = 'binary_crossentropy', metrics = ['Accuracy'])

 return model

 model = build_model()

 model.summary()

 from tensorflow.keras import callbacks
 filepath = "/content/drive/MyDrive/BestModelMRI3.hdf5"
 checkpoint = callbacks.ModelCheckpoint(filepath, monitor = 'val_loss', save_best_only = True, 
 mode = 'min',verbose = 1)


 import datetime
 import keras
 import os

 logdir = os.path.join("/content/drive/MyDrive/MRI_logs", 
 datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
 tensorboard_callback = keras.callbacks.TensorBoard(logdir)

 history = model.fit(x_train2, y_train2, epochs = 200, batch_size = 32, shuffle = True, 
  validation_data = (x_val, y_val), callbacks = [checkpoint, tensorboard_callback],verbose= 1)

model.load_weights("/content/drive/MyDrive/BestModelMRI3.hdf5")


model.evaluate(x_test, y_test)

predictions = model.predict(x_test)

yhat = np.round(predictions)

from sklearn.metrics import confusion_matrix, classification_report 
confusion_matrix(y_test, yhat)
sns.heatmap(confusion_matrix(y_test, yhat), annot = True, cmap = 'RdPu')

print(classification_report(y_test, yhat))

【问题讨论】:

    标签: tensorflow grayscale transfer-learning


    【解决方案1】:

    VGG 模型是在 RGB 图像上训练的。 CV2 将图像读取为 BGR。所以添加代码

    img=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    

    将 BGR 转换为 RGB。此外,VGG 要求像素在 -1 到 +1 的范围内,因此可以缩放

    X=X/127.5 -1
    

    【讨论】:

    • 那么如果我使用 cv2.imread() 作为 RGB 图像读取灰度图像可以吗?
    猜你喜欢
    • 2021-10-21
    • 2020-08-24
    • 2017-05-28
    • 1970-01-01
    • 2020-07-13
    • 2019-05-24
    • 1970-01-01
    相关资源
    最近更新 更多