WinAx
@WinAx

OpenCV многопоточный поиск в видео?

Приветствую!
Написал программу на Qt с использованием OpenCV под Ubuntu которая ищет положение в видео файле по фото с экрана, к примеру.
Задается путь к видео, путь к изображению после обработки выдается время в секундах.
Решил оптимизировать добавив разбиение поиска на доступные ядра процессора.
Каждый поток выбирает ядро, инициализирует свой VideoCapture, начинает поиск с определенной позиции и на определенное количество кадров.
Все работает правильно, в моем случае все 12 ядер загружаются на сто процентов в отличии от первой версии которая загружала одно ядро.
НО!... Поиск идет примерно в 10 раз медленнее...
С чем это может быть связано?
  • Вопрос задан
  • 521 просмотр
Пригласить эксперта
Ответы на вопрос 5
hePPer
@hePPer
плохой алгоритм или слишком много потоков.
Ответ написан
@klepiku
каждое ядро выполняет одну и ту же задачу

попробуйте (если возможно) разделить видео на квадраты по ядрам
Ответ написан
@PyNen
Все ответы на сайте нвидиа. Gpu даёт увеличение производительности в 15 раз по сравнению с cpu. Есть ещё какая-то программа, благодаря ей можно и в 17 раз производительнее. Caffe посмотри, сверточную нейронную сеть. Она обрабатывает видео дважды - разреза видео на Горизонтальные полосы на количество ядер, потом на вертикальные. Ссылки не могу дать. Opencv - 1 слой распознавания. Сверточная нейронная сеть - от восьми.
Ответ написан
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Попробуйте на этапе сборки opencv отключить поддержку OpenCL и CUDA.
Ответ написан
begemot_sun
@begemot_sun
Программист в душе.
Файл лежит на диске, в случае одно поточной программы вы последовательно, байт за байтом, читаете файл.
В случае многопоточной, диск вынужден головкой крутить туда и сюда, т.е. время доступа к данным увеличивается.
Т.о. диск может быть узким местом для вашей системы. То что показывает загрузку 100% для процессоров - это ни о чем не говорит.

Второй вариант: внутри OpenCV возможно есть какой-то разделяемый ресурс, который не может быть использован одновременно всеми потоками. Т.о. возможно (я не специалист), достаточно скомпилировать OpenCV с поддержкой многопоточности.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы