Comments 72
У оптических датчиков (даже у наручных браслетов) есть проблема с данными в движении. Особенно когда каденс более или менее в районе пульса.

Хотелось бы Фурье образ увидеть в качестве иллюстрации. И ещё вопрос: при каком освещении Вы снимали?

Да, была мысль применить к массиву FFT. Освещение обычное, просто вебкамера на мониторе.

Искусственное освещение может мерцать, идеально проверить ещё при солнечном освещении.

Поддержу.
Даже искусственное освещение может меняться по десятку причин: например, прошёл кто-то в двух метрах от кадра, бросил невнятную тень на стену – привет, картинка расценивается как изменившаяся (на примере видеонаблюдения видел массу таких срабатываний).

Очевидно, чтобы заметить пульсации 50Гц, надо получать картинку с камеры чаще, чем 50 раз в секунду. Из-за разницы частот возникают биения яркости, и они не обязаны быть равны 50 герцам.
Очевидно, чтобы заметить пульсации 50Гц, надо получать картинку с камеры чаще, чем 50 раз в секунду
На самом деле не совсем так. Скажем камера с 30 кадрами в секунду тоже даст возможнось заметить пульсации 50гц. Измерить 50гц не сможете, но именно заметить пульсацию — вполне.
И еще надо помнить, что частота кадров не однозначно определяет выдержку камеры. Вполне возможна ситуация 30 к/с камеры с выдержкой кадра 1/90.
На самом деле, все еще сложнее :)
ru.dsplib.org/content/discrete_aliasing/discrete_aliasing.html

Можно оцифровывать сигналы из зон Найквиста высших порядков (выше частоты дискретизации АЦП), но в случае света непонятно как быть с фильтрацией. В радиотехнике это работает, а вот в оптике хз.

менно FFT позволит отфильтровать все, кроме частот в заданном диапазоне возможных значений пульса. Пульс достаточно инертно меняется и, обычно, достатчно стабилен, наверно можно искать на фурье-спектре экстремум в заданной области допустимых пульсов, а чтобы помехи мешали еще меньше, применить сверху фильтр калмана или тупо медианный фильтр хотя бы.

UFO landed and left these words here

Чёрт, а я по описанию вначале подумал, что смарт просто держать в руках, не направляя на себя – и пульс ловит по синхронизированным с ним микродвижениям (есть подобная прога, работающая по акселерометру или гироскопу).

Чем дело кончилось у автора программы, не знаю, но стало интересно проверить, возможно ли это.

Автор упомянутого приложения переодически читает Хабр и просил передать, что у него все хорошо — приложение пока не удалили.


Интересно, что до написания приложения я начинал свои эксперементы с пульсом абсолютно также — с десктопного прототипа на OpenCV. У вас получился очень выразительный код.


Было бы очень интересно почитать продолжение статьи с выдергиванием пульса актера из фильма.

Да там собственно писать нечего.
Заменяем строчку:
cap = cv2.VideoCapture(0)
на
cap = cv2.VideoCapture("video.mp4")


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

Когда я экспериментировал с измерением пульса "по фильмам" у меня были проблемы как раз с тем, что нужно трекать движение лица. Погрешность в треккинге, даже у лучших алгоритмов сильно зашумляла картину.


Было интересно может у кого-нибудь получится выделить пульс лучше.

Для начала можно поэкспериментировать с собственным видео, чтобы понять, сохраняет ли вообще MP4 такие малые перепады яркости. Если нет, то дальнейшее бесмысленно :)

Так да, нужна привязка к «поверхности», есть программы для программной стабилизации видео с астрономических камер, например astrojolo.com/wp-content/uploads/2019/03/pipp_as_01.jpg Возможно сработает, не знаю.
Прикольно! Надо потестить. Хотя они, наверное, оптимизированы под стабилизацию неизменного изображения.

Зачем стабилизировать? Сегментировать и искать непрерывные участки, похожие на кожу. Заодно выделим области примерно одинаково освещенные, чтобы не возиться с тенями и бликами. Главное смотреть на области. где задеектировано лицо.
Усреднять, наверно, имеет смысл, но что если нормировать и считать БПФ от всех точек кожи, а фурье-спектры перемножать. Тогда резонансные участки выделятся, а шум помножится на ноль.



Спустя 5 минут. Хз что я тут написал. наверно бред полный.

Если бы кожа имела 100% одинаковый цвет на всей плоскости, то можно не стабилизировать :) В реале малейший сдвиг уводит кривую вверх-вниз, так что привязка нужна.

Запустите скрипт и поэкспериментируйте, сразу видно будет.

да запустил. Елозит туда-сюда график, без фурье не удобно. Еще можно поиграться стабилизируя линию на среднем по меньшему окну. Пусть весь график будет выбиваться, но в целом будет понятнее.

Очень здравый подход. Правда, если пытаться найти однотонные участки кожи — будут получатся небольшие плавающие пятна, особенно если тело в движении.


Но после небольшого файн-тюнинга, данная идея стабильно улучшает получаемый спектр. Вот строчка, которая работает в подобном пульсометре на проде (после небольшой чистки от ООП):


removeOtherColors(maskedBitmap, getAverageRgb(maskedBitmap), 0.5f)

Насчет перемножения спектров преобразований Фурье — идея интересная. Вы имеете ввиду неперекрывающиеся отрезки видео?


Есть два вида помех:


  1. Те, которые имеют определенную частоту (шаги человека, если говорить о фитнес-браслетах)
  2. Случайные шумы

Разберем оба случая.


  1. Те шумы, которые имеют стабильную частоту — останутся во всех спектрах и умножение просто уменьшит модуль.
  2. По идее, делая преобразование Фурье от всего видео-ряда, шумы, которые не имеют гармоники затухают сами, потому что вместо синфазного накопления

cуммы sin(Real_freq x) sin (Assumed_freq x) для всех x, когда real_freq = assumed_freq и сигнал находитсяв фазе с синусойдой assumed_freq.
Мы получаем нечто похожее
random()
sin (Assumed_freq * x), что стремиться к 0 при делении на количество точек в ряде.

Время редактирования истекло. В последнем примере имеются ввиду не только sin, но и cos, конечно.


Но даже учитывая то, что шумы гасятся сами самим ПФ, такой подход с умножением может быстрее убрать шумы, чем использование всего ряда. Особенно для гармонических шумов, представленных только на каком-то отрезке измерения. Нужно экспериментировать.


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

Да, я имел в виду, что, вроде бы (хотя я могу и ошибаться), изменение тона кожи из-за оксигенации по всей ее поверхности присходит более-менее синфазно. Если так, то спектры разных участков можно перемножать. Конечно спектр нужно брать не от всего ролика, а от некоторого временнОго окна, важно, чтобы длительность окна многократно превышала длину волны амого медленного из возможных человеческих пульсов.


О… и тут до меня доходит. почему фитнес браслеты заставляют довоьно долго ждать… они просто дожидаются пары десятков биений, чтобы поймать и усреднить нужную гармонику.
Хочется-то, показыать пульс уже по факту детектирования пары тройки ударов, но это чревато ошибками. Короче, нужно просто постоянно мерть пльс в браслетах. не так уж это энергетически накладно.

Но вернёмся к теме. Попробуйте анализировать пульсации не на ровном участке кожи, а, к примеру, на глазу. Почему-то у меня в таком случае происходит максимально четкая детекция ритма. Может быть это какая-то гармоника от лампы накаливания? Всё бы ничего. но примерно такуой же "пульс" детектится у стены, если вовсе выйти из кадра.

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


Тут хитростей особо нет, что-то на изображении пульсирует — осталось понять что. В вашем случае это может быть гармоника лампы накаливания (или баг в алгоритме, но вряд ли).


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

Вот, кстати. попался проектик на js. Если положить палец прямо на объектив камеры ноута, работает очень четко и однозначно. Главный плюс — это работа в браузере. Не надо ничего ставить и запускать.

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

Если наложить два графика, «на глаз» видно что пульс выше после зарядки:



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

Для проверки нужно снять ЭКГ и график наложить на видео. Сколько стоит сделать ЭКГ на камеру? Скажите. что вы блогер=)

То есть вы берёте цвет кожи, переводите в оттенки серого, и в таком сигнале видите пульсации? Как-то это слишком просто. Удивительно, что это работает. Но, как пишут комментаторы выше, лучше бы в этом убедиться более надёжно.

На самом деле колебания яркости всего лишь 0.3% от диапазона 0-255, так что неудивительно что глазом мы этого не видим. Но да, я думал что будет сложнее, придется отдельные каналы выделять, смотреть где больше влияние и пр.

Камера снимает, наверное, 30 кадров в секунду, лампочка на потолке мерцает 50 раз в секунду, монитор 60 раз. Какие тут получатся результирующие биения, предсказать не берусь. Но всё же предложу померять пульс у обычной фотографии зафиксированной неподвижно. Вполне возможно получите такой же пульс как у живого человека

Очевидно. что наименьшее общее кратное (НОК) периодов это и будет совокупный период колебаний системы.

Скажите, а что за приложение на андроид вы видели?

Просто я писал точно такое же приложение для одного нашего заказчика в пору работы в аутсорс. Наше приложение называлось PulseR :)
Как я понял, тот чувак так и не смог найти инвестиций, точность измерений была крайне сомнительной — адекватный результат выдавался 1 раз из 10
Не помню, читал наверно год назад, но не было времени проверить.

Со смартфоном действительно сложнее, если его в руках держать, тряска будет сильная. С вебкамерой проще. Тут 95% точности, это фиксация камеры и пациента :) График на самом деле сильно колбасит если хоть чуть пошевелиться, а если еще и камера трясется, то наверно 1 к 10 и будет хоть какой-то результат.

Вообще-то имеет место быть вот этот эффект.
Главную роль играет не цвет, а свет, поэтому можно видеть пульс даже у рубашки.
И эффективней будет брать local binary pattern, нормировать и прогонять через FFT фильтр, который будет отсекать все частоты, кроме диапазона 40-90 герц.

Слишком малый диапазон — у меня нередко бывает пульс за 120 (для выявления чего, собственно, и нужно измерять пульс при тахикардии)

Вероятно речь шла об этой статье:


https://m.habr.com/ru/post/463281/


За полгода после публикации я немного доработал алгоритм, так что адекватный результат получается немного почаще, чем в 10% случаев. Вот ссылка, если захотите протестировать


https://play.google.com/store/apps/details?id=ki.facehrm

У меня знакомый делал замер пульса по пьезодатчиам. Ставил пьезодатчики под ножки кровати и когда человек спит, то в фазе глубокого сна можно снимать биение сердца.
Интересно, неужели матрас не сглаживает столь малые колебания?

Хотя такой способ еще может быть удобен для автоматического взвешивания человека :) Тут алгоритмически может быть много тонкостей, как учитывать вес простыней когда человека нет, как учитывать если спят двое, и пр.
как-то получалось…

Даже на графике было видно вторую гармонику — вариабельность ритма в зависимости от фазы дыхания (heart rate variability). По этой гармонике можно анализировать некоторые параметры здоровья.
хм, а если двое спят? хотя тогда можно анализировать не только сон

Анализируя ваш сон
Андроид задетектил стон
И после электронный мозг
Жить без Гиноида не мог.

интересно было бы анализировать некоторых телевизионных персонажей, насколько у них учащается пульс, когда доносят до зрителей определенную информацию
Интересная работа, сам я и не задумывался, чтобы вебкамерой пульс определять
Какое значение выдает программа если в кадре нет одушевленных или подвижных предметов?
UFO landed and left these words here

Вот не пойму, если тупо с веб-камеры так надежно виден ритм в реальном времени, какого черта спец-датчики во всяких мифитах сяомевских и прочих смарт-часах так четко не работают? там же и подсветка специальная, и матрица однопиксельная… казалось бы фильтруй и показывай в реальном времени, ан нет, ждать приходится усреднения, натягивать на руку туго и все равно через раз фиксит. Может это у меня такая шерсть густая на руке?

Ритм виден надежно только для неподвижной картинки, алгоритм сильно чувствителен к горизонтальному смещению. Пульсоксиметр с прищепкой ритм видит четко, но спортивные часы так никто носить не будет :)

Вживить бы пульсоксиметр под кожу. Например в составе кохлеарного импланта с bluetooth

Неподвижность обьекта это очень важный критерий, но второй по значимости, как мне кажется.


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


Почему же инжнеры не могут сделать "нормальные" фитнес-брасслеты? Освещенность на Солнце 30 — 100 тысяч люкс, что очень много. Кожа сама по себе имеет небольшую прозрачность для света, а если браслет еще и установлен неплотно, кожа под браслетом может "немного" подсвечиваться солнцем, что само по себе и неплохо. Если бы не два фактора:


  1. Мощность диода весьма ограничена и он не может тягаться с Солнцем, если браслет надет неплотно
  2. При беге или ходьбе изменения освещенности от Солнца еще РИТМИЧНО, что делает задачу распознавания пульса в таких условиях очень сложной

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

Китайские браслеты настолько продвинуты, что видят пульс даже у колбасы)
Скрытый текст
image

Нормальный пульс. Колбаса вас не боится. Видимо для вас она опаснее, чем вы для нее.

Я чего-то не понимаю. Каким образом камера с 30 фпс может выдать картинку, показанную на графике? Если «синус» на нем соответствует 75 герцам, а в одном периоде порядка 15 отсчетов, то частота дискретизации около/больше 1 кГц. Или действительно наблюдается картина с другой зоны Найквиста?

"Синус" соотвествует 75/60 гц, т.е. чуть больше одного герца. Эта "ошибка" часто возникает при переходе от привычных нам удар/мин в систему си.

Спасибо, только прочитал и понял свою ошибку) Какие еще 75 Гц, о чем я думал) Действительно, 30 фпс без проблем позволят оценивать пульс и другие периодичности вплоть до 15 Гц.
Изините за оффтопик, в спешке прочитал «диктатора на телевидении». Видимо, некоторые хабро-комментарии сказываются на восприятии информации.

По теме: насколько это перспективно для камер наблюдения? Кажется, что такие подходы в связке с BigData+AI уже делают мир «особого мнения» не столь фантастичным.

Камеры наблюдения слишком далеко, чтобы там такие детали выделить. В описанном здесь примере, если заткнуть камеру пальцем в ярком помешении, пульс будет снят наиболее четко. Если в кадре обычное ищбражение, фрагмент видимой кожи елозит в кадре туда сюда, тени мельтешат, то вам нужна длинная экспозиция, чтобы накопить достаточно статистики для считывания пульса. пульс за такое время и измениться уже может. Да и кто будет ждать перед камерой столько?
Если речь о камере у оператора в банке, которая (камера, а не банка) смотрит на вас, пока вы рассказываете как регулярно будете отдавать кредит, то пульс можно снять легко и не принуждённо. Если речь о камере наблюдения которая смотрит на ваш подъезд или лифт (обычо сверху), то по трем мельтешащим пикселям вряд ли удастся получить стабильный результат.
Дорогущая 4к камера с зумм-объективом и серво-подвесом в качестве камеры наблюдения да. вполне способна зазумить и трекать лицо, чтобы снять пульс, но это всё того не стоит.
В кино это все для пущего футуризма. На деле принцип паретто говорит, что никому не нужен пульс прохожих, чтобы ради этого делать уличные камеры на два порядка дороже.

Only those users with full accounts are able to leave comments. Log in, please.