qq_42761538 2021-03-12 11:28 采纳率: 0%
浏览 22

Keras找不到图像文件

import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
from keras.callbacks import ModelCheckpoint, TensorBoard
from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense
from keras.layers.normalization import BatchNormalization
from keras.models import Sequential, load_model
from keras.preprocessing.image import ImageDataGenerator
from sklearn.metrics import classification_report
from sklearn.preprocessing import LabelBinarizer

matplotlib.use("Agg")



def GNT_generator(path, bs, start, end, mode='train', aug=None):
    idx = start - 1
    # print(start, "a epoch")
    while True:
        labels = []
        images = []
        # count = 0
        # print(idx, "start")
        for count in range(0, bs):
            try:
                # count = count + 1
                idx = idx + 1
                # print(count, idx)
                if idx == end:
                    # print("reach end")
                    idx = start
                    if mode == 'eval':
                        break
                for dir_name in _label:
                    root_path = os.path.join(path, dir_name)
                    filename = os.path.join(root_path, str(idx) + '.png')
                    try:
                        im = Image.open(filename).resize([64, 64])
                    except IOError:
                        # print("Error: no file name %s" % filename)
                        continue
                    image = np.asarray(im).reshape((64, 64, 3))
                    label = dir_name
                    images.append(image)
                    labels.append(label)
            except StopIteration:
                # print("ERROR at", count, idx)
                continue
        # print(" a batchsize")
        labels = lb.transform(np.array(labels))
        images = np.array(images)
        if aug is not None:
            (images, labels) = next(aug.flow(images,
                                             labels, batch_size=bs))

        yield (images, labels)


TRAIN_PATH =r'G:\best\matlab\a'
TEST_PATH = r'G:\best\matlab\test'
BS = 1
_label = [dir_name for dir_name in os.listdir(TRAIN_PATH)]
number_of_classes = len(_label)
num_of_epochs = 12
STEP_TRAIN = 60
STEP_VALIDATION = 60


def build_model():
    model = Sequential()

    model.add(Conv2D(64, (3, 3),
                     activation='relu', padding='same', strides=(1, 1),
                     input_shape=(64, 64, 1)))
    model.add(BatchNormalization(axis=-1))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

    model.add(Conv2D(128, (3, 3),
                     activation='relu', padding='same', strides=(1, 1)))
    model.add(BatchNormalization(axis=-1))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

    model.add(Conv2D(256, (3, 3),
                     activation='relu', padding='same', strides=(1, 1)))
    model.add(BatchNormalization(axis=-1))
    model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

    model.add(Flatten())

    model.add(Dropout(0.5))
    model.add(Dense(1024, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(0.5))
    model.add(Dense(number_of_classes, activation='softmax'))

    # model.add(Conv2D(128, (3, 3), input_shape=(64, 64, 3)))
    # model.add(BatchNormalization(axis=-1))
    # model.add(Activation('relu'))
    # model.add(Conv2D(64, (3, 3)))
    # model.add(BatchNormalization(axis=-1))
    # model.add(Activation('relu'))
    # model.add(MaxPooling2D(pool_size=(2, 2)))
    #
    # model.add(Conv2D(64, (3, 3)))
    # model.add(BatchNormalization(axis=-1))
    # model.add(Activation('relu'))
    # model.add(Conv2D(64, (3, 3)))
    # model.add(BatchNormalization(axis=-1))
    # model.add(Activation('relu'))
    # model.add(MaxPooling2D(pool_size=(2, 2)))
    #
    # model.add(Flatten())
    #
    # # Fully connected layer
    # model.add(Dense(1024))
    # model.add(BatchNormalization())
    # model.add(Activation('relu'))
    # model.add(Dropout(0.4))
    # model.add(Dense(number_of_classes))
    #
    # model.add(Activation('softmax'))
    return model


save_path = r'G:\best\trained_best_weights_1.h5'


def training(train, test):
    model = build_model()
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    checkpoint = ModelCheckpoint(save_path,
                                 monitor='val_loss', verbose=1, save_best_only=True, period=1)

    tensor_board = TensorBoard(log_dir=r'G:\best\CNN', write_graph=True, batch_size=BS)
    model.summary()
    if os.path.exists(save_path):
        model = load_model(save_path)
        # 若成功加载前面保存的参数,输出下列信息
        print("checkpoint_loaded")

    H = model.fit(
        train,
        steps_per_epoch=STEP_TRAIN,
        validation_data=test,
        validation_steps=STEP_VALIDATION,
        verbose=2,
        epochs=num_of_epochs,
        callbacks=[checkpoint, tensor_board]
    )  # the more epoch the better
    model.save('model.h5')
    # test = GNT_generator(TEST_PATH, BS, 193, 241, mode='eval', aug=None)

    N = num_of_epochs
    plt.style.use("ggplot")
    plt.figure()
    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")
    plt.plot(np.arange(0, N), H.history["accuracy"], label="train_acc")
    plt.plot(np.arange(0, N), H.history["val_accuracy"], label="val_acc")
    plt.title("Training Loss and Accuracy on Dataset")
    plt.xlabel("Epoch #")
    plt.ylabel("Loss/Accuracy")
    plt.legend(loc="lower left")
    plt.savefig("plot.png")


def testing(test):
    # load model
    model = build_model()
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.load_weights(save_path)
    predIdxs = model.predict_generator(test,
                                       steps=(STEP_VALIDATION) + 1)
    predIdxs = np.argmax(predIdxs, axis=1)
    print("[INFO] evaluating network...")
    print(classification_report(test.classes, predIdxs,
                                target_names=lb.classes_))
    print(model.metrics)


if __name__ == "__main__":
    lb = LabelBinarizer()
    lb.fit(_label)
    mlabels = lb.transform(_label)
    train_datagen = ImageDataGenerator(rescale=1. / 255,
                                       rotation_range=0,
                                       width_shift_range=0.1,
                                       height_shift_range=0.1)
    trainGen = train_datagen.flow_from_directory(TRAIN_PATH,
                                                 target_size=(64, 64),
                                                 batch_size=BS,
                                                 classes=_label,
                                                 class_mode="categorical",
                                                 color_mode="grayscale")

    STEP_TRAIN = trainGen.n // trainGen.batch_size
    test_datagen = ImageDataGenerator(rescale=1. / 255)
    testGen = test_datagen.flow_from_directory(TEST_PATH,
                                               target_size=(64, 64),
                                               batch_size=BS,
                                               classes=_label,
                                               class_mode="categorical",
                                               color_mode="grayscale")
    STEP_VALIDATION = testGen.n // testGen.batch_size
    training(trainGen, testGen)
    testing(testGen)

报错详情:无法读取到图像

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 17:10
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了