无法分配ndarray

问题描述

我遇到内存问题,无法解释原因。我试图遍历一些图像,检测面部,并使用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),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

解决方法

我能够找到某种程度减轻这种情况的方法,但是还远远不够完美。仍然会发生相同的错误,但是现在它不是在20张图像之后发生,而是在2000年左右发生。我从keras中引入了以下内容

from keras import backend as K

循环的每次迭代之后,我运行以下代码。

K.clear_session()