Juliojuse's picture
add requirement
d15a19c
raw
history blame
No virus
5.57 kB
import numpy as np
import gradio as gr
import cv2
from model import PhysNet_Model,DeepPhys_Model
import pandas as pd
import time
from physiological_indicators import PhysiologicalIndicators
from face_detection import FaceDetection
from utils_sig import *
from gradio_utils import rppg_to_physiological_indicators,fake_diffusion
from gradio_utils import read_video
fece_detection = FaceDetection()
csv_url = './code/ippg_predict.csv'
def video_to_rppg_dynamic(model_choice,path):
'''
动态进行video到rppg的转换
path: video file path
#C:\\Users\\74314\\AppData\\Local\\Temp\\gradio\\f50cc35ca9bac3568e36f1f7277a72d5e252ad37\\e0faab5f1b8c05eda32648dd635a97c4.mp4
'''
print(model_choice,"=======================================")
if model_choice=="ContrastPhys":
model = PhysNet_Model('./code/contrast_phys/model_weights.pt')
elif model_choice=="DeepPhys":
model = DeepPhys_Model('./code/contrast_phys/PURE_PURE_UBFC_deepphys_Epoch29.pth')
else:
model = None
# read video from file path as frames list
print("===============================",path)
video = read_video(path)
# print(video.shape)
HR_list = []
RR_list = []
HRV_list = []
BO_list = []
for i in range(0,video.shape[0]-128,30):
video_input = video[i:i+128,:,:,:]
video_input, ROI1, ROI2, status, face_region = face_detection_ROI(fece_detection, video_input)
# print(video_input.shape)
ippg, face_list = model.predict(video_input)
HR,RR,BP,HRV,BO = rppg_to_physiological_indicators(ippg, ROI1, ROI2)
HR_list.append(HR)
RR_list.append(RR)
HRV_list.append(HRV)
BO_list.append(BO)
ippg_pd = pd.DataFrame({
"index":range(0,80),
"rppg":ippg,
})
HR_pd = pd.DataFrame({"index":range(0,len(HR_list)),"HR":HR_list})
RR_pd = pd.DataFrame({"index":range(0,len(RR_list)),"RR":RR_list})
BP_pd = pd.DataFrame({"index":range(0,len(BP)),"BP":BP})
HRV_pd = pd.DataFrame({"index":range(0,len(HRV_list)),"HRV":HRV_list})
BO_pd = pd.DataFrame({"index":range(0,len(BO_list)),"BO":BO_list})
ippg_pd.to_csv(csv_url,index=False)
print(len(ippg))
yield ippg_pd,HR_pd,RR_pd,BP_pd,HRV_pd,BO_pd
def get_data():
return pd.read_csv(csv_url)
with gr.Blocks() as demo:
gr.Markdown("## Calculate rppg from video.") # 使用 Markdown 输出一句话
with gr.Tab("Video"): # 新建一个 Tab
with gr.Row(): # 同一行排列
model_select_video = gr.Dropdown(["ContrastPhys","DeepPhys"],label="Model",info="选择rppg检测模型") # 下拉菜单
with gr.Row(): # 同一行排列
video_input = gr.Video()
# video_output = gr.Video()
rppg_output_video = gr.LinePlot(x="index", y="rppg", y_title="rppg singal", width=600, height=300,label="rppg singal")
with gr.Row(): # 同一行排列
HR_output_video = gr.LinePlot(x="index", y="HR", y_title="心率", width=170, height=150,label="心率")
RR_output_video = gr.LinePlot(x="index", y="RR", y_title="呼吸", width=170, height=150,label="呼吸")
BP_output_video = gr.LinePlot(x="index", y="BP", y_title="血压", width=170, height=150,label="血压")
HRV_output_video = gr.LinePlot(x="index", y="HRV", y_title="心率变异性", width=170, height=150,label="心率变异性")
BO_output_video = gr.LinePlot(x="index", y="BO", y_title="血氧", width=170, height=150,label="血氧")
text_button = gr.Button("Start",label="开始")
with gr.Tab("Webcam"): # 新建一个 Tab
with gr.Row(): # 同一行排列
model_select_webcam = gr.Dropdown(["ContrastPhys","DeepPhys"],label="Model",info="选择rppg检测模型") # 下拉菜单
with gr.Row(): # 同一行排列
webcam_input = gr.Video(source="webcam")
# video_output = gr.Video()
rppg_output_webcam = gr.LinePlot(x="index", y="rppg", y_title="rppg singal", width=600, height=300,label="rppg singal")
with gr.Row(): # 同一行排列
HR_output_webcam = gr.LinePlot(x="index", y="HR", y_title="心率", width=170, height=150,label="心率")
RR_output_webcam = gr.LinePlot(x="index", y="RR", y_title="呼吸", width=170, height=150,label="呼吸")
BP_output_webcam = gr.LinePlot(x="index", y="BP", y_title="血压", width=170, height=150,label="血压")
HRV_output_webcam = gr.LinePlot(x="index", y="HRV", y_title="心率变异性", width=170, height=150,label="心率变异性")
BO_output_webcam = gr.LinePlot(x="index", y="BO", y_title="血氧", width=170, height=150,label="血氧")
image_button = gr.Button("Start")
with gr.Accordion("Open for More!"): # 可折叠的组件
gr.Markdown("Look at me...")
text_button.click(video_to_rppg_dynamic,
inputs=[model_select_video,video_input],
outputs=[rppg_output_video,HR_output_video,RR_output_video,BP_output_video,HRV_output_video,BO_output_video]) # 按钮绑定相应的槽函数
image_button.click(video_to_rppg_dynamic,
inputs=[model_select_webcam,webcam_input],
outputs=[rppg_output_webcam,HR_output_webcam,RR_output_webcam,BP_output_webcam,HRV_output_webcam,BO_output_webcam]) # 按钮绑定相应的槽函数
# define queue - required for generators
demo.queue()
demo.launch()