Размер X.shape [1] не соответствует ожидаемому значению - PullRequest
0 голосов
/ 03 апреля 2020

В настоящее время я работаю над своим последним проектом в области робототехники, и я решил создать робота с открытым исходным кодом, способного воспроизводить человеческие эмоции. Робот полностью настроен и готов к приему заказов, но я все еще занят его кодированием. В настоящее время я основываю свой код на этом методе . Идея состоит в том, чтобы извлечь 68 лицевых ориентиров из видеопотока с низким FPS (используя RPi Camera V2), передать эти ориентиры в обученный классификатор SVM и вернуть ему цифру от 0 до 6 в зависимости от обнаруженного выражения (Angry, Disgust, Страх, Счастье, Грусть, Сюрприз и Нейтраль). Я тестирую возможности своей модели с некоторыми снимками, которые я сделал с помощью камеры RPi, и это то, что мне удалось собрать вместе с точки зрения кода:

# import the necessary packages
from imutils import face_utils
import dlib
import cv2
import numpy as np

import time
import argparse
import os
import sys
if sys.version_info >= (3, 0):
        import _pickle as cPickle
else:
        import cPickle
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

from data_loader import load_data 
from parameters import DATASET, TRAINING, HYPERPARAMS

def get_landmarks(image, rects):
    if len(rects) > 1:
        raise BaseException("TooManyFaces")
    if len(rects) == 0:
        raise BaseException("NoFaces")
    return np.matrix([[p.x, p.y] for p in predictor(image, rects[0]).parts()])

# initialize dlib's face detector (HOG-based) and then create
# the facial landmark predictor
print("Initializing variables...")
p = "shape_predictor_68_face_landmarks.dat"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(p)

# path to pretrained model
path = "saved_model.bin"

# load pretrained model
print("Loading model...")
model = cPickle.load(open(path, 'rb'))

# initialize final image height & width
height = 48
width = 48

# initialize landmarks variable as empty array
landmarks = []

# load the input image and convert it to grayscale
print("Loading image...")
gray = cv2.imread("foo.jpg")

# detect faces in the grayscale image
print("Detecting faces in loaded image...")
rects = detector(gray, 0)

# loop over the face detections
print("Looping over detections...")
for (i, rect) in enumerate(rects):
    # determine the facial landmarks for the face region, then
    # convert the facial landmark (x, y)-coordinates to a NumPy
    # array
    shape = predictor(gray, rect)
    shape = face_utils.shape_to_np(shape)

    # loop over the (x, y)-coordinates for the facial landmarks
    # and draw them on the image
    for (x, y) in shape:
        cv2.circle(gray, (x, y), 2, (0, 255, 0), -1)

# show the output image with the face detections + facial landmarks
print("Storing saved image...")
cv2.imwrite("output.jpg", gray)
print("Image stored as /'output.jpg/'")

# arrange landmarks in array
print("Collecting and arranging landmarks...")
# scipy.misc.imsave('temp.jpg', image)
# image2 = cv2.imread('temp.jpg')
face_rects = [dlib.rectangle(left=1, top=1, right=47, bottom=47)]
landmarks = get_landmarks(gray, face_rects)

# load data
print("Loading collected data into predictor...")
print("Extracted landmarks: ", landmarks)
landmarks = np.array(landmarks.flatten())

# predict expression
print("Making prediction")
predicted = model.predict(landmarks)

Однако после пока работает код, все вроде бы хорошо до этого момента:

Making prediction
Traceback (most recent call last):
  File "face.py", line 97, in <module>
    predicted = model.predict(landmarks)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py", line 576, in predict
    y = super(BaseSVC, self).predict(X)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py", line 325, in predict
    X = self._validate_for_predict(X)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py", line 478, in _validate_for_predict
    (n_features, self.shape_fit_[1]))
ValueError: X.shape[1] = 136 should be equal to 2728, the number of features at training time

Я искал похожие проблемы на этом сайте, но, учитывая такую ​​конкретную цель, я не совсем нашел то, что мне нужно. Я работал над дизайном и исследованиями в течение достаточно долгого времени, но поиск всех фрагментов, необходимых для работы кода, занял у меня больше всего времени, и я бы хотел как можно скорее применить эту концепцию sh возможно, так как дата презентации приближается быстро. Любые вклады приветствуются!

Кстати, вот обученная модель, которую я сейчас использую.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Решено! Оказывается, моя модель была обучена с использованием комбинации функций HOG и ориентиров Dlib, однако я только передавал ориентиры предиктору, что приводило к расхождению в размере.

0 голосов
/ 03 апреля 2020

Возможно, я глупый, но похоже, что вы определяете путь после , когда вы используете его для загрузки своей модели. Кроме того, путь выглядит как очень плохое имя для переменной, содержащей местоположение файла, возможно, что modelFileLocation реже будет определен.

...