无法分配 ndarray
Posted
技术标签:
【中文标题】无法分配 ndarray【英文标题】:Could not allocate ndarray 【发布时间】:2021-01-20 20:03:05 【问题描述】:我遇到了内存问题,我无法解释原因。我正在尝试迭代一些图像,检测人脸,并使用 python 包(DeepFace)来确定图像中所有人脸的一些属性并将其保存下来。我注意到我的 Ram 几乎立即使用率非常高(15/16 GB)并在它运行的整个过程中徘徊在那里,然后通常在浏览大约 20 张图像后崩溃。那是我收到错误“无法分配ndarray”的时候。下面是我的代码。
import os
import cv2
import pandas as pd
from deepface import DeepFace
import gc
path="Documents/test images 2"
saved_path = "Documents/faces2"
valid_images =[".png"]
face_cascade = cv2.CascadeClassifier('Documents/haarcascade_frontalface_default.xml')
# Create empty dataframe to save results to
all_image_objects = pd.DataFrame(columns = ['Image','Age','Gender','Race','Emotion'])
for f in os.listdir(path):
ext= os.path.splitext(f)[1]
if ext.lower() not in valid_images:
continue
img_name=os.path.basename(f)
img_name=os.path.splitext(img_name)[0]
img = cv2.imread(os.path.join(path,f))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for (x, y, w, h) in faces:
ROI = img[y-20:y+h+20,x-20:x+w+20]
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
try:
demography = DeepFace.analyze(ROI, actions = ['age', 'gender', 'race', 'emotion'])
# handling the case where no face is detetected
except ValueError:
continue
face_dict = 'Image':img_name,
'Age':demography["age"],
'Gender':demography["gender"],
'Emotion':demography["dominant_emotion"],
'Race':demography["dominant_race"]
index = [0]
face_df = pd.DataFrame(face_dict, index=index)
all_image_objects=all_image_objects.append(face_df,ignore_index=True)
cv2.imwrite(os.path.join(saved_path,f),img)
gc.collect()
我试图控制内存使用的其中一件事是根据我所做的一些读数添加 gc.collect() 函数,但这似乎没有效果。有什么方法可以帮助理解是什么占用了内存?每张图片大约 200-400 KB,我的理解是我一次只加载一个,所以我很困惑我是如何为此消耗这么多内存的。
编辑:我一直在尝试使用 guppy 进行更多故障排除,但每当我尝试分析内存使用情况时,内核就会崩溃。以下是我正在尝试的。
from guppy import hpy
h=hpy()
h.heap()
结果
Restarting kernel...
[SpyderKernelApp] WARNING | No such comm: ba39c2f6076211eb91367085c2f42d08
[SpyderKernelApp] WARNING | No such comm: 9b49877e076411eb8c3e7085c2f42d08
【问题讨论】:
【参考方案1】:我能够找到一些可以在一定程度上缓解这种情况的方法,但远非完美。仍然得到同样的错误,但现在不是在 20 张图像之后发生,而是在大约 2000 之后发生。从 keras 我带来了以下内容
from keras import backend as K
在循环的每次迭代之后,我都会运行以下命令。
K.clear_session()
【讨论】:
以上是关于无法分配 ndarray的主要内容,如果未能解决你的问题,请参考以下文章