# -*- coding: utf-8 -*-
"""myapp Widget"""
import argparse
#from datetime import datetime
import sys
from typing import Literal
import gradio as gr
import numpy as np
from . import PROGRAM_NAME
from src.reporter import log
from src.saliency import SaliencyMap, convert_colormap
from src.utils import Stopwatch, get_package_version
log.info("#アプリ起動中")
watch = Stopwatch.start_new()
def jet_tab_selected(image: np.ndarray):
"""
JETタブを選択時
"""
#print(f"{datetime.now()}#jet")
saliency = SaliencyMap("SpectralResidual")
success, saliency_map = saliency.compute(image)
if not success:
return image # エラーが発生した場合は入力画像を返します。
retval = convert_colormap(image, saliency_map, "jet")
#print(f"{datetime.now()}#jet")
return retval
def hot_tab_selected(image: np.ndarray):
"""
HOTタブを選択時
"""
#print(f"{datetime.now()}#hot")
saliency = SaliencyMap("SpectralResidual")
success, saliency_map = saliency.compute(image)
if not success:
return image # エラーが発生した場合は入力画像を返します。
retval = convert_colormap(image, saliency_map, "turbo")
#print(f"{datetime.now()}#hot")
return retval
def submit_clicked(image: np.ndarray, algorithm: Literal["SpectralResidual", "FineGrained"]):
"""
入力画像を元に顕著マップを計算します。
Parameters:
image: 入力画像
str: 顕著性マップのアルゴリズム
Returns:
np.ndarray: JET画像
np.ndarray: HOT画像
"""
sw = Stopwatch.start_new()
log.info(f"#submit_clicked({sw.elapsed:.3f}s)")
#
saliency = SaliencyMap(algorithm)
log.info(f"#SaliencyMap({sw.elapsed:.3f}s)")
success, saliency_map = saliency.compute(image)
log.info(f"#compute({sw.elapsed:.3f}s)")
if not success:
return image, image # エラーが発生した場合は入力画像を返します。
log.info(f"#jet({sw.elapsed:.3f}s)")
jet = convert_colormap(image, saliency_map, "jet")
# jet = None
log.info(f"#hot({sw.elapsed:.3f}s)")
hot = convert_colormap(image, saliency_map, "hot")
saliency = None
log.info(f"#submit_clicked({sw.elapsed:.3f}s)")
return jet, hot
def run_app(args: argparse.Namespace) -> None:
"""
アプリの画面を作成し、Gradioサービスを起動します。
Parameters:
args: コマンドライン引数
watch: 起動したスタート時間
"""
# analytics_enabled=False
# https://github.com/gradio-app/gradio/issues/4226
with gr.Blocks(
analytics_enabled=False,
title=f"{PROGRAM_NAME} {get_package_version()}",
head="""
"""
) as demo:
gr.Markdown("""
# Saliency Map demo.
""")
with gr.Accordion("取り扱い説明書", open=False):
gr.Markdown("""
1. inputタブで画像を選択します。
2. Submitボタンを押します。
3. 結果は、JETタブとHOTタブに表示します。
""")
algorithm_type = gr.Radio(
["SpectralResidual", "FineGrained"],
label="Saliency",
value="SpectralResidual",
interactive=True
)
submit_button = gr.Button("submit", variant="primary")
with gr.Row():
with gr.Tab("input", id="input"):
image_input = gr.Image(sources=["upload", "clipboard"],
interactive=True)
with gr.Tab("overlay(JET)"):
image_overlay_jet = gr.Image(interactive=False)
# tab_jet.select(jet_tab_selected,
# inputs=[image_input],
# outputs=image_overlay_jet)
with gr.Tab("overlay(HOT)"):
image_overlay_hot = gr.Image(interactive=False)
# tab_hot.select(hot_tab_selected,
# inputs=[image_input],
# outputs=image_overlay_hot, api_name=False)
#
submit_button.click(
submit_clicked,
inputs=[image_input, algorithm_type],
outputs=[image_overlay_jet,
image_overlay_hot]
)
gr.Markdown(f"""
Python {sys.version}
App {get_package_version()}
""")
demo.queue(default_concurrency_limit=5)
log.info(f"#アプリ起動完了({watch.stop():.3f}s)")
# https://www.gradio.app/docs/gradio/blocks#blocks-launch
demo.launch(
inbrowser=args.inbrowser,
share=args.share,
server_port=args.server_port,
max_file_size=args.max_file_size,
)