Jump to content
Compvision.ru

Recommended Posts

Наткнулся на сегментацию нейросетью. Результат очень впечатлил. Но возник вопрос с быстродействием. Это обработка в реальном масштабе времени? И каким компьютером?

 

Share this post


Link to post
Share on other sites
В 25.07.2017 at 21:20, iskees сказал:

на тесле 500*500 пикселей 33мс

Спасибо за ответ.

Разбирал структуру CUDA.

У меня почему то все задачи по компьютерному зрению сводятся к последовательному прохождению каким-либо окном по изображению и составлению таблиц. Последовательное прохождение по изображению хорошо работает с памятью, т.к. непосредственно работаю с кешем. А вот создание таблиц - это кошмар для кеша, если таблица занимает несколько мегабайт памяти. Так как неизвестно в какую область таблицы я перейду на следующем шаге. 

Структура CUDA (может я ее не правильно понял) будет отлично работать только для последовательной обработки изображений. Пример, изменение яркости изображения, когда идет последовательная подкачка памяти. А как работать с таблицами в несколько мегабайт? Простейший пример, на мой взгляд неэффективности CUDA: сделать цветную гистограмму изображения(т.е. посчитать количество пикселей каждого цвета). Даже если ограничимся 6 разрядами каждого цвета RGB, итого 18 разрядов. Размер таблицы 1 МегаБайт.

Share this post


Link to post
Share on other sites

Если вы случайно обращаетесь к памяти то никакая архитектура не поможет.

Ваш пример немного не понятен, вы хотите общую гистограмму всего изображение или скользящих окон.

Для общей гистограммы, так там последовательное обращение будет внутри каждого потока, а результат в разделяемой памяти

А для скользящего окна, если окно достаточно крупное можно использовать интегральное изображение (по одному на регистр) и на порядок сократить обращение к глобальной памяти.

  • Thanks 1

Share this post


Link to post
Share on other sites
10 часов назад, iskees сказал:

Ваш пример немного не понятен, вы хотите общую гистограмму всего изображение или скользящих окон.

Пример приведен для всего изображения. Да изображение я могу разбить на части и обрабатывать разными процессорами. Но создаваемая таблица размером 1 Мб должна быть доступна для всех процессоров и каждый процессор должен записывать результат непредсказуемо или в начало или в конец или середину этой таблицы. И основное время будет уходить не на вычислительные процессы, а на обращение к памяти. Как можно реализовать по другому?

На CPU я могу прогрузить таблицу в кеш 2 или 3 уровня увеличив быстродействие. Как это реализовать на GPU быстрее, чем на CPU?

Share this post


Link to post
Share on other sites

На GPU будут совсем другие алгоритмы. Например, в первом kernel одна workgroup будет обрабатывать участок изображения 64х64 и сделает для него не полную гистограмму, а список того, что ей попалось. А уже второй kernel будет объединять эти результаты в глобальную гистограмму в global memory.

Ещё можно применить небольшую компрессию и считать отдельно не каждый цвет, а объединять соседние в одни бины. Например, брать кубик 3х3х3 как один бин в гистограмме. Небольшой проигрыш в точности, но очевидный выигрыш в скорости.

Да, программирование под видеокарты - это не такое уж простое занятие.

Share this post


Link to post
Share on other sites
4 часа назад, Nuzhny сказал:

Да, программирование под видеокарты - это не такое уж простое занятие.

Я с Вами полностью согласен, поэтому хочу понять какие классы задач можно решать GPU.

Если можно решить выше приведенный примитивный пример, то стоит GPU осваивать. На GPU хорошо решаются задачи выделения границ, получил частичку изображения и записал туда же откуда и взял. Это будет на порядки быстрее чем на CPU. 

4 часа назад, Nuzhny сказал:

можно применить небольшую компрессию

Компрессию и так уже сделали уменьшив разрядность с 24 до 18. Дальнейшие уменьшение разрядности приведет к заметным искажениям. А размер таблицы гистограммы не зависит от размера изображения.

4 часа назад, Nuzhny сказал:

в первом kernel одна workgroup будет обрабатывать участок изображения 64х64 и сделает для него не полную гистограмму, а список того, что ей попалось.

Хорошо получаем множества таблицу другого вида, состоящую не из одного значения(количество пикселей данного цвета ), а из двух(номер цвета и количество пикселей). А вот задача получить конечную таблицу будет получить сложнее, чем просто посчитать цвета в изображении. На мой взгляд CPU данную задачу решит быстрее. 

Share this post


Link to post
Share on other sites

Что хорошо реализуется, а что плохо, можно прикинуть изучив основные паттерны, например здесь: http://my-it-notes.com/2013/06/gpu-processing-intro-cuda-opencl/ на каждый из них, при желании, всегда можно найти примеры реализации.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×