【问题标题】:how to build cnn model for defect detection with three classes and test one image on it如何使用三类构建用于缺陷检测的 cnn 模型并在其上测试一张图像
【发布时间】:2021-09-08 13:24:25
【问题描述】:

我构建了一个 CNN 模型来检测图像上的两种缺陷。这些类有“大”和“小”之分,准确性非常好。我的模型架构如下:

inputs = tf.keras.Input(shape=(120, 120, 3))
x = tf.keras.layers.Conv2D(filters=16, kernel_size=(3, 3), activation='relu')(inputs)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu')(x)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)

model = tf.keras.Model(inputs=inputs, outputs=outputs)

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

print(model.summary())

history = model.fit(
    train_data,
    validation_data=val_data,
    epochs=100,
    callbacks=[
        tf.keras.callbacks.EarlyStopping(
            monitor='val_loss',
            patience=3,
            restore_best_weights=True
        )
    ]
)

现在,我想将此 CNN 模型用于多类,这些类将是“大”、“小”、“其他”。我有数据集,但我不知道如何更改三个类的模型。另外,最后我想在我的 CNN 模型中测试一张图像,如果插入的图像是大、小或其他,我会得到标签,但我不知道如何。

【问题讨论】:

    标签: python tensorflow keras deep-learning conv-neural-network


    【解决方案1】:

    试试这个:

    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Conv2D(input_shape = (120, 120, 3), filters=16, kernel_size=(3, 3), activation='relu'))
    model.add(tf.keras.layers.MaxPool2D(pool_size=(2, 2)))
    model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu'))
    model.add(tf.keras.layers.MaxPool2D(pool_size=(2, 2)))
    model.add(tf.keras.layers.GlobalAveragePooling2D())
    model.add(tf.keras.layers.Dense(3, activation='softmax'))
    
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    

    要预测,可以使用以下代码:

    from PIL import Image
    import numpy as np
    from skimage import transform
    
    def load(filename):
        np_image = Image.open(filename)
        np_image = np.array(np_image).astype('float32')/255
        np_image = transform.resize(np_image, (120, 120, 3))
        np_image = np.expand_dims(np_image, axis=0)
        return np_image
    
    
    folder_path = 'Dataset/test/4.jpg'
    image = load(folder_path)
    pred = model.predict_classes(image)
    pred.tolist()[0]
    

    【讨论】:

    • 非常感谢,但是对于测试图像,我怎样才能获得输出标签?我的意思是这段代码返回 0 和 1 的数组。我写了一个函数来获取标签,但我不知道如何使用它:
    • def generate_df(image_dir, label): filepaths = pd.Series(list(image_dir.glob(r'*.png')), name='Filepath').astype(str) labels = pd.Series(label, name='Label', index=filepaths.index) df = pd.concat([filepaths, labels], axis=1) return df
    • big_df = generate_df(big_dir, label="BIG")
    • 我已经改变了我的答案。要获得预测的类,您必须使用顺序。
    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多