OpenCV CascadeClassifier Python内存不足

时间:2018-05-21 11:29:28

标签: python opencv machine-learning out-of-memory cascade-classifier

这是我的代码:

def load_cascades():
    cascades = []
    for root, dirs, files in os.walk(rooted('data/logos')):
        for fname in files:
            if fname == 'cascade.xml':
                path = os.path.join(root, fname)
                cascade = cv2.CascadeClassifier(path)
                cascades.append(cascade)
    return cascades


cascades = load_cascades()


def get_heuristics(pair):
    url = pair[0]
    image = pair[1]
    matches_any_logos = False

    for cascade in cascades:
        frame = cv2.imread(image, 0)

        logos = cascade.detectMultiScale(
            image=frame,
            minNeighbors=5,
            minSize=(25, 25),
        )

        if len(logos) > 0:
            matches_any_logos = True

    return {
        'matches_any_logos': matches_any_logos,
        'matches_corresponding_urls': matches_corresponding_urls,
    }


class LogoDetectionVectorizer(DictVectorizer):

    def fit(self, x, y=None):
        x = [get_heuristics(v) for v in x]
        return super(LogoDetectionVectorizer, self).fit(x)

    def fit_transform(self, x, y=None):
        x = [get_heuristics(v) for v in x]
        return super(LogoDetectionVectorizer, self).fit_transform(x)

    def transform(self, x, y=None):
        x = [get_heuristics(v) for v in x]
        return super(LogoDetectionVectorizer, self).transform(x)

这是模型训练的机器学习算法中的一个模块,我有一套训练模型与我训练过的徽标相关,但是当我尝试在大型数据集上训练模型时,我得到了这个错误:

cv2.error: /io/opencv/modules/core/src/matrix.cpp:436: error: (-215) u != 0

并且opencv报告它内存不足。我不懂为什么?我只是创建所有级联一次,然后多次使用它们,我看到我需要在每次迭代后调用cascade.deallocate(),然后重新创建级联但是python声称cascade.desallocate()不存在以及每次都必须重建级联的明显性能。

有人可以帮忙吗?感谢

1 个答案:

答案 0 :(得分:0)

我发现了这个问题,就在cascade.detectMultiScale之后我需要调用

del frame

出于某种原因,OpenCV在读取图像并且变量超出范围时不会释放内存,我在GitHub上报告了这个内存泄漏