Перейти к содержимому
Compvision.ru

Recommended Posts

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 25.07.2017 at 21:20, iskees сказал:

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 часов назад, iskees сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Nuzhny сказал:

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

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×