Я работаю над моделью классификации кошка против собаки, код загрузки данных ниже. Что я сделал, так это прочитал изображения с помощью OpenCV, затем получил края, используя функцию обнаружения краев, и изменил размеры изображений до 200 200, поэтому в конце я получил черно-белое изображение с белыми цветами в соответствии с обнаруженным контуром.
import os
import sys
import cv2
import random
from tqdm import tqdm
import matplotlib.pyplot as plt
train_images = os.listdir('data/train')
test_images = os.listdir('data/test')
test_images_data = []
for image in tqdm(test_images):
image_data = cv2.imread('data/test/' + image)
#Convert to GrayScale
#gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#convert color from BGR to RGB
image_data = cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB)
image_data = cv2.resize(image_data, (200, 200))
#turn to only borders
edges = cv2.Canny(image_data, 150, 150)
test_images_data.append(edges)
train_images_data = []
train_images_labels = []
random.shuffle(train_images)
for image in tqdm(train_images):
image_data = cv2.imread('data/train/' + image)
#Convert to GrayScale
#gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#convert color from BGR to RGB
image_data = cv2.cvtColor(image_data, cv2.COLOR_BGR2RGB)
image_data = cv2.resize(image_data, (200, 200))
#turn to only borders
edges = cv2.Canny(image_data, 150, 150)
train_images_data.append(edges)
if image.startswith('cat'):
train_images_labels.append(0)
else:
train_images_labels.append(1)
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
model = Sequential()
model.add(Conv2D(32, (2, 2), input_shape=train_images_data[0].shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(train_images_data, train_images_labels, epochs=150, validation_split=0.2, batch_size=10)
проблема в том, что когда я запускаю его так, я получаю эту ошибку
ValueError: Input 0 is incompatible with layer conv2d_16: expected ndim=4, found ndim=3
Я пробовал другие значения input_shape, такие как
(200, 200, 1)
(200, 200, -1)
(1, 200, 200)
(-1, 200, 200)
Никто не работает.