labtool_docker / app.py
taigatakano's picture
fix bug and refactor code
e70b1cc
Raw
History Blame Contribute Delete
7.69 kB
import os
if os.name == 'nt':
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
import gradio as gr
from moviepy.editor import VideoFileClip
from lab_tools import spectrogram
from lab_tools import labutils
from lab_tools import analyze1f
from lab_tools import ytutil
def update_slider_range(filepath):
timestamp = labutils.load_signal(filepath, "Timestamp")
max_value = float(timestamp[len(timestamp) - 1])
min_value = float(timestamp[0])
return gr.update(minimum=min_value, maximum=max_value), gr.update(minimum=min_value, maximum=max_value, value=max_value)
def update_anlyze_setting(mode):
if mode == "YouTube":
return gr.update(visible=True, value=None), gr.update(visible=False, value=None), gr.update(visible=True), gr.update(value=None)
else:
return gr.update(visible=False, value=None), gr.update(visible=True, value=None), gr.update(visible=False), gr.update(value=None)
def update_slidar_range_youtube(video_url):
if video_url == "":
return gr.update(maximum=0, value=0), gr.update(maximum=0, value=0), gr.update(value=None), gr.update(value=None), gr.update(value=None)
video_info = ytutil.get_video_info(video_url)
duration = int(video_info["duration"]) - 1
title = video_info["title"]
ytutil.remove_mp4_file()
return gr.update(maximum=duration), gr.update(maximum=duration, value=duration), gr.update(value=title), gr.update(value=None), gr.update(value=None)
def update_slidar_range_video_file(file_path):
if file_path == "":
return gr.update(maximum=0), gr.update(maximum=0, value=0), gr.update(value=None), gr.update(value=None)
with VideoFileClip(file_path) as video:
duration = video.duration
return gr.update(maximum=duration), gr.update(maximum=duration, value=duration), gr.update(value=None), gr.update(value=None)
with gr.Blocks() as main_ui:
with gr.Tab("Spectrogram analyze"):
with gr.Row():
with gr.Column():
file_input = gr.File(label="CSVファイルをアップロードしてください。", file_count="single", file_types=["csv"])
fmax_slider = gr.Slider(minimum=0, maximum=200, value=40, label="wavelet 最大周波数", step=10, info="単位はHz。")
start_time = gr.Slider(minimum=0, maximum=60, value=0.0, step=0.5, label="Start Time (sec)")
end_time = gr.Slider(minimum=0, maximum=60, value=60.0, step=0.5, label="End Time (sec)")
with gr.Accordion(label="フィルター設定", open=False):
filter_setting = gr.Radio(
["No Filter", "High PASS", "Low PASS"],
label="使用するフィルター",
value="High PASS",
)
fp_hp = gr.Slider(minimum=0, maximum=20, value=3, step=0.1, label="通過域端周波数 [Hz]")
fs_hp = gr.Slider(minimum=0, maximum=20, value=1, step=0.1, label="阻止域端周波数 [Hz]")
gpass = gr.Slider(minimum=0, maximum=100, value=3, step=1, label="通過域端最大損失 [dB]")
gstop = gr.Slider(minimum=0, maximum=100, value=40, step=1, label="阻止域端最小損失 [dB]")
with gr.Accordion(label="詳細設定", open=False):
analysis_method = gr.Radio(
["Short-Time Fourier Transform", "Wavelet"],
label="Analysis method",
value="Short-Time Fourier Transform",
)
fs_slider = gr.Slider(minimum=0, maximum=10000, value=1000, label="サンプリング周波数", step=10, info="単位はHz。")
column_dropdown = gr.Dropdown(["Fp1", "Fp2", "T7", "T8", "O1", "O2"], value="Fp2", label="使用する信号データ", allow_custom_value=True, info="使用する信号データを選んでください。デフォルトはFp2です。")
integration_method = gr.Radio(
["Trapezoid(台形積分)", "Simpson(シンプソン法)"],
label="Integration Method",
value="Simpson(シンプソン法)",
)
segment_length = gr.Slider(minimum=0, maximum=8192, value=4096, step=1, label="STFT: セグメント長")
overlap = gr.Slider(minimum=0, maximum=99, value=90, step=1, label="STFT: オーバーラップ率 [%]")
fontsize = gr.Slider(minimum=0, maximum=20, value=12, step=1, label="グラフのフォントサイズ")
submit_button = gr.Button("計算開始")
file_input.change(
update_slider_range,
inputs=file_input,
outputs=[start_time, end_time]
)
with gr.Column():
config_file = gr.File(label="Ziped Analyze File")
wavelet_image = gr.Image(type="filepath", label="Spectrogram")
band_intensity = gr.Image(type="filepath", label="Band Intensity")
submit_button.click(spectrogram.generate_spectrogram_and_signal_plot, inputs=[
file_input, analysis_method,
fs_slider, fmax_slider, column_dropdown, start_time, end_time,
filter_setting, fp_hp, fs_hp, gpass, gstop,
integration_method, segment_length, overlap, fontsize],
outputs=[wavelet_image, band_intensity, config_file])
with gr.Tab("1f noise analyze"):
with gr.Row():
with gr.Column():
mode_setting = gr.Radio(
["YouTube", "動画ファイル"],
label="解析データ",
value="YouTube",
)
youtube_url_input = gr.Text(label="YouTubeのリンクを貼り付けてください。")
file_input = gr.File(label="動画をアップロードしてください", visible=False, file_count="single", file_types=["mp4"])
start_time = gr.Slider(minimum=0, maximum=3600, value=0, step=1, label="Start Time (sec)")
end_time = gr.Slider(minimum=0, maximum=3600, value=10, step=1, label="End Time (sec)")
submit_button = gr.Button("計算開始")
download_button = gr.Button("ダウンロード")
with gr.Column():
caption = gr.Text(label="動画タイトル")
result = gr.Image(type="filepath", label="Wavelet")
file_result = gr.File(label="Downloaded Video")
submit_button.click(analyze1f.analyze_1f_noise, inputs=[mode_setting, youtube_url_input, file_input, start_time, end_time], outputs=[caption, result])
download_button.click(ytutil.download_youtube_video, inputs=[youtube_url_input], outputs=[file_result])
mode_setting.change(
update_anlyze_setting,
inputs=mode_setting,
outputs=[youtube_url_input, file_input, download_button, result]
)
youtube_url_input.change(
update_slidar_range_youtube,
inputs=youtube_url_input,
outputs=[start_time, end_time, caption, file_result, result]
)
file_input.change(
update_slidar_range_video_file,
inputs=file_input,
outputs=[start_time, end_time, file_result, result]
)
if __name__ == "__main__":
if os.name == 'nt':
main_ui.queue().launch()
else:
main_ui.queue().launch(server_name="0.0.0.0", server_port=7860)
ytutil.remove_mp4_file()