OpenCV 内存不足错误 Python - (-215) u != 0 in function cv::Mat::create
Out of Memory Error in OpenCV Python - (-215) u != 0 in function cv::Mat::create
我正在使用 OpenCV + Python
进行与人类情感检测相关的研究项目。我遵循使用 CK+ 数据集进行训练的教程。但是当我尝试 运行 代码来训练数据集时,它给出了 OutOfMemory
错误。我该如何解决这个问题。请帮我。我是 OpenCV
和 Python 的初学者。我把我的错误代码和源代码放在下面。
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!")
如果您使用的是 32 位系统,这是不可能的,因为没有足够的内存可以寻址。您的图像对于您的构建系统来说太大了。如果您有 32 位操作系统,请升级到 64 位,否则您可能正在使用 32 位构建环境,您应该切换到 64 位构建工具。
我正在使用 OpenCV + Python
进行与人类情感检测相关的研究项目。我遵循使用 CK+ 数据集进行训练的教程。但是当我尝试 运行 代码来训练数据集时,它给出了 OutOfMemory
错误。我该如何解决这个问题。请帮我。我是 OpenCV
和 Python 的初学者。我把我的错误代码和源代码放在下面。
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!")
如果您使用的是 32 位系统,这是不可能的,因为没有足够的内存可以寻址。您的图像对于您的构建系统来说太大了。如果您有 32 位操作系统,请升级到 64 位,否则您可能正在使用 32 位构建环境,您应该切换到 64 位构建工具。