File size: 9,224 Bytes
1bf41f9
 
 
 
b76540e
0977623
 
 
 
 
 
1bf41f9
3a900c7
b76540e
0977623
 
 
8ccf878
 
0977623
 
8ccf878
1bf41f9
0977623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35e7d15
0977623
35e7d15
0977623
 
 
 
35e7d15
0977623
 
35e7d15
0977623
 
 
 
8ccf878
0977623
447b452
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0977623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22c52a4
 
0977623
e93672e
0977623
 
d260fc4
 
22c52a4
 
d260fc4
 
 
447b452
 
d260fc4
447b452
0977623
d260fc4
 
 
 
 
 
 
 
 
 
 
 
 
 
e93672e
0977623
d2f0d15
e93672e
d2f0d15
e93672e
d2f0d15
e93672e
0977623
24090d2
 
 
 
 
 
 
 
277b552
447b452
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0977623
 
 
 
 
 
 
 
 
 
447b452
0977623
 
447b452
8ccf878
1bf41f9
 
0977623
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# -*- 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!  

        """)

    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("Advanced options", open=False):
        algorithm_type = gr.Radio(
            ["SpectralResidual", "FineGrained"],
            label="Saliency",
            value="SpectralResidual",
            interactive=True
        )

    with gr.Accordion("Examples", 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,
    )