Это больше похоже на то, что я хотел бы обсудить с сообществом, чем на то, что я ищу для абсолютного ответа.
Я пытаюсь реализовать алгоритм вычитания фона на основе GMM с нуля. Судя по всему, OpenCV уже хорошо реализовал его (MOG2). Я все еще пытаюсь реализовать это с нуля, так как я хотел бы протестировать некоторые параметры, к которым OpenCV не предоставляет доступ. Тем не менее, моя реализация была очень медленной при работе с изображениями 4К и заняла огромное количество памяти, в то время как OpenCV может достигать 5-10 изображений в секунду или даже быстрее и не занимает много памяти. Я НЕ удивлен, что OpenCV был намного быстрее моего, но все же любопытно, как это было достигнуто.
Итак, вот мои мысли:
Подход GMM заключается в построении смеси гауссианов для описания фона / переднего плана для каждого пикселя . Тем не менее, каждый пиксель будет иметь 3-5 связанных трехмерных гауссовых компонентов. Мы можем упростить вычисления, используя общую дисперсию для разных каналов вместо ковариации. Тогда у нас должно быть как минимум 3 средних, 1 дисперсия и 1 весовой параметр для каждого гауссова компонента. Если предположить, что каждый пиксель будет поддерживать 3 компонента. Это будет примерно 4000 *2000* 3 * (3 + 1 + 1) параметров при чтении изображения.
Вычисление для обновления GMM, хотя оно не очень сложное для одного пикселя, общее количество времени для вычисления целых 4000 * 2000 пикселей все равно должно быть очень дорогим.
Я не думаю, что OpenCV MOG2 был ускорен CUDA, когда я тестировал на своем Mac без графической карты. Скорость была все еще быстрой.
Итак, мой вопрос:
- Сжимает ли OpenCV изображение перед подачей его в модель и распаковывает результаты при возврате?
- Можно ли добиться обработки почти в реальном времени для изображений 4k (без сжатия изображений) с распараллеливанием на ЦП?
- Моя реализация использовала 4000 * 2000 двойных связанных списков для поддержки гауссовых компонентов для изображений 4k. Я ожидал, что это должно сэкономить мне немного памяти, но память все еще взорвалась, когда я проверил это на образе 4k.
Plus:
- Я тестировал OpenCVMOG2 на измененном изображении ((3840, 2160) до (384, 216)), и обнаружение кажется приемлемым.
Это может быть странный вопрос ... Но я был бы признателен за любые мнения по этому поводу.