Форум программистов, компьютерный форум, киберфорум
Программирование графики
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 14
1

Нехватка памяти при передаче библиотеке OpenCV большого количества изображений

26.03.2016, 16:14. Показов 1061. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Я не совсем уверен что в правильном разделе создаю тему ибо не понимаю даже в какой стороне искать решение проблемы, но склоняюсь что всё таки это что-то скорее связанное с ОС.
В общем балуюсь я тут библиотечкой OpenCV, а в частности такой классной штукой как распознавание образов. Для этого необходимо подготовить каскады с помощью идущей в комплекте утилитки opencv_traincascade. Суть в том что ей передаёшь набор картинок и она учит классификатор (видимо нейронные сети). Ну так вот у меня это утилитка не хочет работать на домашнем компе и вылетает с ошибкой что не может выделить ~800 Мб в памяти. Но у меня 16 ГБ оперативы и загружена она 15-20%. Почему он там 800 Мб не находит? Это если ему передать 900 картинок. Пробовал передавать 100 - тогда работает ибо естественно и памяти надо меньше. Я бы так и смирился, но старенький ноут на работе с 2 Гб прекрасно справляется с 900 картинками. Я даже залез в исходники этой утилитки и там самый обыкновенный malloc. Возвращаемый им указатель проверяется на нулёвость и если ноль то выводится как раз моя ошибка. Такое ощущение что есть какое-то ограничение и его можно где-то отключить.
Т.к. не уверен в какой области проблема, то не знаю какие нужны данные поэтому если что-то нужно уточнить - отвечу. На всякий случай скрин с самыми основными данными приложил.
Миниатюры
Нехватка памяти при передаче библиотеке OpenCV большого количества изображений  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2016, 16:14
Ответы с готовыми решениями:

Нехватка памяти, попиксельное сравнение двух изображений
Добрый день ув. Программисты. Есть код сравнения двух изображений по пиксельно: procedure...

Очистка памяти при генерации большого количества чисел в ListBox
Пишу сейчас псевдогенератор случайных чисел по алгоритму линейного сопоставления.. При генерации...

Предпросмотр большого количества изображений
Хочу сделать некий сортировщик фотографий. Для этого мне нужен предпросмотр, такой же как в...

Хранение и использование большого количества изображений
Всем привет! Подскажите способ хранения большого количества изображений, чтобы можно было эти...

11
353 / 34 / 7
Регистрация: 02.07.2008
Сообщений: 311
27.03.2016, 01:58 2
Я почему то подумал что для 64 разрдной оси нужно использовать 64 версию программы. Ну это я так просто подумал если что.
0
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 14
27.03.2016, 03:15  [ТС] 3
Ну я в принципе тоже так думал и на рабочем компе кажись 32 (в понедельник уточню). Но всё равно нет ведь другого варианта утилитки OpenCV-шной. Не верится мне как-то что они решили 64-оси не поддерживать. Получается должна она работать у меня.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
28.03.2016, 12:39 4
Цитата Сообщение от Letis Посмотреть сообщение
Ну так вот у меня это утилитка не хочет работать на домашнем компе и вылетает с ошибкой что не может выделить ~800 Мб в памяти
Вот здесь поподробнее. Можно увидеть точный текст ошибки или скрин?
И ещё одно - когда утилите запущена - найдите её в Диспетчере задач и посмотрите, есть ли в конце "*32".
0
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 14
28.03.2016, 21:10  [ТС] 5
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Вот здесь поподробнее. Можно увидеть точный текст ошибки или скрин?
И ещё одно - когда утилите запущена - найдите её в Диспетчере задач и посмотрите, есть ли в конце "*32".
Ну да. Стоило сразу такой скрин кинуть...
Проверил на работе 32 и там тоже самое. Просто я почему-то думал что дело в количестве положительных образцов а дело в сумме образцов с объектом и без (что логично). Пока эксперименты говорят о том что навернуться может где-то на 1000 картинок в общем, хотя в гайдах пишут что для приемлемого распознавания например лиц ему передают ~ по 2000 обоих типов.
Как я и говорил, в тот самый alloc.cpp на 52-ую строку я проходил и находил там следующее:
C++
1
2
3
4
5
static void* OutOfMemoryError(size_t size)
{
    CV_Error_(CV_StsNoMem, ("Failed to allocate %lu bytes", (unsigned long)size));
    return 0;
}
Функция просто выводящая сообщение и в любом случае возвращающая 0. Вызывается она там же рядышком:
C++
1
2
3
4
5
6
7
8
9
void* fastMalloc( size_t size )
{
    uchar* udata = (uchar*)malloc(size + sizeof(void*) + CV_MALLOC_ALIGN);
    if(!udata)
        return OutOfMemoryError(size);
    uchar** adata = alignPtr((uchar**)udata + 1, CV_MALLOC_ALIGN);
    adata[-1] = udata;
    return adata;
}
Т.е. udata получается NULL... Немного смущает меня этот CV_MALLOC_ALIGN, но если бы он как-то сильно ломал malloc тогда и с 100 картинок не работало бы ведь?
Миниатюры
Нехватка памяти при передаче библиотеке OpenCV большого количества изображений  
0
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 14
28.03.2016, 21:13  [ТС] 6
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Вот здесь поподробнее. Можно увидеть точный текст ошибки или скрин?
И ещё одно - когда утилите запущена - найдите её в Диспетчере задач и посмотрите, есть ли в конце "*32".
И чуть не забыл. Да на домашней 64-ой в диспетчере дописано *32. Это плохо? И по наблюдениям он успевает пожрать памяти по более чем, как потом утверждает, не может выделить, когда загибается.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
28.03.2016, 22:11 7
Цитата Сообщение от Letis Посмотреть сообщение
Немного смущает меня этот CV_MALLOC_ALIGN
Он наверняка где-то описан рядом в коде, возможно просто как директива препроцессора, типа
C++
1
#define CV_MALLOC_ALIGN 1024
хотя может быть и по-иному.
Цитата Сообщение от Letis Посмотреть сообщение
Да на домашней 64-ой в диспетчере дописано *32. Это плохо?
Это означает, что приложение скомпилировано как 32-битное и ему выделяется 4 Гб виртуального адресного пространства, из которых только 2 Гб находятся в распоряжении приложения. Так как память выделяется и до этого, вполне возможно, что она заканчивается и эти ~800 Mb не помещаются.
Если у вас есть исходный код, можно попробовать перекомпилировать приложение для 64-битной архитектуры или поискать готовую 64-битную версию. Но на 32-битной системе оно работать не будет.
Можете сами проанализировать используемую память: VMMap и статью в руки и - вперёд!
1
vavun
28.03.2016, 22:30
  #8

Не по теме:

tezaurismosis, забирай себе.
Похоже windows тут не при делах

0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
28.03.2016, 23:16 9

Не по теме:

vavun, угу.


Letis, одной из причин большого потребления памяти может быть большой .vec-файл.
Можно попробовать запустить процесс с -w и -h поменьше.
Есть очень подробная статья: http://note.sonots.com/SciSoft... ining.html, автор использует размеры 20х20.
0
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 14
31.03.2016, 21:38  [ТС] 10
Благодарю за статейки. Познавательно. Есть вопрос по поводу "перекомпилировать приложение для 64-битной архитектуры". Как?
Я "дитя IDE" (и я этим не горжусь), я обычно нажимаю кнопочку "Build" и оппа! готово. Сборка этой OpenCV у меня заняла около 3х суток. :-) Я настраивал CMake на тот MinGW что идёт в комплекте с QtCreator и там каждый второй фаил или папка содержат в названии цифру 32. На оф-сайте про 64-версию тоже что-то ни чего не попалось. Я так понял MinGW в принципе не умеет под 64 собирать? А что за штука такая MinGW-w64 мне попалась? Вроде и MinGW а вроде и к обычному MinGW отношения не имеет... Если я сделаю всё то-же что и в прошлый раз с MinGW но с MinGW-w64 у меня получится 64-битная версия?
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
01.04.2016, 10:34 11
Цитата Сообщение от Letis Посмотреть сообщение
На оф-сайте про 64-версию тоже что-то ни чего не попалось.
Если разработчики не сделали версию для 64-битной архитектуры (в т.ч. сборочных утилит), то просто так пересобрать вряд ли получится, ибо проект огромный.
Цитата Сообщение от Letis Посмотреть сообщение
Я так понял MinGW в принципе не умеет под 64 собирать?
Обычный MinGW вроде только под 32 бита, для 64 битов создано ответвление - MinGW-w64. Это разные проекты, но содержат они одни и те же утилиты, только для разных архитектур.
0
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 14
03.04.2016, 16:19  [ТС] 12
Ну проблема решена. Помогла сборка под 64 с помощью MinGW-w64. Около 2000 картинок переваривает. Наблюдаю в диспетчере до 3,5 Гб отеденной памяти и 100% загрузку всех 8 ядер (и времени тратит столько же сколько 32 переваривала 200 картинок). 64 рулит вобщем. Правда теперь иногда выдаёт другие ошибки :-) , но это явно уже как-то связанно с самими картинками.

ЗЫ:
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Если разработчики не сделали версию для 64-битной архитектуры (в т.ч. сборочных утилит), то просто так пересобрать вряд ли получится, ибо проект огромный.
Имелся ввиду сайт MinGW :-)
0
03.04.2016, 16:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2016, 16:19
Помогаю со студенческими работами здесь

SQLite3 для хранения большого количества изображений( нужен совет )
Здравствуйте. Есть вопрос : насколько эффективно хранить большое количество(500 000 и более)...

Microsoft Office Word 2013 - тормозит из-за большого количества изображений
Здравствуйте. Есть проблема с тормозами в Word 2013 из-за большого количества изображений. ...

Нехватка памяти при выбросе исключения
Собственно, наткнулся на проблему //Если здесь для создания std::string не хватит памяти, то...

Нехватка памяти при компресии данных
Доброго времени суток :) Нужно написать алгоритм сжатия данных для архиватора ( zlib и т.д....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru