# -*- coding: utf-8 -*-
"""
SaliencyMapDemo
"""
import argparse
from datetime import datetime
import sys
import gradio as gr
import numpy as np
import utils
from saliency import SaliencyMap, convertColorMap
from reporter import get_current_reporter
PROGRAM_NAME = 'SaliencyMapDemo'
__version__ = utils.get_package_version()
log = get_current_reporter()
def jetTab_Selected(image: np.ndarray):
#print(f"{datetime.now()}#jet")
saliency = SaliencyMap("SpectralResidual")
success, saliencyMap = saliency.computeSaliency(image)
retval = convertColorMap(image, saliencyMap, "jet")
#print(f"{datetime.now()}#jet")
return retval
def hotTab_Selected(image: np.ndarray):
#print(f"{datetime.now()}#hot")
saliency = SaliencyMap("SpectralResidual")
success, saliencyMap = saliency.computeSaliency(image)
retval = convertColorMap(image, saliencyMap, "hot")
#print(f"{datetime.now()}#hot")
return retval
def submit_Clicked(image: np.ndarray, algorithm: str):
"""
入力画像を元に顕著マップを計算します。
Parameters:
image: 入力画像
str: 顕著性マップのアルゴリズム
Returns:
np.ndarray: JET画像
np.ndarray: HOT画像
"""
log.info(f"#submit_Clicked")
watch = utils.Stopwatch.startNew()
saliency = SaliencyMap(algorithm)
success, saliencyMap = saliency.computeSaliency(image)
log.info(f"#SaliencyMap computeSaliency()")
if not success:
return image, image # エラーが発生した場合は入力画像を返します。
log.info(f"#jet")
jet = convertColorMap(image, saliencyMap, "jet")
#jet = None
log.info(f"#hot")
hot = convertColorMap(image, saliencyMap, "hot")
saliency = None
log.info(f"#submit_Clicked End{watch.stop():.3f}")
return jet, hot
def run(args: argparse.Namespace, watch: utils.Stopwatch) -> 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} {__version__}", \
head="""
""") as demo:
gr.Markdown(
"""
# Saliency Map demo.
""")
with gr.Accordion("取り扱い説明書", open=False):
gr.Markdown(
"""
1. inputタブで画像を選択します。
2. Submitボタンを押します。
※画像は外部送信していません。ローカルで処理が完結します。
3. 結果は、JETタブとHOTタブに表示します。
""")
algorithmType = gr.Radio(["SpectralResidual", "FineGrained"], label="Saliency", value="SpectralResidual", interactive=True)
submit_button = gr.Button("submit")
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(jetTab_Selected, inputs=[image_input], outputs=image_overlay_jet)
with gr.Tab("overlay(HOT)"):
image_overlay_hot = gr.Image(interactive=False)
#tab_hot.select(hotTab_Selected, inputs=[image_input], outputs=image_overlay_hot, api_name=False)
submit_button.click(submit_Clicked, inputs=[image_input, algorithmType], outputs=[image_overlay_jet, image_overlay_hot])
gr.Markdown(
f"""
Python {sys.version}
App {__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(
max_file_size=args.max_file_size,
server_port=args.server_port,
inbrowser=True,
share=False,
)