Oberon space

General Category => Общий раздел => Тема начата: valexey_u от Апрель 14, 2013, 07:09:07 pm

Название: Мы победили :-)
Отправлено: valexey_u от Апрель 14, 2013, 07:09:07 pm
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
Название: Re: Мы победили :-)
Отправлено: Valery от Апрель 14, 2013, 08:03:30 pm
Поздравляю!
Название: Re: Мы победили :-)
Отправлено: ilovb от Апрель 14, 2013, 08:17:28 pm
Присоединяюсь к поздравлениям! Подробности давай уже  :)
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 14, 2013, 08:39:50 pm
Спасибо всем за поздравления, но подробности наверно завтра - я часов 36 не спал (а нормально не спал все 48) :-)

Пока можете прочитать на том самом сайте ( http://hackday.ru/events/hackday-25 ) что это вообще за мероприятие такие было.

PS. Именно на этом мероприятии, только с порядковым номером не 25, а 23 (http://hackday.ru/events/hackday-23), была допилена до полноценного прототипа The Nothing System (http://hackday.ru/events/hackday-23/projects проект номер 2), которую потом обсуждали на оберонкоре (http://forum.oberoncore.ru/viewtopic.php?f=26&t=4212)
Название: Re: Мы победили :-)
Отправлено: Geniepro от Апрель 14, 2013, 09:46:48 pm
ПОздравляю! Твой проект Virtualens выглядит на фоне остальных действиетльно единственным более-менее техническим и интересным...
Кстати, а что ещё за девушка там была? Она тоже в этом проекте Virtualens участвовала? Там же вроде только один участник был указан...
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 15, 2013, 01:52:14 pm
Пока не написался отчет, что-то можно прочесть тут в комментах: https://plus.google.com/114633421665967893098/posts/hdL8JMK96KA
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 15, 2013, 08:03:53 pm
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 15, 2013, 08:13:09 pm
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
Спасибо. А что за 25 победителей? Можно url?
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 15, 2013, 08:17:31 pm
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
Спасибо. А что за 25 победителей? Можно url?
а я и спрашиваю... ибо не понятно с одной стороны "мы победили",  а с другой стороны 24 номер... вот я и подумал, что все проекты из этого списка являются победителями  (как со стартом Лаптева-Грачева)  :)
а  что не так?
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 15, 2013, 09:24:22 pm
Поздравляю.. я правильно понял, что ваш проект среди 25 победителей?
Спасибо. А что за 25 победителей? Можно url?
а я и спрашиваю... ибо не понятно с одной стороны "мы победили",  а с другой стороны 24 номер... вот я и подумал, что все проекты из этого списка являются победителями  (как со стартом Лаптева-Грачева)  :)
а  что не так?

Не, это все проекты-участники хакотона :-)

Упорядочены в порядке подачи заявки - я проект зарегистрировал последним. Впрочем, там и состав команд не правильный.  Да и проекты там не все (некоторые проекты были заявлены уже после начала, а некоторые заявленные проекты не запустились, ибо народ не набрался). Более правдивая версия будет, видимо, в отчете организаторов мероприятия. Думаю через день-два они выложат это дело.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 16, 2013, 04:02:18 am
Отчет тут: http://valexey.blogspot.ru/2013/04/hackday25-virtualens.html
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 16, 2013, 11:22:55 am
Отчет тут: http://valexey.blogspot.ru/2013/04/hackday25-virtualens.html
если есть скиньте ролик (демонстрирующий исходную и результирующую картинки)..
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 16, 2013, 11:42:31 am
Отчет тут: http://valexey.blogspot.ru/2013/04/hackday25-virtualens.html
если есть скиньте ролик (демонстрирующий исходную и результирующую картинки)..
Сейчас готовится видео от интеловцев. Думаю там все будет, мы с ними сотрудничаем.

Ну и видео с демофеста будут выложены скоро-скоро, и там тоже что-то будет видно.
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 16, 2013, 12:06:27 pm

Сейчас готовится видео от интеловцев. Думаю там все будет, мы с ними сотрудничаем.

Ну и видео с демофеста будут выложены скоро-скоро, и там тоже что-то будет видно.
ну и отлично.. остается только запатентовать технологию и продавать ее (ну например как реалтаймовую замену фона в видео звонках) - думаю желающие купить будут  :)
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 17, 2013, 11:57:51 am
Какой кошмар. Мы еще и в телевизор попали. Журналюги как обычно все переврали.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 17, 2013, 12:35:36 pm
http://www.youtube.com/watch?v=MN6l0jnGi1s
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 17, 2013, 12:37:49 pm
А вот более вменяемый репортаж с хакотона: http://www.youtube.com/watch?v=OhZUkSxLfik
Чем менее "центральный" канал, тем более вменяемые репортажи.
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 17, 2013, 01:57:14 pm
http://www.youtube.com/watch?v=MN6l0jnGi1s
гыыы  угадал, однако  :D - ничего ужасного - море бабла в перспективе.. кстати.. картинку увидел...  ;)
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 17, 2013, 01:59:50 pm
А вот более вменяемый репортаж с хакотона: http://www.youtube.com/watch?v=OhZUkSxLfik
Чем менее "центральный" канал, тем более вменяемые репортажи.
но картинки по вашему проекту нет, однако  ;)
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 17, 2013, 02:42:36 pm
А вот более вменяемый репортаж с хакотона: http://www.youtube.com/watch?v=OhZUkSxLfik
Чем менее "центральный" канал, тем более вменяемые репортажи.
но картинки по вашему проекту нет, однако  ;)
А у нас интервью и не брали. Вообще нам не до того было - мы работали :-)

Это робототехники могли себе позволить иметь "менеджера" - их шесть человек было. Результатом работы получилась машинка на ардуине управляемая через WiFi.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 17, 2013, 04:17:21 pm
Да, вот освещение всего этого во вконтакте: http://vk.com/hackday25
Там выложили все фотки только что.

А вот в фейспалме: http://www.facebook.com/events/387088108064788/
Название: Re: Мы победили :-)
Отправлено: ilovb от Апрель 17, 2013, 05:25:42 pm
 :)
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 18, 2013, 01:12:06 pm
http://www.youtube.com/watch?v=MN6l0jnGi1s

Цитировать

Опубликовано 15.04.2013

Описание отсутствует.

    Категория    Животные
    Лицензия    Стандартная лицензия YouTube

Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 18, 2013, 01:33:29 pm
http://www.youtube.com/watch?v=MN6l0jnGi1s

Цитировать

Опубликовано 15.04.2013

Описание отсутствует.

    Категория    Животные
    Лицензия    Стандартная лицензия YouTube


Ну да, в мире животных же!
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 18, 2013, 03:38:49 pm
Кстати, в качестве одного из побочных эффектов победы получился инвайт на хабр. Так что теперь я могу нести ахинеюслово о Обероне в промышленных масштабах.
Название: Re: Мы победили :-)
Отправлено: Geniepro от Апрель 18, 2013, 04:13:35 pm
Кстати, в качестве одного из побочных эффектов победы получился инвайт на хабр. Так что теперь я могу нести ахинеюслово о Обероне в промышленных масштабах.
А не имеешь морального права -- инвайт же тебе не за оберон дали! )))
Название: Re: Мы победили :-)
Отправлено: ilovb от Апрель 18, 2013, 04:19:56 pm
Хорошая новость. Не думал запилить туда статью о мероприятии? :)
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 18, 2013, 04:32:51 pm
Кстати, в качестве одного из побочных эффектов победы получился инвайт на хабр. Так что теперь я могу нести ахинеюслово о Обероне в промышленных масштабах.
А не имеешь морального права -- инвайт же тебе не за оберон дали! )))
Я никогда не понимал что такое "моральное право", так что я это понятие просто игнорирую по жизни :-)
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 18, 2013, 04:34:13 pm
Хорошая новость. Не думал запилить туда статью о мероприятии? :)
Статью о мероприятии напишет и опубликует Интел в своем блоге на хабре (вероятно это будет завтра). По идее там должны быть и видюшки с демонстрацией нашего поделия - сегодня как раз отгрузил Интелу оные видео (скринкапчи).
Название: Re: Мы победили :-)
Отправлено: ilovb от Апрель 18, 2013, 05:08:59 pm
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 18, 2013, 05:37:25 pm
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 18, 2013, 06:03:01 pm
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
:) Не стоит прыгать на опытного "боксера".. к тому же вы в разных весовых категориях...
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 18, 2013, 06:13:30 pm
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
:) Не стоит прыгать на опытного "боксера".. к тому же вы в разных весовых категориях...
У нас скорее даже виды спорта разные :-)
Название: Re: Мы победили :-)
Отправлено: Geniepro от Апрель 18, 2013, 09:02:03 pm
Чуйствую valexey скоро станет весьма известным. Потом опубликует на хабре статью про оберон и станет внезапно самым известным оберонщегом в рашке. :D
Ну, до известности info21 мне прыгать и прыгать :-)
info21 мало кто знает, а вот до Сергея Губанова и правда долго тянуться придётся )))
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 19, 2013, 07:52:44 am
http://habrahabr.ru/company/intel/blog/176985/
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 22, 2013, 11:28:38 am
Опубликован отчет от организаторов. http://hackday.ru/events/hackday-25/report
Там в основном перечень и описание доплывших проектов, номинации и статистика.

Примечательно что среди победителей в разных номинациях нет ни одного веб-проекта. И это радует.
Название: Re: Мы победили :-)
Отправлено: Губанов Сергей Юрьевич от Апрель 22, 2013, 12:47:43 pm
А что за проблемы были с производительностью блюра? Оно же на  640 * 480 = 307'200 должно со скоростью света летать?..  ???

for (int n = 1; n < N; n++)
{

  for (int y = 1; y < 639; y++)
  {
    for (int x = 1; x < 479; x++)
    {
      b[y, x] = 0.25 * (a[y - 1, x] + a[y + 1, x] + a[y, x - 1] + a[y, x + 1]);
    }
  }

  for (int y = 1; y < 639; y++)
  {
    for (int x = 1; x < 479; x++)
    {
      a[y, x] = 0.25 * (b[y - 1, x] + b[y + 1, x] + b[y, x - 1] + b[y, x + 1]);
    }
  }

}
Название: Re: Мы победили :-)
Отправлено: Губанов Сергей Юрьевич от Апрель 22, 2013, 12:52:48 pm
Ну, то есть наоброт, y < 479, а x < 639.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 22, 2013, 01:05:21 pm
А что за проблемы были с производительностью блюра? Оно же на  640 * 480 = 307'200 должно со скоростью света летать?..  ???

for (int n = 1; n < N; n++)
{

  for (int y = 1; y < 639; y++)
  {
    for (int x = 1; x < 479; x++)
    {
      b[y, x] = 0.25 * (a[y - 1, x] + a[y + 1, x] + a[y, x - 1] + a[y, x + 1]);
    }
  }

  for (int y = 1; y < 639; y++)
  {
    for (int x = 1; x < 479; x++)
    {
      a[y, x] = 0.25 * (b[y - 1, x] + b[y + 1, x] + b[y, x - 1] + b[y, x + 1]);
    }
  }

}
У нас блюр был довольно сильный - диаметр 40. Причем он делался практически по определению эффекта боке, то есть за один проход. Не оптимизированный алгоритм кушал O(W*H*D^2), оптимизированный O(W*H*D). Я затрудняюсь прямо сейчас пересчитать какая будет сложность твоего алгоритма для достижения той же силы эффекта. То есть надо как-то пересчитать N в D.

Многопроходный блюр, как у тебя, надо будет попробовать. Может даст или лучший эффект, или лучшую производительность.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 22, 2013, 01:13:40 pm
Да, и нужно учесть еще один нюанс - это все должно было быстро работать на ультрабуке, то есть на системе с порезанными частотами и хреновым охлаждением (из за чего оно склонно еще понижать частоту процессора).
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 22, 2013, 01:15:29 pm
а что там считать то..  t=2*N*W*H*d - здесь d -время вычисления элемента массивов a,b
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 22, 2013, 01:17:18 pm
а что там считать то..  t=2*N*W*H*d - здесь d -время вычисления a(b) [j]
Я же уточнил - сложность в переводе N в D, где D - диаметр ядра свертки в нашем блюре, а N это число проходов в блюре Сергея. То есть чтобы эффект был если не эквивалентен, то по крайней мере максимально похож.
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 22, 2013, 01:29:31 pm
а что там считать то..  t=2*N*W*H*d - здесь d -время вычисления a(b) [j]
Я же уточнил - сложность в переводе N в D, где D - диаметр ядра свертки в нашем блюре, а N это число проходов в блюре Сергея. То есть чтобы эффект был если не эквивалентен, то по крайней мере максимально похож.
не надо переводить.. достаточно проверить картинку при N=sqrt(D/2)~5
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 22, 2013, 01:33:06 pm
а что там считать то..  t=2*N*W*H*d - здесь d -время вычисления a(b) [j]
Я же уточнил - сложность в переводе N в D, где D - диаметр ядра свертки в нашем блюре, а N это число проходов в блюре Сергея. То есть чтобы эффект был если не эквивалентен, то по крайней мере максимально похож.
не надо переводить.. достаточно проверить картинку при N=sqrt(D/2)~5
Дык да. Но для этого мне надо в код лезть, камеру расчехлять. Я не могу прямо сейчас проверить. Потому и написал :-)
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 22, 2013, 01:58:19 pm
не надо переводить.. достаточно проверить картинку при N=sqrt(D/2)~5
что- то день не верный... при N=D/2=20  должна наблюдаться сходная  с вашей производительность алгоритма Сергея
(если ваши d имеют одинаковую вычислительную сложность), нужно оценить только качество картинки.
Название: Re: Мы победили :-)
Отправлено: Губанов Сергей Юрьевич от Апрель 23, 2013, 07:30:51 am
За одно N делается два прохода, так что радиус 40 это примерно N=20.

Померил на i7 2600K. Да, действительно ТОРМОЗИТ!!!

namespace ConsoleApplication67
{
class Program
{
static void Main (string[] args)
{
const int H = 480;
const int W = 640;
double[,] a = new double[H, W];
double[,] b = new double[H, W];
System.Random r = new System.Random();
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
for (int N = 1; N < 21; N++)
{
for (int y = 0; y < H; y++)
{
for (int x = 0; x < W; x++)
{
a[y, x] = r.NextDouble();
}
}
timer.Start();
for (int n = 0; n < N; n++)
{
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
b[y, x] = 0.25 * (a[y - 1, x] + a[y + 1, x] + a[y, x - 1] + a[y, x + 1]);
}
}
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
a[y, x] = 0.25 * (b[y - 1, x] + b[y + 1, x] + b[y, x - 1] + b[y, x + 1]);
}
}
}
timer.Stop();
System.Console.WriteLine("N={0}, t={1} seconds", N, timer.Elapsed.TotalSeconds);
}
System.Console.ReadLine();
}
}
}

N=1, t=0.0025269 seconds
N=2, t=0.0070202 seconds
N=3, t=0.0136165 seconds
N=4, t=0.0224988 seconds
N=5, t=0.0334735 seconds
N=6, t=0.046629 seconds
N=7, t=0.0619759 seconds
N=8, t=0.0795237 seconds
N=9, t=0.0992912 seconds
N=10, t=0.1212711 seconds
N=11, t=0.1455351 seconds
N=12, t=0.1721706 seconds
N=13, t=0.2007201 seconds
N=14, t=0.2315255 seconds
N=15, t=0.2645839 seconds
N=16, t=0.2999006 seconds
N=17, t=0.3371634 seconds
N=18, t=0.3767296 seconds
N=19, t=0.4186069 seconds
N=20, t=0.462693 seconds

При N=20 на i7 2600K будет 2 FPS.

Замена double на int ускорения не даёт.

Название: Re: Мы победили :-)
Отправлено: Geniepro от Апрель 23, 2013, 09:46:43 am
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 10:33:18 am
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
  то же верно... Алексей - плиз сделайте   ролик на черным (белом) фоне  обычным xor'ом- заценим качество фильтрации.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 10:45:40 am
За одно N делается два прохода, так что радиус 40 это примерно N=20.

Померил на i7 2600K. Да, действительно ТОРМОЗИТ!!!

N=1, t=0.0025269 seconds
N=2, t=0.0070202 seconds
N=3, t=0.0136165 seconds
N=4, t=0.0224988 seconds
N=5, t=0.0334735 seconds
N=6, t=0.046629 seconds
N=7, t=0.0619759 seconds
N=8, t=0.0795237 seconds
N=9, t=0.0992912 seconds
N=10, t=0.1212711 seconds
N=11, t=0.1455351 seconds
N=12, t=0.1721706 seconds
N=13, t=0.2007201 seconds
N=14, t=0.2315255 seconds
N=15, t=0.2645839 seconds
N=16, t=0.2999006 seconds
N=17, t=0.3371634 seconds
N=18, t=0.3767296 seconds
N=19, t=0.4186069 seconds
N=20, t=0.462693 seconds

При N=20 на i7 2600K будет 2 FPS.

Замена double на int ускорения не даёт.
Пару замечаний:
1) Полученные fsp нужно разделить еще на 3, так как нам нужно все три канала обрабатывать (r,g,b).
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Название: Re: Мы победили :-)
Отправлено: Geniepro от Апрель 23, 2013, 11:19:57 am
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Таймер не сбрасывается. Надо перед timer.Start(); указать timer.Reset();
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 11:22:07 am
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

И нет, с блюром/боке в общем то никаких непреодолимых проблем сейчас нет - все будет быстро и красиво :-)  А вот за 48 часов написать прототип, чтобы и размывал хорошо, и вообще работал как надо, было сложно. да.
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 11:24:52 am

2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
потому, что у него есть внешний цикл по N ([1..20])  и внутренний по n[0..N-1] которые дают ~N*N*W*H/2=N^2*W*H/2
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 11:26:30 am

Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации
Название: Re: Мы победили :-)
Отправлено: Geniepro от Апрель 23, 2013, 11:28:59 am
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 11:30:50 am
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
Нет, не сводится.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 11:31:34 am

Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 11:37:27 am

Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
... того что попало в "глубину" фокуса.. т.е человека (можно предмет.. например настольную лампу).. Я ведь правильно понял, что вы ловите не "контур" человека.. а все то что расположено ближе некоторого расстояния от детектора()?
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 11:51:02 am

Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
... того что попало в "глубину" фокуса.. т.е человека (можно предмет.. например настольную лампу).. Я ведь правильно понял, что вы ловите не "контур" человека.. а все то что расположено ближе некоторого расстояния от детектора()?
Да. на человека нам пока что плевать.
Собственно в плане отсечения там есть одна проблемка - там нет взаимнооднозначного отображения карты глубин и цветной картинки, также у них разные разрешения, также там есть всякие забавные смещения и искажения. Для прототипа на хакатоне получилось как-то магическими константами и другими костылями всё это заткнуть чтобы выглядело не слишком отвратно, но ясно что все это нужно переделывать по нормальному (а для этого нужно набрать экспериментальных данных, чтобы выяснить некоторые характеристики камеры). Вот закончу битву с виртуальными камерами, и начну возиться с этим вот.
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 11:54:37 am
если это так,  то  предположим  что вы можете отфильтровать все то что ближе 1 метра от камеры... хотелось бы увидеть предмет (можно настольную лампу) , который находясь в фокусе  постепенно удаляется из него  и эта картинка должна накладываться на белый фон...
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 01:31:38 pm
если это так,  то  предположим  что вы можете отфильтровать все то что ближе 1 метра от камеры... хотелось бы увидеть предмет (можно настольную лампу) , который находясь в фокусе  постепенно удаляется из него  и эта картинка должна накладываться на белый фон...
Прямо сейчас ничего не сниму и не выложу - не до того. Так что пока из доступных видео есть только видео снятое по просьбе Интела для их хабрастатьи (http://habrahabr.ru/company/intel/blog/176985/): http://www.youtube.com/watch?feature=player_embedded&v=gy2oWQgv348

Также было снято еще одно, более длинное где я играюсь с этим самым виртуальным "фокусом". Попробую выложить сегодня ночером.

Эффектов сглаживания переходов в той версии, что на видео, у нас  нет, так что там либо данный пиксель размывается, либо не размывается вовсе, ничего не маскируется, всё на виду и четко видна граница отсечения :-)
Название: Re: Мы победили :-)
Отправлено: Губанов Сергей Юрьевич от Апрель 23, 2013, 02:10:05 pm
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Таймер не сбрасывается. Надо перед timer.Start(); указать timer.Reset();

Точно, таймер не сбрасывается!

Итак, правильные результаты:

N=1, t=0.003471 seconds
N=2, t=0.0322118 seconds
N=3, t=0.009048 seconds
N=4, t=0.0119841 seconds
N=5, t=0.0149944 seconds
N=6, t=0.0179927 seconds
N=7, t=0.0210585 seconds
N=8, t=0.0256923 seconds
N=9, t=0.0274187 seconds
N=10, t=0.0306925 seconds
N=11, t=0.0347208 seconds
N=12, t=0.0362271 seconds
N=13, t=0.0395649 seconds
N=14, t=0.0422456 seconds
N=15, t=0.0448891 seconds
N=16, t=0.0485976 seconds
N=17, t=0.0517676 seconds
N=18, t=0.0574415 seconds
N=19, t=0.0571965 seconds
N=20, t=0.0606412 seconds

То есть при N=20 получаем 16.5 FPS (или 5.5 FPS если делать это для трёх каналов в однопоточной программе).

Требуемых 30 FPS всё равно не получилось.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 02:32:03 pm
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Таймер не сбрасывается. Надо перед timer.Start(); указать timer.Reset();

Точно, таймер не сбрасывается!

Итак, правильные результаты:

N=1, t=0.003471 seconds
N=2, t=0.0322118 seconds
N=3, t=0.009048 seconds
N=4, t=0.0119841 seconds
N=5, t=0.0149944 seconds
N=6, t=0.0179927 seconds
N=7, t=0.0210585 seconds
N=8, t=0.0256923 seconds
N=9, t=0.0274187 seconds
N=10, t=0.0306925 seconds
N=11, t=0.0347208 seconds
N=12, t=0.0362271 seconds
N=13, t=0.0395649 seconds
N=14, t=0.0422456 seconds
N=15, t=0.0448891 seconds
N=16, t=0.0485976 seconds
N=17, t=0.0517676 seconds
N=18, t=0.0574415 seconds
N=19, t=0.0571965 seconds
N=20, t=0.0606412 seconds

То есть при N=20 получаем 16.5 FPS (или 5.5 FPS если делать это для трёх каналов в однопоточной программе).

Требуемых 30 FPS всё равно не получилось.
Тут возможны еще несколько нюансов которые могут как-то влиять на производительность:
1) на самом деле при N=13 тоже размытие может быть вполне вменяемым. Так что пусть N=13.
2) У нас не двумерный, а одномерный массив на входе (в котором у нас r,g,b сразу).
3) Мы все же писали на C++, это может дать прирост производительности. Кроме того, нужно проверять не в Debug-сборке.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 02:35:23 pm
2) У нас не двумерный, а одномерный массив на входе (в котором у нас r,g,b сразу).
нужно проверять не в Debug-сборке.
Еще точнее - у нас просто указатель на область памяти. Соответственно при каждом обращении нет никаких проверок на выход за границы массива.
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 04:28:39 pm
Прямо сейчас ничего не сниму и не выложу - не до того.
и не надо.. важно понять , для чего это делается - для подбора адекватной модели очистки того, что попало в фокус.. по херне которой вы скормили журналюгам  и участникам конкурса (и на которую вы дали ссылки) это не сделаешь...  ;)
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 04:39:13 pm
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
Нет, не сводится.
но тем не менее такой подход имеет право на жизнь и существует.. в видеорегистраторах (напр. VideoNET) - он не требует специальных камер с захватом глубины... при этом подходе  обьект фиксируется по небольшому движению - (например , покачиванию головы) - а дальше идет его удержание и регистрация эволюции (изменений ) со временем..- недостаток подхода.. окружение должно  быть статичным....
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 04:42:10 pm
Прямо сейчас ничего не сниму и не выложу - не до того.
и не надо.. важно понять , для чего это делается - для подбора адекватной модели очистки того, что попало в фокус.. по херне которой вы скормили журналюгам  и участникам конкурса (и на которую вы дали ссылки) это не сделаешь...  ;)

Для подбора адекватной модели не достаточно того что ты попросил. Нужно одновременно иметь depth-картинку и color-картинку. Причем depth нельзя выкладывать в виде видео (или в виде какого-нибудь png), ибо в видео не видно процентов 70 информации что в depth содержится. Также это все нельзя жать любыми видеокодеками что жмут с потерями (h263, h264 и так далее).
Название: Re: Мы победили :-)
Отправлено: DddIzer от Апрель 23, 2013, 04:49:53 pm
Прямо сейчас ничего не сниму и не выложу - не до того.
и не надо.. важно понять , для чего это делается - для подбора адекватной модели очистки того, что попало в фокус.. по херне которой вы скормили журналюгам  и участникам конкурса (и на которую вы дали ссылки) это не сделаешь...  ;)

Для подбора адекватной модели не достаточно того что ты попросил. Нужно одновременно иметь depth-картинку и color-картинку
а я и не говорил, что этого достаточно  :D - просто по тому что вы дали вообще ничего не скажешь.. так поиграться только...
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 04:55:29 pm
а я и не говорил, что этого достаточно  :D - просто по тому что вы дали вообще ничего не скажешь.. так поиграться только...
Ну, дык, продухт же! Точнее прототип оного. Показывает конечный результат, по которому юзер и оцениват нужно оно ему или не нужно. Кстати, народ на хакатоне подходил, игрался живьем с нашей прогой.

Вообще, по хорошему, у PerC SDK есть свой формат записи "видео", где сохраняется действительно всё. Затем это файло можно через этот же PerC SDK считать и пробовать как-то обработать. Может быть полезно тем, у кого нет камеры, а повозиться хочется. Могу наснимать таких вот "видео" и выложить куда-то.

PS. PerC SDK API доступен для C++ и C#. Естественно только под винду. Винда нужна не старее Win7 SP1.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 23, 2013, 05:13:41 pm
Возможно кто-то даже научится со всем этим работать на Обероне, или там на КП в ББ, и заткнет нас, и других конкурсантов (уже большого конкурса Intel) за пояс, на деле доказав, что КП/ББ для подобных задач действительно дает преимущество в плане скорости и качества разработки, и правильные циклы таки рулят :-)

PS. Большой конкурс Интела это вот это: http://perceptualchallenge.intel.com ну и описалово на хабре: http://habrahabr.ru/company/intel/blog/166759/
Название: Re: Мы победили :-)
Отправлено: Губанов Сергей Юрьевич от Апрель 24, 2013, 09:31:29 am
Еще точнее - у нас просто указатель на область памяти. Соответственно при каждом обращении нет никаких проверок на выход за границы массива.

Перешёл в unsafe C# и убрал проверку индексов массивов. Ускорилось почти в 3 раза. В однопоточной RGB FPS = 30 при N = 10 (R = 20).

N = 1 (R = 2), dt=0.0017206 seconds, FPS = 581 (RGB FPS = 193)
N = 2 (R = 4), dt=0.0024114 seconds, FPS = 414 (RGB FPS = 138)
N = 3 (R = 6), dt=0.0032783 seconds, FPS = 305 (RGB FPS = 101)
N = 4 (R = 8 ), dt=0.0047132 seconds, FPS = 212 (RGB FPS = 70)
N = 5 (R = 10), dt=0.0055715 seconds, FPS = 179 (RGB FPS = 59)
N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
N = 8 (R = 16), dt=0.009428 seconds, FPS = 106 (RGB FPS = 35)
N = 9 (R = 18), dt=0.0100056 seconds, FPS = 99 (RGB FPS = 33)
N = 10 (R = 20), dt=0.0109701 seconds, FPS = 91 (RGB FPS = 30)
N = 11 (R = 22), dt=0.0120318 seconds, FPS = 83 (RGB FPS = 27)
N = 12 (R = 24), dt=0.0131353 seconds, FPS = 76 (RGB FPS = 25)
N = 13 (R = 26), dt=0.0149416 seconds, FPS = 66 (RGB FPS = 22)
N = 14 (R = 28), dt=0.0156479 seconds, FPS = 63 (RGB FPS = 21)
N = 15 (R = 30), dt=0.0164521 seconds, FPS = 60 (RGB FPS = 20)
N = 16 (R = 32), dt=0.0175388 seconds, FPS = 57 (RGB FPS = 19)
N = 17 (R = 34), dt=0.0185114 seconds, FPS = 54 (RGB FPS = 18)
N = 18 (R = 36), dt=0.0286554 seconds, FPS = 34 (RGB FPS = 11)
N = 19 (R = 38), dt=0.020801 seconds, FPS = 48 (RGB FPS = 16)
N = 20 (R = 40), dt=0.0218066 seconds, FPS = 45 (RGB FPS = 15)

namespace ConsoleApplication67
{
class Program
{
static unsafe void Main (string[] args)
{
const int H = 480;
const int W = 640;
double[] a = new double[H * W];
double[] b = new double[H * W];

System.Random r = new System.Random();
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
for (int N = 1; N < 21; N++)
{
fixed (double* pa = &a[0])
{
for (int y = 0; y < H; y++)
{
for (int x = 0; x < W; x++)
{
*(pa + H *y + x) = r.Next();
}
}
}
timer.Reset();
timer.Start();
fixed (double* pa = &a[0])
{
fixed (double* pb = &b[0])
{
for (int n = 0; n < N; n++)
{
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
*(pb + H * y + x) = 0.25 * (*(pa + H * (y - 1) + x)
+ *(pa + H * (y + 1) + x)
+ *(pa + H * y + x - 1)
+ *(pa + H * y + x + 1));
}
}
for (int y = 1; y < H-1; y++)
{
for (int x = 1; x < W-1; x++)
{
*(pa + H * y + x) = 0.25 * (*(pb + H * (y - 1) + x)
+ *(pb + H * (y + 1) + x)
+ *(pb + H * y + x - 1)
+ *(pb + H * y + x + 1));
}
}
}
}
}
timer.Stop();
double dt = timer.Elapsed.TotalSeconds;
System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3} (RGB FPS = {4})",
N, 2*N, dt, (int)(1.0/dt), (int)(1.0/(3*dt)));
}
System.Console.ReadLine();
}
}
}
Название: Re: Мы победили :-)
Отправлено: Губанов Сергей Юрьевич от Апрель 24, 2013, 09:44:20 am
Кстати если из цветового пространства RGB перейти в цветовое пространство навроде Lab, то сильно размыть достаточно будет только один канал L. Каналы a и b можно размыть немножко или не трогать вообще. Потом перейти обратно в RGB. Правда в настоящий Lab переводится дорого (там формулы нелинейные), а в "облегченный" (например тупо разностный: L = G, a = G - R, b = G - B) - конечный результат может не понравится по цветам, хотя для вебкамеры наверное сойдёт.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 10:35:36 am
Еще точнее - у нас просто указатель на область памяти. Соответственно при каждом обращении нет никаких проверок на выход за границы массива.

Перешёл в unsafe C# и убрал проверку индексов массивов. Ускорилось почти в 3 раза. В однопоточной RGB FPS = 30 при N = 10 (R = 20).

N = 1 (R = 2), dt=0.0017206 seconds, FPS = 581 (RGB FPS = 193)
N = 2 (R = 4), dt=0.0024114 seconds, FPS = 414 (RGB FPS = 138)
N = 3 (R = 6), dt=0.0032783 seconds, FPS = 305 (RGB FPS = 101)
N = 4 (R = 8 ), dt=0.0047132 seconds, FPS = 212 (RGB FPS = 70)
N = 5 (R = 10), dt=0.0055715 seconds, FPS = 179 (RGB FPS = 59)
N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
N = 8 (R = 16), dt=0.009428 seconds, FPS = 106 (RGB FPS = 35)
N = 9 (R = 18), dt=0.0100056 seconds, FPS = 99 (RGB FPS = 33)
N = 10 (R = 20), dt=0.0109701 seconds, FPS = 91 (RGB FPS = 30)
N = 11 (R = 22), dt=0.0120318 seconds, FPS = 83 (RGB FPS = 27)
N = 12 (R = 24), dt=0.0131353 seconds, FPS = 76 (RGB FPS = 25)
N = 13 (R = 26), dt=0.0149416 seconds, FPS = 66 (RGB FPS = 22)
N = 14 (R = 28), dt=0.0156479 seconds, FPS = 63 (RGB FPS = 21)
N = 15 (R = 30), dt=0.0164521 seconds, FPS = 60 (RGB FPS = 20)
N = 16 (R = 32), dt=0.0175388 seconds, FPS = 57 (RGB FPS = 19)
N = 17 (R = 34), dt=0.0185114 seconds, FPS = 54 (RGB FPS = 18)
N = 18 (R = 36), dt=0.0286554 seconds, FPS = 34 (RGB FPS = 11)
N = 19 (R = 38), dt=0.020801 seconds, FPS = 48 (RGB FPS = 16)
N = 20 (R = 40), dt=0.0218066 seconds, FPS = 45 (RGB FPS = 15)
Угу. Это уже похоже на ту производительность, которую мы в конце концов получили в ту субботу (ну может раза в два медленней у тебя пока, надо будет проверить).

Отключение проверок границ массивов (переход на указатели в случае C#) и переход на unsafe ускоряет приложение в разы. Похоже в debug-версии C++ в MSVS тоже проверяются и границы массивов и вообще оно все такое safe, ибо переход на релиз-версию нам тоже дало прибавку производительности в 3 раза примерно.

Еще нюанс - ты тут экономишь на конвертации из double в byte (то есть по просту не конвертируешь, изображения тут у тебя сразу в double). В некоторых случаях это довольно дорогостоящая конвертация.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 10:54:07 am
Кстати если из цветового пространства RGB перейти в цветовое пространство навроде Lab, то сильно размыть достаточно будет только один канал L. Каналы a и b можно размыть немножко или не трогать вообще. Потом перейти обратно в RGB. Правда в настоящий Lab переводится дорого (там формулы нелинейные), а в "облегченный" (например тупо разностный: L = G, a = G - R, b = G - B) - конечный результат может не понравится по цветам, хотя для вебкамеры наверное сойдёт.

Я тогда думал о работе в YUV, но решил что на допил уйдет слишком много времени, поэтому остались на RGB.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 12:39:26 pm
Я тут немного поисследовал. В общем, во-первых я переписал последний вариант Сергея на полноценный RGB и байтовыми буферами. Также N я фиксировал (N=13), но зато тест идет не по одному кадру, а по 1000 кадрам (соответственно замеряем время для 1000 кадров - так точнее, и так реалистичнее (от длительного нагрева проц. может снизить частоту)).

Во-вторых я реализовал алгоритм Сергея на С++, чтобы можно было сравнить производительность собственно языков.

В-третьих я из нашего прототипа вытащил алгоритм размытия в отдельный проект. И замерял производительность именно этого алгоритма (а не всего pipeline'а, как раньше).

Итак, вначале результаты. Напомню, что радиус размытия (N) = 13. Обрабатываются все три канала. Число обрабатываемых кадров = 1000.
C# (алгоритм Cергея):
   time: 107 seconds
   fps : 9.35
С++ (алгоритм Сергея):
   time: 96 seconds
   fps : 10.42
C++ (наш с Надей алгоритм):
   time: 22 seconds
   fps : 45.45 fps

Тестировалось всё ровно на том же ультрабуке, что и демонстрировалось на хакатоне.

Далее исходники:

С#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            const int H = 480;
            const int W = 640;
            byte[] a = new byte[H * W * 3];
            byte[] b = new byte[H * W * 3];

            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            const int N = 13;
            timer.Reset();
            timer.Start();
            const int frames = 1000;
            for (int nn = 0; nn<frames; nn++)
            {
                fixed (byte* pa = &a[0])
                {
                    fixed (byte* pb = &b[0])
                    {
                        for (int n = 0; n < N; n++)
                        {
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < W - 1; x++)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *(pb + (H * y + x) * 3 + color_shift) = (byte)(0.25 * (*(pa + (H * (y - 1) + x) * 3 + color_shift)
                                        + *(pa + (H * (y + 1) + x) * 3 + color_shift)
                                        + *(pa + (H * y + x - 1) * 3 + color_shift)
                                        + *(pa + (H * y + x + 1) * 3 + color_shift)));
                                    }
                                }
                            }
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < W - 1; x++)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *(pa + (H * y + x) * 3 + color_shift) = (byte)(0.25 * (*(pb + (H * (y - 1) + x) * 3 + color_shift)
                                            + *(pb + (H * (y + 1) + x) * 3 + color_shift)
                                            + *(pb + (H * y + x - 1) * 3 + color_shift)
                                            + *(pb + (H * y + x + 1) * 3 + color_shift)));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            timer.Stop();
            double dt = timer.Elapsed.TotalSeconds;
            System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3}",
                N, 2 * N, dt, (frames / dt));

            System.Console.ReadLine();
        }
    }
}

С++ (алгоритм Сергея):
#include <iostream>
#include <ctime>

const int width = 640;
const int height = 480;
const size_t blurRange = 13;

enum Color {
    RED = 0,
    GREEN,
    BLUE
};

int index(int x, int y, Color color) {
    return width*y*3+x*3+color;
}

int main()
{
    volatile unsigned char* volatile in  = new unsigned char[width*height*3];
    volatile unsigned char* volatile out = new unsigned char[width*height*3];

    time_t begin;
    time(&begin);

    const int frames = 1000;

    for (int nn=0; nn<frames; nn++) {
        for (int i=0; i<blurRange; i++) {

            for (int y=1; y<height-1; y++)
                for (int x=1; x<width-1; x++) {
                    out[index(x,y,RED)]= 0.25*(
                        (float)in[index(x,y-1,RED)]+
                               in[index(x,y+1,RED)]+
                               in[index(x-1,y,RED)]+
                               in[index(x+1,y,RED)]);
                    out[index(x,y,GREEN)]= 0.25*(
                        (float)in[index(x,y-1,GREEN)]+
                               in[index(x,y+1,GREEN)]+
                               in[index(x-1,y,GREEN)]+
                               in[index(x+1,y,GREEN)]);
                    out[index(x,y,BLUE)]= 0.25*(
                        (float)in[index(x,y-1,BLUE)]+
                               in[index(x,y+1,BLUE)]+
                               in[index(x-1,y,BLUE)]+
                               in[index(x+1,y,BLUE)]);
                }

            for (int y=1; y<height-1; y++)
                for (int x=1; x<width-1; x++) {
                    in[index(x,y,RED)]=0.25*(
                        (float)out[index(x,y-1,RED)]+
                               out[index(x,y+1,RED)]+
                               out[index(x-1,y,RED)]+
                               out[index(x+1,y,RED)]);
                    in[index(x,y,GREEN)]=0.25*(
                        (float)out[index(x,y-1,GREEN)]+
                               out[index(x,y+1,GREEN)]+
                               out[index(x-1,y,GREEN)]+
                               out[index(x+1,y,GREEN)]);
                    in[index(x,y,BLUE)]=0.25*(
                        (float)out[index(x,y-1,BLUE)]+
                               out[index(x,y+1,BLUE)]+
                               out[index(x-1,y,BLUE)]+
                               out[index(x+1,y,BLUE)]);
                }
        }
    }

    time_t end;
    time(&end);
    auto seconds = difftime(end, begin);
    std::cout << float(frames)/seconds << " " << seconds << std::endl;
}

С++ (наш алгоритм):
#include <iostream>
#include <ctime>

const int width = 640;
const int height = 480;
const size_t blurRange = 13;

enum Color {
    RED = 0,
    GREEN,
    BLUE
};

int index(int x, int y, Color color) {
    return width*y*3+x*3+color;
}

template <size_t N>
struct ring_buffer {
    float buf[N];
    size_t head;
    size_t size;
    ring_buffer():head(0), size(0) {memset(buf, 0, sizeof(buf));}
    void push_back(float v) {
        if (++head >= N) {head=0;}
        if (size<N) size++;
        buf[head]=v;
    }

    float back()   {return buf[head];}
    float front()  {return buf[head!=N-1?head+1:0];}
};

int main()
{
    volatile unsigned char* volatile in  = new unsigned char[width*height*3];
    volatile unsigned char* volatile out = new unsigned char[width*height*3];

    time_t begin;
    time(&begin);

    const int frames = 1000;

    for (int nn=0; nn<frames; nn++) {
        for (int y=blurRange; y<height-blurRange; y++) {
            float red = 0;
            float green = 0;
            float blue = 0;

            ring_buffer<blurRange*2> redRows ;
            ring_buffer<blurRange*2> blueRows;
            ring_buffer<blurRange*2> greenRows;                       

            for (int x=blurRange; x<width-blurRange; x++) {
                float vr = 0;
                float vg = 0;
                float vb = 0;
                for (int y1 = y-blurRange; y1<y+blurRange; y1++) {
                    vr += in[index(x,y1,RED)  ];
                    vg += in[index(x,y1,GREEN)];
                    vb += in[index(x,y1,BLUE) ];
                }
                vr = vr/(blurRange*blurRange*4.0);
                vg = vg/(blurRange*blurRange*4.0);
                vb = vb/(blurRange*blurRange*4.0);

                auto front_r = redRows.front();
                red   += vr - redRows.front();
                green += vg - greenRows.front();
                blue  += vb - blueRows.front();
                               
                redRows.push_back(vr);
                blueRows.push_back(vb);
                greenRows.push_back(vg);

                out[index(x,y,RED)  ] = red*(blurRange*2.0/redRows.size);
                out[index(x,y,GREEN)] = green*(blurRange*2.0/greenRows.size);
                out[index(x,y,BLUE) ] = blue*(blurRange*2.0/blueRows.size);
            }
        }
    }
    time_t end;
    time(&end);
    auto seconds = difftime(end, begin);
    std::cout << float(frames)/seconds << " " << seconds << std::endl;
    return 0;
}
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 01:11:38 pm
В OpenBSD есть утилита APM. В линуксе подобного нет? Можно жёстко выставить минимальные частоты проца. Это должно повысить качество результата тестов.
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 01:14:41 pm
for (int x = 1; x < W - 1; x++)
...
(*(pa + (H * (y - 1) + x) * 3
А вынос множителя за скобки прироста в производительности не даёт?

for (int x = 1; x < W * 3 - 3; x = x + 3)
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 01:22:14 pm
В OpenBSD есть утилита APM. В линуксе подобного нет? Можно жёстко выставить минимальные частоты проца. Это должно повысить качество результата тестов.
В данном проекте целевая платформа - Windows. Соответственно компилятор/среда разработки - MSVS 2012.

Кроме того, жестко фиксировать - это слишком жестоко для ультрабука. Например как эта APM себя поведет с интеловской технологией Turbo Boost?

Ну и учти, что у нас тут первичны не тесты, а то как оно будет работать у пользователя. А у пользователя оно будет работать долго, постоянно и без фиксации частоты.

Кстати, 45 fps это конечно хорошо, но для продукта (а не прототипа) нам нужно еще повысить производительность этого эффекта как минимум в 8-10 раз. Причем эффект должен еще стать визуально красивее. И да, распараллеливать на несколько ядер CPU нельзя. Все должно пахать в одном потоке.
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 01:25:12 pm
И вообще, можно же держать три указателя на три строки. Чтобы вычислять их однократно. И даже вычислять-то одну надо, остальные от неё на константу отличаются. Неужели то, что приведено в исходниках оптимизируется лучше, чем ручной вывод?
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 01:31:22 pm
И вообще, можно же держать три указателя на три строки. Чтобы вычислять их однократно. И даже вычислять-то одну надо, остальные от неё на константу отличаются. Неужели то, что приведено в исходниках оптимизируется лучше, чем ручной вывод?
Ты про какой из двух алгоритмов говоришь? Ну, и вообще, show me code :-) Проверим.
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 01:37:00 pm
В данном проекте целевая платформа - Windows.
На винде аналог точно есть.

Ну и учти, что у нас тут первичны не тесты, а то как оно будет работать у пользователя. А у пользователя оно будет работать долго, постоянно и без фиксации частоты.
То есть, вы будете приходить к каждому пользователю и проверять, что у них работает как надо? Как вы убедитесь, что оно работает быстро, если на частоту не обращаете внимание и не хотите знать производительности при минимальном задействовании процессора?

Если поставить минимальную частоту на проц, то, во-первых, будет известно, что при такой нагрузке он гарантированно не работает или наоборот - работает даже тогда. А во-вторых, будет известно, что полученные результаты верны, потому что частота проца не скакала.
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 01:38:00 pm
я про исходник на шарпе
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 01:40:35 pm
я про исходник на шарпе
Попробуй его модифицировать в соответствии со своим пониманием. Я прогоню тест.
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 02:19:38 pm
Ой, а там H. Я, наверно, неправильно понял алгоритм.

*(pa + (H * (y + 1) + x) * 3 + color_shift)

Здесь должен быть H?
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 02:24:09 pm
Ой, а там H. Я, наверно, неправильно понял алгоритм.

*(pa + (H * (y + 1) + x) * 3 + color_shift)

Здесь должен быть H?
Нет, видимо должен быть W. Косячок.
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 03:30:12 pm
Вот как-то так. Но я не пишу на шарпе, поэтому мог сильно ошибиться. Да и вообще - фортранщики ликуют. Но всё же - как насчёт производительности?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            const int H = 480;
            const int W = 640;
            byte[] a = new byte[H * W * 3];
            byte[] b = new byte[H * W * 3];
            byte* pa0, pa1, pa2f, pa2l, pa3, pb0, pb1, pb2f, pb2l, pb3;
            int w = W * 3;

            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            const int N = 13;
            timer.Reset();
            timer.Start();
            const int frames = 1000;
            for (int nn = 0; nn<frames; nn++)
            {
                fixed (byte* pa = &a[0])
                {
                    fixed (byte* pb = &b[0])
                    {
                        for (int n = 0; n < N; n++)
                        {
pb0 = pb + w + 3; // другой массив
pa1 = pa + 3; // первый массив. первая строка
pa2f = pa + w; // первый массив. вторая строка
pa2l = pa1 + w + 3; // первый массив. вторая строка
pa3 = pa2 + w; // первый массив. третья строка
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < w - 3; x = x + 3)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *pb0 = (byte)(0.25 * (*pa1
                                        + *pa3
                                        + *pa2f
                                        + *pa2l));
pb0 = pb0 + 1;
pa1 = pa1 + 1;
pa2f = pa2f + 1;
pa2l = pa2l + 1;
pa3 = pa3 + 1;
                                    }
                                }
pb1 = pb1 + 6;
pa1 = pa1 + 6;
pa2f = pa2f + 6;
pa2l = pa2l + 6;
pa3 = pa3 + 6;
                            }
pa0 = pa + w + 3;
pb1 = pb + 3;
pb2f = pb + w;
pb2l = pb1 + w + 3;
pb3 = pb2 + w;
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < w - 3; x++)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *pa0 = (byte)(0.25 * (*pb1
                                            + *pb3
                                            + *pb2f
                                            + *pb2l));
pa0 = pa0 + 1;
pb1 = pb1 + 1;
pb2f = pb2f + 1;
pb2l = pb2l + 1;
pb3 = pb3 + 1;
                                    }
                                }
pa0 = pa0 + 6;
pb1 = pb1 + 6;
pb2f = pb2f + 6;
pb2l = pb2l + 6;
pb3 = pb3 + 6;
                            }
                        }
                    }
                }
            }

            timer.Stop();
            double dt = timer.Elapsed.TotalSeconds;
            System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3}",
                N, 2 * N, dt, (frames / dt));

            System.Console.ReadLine();
        }
    }
}
Название: Re: Мы победили :-)
Отправлено: Губанов Сергей Юрьевич от Апрель 24, 2013, 06:59:29 pm
Также N я фиксировал (N=13)
А ты точно фиксировал N=13, а не R=13? В моём алгоритме за один присест делается два прогона, так что моё N=13 соответствует радиусу размытия R=26.

Для R=13 у меня для double-сов будет что-то среднее между:

N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)

Твой алгоритм я чего-то не понял, наработался за день голова сейчас уже не варит...

Здесь должен быть H?
Нет, видимо должен быть W. Косячок.
Ага, у меня косяк, надо умножать на W.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 07:09:40 pm
Также N я фиксировал (N=13)
А ты точно фиксировал N=13, а не R=13? В моём алгоритме за один присест делается два прогона, так что моё N=13 соответствует радиусу размытия R=26.

Для R=13 у меня для double-сов будет что-то среднее между:

N = 6 (R = 12), dt=0.006789 seconds, FPS = 147 (RGB FPS = 49)
N = 7 (R = 14), dt=0.0080567 seconds, FPS = 124 (RGB FPS = 41)
Да, вполне вероятно я ошибся. Впрочем, думаю завтра-или в пятницу я доберусь до уже визуализации, и будем сравнивать уже визуальные результаты :-) Там будет видно кто кому где эквивалентен.
Название: Re: Мы победили :-)
Отправлено: Valery Solovey от Апрель 24, 2013, 10:33:03 pm
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
Кстати, для полноты результата не забудьте потом сделать второй плагин, который на стороне клиента в реальном времени будет восстанавливать изображение. За специальную плату...
Название: Re: Мы победили :-)
Отправлено: valexey_u от Апрель 24, 2013, 10:47:08 pm
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects
Кстати, для полноты результата не забудьте потом сделать второй плагин, который на стороне клиента в реальном времени будет восстанавливать изображение. За специальную плату...
После того как оно пройдет через h264, уже ничего не восстановить. Но если без кодека - то да, возможно :-)
Название: Re: Мы победили :-)
Отправлено: valexey_u от Май 07, 2013, 09:32:53 am
Сегодня прилетело официальное оповещении о начале второй фазы большого Интеловского конкурса: https://perceptualchallenge.intel.com/

Цитировать
Intel wants to see your most innovative and unique games, productivity tools, user interfaces, or other innovative use of gesture, voice control, facial recognition, and augmented reality. The second phase of Intel’s Perceptual Computing Challenge is NOW OPEN FOR ENTRIES and with a grand-prize of $100,000 USD and thousands of dollars in even more prizing available in 4 different categories, this is not one to miss.

Цитировать
We invite you to submit your idea within the next six weeks. Idea submissions are due June 17th.  The creators with the most innovative and impressive concepts will receive an interactive gesture camera in order to turn their idea into reality and will have until August to develop and deliver their demos.

Intel is also looking for developers and applications using this technology to showcase at industry events and market together with our new computing platforms.

Правила и описание: https://perceptualchallenge.intel.com/static/docs/terms_and_conditions.pdf

Победителей первой фазы этого большого конкурсе Интел можно глянуть тут:
http://software.intel.com/sites/campaigns/perceptualshowcase/
Название: Re: Мы победили :-)
Отправлено: valexey_u от Июль 12, 2013, 09:26:06 am
Мы прошли в финал.

Наше приложение (точнее идея, но у нас то уже приложение есть) стало одним из 750ти финалистов конкурса. Теперь к 26 августа нужно допилить приложение, сделать инсталлятор, написать документацию, снять видео и всё это выслать на суд Интелу. Результаты будут в середине сентября.
Название: Re: Мы победили :-)
Отправлено: valexey_u от Сентябрь 27, 2013, 12:35:29 pm
Отправили приложение на рассмотрение судей. Теперь результаты будут когда-то в октябре.

Про то как мы писали Virtualens и про конкурс: http://habrahabr.ru/post/195474/
Название: Re: Мы победили :-)
Отправлено: Geniepro от Сентябрь 27, 2013, 12:38:45 pm
Круто! Малаццы ))
Название: Re: Мы победили :-)
Отправлено: valexey_u от Октябрь 10, 2013, 07:33:17 pm
Сравнение Virtualens с похожими технологиями сокрытия деталей фона: http://youtu.be/kBWvv802LHA
Название: Re: Мы победили :-)
Отправлено: valexey_u от Октябрь 10, 2013, 10:39:23 pm
Перевели, дополнили и опубликовали нашу статью на IDZ: http://software.intel.com/en-us/articles/virtualens-how-we-made-our-project-for-intel-perceptual-computing-challenge