首页 > 解决方案 > CNN - 检测手写表情:ValueError:无法将输入数组从形状 (26,26,3) 广播到形状 (26)

问题描述

在我的根文件夹中,images我有三个名为0, 1,的文件夹2。文件夹0中有no smilies. 文件夹1中有happy handwritten smilies,文件夹2中有sad handwritten smilies。图像是jpg尺寸为 的彩色图像26x26

这是我的代码

from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
import numpy as np
import os
import cv2
from sklearn.model_selection import train_test_split

def getImages(path, classes):
    folder = os.listdir(path)
    classes_counter = 0
    images = []
    images_classes = []

    for x in range (0,len(folder)):
        myPicList = os.listdir(path+"/"+ str(classes[classes_counter]))
        for pic in myPicList:
            img_path = path+"/" + str(classes[classes_counter]) + "/" + pic
            img = cv2.imread(img_path)
            img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            images.append(img)
            images_classes.append(classes_counter)
        classes_counter +=1

    images = np.array(images, dtype="float") / 255
    return images, images_classes

def createModel(classes, images_dimension):
    classes_amount = len(np.unique(classes))
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu', input_shape=images_dimension))
    model.add(Conv2D(32, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu'))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu'))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(512, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(classes_amount, activation='softmax'))

    return model


labels = [0,1,2]
images, images_classes = getImages('training-images', labels)
images_dimension=(26,26,3)

X_train, X_test, Y_train, Y_test = train_test_split(images, images_classes, test_size=0.2)  # if 1000 images split will 200 for testing
X_train, X_validation, Y_train, Y_validation = train_test_split(X_train, Y_train, test_size=0.2) # if 1000 images 20% of remaining 800 will be 160 for validation

model = createModel(labels, images_dimension)
batch_size = 20
epochs = 100
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_validation, Y_validation))
model.evaluate(X_test,Y_test,verbose=0)

在该行中images = np.array(images, dtype="float") / 255,我收到错误:

Traceback (most recent call last):
  File "train-nn.py", line 54, in <module>
    images, images_classes = getImages('training-images', labels)
  File "train-nn.py", line 24, in getImages
    images = np.array(images, dtype="float") / 255
ValueError: could not broadcast input array from shape (26,26) into shape (26)

我认为数据结构或数组结构有问题。我不知道我做错了什么。也许有人知道这个问题,可以给我一个提示!

在这里,您可以将整个项目下载为 zip 文件。 http://fileshare.mynotiz.de/cnn-handwritten-smilies.zip

标签: pythonopencvmachine-learningkerascomputer-vision

解决方案


我发现了问题。我的一张测试数据图像不是 26x26 格式,而是 26x23。


推荐阅读