Ошибка при проверке ввода: ожидалось, что conv2d_1_input будет иметь форму (64, 64, 3), но получил массив с формой (64, 64, 4) - PullRequest
0 голосов
/ 29 января 2019

Моя модель для классификации изображений показана ниже. При использовании функции прогнозирования выдается следующая ошибка:

ValueError: Ошибка при проверке ввода: ожидается, что conv2d_1_input будет иметь форму (64, 64, 3), нополучил массив с формой (64, 64, 4)

Модель, как показано ниже:

# Importing the Keras libraries and packages
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
# Initialising the CNN
classifier = Sequential()
# Step 1 - Convolution
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Adding a second convolutional layer
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Step 3 - Flattening
classifier.add(Flatten())
# Step 4 - Full connection
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))
# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', 
metrics = ['accuracy'])

# Part 2 - Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator
import pickle
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('Dataset/training_data',
target_size = (64, 64),batch_size = 32,class_mode = 'binary')
test_set = test_datagen.flow_from_directory('Dataset/test_data',
target_size = (64, 64),batch_size = 32,class_mode = 'binary')
classifier.fit_generator(training_set,
steps_per_epoch = 350,epochs = 2,validation_data = test_set,validation_steps 
= 101)

Функция прогнозирования показана ниже: Я использовал пакет запросов, так как хочу использоватьURL изображения для прогноза.

import requests
from io import BytesIO
from PIL import Image
import numpy as np
from keras.preprocessing import image
import cv2

 url='http://answers.opencv.org/upfiles/logo_2.png'
 response = requests.get(url)
 img = Image.open(BytesIO(response.content))
 #file = cv2.imread(img)
 img = img.resize((64,64))
 x = image.img_to_array(img)
 x = np.expand_dims(x, axis=0)
 result = classifier.predict(x)
 #training_set.class_indices
 if result[0][0] == 1:
      prediction = 'signature'
 else:
      prediction = 'nonsignature'



 print(prediction)

Есть ли альтернативный способ, используя только один пакет вместо PIL и керас

Спасибо за помощь !!

1 Ответ

0 голосов
/ 29 января 2019

Сообщение об ошибке говорит само за себя.Ваша сеть ожидает изображения с 3 цветными каналами (RGB), но вы предоставляете ей изображения с 4 каналами.Вы работаете с изображением в формате png, поэтому изображение, вероятно, имеет формат RGBA, а четвертый канал является прозрачным.

Изображения PIL можно преобразовать в формат RGB следующим образом:

img = img.convert(mode='RGB')
x = image.img_to_array(img)

x.shape
> (64, 64, 3)

Однако это преобразование может не дать желаемого результата (например, фон будет черным).Вы можете обратиться к этому вопросу для других способов преобразования в RGB.

Вы также можете использовать функцию load_img из модуля предварительной обработки Keras:

import keras
img = keras.preprocessing.image.load_img(io.BytesIO(response.content))

Это загрузит изображение в формате RGB.Эта функция использует PIL под капотом и дает тот же результат, что и выше.

...