Как изменить размер массива с камеры, чтобы он соответствовал модели распознавания лиц? - PullRequest
0 голосов
/ 08 октября 2019

Хорошо, так долго, я сделал модель для распознавания лиц. Теперь, когда я хочу сделать прогноз из моей модели, я получаю следующую ошибку:

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

Я использую мою камеру и система распознавания лиц работает и рисует прямоугольник, просто мое предсказание распознавания лиц дает ошибку.

Я новичок в машинном обучении и действительно ловлю себя на том, куда нужно идти,не судите меня по поводу моих ошибок: /

Я пробовал некоторые решения, которые работали для некоторых людей, такие как изменение формы и т. д., но это не для меня.

РЕДАКТИРОВАТЬ: Хорошо, пока вам, ребята, удалосьпомогите мне избавиться от ошибки массива, но с изменением размера моего roi_color я получаю новую ошибку: OpenCV (4.1.1) C: \ projects \ opencv-python \ opencv \ modules \ imgproc \ src \ resize.cpp: 3363: ошибка:(-215: утверждение не выполнено)! Dsize.empty () в функции 'cv :: hal :: resize'

Спасибо за помощь, Ян

import numpy as np
import cv2
import random as rd
from pathlib import Path
import string
from keras.models import model_from_json


def Recog_face(x, y, roi_color, frame, recognizer_face):
    predictions = recognizer_face.predict(roi_color)
    color = (255, 255, 255) 
    stroke = 2   
    font = cv2.FONT_HERSHEY_SIMPLEX 
    return cv2.putText(frame, predictions, (x,y), font, 1, color, stroke, cv2.LINE_AA)

def Detect_face(x, y, frame):
    color = (255, 0, 0)
    stroke = 1 
    end_cord_x = x + w 
    end_cord_y = y + h 
    return cv2.rectangle(frame, (x, y), (end_cord_x, end_cord_y), color, stroke) 

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')




recognizer_face = model_from_json(open("face_rec.json", "r").read()) 


recognizer_face.load_weights('face_rec.h5')



cap = cv2.VideoCapture(0)


while True:

    ret, frame = cap.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, 
                                         minNeighbors=5)

    for (x, y, w, h) in faces: 

        roi_gray = gray[y:y+h, x:x+w] 
        roi_color = frame[y:y+h, x:x+w]

        Detect_face(x, y, frame)

        # Face recognizer
        Recog_face(x, y, roi_color, frame, recognizer_face)





    cv2.imshow('frame', frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break 

cap.release()
cv2.destroyAllWindows()
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense

classifier = Sequential()

# Convolution
classifier.add(Convolution2D(32, 3, 3, input_shape=(64, 64, 3), activation='relu')) 
# Maxpooling To reduce the number of nodes will get in flattening step
# Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2))) 
# adding second Convolution layer
classifier.add(Convolution2D(32, 3, 3, activation='relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2))) 
# Flatten
classifier.add(Flatten())
# Full connection
classifier.add(Dense(output_dim = 128, activation = 'relu')) # 128 hidden nodes in the hidden layer
classifier.add(Dense(output_dim = 5, activation = 'softmax')) # softmax function cause multiple outcome 
# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
print(classifier.summary()) 



from keras.preprocessing.image import ImageDataGenerator


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('images/Training_set',
                                                target_size=(64, 64), 
                                                batch_size=32,
                                                color_mode='rgb',
                                                class_mode='categorical') 

test_set = test_datagen.flow_from_directory('images/Test_set',
                                            target_size=(64, 64),
                                            batch_size=32,
                                            color_mode='rgb',
                                            class_mode='categorical') 
classifier.fit_generator(training_set,
                        steps_per_epoch=380,
                        epochs=2,
                        validation_data= test_set,
                        validation_steps=127)


fer_json = classifier.to_json()
with open("face_rec.json", "w") as json_file:
    json_file.write(fer_json)
classifier.save_weights("face_rec.h5")  
...