1 / 129

Оптический поток с CUDA

Оптический поток с CUDA. Михаил Смирнов (ВМК МГУ). План. Что такое оптический поток Классический метод Horn-Schunck Современный подход к реализации модели Horn-Schunck. Оптический поток. Набор векторов смещения Плотный (для каждого пикселя)

yakov
Télécharger la présentation

Оптический поток с CUDA

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Оптический поток с CUDA Михаил Смирнов (ВМК МГУ)

  2. План • Что такое оптический поток • Классический метод Horn-Schunck • Современный подход к реализации модели Horn-Schunck

  3. Оптический поток • Набор векторов смещения • Плотный (для каждого пикселя) • Разреженный (для некоторого подмножества пикселей) • Описывает движение в кадре

  4. Как найти оптический поток? • Яркость объекта в кадре не меняется • Если никто не меняет освещения

  5. Как найти оптический поток? • Яркость объекта в кадре не меняется • Если никто не меняет освещения • Будем сопоставлять пиксели одинаковой яркости

  6. Не самый удачный вариант • Нужна дополнительная информация

  7. Aperture Problem

  8. Дополнительная информация • Посмотрим на движение в целом

  9. Дополнительная информация • Посмотрим на движение в целом • Соседние точки скорее всего двигаются одинаково

  10. Гладкость поля смещений

  11. Обозначения • Смещение по вертикали • Смещение по горизонтали

  12. Гладкость поля смещений

  13. Гладкость поля смещений

  14. Гладкость поля смещений • «Хорошее» поле • Небольшие абсолютные значения производных

  15. «Хорошее» поле смещений • Сохраняет яркость • Гладкое

  16. Обозначения • Прямоугольная область изображения • Яркость изображения с номером в точке

  17. Классическая модель Horn-Schunck • Сохранениеяркости • data term • Гладкость поля • smoothness term

  18. Точка минимума • Линеаризуем подинтегральное выражение в • Уравнения Эйлера-Лагранжа для линеаризованной модели Граничные условия: отражение

  19. Метод Якоби для дискретных уравнений Эйлера-Лагранжа где

  20. РеализацияОбщая схема • Копирование изображений в память GPU • Вычисление производных изображения • Решение СЛАУ • Копирование результат в основную память

  21. Производные изображения • Пятиточечный шаблон: • Усреднение по времени

  22. Производные изображенияРеализация • Чтение через текстуры • Нормализованные координаты • cudaAddressModeMirror

  23. Производные изображения float t0, t1; // x derivative t0 = tex2D(texSource, x - 2.0f * dx, y); t0 -= tex2D(texSource, x - 1.0f * dx, y) * 8.0f; t0 += tex2D(texSource, x + 1.0f * dx, y) * 8.0f; t0 -= tex2D(texSource, x + 2.0f * dx, y); t0 /= 12.0f; t1 = tex2D(texTarget, x - 2.0f * dx, y); t1 -= tex2D(texTarget, x - 1.0f * dx, y) * 8.0f; t1 += tex2D(texTarget, x + 1.0f * dx, y) * 8.0f; t1 -= tex2D(texTarget, x + 2.0f * dx, y); t1 /= 12.0f; Ix[pos] = (t0 + t1) * 0.5f; // t derivative Iz[pos] = tex2D(texTarget, x, y) - tex2D(texSource, x, y);

  24. Решение уравнений Эйлера-Лагранжа • Ядро выполняют одну итерацию • Обновляются и , и • Каждый поток обрабатывает вектор для одного пикселя • Исходные данные общие для всех потоков • Возможен выигрыш от использования кеша

  25. Одна итерация // handle borders if (ix != 0) left = pos - 1; else left = pos; … floatsumU = (u0[left] + u0[right] + u0[up] + u0[down]) * 0.25f; floatsumV = (v0[left] + v0[right] + v0[up] + v0[down]) * 0.25f; floatfrac = (Ix[pos] * sumU + Iy[pos] * sumV + Iz[pos]) / (Ix[pos] * Ix[pos] + Iy[pos] * Iy[pos] + alpha); u1[pos] = sumU - Ix[pos] * frac; v1[pos] = sumV - Iy[pos] * frac;

  26. Современный подход • Классический метод хорошо работает только для небольших смещений • Линеаризация

  27. Современный подход • Уменьшим изображения • «Большие» смещения станут «маленькими» • Решим задачу для уменьшенных изображений • Классический метод Horn-Schunck • Используем найденное решение как стартовую точку в исходной задаче

  28. Современный подход • Можно рассмотреть пирамиду изображений • Каждое следующее меньше предыдущего • Используем решение задачи для текущего уровня как начальное приближение для следующего • Стартуем с самых маленьких изображений

  29. Современный подход • Линеаризация работает для небольших смещений • Разобьем решение на текущем уровне на два слагаемыхрешение с предущего уровня

  30. Деформация • На текущем уровне вместо будем работать с • Задача сводится к нахождению небольших смещений • Классический Horn-Schunck

  31. Общая схема • Копирование изображений в память GPU • Построение пирамиды (коэффициент 0.5) • Начинаяснаименьшегоразрешения • Замена на его деформированную версию • Вычисление производных (для и ) • Нахождение • Масштабирование (переход к большему разрешению) • Копирование результатов в основную память

  32. Деформация constint ix = threadIdx.x + blockIdx.x * blockDim.x; constintiy = threadIdx.y + blockIdx.y * blockDim.y; constintpos = ix + iy * stride; if (ix >= width || iy >= height) return; float x = ((float)ix + u[pos] + 0.5f) / (float)width; float y = ((float)iy + v[pos] + 0.5f) / (float)height; out[pos] = tex2D(texToWarp, x, y);

  33. Современный подход • На каждом уровне изображение можно деформировать несколько раз • warping iterations

  34. Современный подход • Создание пирамиды • Для всех уровней пирамиды начиная с наименьшего • Деформация • Вычисление производных • Нахождение • Перейти к следующему уровню Выполнить несколько итераций(warping iterations)

  35. Warping iterations решение Размер изображения Warping iterations Продолжитьu, v Warping iterations Продолжитьu, v

  36. Решение СЛАУОптимизация доступа к памяти • Выравнивание адреса начала строк матрицы • Использование текстур • Использование общей памяти мультипроцессора (shared memory)

  37. Решение СЛАУОптимизация доступа к памяти • 640x480, 500 итераций • G92 (GeForce 8800GTX)

  38. Решение СЛАУОптимизация доступа к памяти • 640x480, 500 итераций • GF104 (GeForce GTX 460)

  39. Ресурсы нашего курса • Steps3d.Narod.Ru • Google Site CUDA.CS.MSU.SU • Google Group CUDA.CS.MSU.SU • Google Mail CS.MSU.SU • Google SVN • Tesla.Parallel.Ru • Twirpx.Com • Nvidia.Ru

More Related