Ошибка нехватки памяти в OpenCV Python - (-215) u!= 0 в функции cv::Mat::create
Я работаю над своим проектом, связанным с исследованием человеческих эмоций, используя OpenCV + Python
, Я следую учебному пособию с использованием наборов данных CK+ для обучения. Но когда я пытаюсь запустить код для обучения набора данных, он дает OutOfMemory
Ошибка. Как я могу решить эту проблему. Пожалуйста, помогите мне. Я новичок в OpenCV
и питон. Я поместил мой код ошибки и исходный код ниже.
OpenCV Error: Insufficient memory (Failed to allocate 495880000 bytes) in cv::OutOfMemoryError, file C:\projects\opencv-python\opencv\modules\core\src\alloc.cpp, line 55
OpenCV Error: Assertion failed (u != 0) in cv::Mat::create, file C:\projects\opencv-python\opencv\modules\core\src\matrix.cpp, line 436
Traceback (most recent call last):
File "D:/Documents/Private/Pycharm/EmotionDetection/training.py", line 71, in <module>
correct = run_recognizer()
File "D:/Documents/Private/Pycharm/EmotionDetection/training.py", line 49, in run_recognizer
fishface.train(training_data, np.asarray(training_labels))
cv2.error: C:\projects\opencv-python\opencv\modules\core\src\matrix.cpp:436: error: (-215) u != 0 in function cv::Mat::create
Это исходный код.
import cv2
import glob
import random
import numpy as np
emotions = ["neutral", "anger", "contempt", "disgust", "fear", "happy", "sadness", "surprise"] # Emotion list
fishface = cv2.face.EigenFaceRecognizer_create() # Initialize fisher face classifier
data = {}
def get_files(emotion): # Define function to get file list, randomly shuffle it and split 80/20
files = glob.glob("dataset\\%s\\*" % emotion)
random.shuffle(files)
training = files[:int(len(files) * 0.8)] # get first 80% of file list
prediction = files[-int(len(files) * 0.2):] # get last 20% of file list
return training, prediction
def make_sets():
training_data = []
training_labels = []
prediction_data = []
prediction_labels = []
for emotion in emotions:
training, prediction = get_files(emotion)
# Append data to training and prediction list, and generate labels 0-7
for item in training:
image = cv2.imread(item) # open image
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # convert to grayscale
training_data.append(gray) # append image array to training data list
training_labels.append(emotions.index(emotion))
for item in prediction: # repeat above process for prediction set
image = cv2.imread(item)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
prediction_data.append(gray)
prediction_labels.append(emotions.index(emotion))
return training_data, training_labels, prediction_data, prediction_labels
def run_recognizer():
training_data, training_labels, prediction_data, prediction_labels = make_sets()
print("training fisher face classifier")
print("size of training set is:", len(training_labels), "images")
fishface.train(training_data, np.asarray(training_labels))
print("predicting classification set")
cnt = 0
correct = 0
incorrect = 0
for image in prediction_data:
pred, conf = fishface.predict(image)
if pred == prediction_labels[cnt]:
correct += 1
cnt += 1
else:
cv2.imwrite("difficult\\%s_%s_%s.jpg" % (emotions[prediction_labels[cnt]], emotions[pred], cnt), image) # <-- this one is new
incorrect += 1
cnt += 1
return (100 * correct) / (correct + incorrect)
# Now run it
meta_score = []
for i in range(0, 10):
correct = run_recognizer()
print("got", correct, "percent correct!")
meta_score.append(correct)
print("\n\nend score:", np.mean(meta_score), "percent correct!")
0 ответов
Если вы используете 32-разрядную систему, это невозможно, поскольку недостаточно памяти, к которой вы можете обратиться. ваши изображения слишком велики для вашей системы сборки. Если у вас 32-битная операционная система, обновитесь до 64-битной, иначе вы, вероятно, используете 32-битные среды сборки, и вам следует перейти на 64-битные инструменты сборки.