# -*- coding: utf-8 -*-
"""
SaliencyMapDemo
"""
import argparse
from datetime import datetime
import sys
import cv2
import gradio as gr
import numpy as np
import utils
PROGRAM_NAME = 'SaliencyMapDemo'
__version__ = utils.get_package_version()
def compute_saliency(image: np.ndarray):
"""
入力画像から顕著性マップを作成しJET画像を返します。
Parameters
----------
param1 : np.ndarray
入力画像
Returns
-------
np.ndarray
カラーマップのJET画像
"""
# OpenCVのsaliencyを作成
saliency = cv2.saliency.StaticSaliencySpectralResidual_create()
# 画像の顕著性を計算
success, saliencyMap = saliency.computeSaliency(image)
if success:
# 顕著性マップをカラーマップに変換
saliencyMap = (saliencyMap * 255).astype("uint8")
saliencyMap = cv2.applyColorMap(saliencyMap, cv2.COLORMAP_JET)
#overlay = saliencyMap
# 元の画像とカラーマップを重ね合わせ
overlay = cv2.addWeighted(image, 0.5, saliencyMap, 0.5, 0)
return overlay
else:
return image # エラーが発生した場合は元の画像を返す
def run(args: argparse.Namespace, watch: utils.Stopwatch) -> None:
"""
アプリの画面を作成し、Gradioサービスを起動します。
----------
param1 : argparse.Namespace
コマンドライン引数
param2 : utils.Stopwatch
起動したスタート時間
"""
# 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.
1. inputタブで画像を選択します。
2. Submitボタンを押します。
※画像は外部送信していません。ローカルで処理が完結します。
3. 結果は、overlayタブに表示します。
""")
submit_button = gr.Button("submit")
with gr.Row():
with gr.Tab("input"):
image_input = gr.Image()
with gr.Tab("overlay"):
image_overlay = gr.Image(interactive=False)
submit_button.click(compute_saliency, inputs=image_input, outputs=image_overlay)
gr.Markdown(
f"""
Python {sys.version}
App {__version__}
""")
demo.queue(default_concurrency_limit=5)
print(f"{datetime.now()}:アプリ起動完了({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)