OpenCV CascadeClassifier Python не хватает памяти - PullRequest
0 голосов
/ 21 мая 2018

Вот мой код:

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 голосов
/ 22 мая 2018

Я обнаружил проблему, сразу после cascade.detectMultiScale мне нужно вызвать

del frame

По какой-то причине OpenCV не освободит память, когда они считывают изображение и переменная выходит из области видимостиЯ сообщил об утечке памяти на GitHub

...