Привет, Хабр!
Меня зовут Лиза Неустроева, я студентка четвёртого курса Физтех-школы прикладной математики и информатики МФТИ. Учась на Физтехе, я заинтересовалась машинным обучением. Мне было и остаётся интересным узнавать, как методы искусственного интеллекта применяются в биологии и медицине. Поэтому я была очень рада, когда попала на стажировку в центр медицины Sber AI Lab и получила возможность участвовать в прикладных исследованиях.
Мне хотелось разобраться с методами бесконтактной оценки медицинских параметров, т. е. буквально по видеопотоку с камеры определять, какой у человека пульс! Исследовать и реализовывать настолько амбициозные проекты всегда проще с экспертами в предметной области. Для нас такими проводниками были коллеги из СамГМУ. Их усилиями подготовлен уникальный датасет, который содержит видеозаписи людей и их фотоплетизмограммы (ниже я напишу, что это и почему это очень важно), а также сопутствующую информацию медицинского характера. Я подробнее расскажу про эти данные и покажу первые результаты простых моделей, с которыми будем сравнивать более продвинутые ML-методы.
Надеюсь, что всем ML-исследователям, и особенно тем, кто увлекается компьютерным зрением, будет интересно поэкспериментировать с этим датасетом и сравнить результаты с нашими бейзлайнами.
Немного терминологии: rPPG — это remote photoplethysmography или, по-русски, бесконтактная фотоплетизмография. Изначально, плетизмография — это метод регистрации изменения объёма органа в результате его наполнения кровью или воздухом. Результат такого измерения называется плетизмограммой, но иногда говорят просто «пульсовая волна». С помощью пульсовой волны можно сделать выводы о сердечном ритме, частоте дыхания, эластичности стенок сосудов и других медицинских параметрах. В частности, пульсовая волна скоррелирована с ЭКГ-сигналом (см. рис. 1).
Фотоплетизмография — вариация этого метода, в котором пульсовая волна считывается оптическим способом, то есть регистрируются малые изменения цвета кожи. Кстати, с точки зрения греческого языка название очень логичное, потому что «фото» — это свет, «плетизмос» — наполнение, а «графо» — писать.
Обычно фотоплетизмограмму получают, используя специальный прибор, например многофункциональный пульсоксиметр (на рис. 1 справа). В последнее время развиваются и бесконтактные методы, объединённые названием rPPG. Оказывается, чтобы определить пульсацию крови не обязательно просвечивать ткани: современные камеры, причём даже не профессиональные, а камеры смартфонов, способны улавливать возникающие из-за цикла кровообращения периодические изменения цвета кожи или мельчайшие движения головы (про второй подход есть статья на Хабре). Остаётся обнаружить и аккуратно проанализировать эти изменения и извлечь пульсовую волну. Это не так-то просто, но очень важно. Решение этой задачи потенциально может помочь в телемедицинской диагностике: если извлечь из видео пульсовую волну, то по ней можно определить производные медицинские параметры, что поможет дистанционно консультирующему врачу больше узнать о здоровье пациента. Часть информации пациент сможет получить даже без обращения к врачу: например, с помощью автономного медицинского ассистента.
Сейчас для извлечения пульсовой волны из видео используются как статистические методы, так и методы машинного обучения. На их разнообразие можно посмотреть в репозитории rppg-toolbox. Есть и стартапы, которые предсказывают медицинские параметры с помощью фотоплетизмограмм, например, Anura и Binah.
Для разработки и оценки методов определения PPG, а также для разработки моделей удалённой диагностики нужны данные! Уже существуют несколько релевантных датасетов, например:
Каждый из них содержит синхронизированные видеозаписи лица и фотоплетизмограммы, в некоторых также есть дополнительная медицинская информация. Но в каждом из этих датасетов содержатся видеозаписи не более чем ста испытуемых, а камера располагается строго перед человеком на фиксированном расстоянии.
Multi-Camera Dataset for rPPG (или MCD rPPG) предлагает записи о 600 испытуемых, что делает данные существенно более разнообразными, чем в предыдущих датасетах. К тому же видео снимались с трёх различных ракурсов и с использованием разных камер. Такое разнообразие позволит обученным на MCD rPPG моделям работать с видео, снятыми в разных условиях на разные устройства. Также в датасете содержатся сопутствующие медицинские параметры, что позволяет решать не только задачу восстановления фотоплетизмограммы по видео, но и другие задачи удалённой диагностики.
Хочу познакомить вас с этим датасетом и предложить базовые обученные нами модели:
предсказывающие медицинские параметры отдельно по каждому кадру,
предсказывающие медицинские параметры по отрывку видео,
восстанавливающие PPG.
Датасет доступен по ссылке, а код всех экспериментов доступен в репозитории. Поехали!
Для каждого из шестисот испытуемых были сделаны два измерения: до и после нагрузки (например, пятнадцати приседаний за тридцать секунд). Каждому измерению соответствует трёхминутное видео, одновременно снятое с трёх разных ракурсов, то есть три ролика (см. рис. 2), синхронизированная с ними фотоплетизмограмма и отдельно записанный ЭКГ-сигнал, всего 3600 записей. Видео записывались в разное время суток в разных помещениях и при различном освещении, чтобы данные были более разнообразными, а обученные на них модели — более устойчивыми и подходящими для использования в разных условиях. Ещё на каждом видео за испытуемыми стоят часы: они нужны для того, чтобы как можно точнее синхронизировать ролики с фотоплетизмограммами.
Ещё для каждого испытуемого известны:
пол (gender);
возраст (age);
рост (height);
вес (weight);
уровень стресса (stress);
уровень гемоглобина (hemoglobin);
уровень гликированного гемоглобина (glycated_hemogloin);
уровень холестерина (cholesterol).
Отдельно до и после нагрузки измерялись:
нижнее или диастолическое артериальное давление (lower_ap);
верхнее или систолическое артериальное давление (upper_ap);
пульс (pulse);
сатурация (saturation);
частота вдохов (respiratory);
эластичность стенок сосудов (rigidity).
Сразу скажу, что для всех дальнейших моделей использовали ИМТ (индекс массы тела) вместо отдельных параметров роста и веса. Это показатель, измеряющийся по формуле:
Он связывает рост и вес, поэтому используется, чтобы определить, является ли масса человека недостаточной, нормальной или избыточной при его росте. Поскольку в датасете представлены видеозаписи лиц, а не в полный рост, выбран именно относительный параметр: невозможно определить по лицу рост или вес человека, но можно оценить их соотношение.
Для начала проведём Exploratory Data Analysis (EDA) и посмотрим на распределение параметров в данных.
Во-первых, кто они, эти испытуемые? А точнее, какие у них демографические характеристики? Треть испытуемых — мужчины, остальные — женщины.
90% респондентов не старше 24 лет, оставшиеся 10% — от 25 до 83 лет.
Во-вторых, посмотрим на распределение их ИМТ и сравним его со средним по России по данным за 2018.
Наши респонденты несколько худее среднестатистического россиянина, может, многие из них студенты :)
В-третьих, изучим, как изменяются некоторые медицинские параметры до и после нагрузки.
Здесь всё ожидаемо: давление повышается, частота вдохов и пульс увеличиваются. Ещё повышается температура, увеличивается эластичность стенок сосудов и уменьшается сатурация. Температура и сатурация — очень низковариабельные параметры, то есть их значения сконцентрированы в узком диапазоне: в случае температуры — около 36,6, в случае сатурации — около 97. Это нормальные параметры для большинства здоровых людей, которыми в основном являются и наши испытуемые. При этом значение сатурации не может сильно отклоняться от этого значения: по определению она не может быть больше 100, а значение 94 уже считается низким — при COVID-19 в таком случае рекомендуют вызвать врача.
Осталось рассмотреть уровень стресса, а также содержание гемоглобина, гликированного гемоглобина и холестерина в крови. Это вариабельные параметры, предсказать которые по фотографии или видеозаписи человеческого лица очень сложно, поскольку гемоглобин, холестерин и гликированный гемоглобин — параметры крови, при малых отклонениях от нормы почти не оказывающие влияния на пульсовую волну и внешность человека, а уровень стресса — субъективный параметр, определяемый по анкете.
Для определения уровня стресса использовалась шкала психологического тестирования PSM-25 (Лемура-Тесье-Филлиона). Испытуемые отвечали на 25 вопросов о наличии физических проявлений стресса: чувстве напряжённости, проблемах с дыханием и других. Каждый вопрос оценивался от 1 до 8 баллов, затем суммарный балл делили на 25. В итоге получалось число в диапазоне от 0 до 8 — чем больше результат, тем в более стрессовом состоянии находится человек.
Каждый из этих параметров важно определять для дистанционной медицинской диагностики. Кроме, может быть, пола и возраста, потому что их пациенты обычно и сами знают 😀. А ещё многие из параметров сложно определять по снимку лица или по видео: есть разные исследования на эту тему, но они пока не позволяют добиться точных результатов. Так, например, в статье 2023 года верхнее давление определяется с погрешностью 12,35 мм. рт. ст., а нижнее — с погрешностью 9,54 мм. рт. ст.. Задача определения уровня гемоглобина пока решается только классификационно (анемия или норма), а не численно. Нам и вам, всем заинтересованным в этой теме, есть куда продвигаться!
Чтобы было, с чего начинать и с чем сравнивать, предлагаем наши бейзлайны. Во всех из них будем пытаться определить по видео каждый из описанных выше параметров. Определение пола по видеозаписи или фотографии лица — единственная задача классификации в предлагаемых данных. Рассмотрим её позже, а пока обратимся к задачам регрессии.
Нулевой пункт такой: случайно разделим датасет по испытуемым на две части в соотношении 80:20, рассчитаем медиану значений целевого параметра по обучающей части и вычислим ошибку на меньшей. В качестве функции ошибки будем использовать MAE (Mean Absolute Error). Повторим такую процедуру 100 раз и усредним ошибку, а также найдём её среднее отклонение.
МАЕ | Среднее отклонение | |
Возраст | 4,39 | 0,69 |
ИМТ | 3,28 | 0,25 |
Нижнее АД | 7,42 | 0,37 |
Верхнее АД | 13,61 | 0,64 |
Сатурация | 0,87 | 0,05 |
Температура | 0,09 | 0,01 |
Уровень стресса | 1,14 | 0,07 |
Гемоглобин | 1,34 | 0,07 |
Гликированный гемоглобин | 0,42 | 0,05 |
Холестерин | 0,65 | 0,04 |
Частота вдохов | 1,40 | 0,12 |
Эластичность стенок сосудов | 2,21 | 0,12 |
ЧСС | 15,04 | 0,60 |
Температура и сатурация достаточно точно предсказываются уже даже таким образом: ошибка составляет менее 1 % от максимального значения. Это говорит о том, что значения этих параметров на датасете не очень разнообразны. Перейдём к более сложным моделям!
Все описанные ниже модели будем учить, используя данные о 80% пациентов, а результаты будем измерять на отложенной выборке из оставшихся 20%. То есть в обучающей выборке будет 2880 видео, а в тестовой — 720. Затем для каждого видео из обучающей части случайным образом выберем 20 кадров, чтобы на этапе обучения каждый раз давать модели один случайный из них. Из каждого видео тестовой выборки случайным образом выберем один кадр, и именно он каждый раз будет подаваться модели для тестирования.
На каждом кадре с помощью пакета Mediapipe определяем прямоугольник, содержащий лицо, — в задачах детекции он называется bounding box. Далее обрежем кадр, оставляя только внутренность этого прямоугольника, чтобы наша модель работала с фотографиями лиц, не отвлекаясь на фон. Нам же не нужно, чтобы она выучила, что всех испытуемых-студентов снимали на фоне одной стены, а более взрослых испытуемых — на фоне другой. Про пакет Mediapipe, кстати, есть интересная статья на Хабре.
Немного технических подробностей. На подготовленных таким образом данных мы воспользовались классическим приёмом transfer learning:
Сначала взяли известную модель (энкодер), инициализированную весами, полученными обучением на большом датасете.
Затем оторвали ей голову, заменили последний слой (это линейный слой классификатора) двумя линейными слоями с функцией активации ReLU между ними.
Полученную модель дообучили на целевой задаче.
В качестве функции потерь была использована кросс-энтропия для задачи предсказания пола и вышеупомянутое MAE для всех задач регрессии.
Ниже приведу результаты для части моделей, но отмечу, что план экспериментов был гораздо шире: подбирали оптимальные гиперпараметры и архитектуру нейросети, экспериментировали со способом обучения, способом инициализации весов и количеством обучаемых параметров. А именно, варьировали скорость обучения (learning rate), функцию потерь (Mean Squared Error или MAE), способ инициализации весов энкодера (случайным образом или из предобученной модели), количество обучаемых параметров («размороженных» слоёв и порядок, в котором эти слои «размораживаются»).
Следуя лучшим практикам компьютерного зрения, пробовали несколько архитектур: ResNet50, ViT, Swin, предобученные на датасете ImageNet, отсюда, а также RexNet150 и EfficientNet_b2 из репозитория HSEmotion. Особенность двух последних моделей заключается в том, что они были специально обучены на датасетах лиц, поэтому должны хорошо подходить нашей задаче.
Посмотрим на результаты. Для анализа качества определения пола мы использовали метрики accuracy и F1 (в качестве положительного класса выбраны женщины).
model | accuracy | F1 |
ResNet50 | 0,952 | 0,961 |
Swin | 0,957 | 0,964 |
ReXNet150 | 0,989 | 0,991 |
ViT | 0,951 | 0,960 |
EfficientNet_b2 | 0,979 | 0,983 |
Все модели показали отличные результаты, они определяют пол почти идеально! Модели, которые были специально предобучены на лицах, справляются немного лучше других. Теперь посмотрим на результаты как для набора моделей, которые определяют один параметр за раз, так и для набора моделей, которые определяют сразу все параметры. Проанализируем работу двух архитектур: RexNet150 и ViT. Этот выбор не случаен: во-первых, они показали результаты немного лучше, чем остальные модели, во-вторых, они являются представителями двух классов современных моделей, борющихся за первенство в разных задачах компьютерного зрения: RexNet150 — свёрточная сеть, а ViT — трансформер.
Наивный бейзлайн | ReXNet150 | ViT | ReXNet150 (все параметры) | ViT | |
Возраст | 4,386 | 1,689 | 1,669 | 1,921 | 4,461 |
ИМТ | 3,277 | 2,516 | 2,534 | 2,454 | 2,803 |
Нижнее АД | 4,723 | 8,581 | 8,146 | 8,013 | 7,870 |
Верхнее АД | 13,606 | 14,049 | 13,788 | 13,178 | 13,299 |
Сатурация | 0,872 | 1,814 | 0,946 | 0,855 | 0,876 |
Температура | 0,094 | 0,614 | 0,128 | 0,110 | 0,103 |
Стресс | 1,144 | 1,198 | 1,210 | 1,117 | 1,156 |
Гмоглобин | 1,342 | 1,223 | 1,154 | 1,110 | 1,385 |
Глик. гемоглобин | 0,418 | 0,533 | 0,526 | 0,513 | 0,487 |
Холестерин | 0,647 | 0,692 | 0,710 | 0,629 | 0,680 |
Частота вдохов | 1,399 | 1,453 | 1,488 | 1,483 | 1,455 |
Эласт-ть сосудов | 2,210 | 2,308 | 2,320 | 2,284 | 2,201 |
Пульс | 15,043 | 16,564 | 16,121 | 14,685 | 15,316 |
В остальных задачах предложенные нами решения достигают лишь результатов на уровне бейзлайнов, то есть, выбранные нейросетевые архитектуры не позволяют добиться значимого преимущества. Возможно, эти параметры вообще невозможно определить только по фото, в частности из-за того, что некоторые из них — пульс, частота вдохов — по своей природе имеют динамический характер. Поэтому следующим шагом попробуем модели, принимающие на вход видео. Заметим, что в этих экспериментах модели, специально обученные предсказывать конкретный параметр, не опережают модели, одновременно предсказывающие сразу все параметры, поэтому в следующей главе будем рассматривать только такую стратегию — предсказывающие все таргеты одновременно.
Если предыдущие модели принимали на вход один кадр и предсказывали по нему один или несколько медицинских параметров, то модели из этого класса будут принимать на вход отрезок видео. Для их обучения мы взяли только видео анфас и вырезали десятисекундные отрывки, а также с помощью Mediapipe обрезали края таким образом, чтобы большую часть кадра занимало лицо. Если точнее, на каждом кадре выделили прямоугольник, ограничивающий лицо, затем нашли минимальный прямоугольник, содержащий все ранее выделенные, и увеличили его стороны на 20%. Наконец, обрезав всё, кроме этого прямоугольника, мы получили видео, на котором лицо испытуемого всё ещё попадает в кадр, а фона как можно меньше.
Также, как и раньше, мы применяли идею transfer learning, но в этот раз в качестве основы взяли модели, заточенные под работу с трёхмерными входными данными, в частности, с видео. Мы взяли предобученные модели, доступные в PyTorch, а именно MViT (аналог трансформера ViT для работы с видео) и три вариации свёрточной сети 3D ResNet. Эти три вариации различаются размерностями ядер свёрток: в первой ядра трёхмерные, во второй есть как трёхмерные, так и двумерные, а в третьей двумерные свёртки по осям высоты и ширины чередуются с одномерным по оси времени.
Все эти модели обучены для работы с короткими видео по 16 кадров, что при нашей частоте съёмки около 30 кадров/с соответствует отрезку видео длиной в полсекунды. Чтобы агрегировать информацию о большем периоде времени, в репозитории мы также предлагаем модели, в которых вместо 16 последовательных кадров на вход подаются 16 кадров с некоторым шагом, или же большой входной отрезок разбивается на несколько частей, в каждой из которых вычисляется средний кадр и на вход модели предлагаются эти 16 «усреднённых» кадров.
В задачах определения пола, возраста и ИМТ эти модели добились результатов, сравнимых с моделями, принимающими на вход отдельные кадры, а вот в остальных задачах тоже не преуспели (подробные результаты по ссылке). Остальные задачи всё ещё бросают вызов исследователям и, мы надеемся, будут решены более специализированными методами, чем наш. Например, интерес представляет комбинация двух уже исследованных подходов: изменения цвета кожи и микродвижений головы.
Обратимся к анонсированным в самом начале фотоплетизмограммам: будем решать задачу восстановления пульсовой волны по видео. Можно было бы сравнивать, насколько похожи предсказанная и истинная пульсовая волна, но численный результат имел бы сложно интерпретируемый физический смысл, поэтому поступим иначе. Современные методы анализа временных рядов позволяют очень точно определять частоту сердечных сокращений по пульсовой волне. Будем сравнивать пульс, рассчитанный по настоящей фотоплетизмограмме, с пульсом, рассчитанным по предсказанной фотоплетизмограмме. Для сравнения используем MAE. Для восстановления ЧСС по пульсовой волне будет использоваться алгоритм на основе быстрого преобразования Фурье.
Приведу результаты работы двух статистических алгоритмов: POS_WANG и LGI, а также обучим модель TS_CAN. Многие статистические модели и, в частности, выбранные нами, усредняют цвета пикселей по всей картинке или отдельно по каждому цветовому каналу, или даже по всем цветовым каналам сразу, а затем оперируют с полученным временным рядом. Поскольку цель — уловить колебания цвета кожи, наличие пикселей фона или одежды делает сигнал более шумным. Поэтому наряду с классическими статистическими алгоритмами приведу их усовершенствованную версию, в которой сначала с помощью модели сегментации выделяются пиксели кожи, а затем усредняются только их значения. С полученным временным рядом будет работать классический алгоритм.
Как и в предыдущих пунктах, прежде всего нужно подготовить данные. Выберем из каждого видео случайный десятисекундный отрывок. С помощью модели SelfieSegmentation от Mediapipe классифицируем все пиксели на 6 категорий.
Фон.
Волосы.
Кожа лица.
Кожа тела.
Одежда.
Другое (аксессуары).
Затем выделим наименьший прямоугольник, ограничивающий все пиксели кожи лица, увеличим его на 10 % с каждой стороны и обрежем всё, кроме этого прямоугольника. Далее во всех алгоритмах будем использовать либо эти обрезанные видео, либо только пиксели кожи лица на них. Для использования второго варианта сохраним маску пикселей кожи лица для каждого кадра.
Для обучения алгоритма TS_CAN использовались только полученные видео, но не маски. Гиперпараметры и предобработка использовались те, что предлагаются в rppg-toolbox для других датасетов.
Алгоритм | POS_WANG | POS_WANG по пикселям кожи | LGI | LGI по пикселям кожи | TS_CAN |
MAE пульса (уд./мин.) | 4,463 | 2,968 | 7,368 | 5,418 | 2,841 |
Замечу, что использование сегментации для статистических алгоритмов даёт прирост точности. Этим удалось добиться MAE меньше 3, что соответствует лучшим результатам на аналогичных датасетах (см. таблицу).
Multi-Camera Dataset rPPG выложен в открытый доступ, поэтому предлагаю вам поэкспериментировать с ним в научных, исследовательских или учебных целях. Задача дистанционного определения медицинских параметров трудная, но важная, и потому кажется нам такой интересной. Думаю, что она понравится и вам, и будем вместе развивать методы удалённой диагностики!
Чтобы облегчить начало работы и чтобы было, с чем сравнивать результаты, выкладываю код бейзлайнов. Пока достаточно уверенно решаются только задачи определения пола, возраста и ИМТ, так что в дальнейших исследованиях есть к чему стремиться.
Надеюсь, что в будущем MCD-rPPG поможет сообществу исследователей продвинуться в разработке методов определения медицинских параметров и внесёт свой вклад в развитие телемедицинских сервисов.
Спасибо, что дочитали. Комментарии открыты для ваших вопросов, идей и предложений :)