SaliencyMapDemo / app.py
umyuu
Fix Attempted to select a non-interactive or hidden tab.
d2f0d15
raw
history blame
9.16 kB
# -*- coding: utf-8 -*-
"""
SaliencyMapDemo
"""
#from datetime import datetime
import sys
from typing import Literal
import gradio as gr
import numpy as np
from src import PROGRAM_NAME, get_package_version
from src.args_parser import parse_args
from src.reporter import log
from src.saliency import SaliencyMap, convert_colormap
from src.utils import Stopwatch
__version__ = get_package_version()
log.info("#ใ‚ขใƒ—ใƒช่ตทๅ‹•ไธญ")
watch = Stopwatch.start_new()
def jet_tab_selected(image: np.ndarray):
"""
JETใ‚ฟใƒ–ใ‚’้ธๆŠžๆ™‚
"""
sw = Stopwatch.start_new()
log.info(f"#jet_tab_selected({sw.elapsed:.3f}s)")
saliency = SaliencyMap("SpectralResidual")
success, saliency_map = saliency.compute(image)
if not success:
return image # ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใŸๅ ดๅˆใฏๅ…ฅๅŠ›็”ปๅƒใ‚’่ฟ”ใ—ใพใ™ใ€‚
retval = convert_colormap(image, saliency_map, "jet")
log.info(f"#jet_tab_selected({sw.elapsed:.3f}s)")
return retval
def hot_tab_selected(image: np.ndarray):
"""
HOTใ‚ฟใƒ–ใ‚’้ธๆŠžๆ™‚
"""
sw = Stopwatch.start_new()
log.info(f"#hot_tab_selected({sw.elapsed:.3f}s)")
saliency = SaliencyMap("SpectralResidual")
success, saliency_map = saliency.compute(image)
if not success:
return image # ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใŸๅ ดๅˆใฏๅ…ฅๅŠ›็”ปๅƒใ‚’่ฟ”ใ—ใพใ™ใ€‚
retval = convert_colormap(image, saliency_map, "turbo")
log.info(f"#hot_tab_selected({sw.elapsed:.3f}s)")
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.debug(f"#SaliencyMap({sw.elapsed:.3f}s)")
success, saliency_map = saliency.compute(image)
log.debug(f"#compute({sw.elapsed:.3f}s)")
if not success:
return image, image # ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใŸๅ ดๅˆใฏๅ…ฅๅŠ›็”ปๅƒใ‚’่ฟ”ใ—ใพใ™ใ€‚
log.debug(f"#jet({sw.elapsed:.3f}s)")
jet = convert_colormap(image, saliency_map, "jet")
# jet = None
log.debug(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 gallery_selected(_, evt: gr.SelectData):
"""
ใ‚ฎใƒฃใƒฉใƒชใƒผใฎ็”ปๅƒใŒ้ธๆŠžใ•ใ‚ŒใŸใจใใซๅ‘ผใณๅ‡บใ•ใ‚Œใ‚‹ใ‚ณใƒผใƒซใƒใƒƒใ‚ฏ้–ขๆ•ฐใ€‚
Parameters:
_ (Unused): ไฝฟ็”จใ•ใ‚Œใชใ„ๅผ•ๆ•ฐใ€‚
evt (gr.SelectData): Gradioใฎใ‚ฎใƒฃใƒฉใƒชใƒผ้ธๆŠžใ‚คใƒ™ใƒณใƒˆใƒ‡ใƒผใ‚ฟใ€‚
Returns:
str: ้ธๆŠžใ•ใ‚ŒใŸใ‚ฎใƒฃใƒฉใƒชใƒผ็”ปๅƒใฎใƒ‘ใ‚นใ€‚
"""
image_path = evt.value['image']['path']
return image_path
args = parse_args()
"""
ใ‚ขใƒ—ใƒชใฎ็”ป้ขใ‚’ไฝœๆˆใ—ใ€Gradioใ‚ตใƒผใƒ“ใ‚นใ‚’่ตทๅ‹•ใ—ใพใ™ใ€‚
ใƒ›ใƒƒใƒˆใƒชใƒญใƒผใƒ‰ๅฏพๅฟœใจใ—ใฆใ€topใƒฌใƒ™ใƒซใฎใ‚คใƒณใƒ‡ใƒณใƒˆใซใ€‚
https://www.gradio.app/guides/developing-faster-with-reload-mode
"""
with gr.Blocks(
title=f"{PROGRAM_NAME} {get_package_version()}",
head="""
<meta name="format-detection" content="telephone=no">
<meta name="robots" content="noindex, nofollow, noarchive">
<meta name="referrer" content="no-referrer" />
"""
) as demo:
gr.Markdown("""
# Saliency Map demo.
็”ปๅƒใซใŠใ‘ใ‚‹ๆณจ็›ฎใ™ในใ้ ˜ๅŸŸใ‚’ๅฏ่ฆ–ๅŒ–ใ™ใ‚‹ใ€Œ้ก•่‘—ๆ€งใƒžใƒƒใƒ—ใ€ใ‚’่กจ็คบใ™ใ‚‹ใƒ‡ใƒขใ‚ขใƒ—ใƒชใงใ™ใ€‚
""")
with gr.Accordion("ๅ–ใ‚Šๆ‰ฑใ„่ชฌๆ˜Žๆ›ธ", open=False):
gr.Markdown("""
## ้ก•่‘—ๆ€งใƒžใƒƒใƒ—ใจใฏ
้ก•่‘—ๆ€งใƒžใƒƒใƒ—ใจใฏใ€็”ปๅƒๅ†…ใฎๆณจ็›ฎใ™ในใ้ ˜ๅŸŸใ‚’่ฆ–่ฆšๅŒ–ใ™ใ‚‹ๆ‰‹ๆณ•ใงใ™ใ€‚ใ“ใฎๆ‰‹ๆณ•ใฏใ€ไบบ้–“ใฎ่ฆ–่ฆšใ‚ทใ‚นใƒ†ใƒ ใŒ้‡่ฆใชๆƒ…ๅ ฑใซ็„ฆ็‚นใ‚’ๅฝ“ใฆใ‚‹ๆ–นๆณ•ใ‚’ๆจกๅ€ฃใ—ใฆใ„ใพใ™ใ€‚ๅ„ใƒ”ใ‚ฏใ‚ปใƒซใซใฏใ€ใใฎๆณจ็›ฎๅบฆๅˆใ„ใ‚’่กจใ™ๅ€คใŒๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใ€ใใ‚ŒใซๅŸบใฅใ„ใฆๆณจ็›ฎใ™ในใ้ ˜ๅŸŸใŒๅผท่ชฟใ•ใ‚Œใพใ™ใ€‚
## ๆ“ไฝœ่ชฌๆ˜Ž
้ก•่‘—ๆ€งใƒžใƒƒใƒ—ใƒ‡ใƒขใ‚’ไฝฟ็”จใ™ใ‚‹ๆ‰‹้ †ใฏไปฅไธ‹ใฎ้€šใ‚Šใงใ™๏ผš
1. ็”ปๅƒใฎ้ธๆŠž: inputใ‚ฟใƒ–ใง่ชฟๆŸปใ—ใŸใ„็”ปๅƒใ‚’้ธๆŠžใ—ใพใ™ใ€‚ไธ‹้ƒจใฎ๐Ÿ“‹ใ‚ฏใƒชใƒƒใƒ—ใƒœใƒผใƒ‰ใ‚ขใ‚คใ‚ณใƒณ๏ผˆใ‚ณใƒ”ใƒผ&ใƒšใƒผใ‚นใƒˆใ‚ขใ‚คใ‚ณใƒณ๏ผ‰ใ‚ˆใ‚Šใ‚ฏใƒชใƒƒใƒ—ใƒœใƒผใƒˆใ‹ใ‚‰ๅ…ฅๅŠ›ใ™ใ‚‹ใ“ใจใ‚‚ๅ‡บๆฅใพใ™ใ€‚
2. ใƒžใƒƒใƒ—ใฎ็”Ÿๆˆ: Submitใƒœใ‚ฟใƒณใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ™ใ‚‹ใจใ€้ธๆŠžใ—ใŸ็”ปๅƒใŒๅ‡ฆ็†ใ•ใ‚Œใ€้‡ใญๅˆใ‚ใ•ใ‚ŒใŸ้ก•่‘—ๆ€งใƒžใƒƒใƒ—ใŒ็”Ÿๆˆใ•ใ‚Œใพใ™ใ€‚
3. ็ตๆžœใฎ็ขบ่ช: ็”Ÿๆˆใ•ใ‚ŒใŸ้ก•่‘—ๆ€งใƒžใƒƒใƒ—ใฏใ€JETใ‚ฟใƒ–ใจHOTใ‚ฟใƒ–ใซ่กจ็คบใ•ใ‚Œใพใ™ใ€‚
### ๆดป็”จใ‚ขใ‚คใƒ‡ใ‚ข๐ŸŽจ
ใ“ใฎใƒ‡ใƒขใฏใ€ๅ‰ตไฝœๆดปๅ‹•ใฎ้š›ใซๆณจ็›ฎใ™ใ‚‹ใƒใ‚คใƒณใƒˆใ‚’่ฆ–่ฆšๅŒ–ใ™ใ‚‹ใŸใ‚ใซๅฝน็ซ‹ใกใพใ™ใ€‚่ฆ–่ฆšๅŒ–ใ•ใ‚ŒใŸ็ตๆžœใ‚’ๅŸบใซใ€ใฉใฎ้ƒจๅˆ†ใซๅŠ ็ญ†ใŒๅฟ…่ฆใ‹ใ‚’ๅˆคๆ–ญใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚
ใŸใจใˆใฐใ€้ก”ใฎ็›ฎใซๆณจ็›ฎใƒใ‚คใƒณใƒˆใŒๅฐ‘ใชใ„ๅ ดๅˆใ€ใใฎ้ƒจๅˆ†ใ‚’้‡็‚น็š„ใซๅŠ ็ญ†ใ™ใ‚‹ใ“ใจใงใ€ไฝœๅ“ๅ…จไฝ“ใฎ้ญ…ๅŠ›ใ‚’้ซ˜ใ‚ใ‚‹ใ“ใจใŒใงใใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚
ใ”ๅˆฉ็”จใ„ใŸใ ใใ€ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
""")
with gr.Accordion("Saliency Map User Guide", open=False):
gr.Markdown("""
## Learn about saliency maps:
A saliency map visually highlights important areas in an image, mimicking how humans focus on key information.
Each pixel is assigned a value representing attention level, highlighting regions of interest.
### Try the demo:
To use the saliency map demo, follow two steps
1. Upload an image or paste it from the clipboard.
2. Click "Submit" to generate and view the saliency map on separate tabs.
### Application Ideas๐ŸŽจ.
Useful for creative projects to identify points of interest and enhance appeal.
For instance, if eyes are focal points, focus enhancements there.
Thank you for your interest!
""")
algorithm_type = gr.Radio(
["SpectralResidual", "FineGrained"],
label="Saliency",
value="SpectralResidual",
interactive=True
)
submit_button = gr.Button("submit", variant="primary")
with gr.Tab("input", elem_id="input_tab"):
image_input = gr.Image(label="input", show_label=True, sources=["upload", "clipboard"])
with gr.Tab("overlay(JET)", elem_id="jet_tab"):
image_overlay_jet = gr.Image(label="jet", show_label=True, interactive=False)
with gr.Tab("overlay(HOT)", elem_id="hot_tab"):
image_overlay_hot = gr.Image(label="hot", show_label=True, interactive=False)
#
with gr.Accordion("Sample Image Gallery", open=False):
gr.Markdown("""
### ็”ปๅƒใฎใƒฉใ‚คใ‚ปใƒณใ‚น่กจ็คบ
็”ปๅƒใฎใƒฉใ‚คใ‚ปใƒณใ‚นใฏใ™ในใฆCC0(ใƒ‘ใƒ–ใƒชใƒƒใ‚ฏใƒ‰ใƒกใ‚คใƒณ)ใงใ™ใ€‚
""")
gallery = gr.Gallery(type="filepath",
value=["assets/black_256x256.webp",
"assets/grayscale_256x256.webp",
"assets/DSC_0108.webp",
"assets/DSC_0297.webp"],
label="Sample Gallery",
interactive=False,
#height=156,
columns=5,
allow_preview=False,
selected_index=0,
preview=False,
show_download_button=False,
show_share_button=False
)
# ใ‚ฎใƒฃใƒฉใƒชใƒผๅ†…ใฎ็”ปๅƒใ‚’้ธๆŠžๆ™‚
gallery.select(gallery_selected,
inputs=[gallery],
outputs=[image_input],
show_api=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.elapsed:.3f}s)ใ‚ขใƒ—ใƒชใ‚’็ต‚ไบ†ใ™ใ‚‹ใซใฏCtrl+Cใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚")
log.debug("reload")
if __name__ == "__main__":
# ใ‚ขใƒ—ใƒชใ‚’่ตทๅ‹•ใ—ใพใ™ใ€‚
# 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,
)