Автор Тема: Мы победили :-)  (Прочитано 35418 раз)

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Мы победили :-)
« Ответ #45 : Апрель 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 ускорения не даёт.


Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #46 : Апрель 23, 2013, 09:46:43 am »
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

DddIzer

  • Гость
Re: Мы победили :-)
« Ответ #47 : Апрель 23, 2013, 10:33:18 am »
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
  то же верно... Алексей - плиз сделайте   ролик на черным (белом) фоне  обычным xor'ом- заценим качество фильтрации.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #48 : Апрель 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)). Это весьма странно.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #49 : Апрель 23, 2013, 11:19:57 am »
2) Почему то в твоем эксперименте получилась не линейная зависимость времени от N (числа проходов), а квадратичная (то есть вместо O(N) имеем O(N^2)). Это весьма странно.
Таймер не сбрасывается. Надо перед timer.Start(); указать timer.Reset();
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #50 : Апрель 23, 2013, 11:22:07 am »
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

И нет, с блюром/боке в общем то никаких непреодолимых проблем сейчас нет - все будет быстро и красиво :-)  А вот за 48 часов написать прототип, чтобы и размывал хорошо, и вообще работал как надо, было сложно. да.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Мы победили :-)
« Ответ #51 : Апрель 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

DddIzer

  • Гость
Re: Мы победили :-)
« Ответ #52 : Апрель 23, 2013, 11:26:30 am »

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

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации

Geniepro

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

Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #54 : Апрель 23, 2013, 11:30:50 am »
Я вот не пойму -- а нафига ваще этот блур? взять просто равномерный фон и на него наложить изображение человека. Ну или на фотку какую-нить. И не надо мучиться с блуром...
Затем, чтобы выглядело естественно. На краях всегда будут артефакты перехода, в случае блюра их можно естественным образом скрыть. Вообще, для данной задачи заменять "задний план" какой-то кратинкой - очень плохая идея. Предлагаю подумать например о волосах.

Короче, задача сводится к алгоритму выделения краёв силуэта человека/людей...
Нет, не сводится.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #55 : Апрель 23, 2013, 11:31:34 am »

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

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Мы победили :-)
« Ответ #56 : Апрель 23, 2013, 11:37:27 am »

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

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
... того что попало в "глубину" фокуса.. т.е человека (можно предмет.. например настольную лампу).. Я ведь правильно понял, что вы ловите не "контур" человека.. а все то что расположено ближе некоторого расстояния от детектора()?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #57 : Апрель 23, 2013, 11:51:02 am »

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

это делается не ради красоты.. просто  хотелось бы оценить качество фильтрации
Погоди, о какой именно фильтрации ты говоришь?
... того что попало в "глубину" фокуса.. т.е человека (можно предмет.. например настольную лампу).. Я ведь правильно понял, что вы ловите не "контур" человека.. а все то что расположено ближе некоторого расстояния от детектора()?
Да. на человека нам пока что плевать.
Собственно в плане отсечения там есть одна проблемка - там нет взаимнооднозначного отображения карты глубин и цветной картинки, также у них разные разрешения, также там есть всякие забавные смещения и искажения. Для прототипа на хакатоне получилось как-то магическими константами и другими костылями всё это заткнуть чтобы выглядело не слишком отвратно, но ясно что все это нужно переделывать по нормальному (а для этого нужно набрать экспериментальных данных, чтобы выяснить некоторые характеристики камеры). Вот закончу битву с виртуальными камерами, и начну возиться с этим вот.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Мы победили :-)
« Ответ #58 : Апрель 23, 2013, 11:54:37 am »
если это так,  то  предположим  что вы можете отфильтровать все то что ближе 1 метра от камеры... хотелось бы увидеть предмет (можно настольную лампу) , который находясь в фокусе  постепенно удаляется из него  и эта картинка должна накладываться на белый фон...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Мы победили :-)
« Ответ #59 : Апрель 23, 2013, 01:31:38 pm »
если это так,  то  предположим  что вы можете отфильтровать все то что ближе 1 метра от камеры... хотелось бы увидеть предмет (можно настольную лампу) , который находясь в фокусе  постепенно удаляется из него  и эта картинка должна накладываться на белый фон...
Прямо сейчас ничего не сниму и не выложу - не до того. Так что пока из доступных видео есть только видео снятое по просьбе Интела для их хабрастатьи (http://habrahabr.ru/company/intel/blog/176985/): http://www.youtube.com/watch?feature=player_embedded&v=gy2oWQgv348

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

Эффектов сглаживания переходов в той версии, что на видео, у нас  нет, так что там либо данный пиксель размывается, либо не размывается вовсе, ничего не маскируется, всё на виду и четко видна граница отсечения :-)
Y = λf.(λx.f (x x)) (λx.f (x x))