Я реализую метод из этой статьи: https://dspace.mit.edu/bitstream/handle/1721.1/66243/Picard_Noncontact%20Automated.pdf?sequence=1&isAllowed=y
Основная идея заключается в измерении сердечного импульса с использованием набора кадров (N = 300) из видео 10 с, поэтому частота кадров составляет 30 кадров в секунду.
red = [item[:,:,0] for item in imgs]
green = [item[:,:,1] for item in imgs]
blue = [item[:,:,2] for item in imgs]
red_avg = [item.mean() for item in red]
green_avg = [item.mean() for item in green]
blue_avg = [item.mean() for item in blue]
red_mean, red_std = np.array(red_avg).mean(), np.array(red_avg).std()
green_mean, green_std = np.array(green_avg).mean(), np.array(green_avg).std()
blue_mean, blue_std = np.array(blue_avg).mean(), np.array(blue_avg).std()
red_avg = [(item - red_mean)/red_std for item in red_avg]
green_avg = [(item - green_mean)/green_std for item in green_avg]
blue_avg = [(item - blue_mean)/blue_std for item in blue_avg]
data = np.vstack([signal.detrend(red_avg), signal.detrend(green_avg), signal.detrend(blue_avg)]).reshape(300,3)
from sklearn.decomposition import FastICA
transformer = FastICA(n_components=3)
X_transformed = transformer.fit_transform(data)
from scipy.fftpack import fft
first = X_transformed.T[0]
second = X_transformed.T[1]
third = X_transformed.T[2]
ff = np.fft.fft(first)
fs = np.fft.fft(second)
ft = np.fft.fft(third)
imgs
- это исходный список массивов с 300 пиксельными значениями изображения. Как вы можете видеть, я разбил все кадры на каналы RGB и, таким образом, получил трассы x_i(t)
, где i = 1,2,3
После стандартизации мы удалили все трассы и сложили их для дальнейшего применения ICA, а затем FFT для всехтри компонента.
Затем метод утверждает, что нам нужно построить график зависимости мощности от частоты (Гц) и выбрать компонент, который, скорее всего, будет сердечным пульсом.
Наконец, мы применили быстрое преобразование Фурье (БПФ) к выбранному исходному сигналу для получения спектра мощности. Частота импульсов была обозначена как частота, которая соответствовала наибольшей мощности спектра в рабочей полосе частот. Для наших экспериментов мы установили рабочий диапазон [0,75, 4] Гц (что соответствует [45, 240] уд / мин), чтобы обеспечить широкий диапазон измерений сердечного ритма.
Вот как я пытаюсьВизуализируйте частоты:
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
data = ft
print(fs.size)
ps = np.abs(np.fft.fft(data))**2
sampling_rate = 30
freqs = np.fft.fftfreq(data.size, 1/sampling_rate)
idx = np.argsort(freqs)
#print(idx)
plt.plot(freqs[idx], ps[idx])
То, что я получаю, совершенно другое, поскольку диапазон частот составляет от $ -15 $ до $ 15 $, и я не знаю, в Гц это или нет.
Три изображения выше - это то, что я получаю, когда выполняю код для визуализации частот и мощности сигнала,
Буду признателен за любую помощь или предложения.