SaliencyMapDemo / app.py
umyuu
้ก•่‘—ๆ€งใƒžใƒƒใƒ—ใซใคใ„ใฆใฎ่ฃœ่ถณ่ชฌๆ˜Žใ‚’่ฟฝ่จ˜
22c52a4
raw
history blame
8.88 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ใ‚ตใƒผใƒ“ใ‚นใ‚’่ตทๅ‹•ใ—ใพใ™ใ€‚
analytics_enabled=False
https://github.com/gradio-app/gradio/issues/4226
ใƒ›ใƒƒใƒˆใƒชใƒญใƒผใƒ‰ๅฏพๅฟœใจใ—ใฆใ€topใƒฌใƒ™ใƒซใฎใ‚คใƒณใƒ‡ใƒณใƒˆใซใ€‚
https://www.gradio.app/guides/developing-faster-with-reload-mode
"""
with gr.Blocks(
analytics_enabled=False,
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ใ‚ฟใƒ–ใซ่กจ็คบใ—ใพใ™ใ€‚
### ๆดป็”จใ‚ขใ‚คใƒ‡ใ‚ข๐ŸŽจ
ใ“ใฎใƒ‡ใƒขใฏใ€ๅ‰ตไฝœๆดปๅ‹•ใฎ้š›ใซๆณจ็›ฎใ™ใ‚‹ใƒใ‚คใƒณใƒˆใ‚’่ฆ–่ฆšๅŒ–ใ™ใ‚‹ใŸใ‚ใซๅฝน็ซ‹ใกใพใ™ใ€‚่ฆ–่ฆšๅŒ–ใ•ใ‚ŒใŸ็ตๆžœใ‚’ๅŸบใซใ€ใฉใฎ้ƒจๅˆ†ใซๅŠ ็ญ†ใŒๅฟ…่ฆใ‹ใ‚’ๅˆคๆ–ญใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚
ไพ‹ใˆใฐใ€็›ฎใซๆณจ็›ฎใ™ใ‚‹ใƒใ‚คใƒณใƒˆใŒๅฐ‘ใชใ„ๅ ดๅˆใฏใ€็›ฎใ‚’้‡็‚น็š„ใซๅŠ ็ญ†ใ™ใ‚‹ใ“ใจใงใ€ไฝœๅ“ๅ…จไฝ“ใฎ้ญ…ๅŠ›ใ‚’้ซ˜ใ‚ใ‚‹ใ“ใจใŒใงใใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚
ใ”ๅˆฉ็”จใ„ใŸใ ใใ€ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
""")
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)
#
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,
)