From 0dd8587ec30d8fa18473227857661aa1ae110f78 Mon Sep 17 00:00:00 2001 From: Adrian Hill Date: Tue, 20 Feb 2024 14:44:42 +0100 Subject: [PATCH 1/7] Add Configurations.jl --- Project.toml | 2 ++ src/VisionHeatmaps.jl | 1 + 2 files changed, 3 insertions(+) diff --git a/Project.toml b/Project.toml index eae97f3..06f98d7 100644 --- a/Project.toml +++ b/Project.toml @@ -5,6 +5,7 @@ version = "1.3.1" [deps] ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +Configurations = "5218b696-f38b-4ac9-8b61-a12ec717816d" ImageCore = "a09fc81d-aa75-5fe9-8630-4744c3626534" ImageTransformations = "02fcd773-0e25-5acc-982a-7f6622650795" Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" @@ -12,6 +13,7 @@ XAIBase = "9b48221d-a747-4c1b-9860-46a1d8ba24a7" [compat] ColorSchemes = "3" +Configurations = "0.17" ImageCore = "0.9, 0.10" ImageTransformations = "0.10" Interpolations = "0.15" diff --git a/src/VisionHeatmaps.jl b/src/VisionHeatmaps.jl index 27a59a8..4b18905 100644 --- a/src/VisionHeatmaps.jl +++ b/src/VisionHeatmaps.jl @@ -5,6 +5,7 @@ using ImageTransformations: imresize using Interpolations: Lanczos using ImageCore using XAIBase: Explanation, AbstractXAIMethod, analyze +using Configurations: @option include("heatmap.jl") include("overlay.jl") From bb6483a25a7a577661747de76dfb9460280bd7be Mon Sep 17 00:00:00 2001 From: Adrian Hill Date: Tue, 20 Feb 2024 14:45:49 +0100 Subject: [PATCH 2/7] Add `HeatmapOptions` struct to handle keyword arguments --- src/heatmap.jl | 54 ++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/heatmap.jl b/src/heatmap.jl index e926610..75b341e 100644 --- a/src/heatmap.jl +++ b/src/heatmap.jl @@ -2,6 +2,19 @@ const DEFAULT_COLORSCHEME = :seismic const DEFAULT_REDUCE = :sum const DEFAULT_RANGESCALE = :centered +@option struct HeatmapOptions + colorscheme::Union{ColorScheme,Symbol} = DEFAULT_COLORSCHEME + reduce::Symbol = DEFAULT_REDUCE + rangescale::Symbol = DEFAULT_RANGESCALE + permute::Bool = true + process_batch::Bool = false + unpack_singleton::Bool = true +end + +get_colorscheme(options::HeatmapOptions) = get_colorscheme(options.colorscheme) +get_colorscheme(c::ColorScheme) = c +get_colorscheme(s::Symbol)::ColorScheme = colorschemes[s] + """ heatmap(x::AbstractArray) @@ -23,37 +36,26 @@ Visualize 4D arrays as heatmaps, assuming the WHCN convention for input array di - `rangescale::Symbol`: Selects how the color channel reduced heatmap is normalized before the color scheme is applied. Can be either `:extrema` or `:centered`. Defaults to `:$DEFAULT_RANGESCALE`. +- `permute::Bool`: Whether to flip W&H input channels. Default is `true`. - `process_batch::Bool`: When heatmapping a batch, setting `process_batch=true` will apply the `rangescale` normalization to the entire batch instead of computing it individually for each sample in the batch. Defaults to `false`. -- `permute::Bool`: Whether to flip W&H input channels. Default is `true`. - `unpack_singleton::Bool`: If false, `heatmap` will always return a vector of images. When heatmapping a batch with a single sample, setting `unpack_singleton=true` will unpack the singleton vector and directly return the image. Defaults to `true`. """ -function heatmap( - val::AbstractArray{T,N}; - colorscheme::Union{ColorScheme,Symbol}=DEFAULT_COLORSCHEME, - reduce::Symbol=DEFAULT_REDUCE, - rangescale::Symbol=DEFAULT_RANGESCALE, - permute::Bool=true, - unpack_singleton::Bool=true, - process_batch::Bool=false, -) where {T,N} +heatmap(val; kwargs...) = heatmap(val, HeatmapOptions(; kwargs...)) +function heatmap(val::AbstractArray{T,N}, options::HeatmapOptions) where {T,N} N != 4 && throw(InputDimensionError) - colorscheme = get_colorscheme(colorscheme) - if unpack_singleton && size(val, 4) == 1 - return single_heatmap(val[:, :, :, 1], colorscheme, reduce, rangescale, permute) + if options.unpack_singleton && size(val, 4) == 1 + return single_heatmap(val[:, :, :, 1], options) end - if process_batch - hs = single_heatmap(val, colorscheme, reduce, rangescale, permute) + if options.process_batch + hs = single_heatmap(val, options) return [hs[:, :, i] for i in axes(hs, 3)] end - return [ - single_heatmap(v, colorscheme, reduce, rangescale, permute) for - v in eachslice(val; dims=4) - ] + return [single_heatmap(v, options) for v in eachslice(val; dims=4)] end const InputDimensionError = ArgumentError( @@ -61,16 +63,12 @@ const InputDimensionError = ArgumentError( Please reshape your input to match this format if your model doesn't adhere to this convention.", ) -get_colorscheme(c::ColorScheme) = c -get_colorscheme(s::Symbol)::ColorScheme = colorschemes[s] - # Lower level function, mapped along batch dimension -function single_heatmap( - val, colorscheme::ColorScheme, reduce::Symbol, rangescale::Symbol, permute::Bool -) - img = dropdims(reduce_color_channel(val, reduce); dims=3) - permute && (img = flip_wh(img)) - return get(colorscheme, img, rangescale) +function single_heatmap(val, options::HeatmapOptions) + img = dropdims(reduce_color_channel(val, options.reduce); dims=3) + options.permute && (img = flip_wh(img)) + cs = get_colorscheme(options) + return get(cs, img, options.rangescale) end flip_wh(img::AbstractArray{T,2}) where {T} = permutedims(img, (2, 1)) From e28be06e24512fbb4067c8d975445e51a7fc0bea Mon Sep 17 00:00:00 2001 From: Adrian Hill Date: Tue, 20 Feb 2024 14:46:01 +0100 Subject: [PATCH 3/7] Support XAIBase --- src/xaibase.jl | 52 +++++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/src/xaibase.jl b/src/xaibase.jl index 7e7e818..befdc3f 100644 --- a/src/xaibase.jl +++ b/src/xaibase.jl @@ -1,34 +1,22 @@ -struct HeatmapConfig - colorscheme::Symbol - reduce::Symbol - rangescale::Symbol -end - -const DEFAULT_HEATMAP_PRESET = HeatmapConfig( - DEFAULT_COLORSCHEME, DEFAULT_REDUCE, DEFAULT_RANGESCALE +const HEATMAP_PRESETS = Dict{Symbol,Function}( + :attribution => (kwargs...) -> HeatmapOptions(; colorscheme=:seismic, reduce=:sum, rangescale=:centered, kwargs...), + :sensitivity => (kwargs...) -> HeatmapOptions(; colorscheme=:grays, reduce=:norm, rangescale=:extrema, kwargs...), + :cam => (kwargs...) -> HeatmapOptions(; colorscheme=:jet, reduce=:sum, rangescale=:extrema, kwargs...), ) -const HEATMAP_PRESETS = Dict{Symbol,HeatmapConfig}( - :attribution => HeatmapConfig(:seismic, :sum, :centered), - :sensitivity => HeatmapConfig(:grays, :norm, :extrema), - :cam => HeatmapConfig(:jet, :sum, :extrema), -) - -# Select HeatmapConfig preset based on heatmapping style in Explanation -function get_heatmapping_config(heatmap::Symbol) - return get(HEATMAP_PRESETS, heatmap, DEFAULT_HEATMAP_PRESET) -end +DEFAULT_HEATMAP_PRESET = (kwargs...) -> HeatmapOptions(; kwargs...) # Override HeatmapConfig preset with keyword arguments -function get_heatmapping_config(expl::Explanation; kwargs...) - c = get_heatmapping_config(expl.heatmap) - - colorscheme = get(kwargs, :colorscheme, c.colorscheme) - rangescale = get(kwargs, :rangescale, c.rangescale) - reduce = get(kwargs, :reduce, c.reduce) - return HeatmapConfig(colorscheme, reduce, rangescale) +function get_heatmapping_options(expl::Explanation; kwargs...) + constructor = get(HEATMAP_PRESETS, expl.heatmap, DEFAULT_HEATMAP_PRESET) + options = constructor(kwargs...) + return options end +#=========# +# Heatmap # +#=========# + """ heatmap(expl::Explanation) @@ -39,14 +27,8 @@ This will use the default heatmapping style for the given type of explanation. Defaults can be overridden via keyword arguments. """ function heatmap(expl::Explanation; kwargs...) - c = get_heatmapping_config(expl; kwargs...) - return heatmap( - expl.val; - colorscheme=c.colorscheme, - reduce=c.reduce, - rangescale=c.rangescale, - kwargs..., - ) + options = get_heatmapping_options(expl; kwargs...) + return heatmap(expl.val, options) end """ @@ -61,7 +43,7 @@ Refer to the `analyze` documentation for more information on available keyword a To customize the heatmapping style, first compute an explanation using `analyze` and then call [`heatmap`](@ref) on the explanation. """ -function heatmap(input, analyzer::AbstractXAIMethod, args...; kwargs...) - expl = analyze(input, analyzer, args...; kwargs...) +function heatmap(input, analyzer::AbstractXAIMethod, analyze_args...; analyze_kwargs...) + expl = analyze(input, analyzer, analyze_args...; analyze_kwargs...) return heatmap(expl) end From 781f3d22e795fa89bc9741033d7c9d7348d6e2fc Mon Sep 17 00:00:00 2001 From: Adrian Hill Date: Tue, 20 Feb 2024 15:01:25 +0100 Subject: [PATCH 4/7] Update tests and references --- test/references/abssum_centered_grays.txt | 1 + test/references/abssum_centered_jet.txt | 1 + test/references/abssum_centered_seismic.txt | 1 + test/references/abssum_extrema_grays.txt | 1 + test/references/abssum_extrema_jet.txt | 1 + test/references/abssum_extrema_seismic.txt | 1 + test/references/maxabs_centered_grays.txt | 1 + test/references/maxabs_centered_jet.txt | 1 + test/references/maxabs_centered_seismic.txt | 1 + test/references/maxabs_extrema_grays.txt | 1 + test/references/maxabs_extrema_jet.txt | 1 + test/references/maxabs_extrema_seismic.txt | 1 + test/references/norm_centered_grays.txt | 1 + test/references/norm_centered_jet.txt | 1 + test/references/norm_centered_seismic.txt | 1 + test/references/norm_extrema_grays.txt | 1 + test/references/norm_extrema_jet.txt | 1 + test/references/norm_extrema_seismic.txt | 1 + ....txt => overlay_abssum_centered_grays.txt} | 0 ...ed.txt => overlay_abssum_centered_jet.txt} | 0 ...xt => overlay_abssum_centered_seismic.txt} | 0 ...a.txt => overlay_abssum_extrema_grays.txt} | 0 ...ema.txt => overlay_abssum_extrema_jet.txt} | 0 ...txt => overlay_abssum_extrema_seismic.txt} | 0 ....txt => overlay_maxabs_centered_grays.txt} | 0 ...ed.txt => overlay_maxabs_centered_jet.txt} | 0 .../overlay_maxabs_centered_seismic.txt | 1 + ...a.txt => overlay_maxabs_extrema_grays.txt} | 0 ...ema.txt => overlay_maxabs_extrema_jet.txt} | 0 .../overlay_maxabs_extrema_seismic.txt | 1 + .../overlay_norm_centered_grays.txt | 1 + test/references/overlay_norm_centered_jet.txt | 1 + .../overlay_norm_centered_seismic.txt | 1 + .../references/overlay_norm_extrema_grays.txt | 1 + test/references/overlay_norm_extrema_jet.txt | 1 + .../overlay_norm_extrema_seismic.txt | 1 + ...overlay_rescale_abssum_centered_grays.txt} | 0 ...> overlay_rescale_abssum_centered_jet.txt} | 0 ...erlay_rescale_abssum_centered_seismic.txt} | 0 ... overlay_rescale_abssum_extrema_grays.txt} | 0 ...=> overlay_rescale_abssum_extrema_jet.txt} | 0 ...verlay_rescale_abssum_extrema_seismic.txt} | 0 ...overlay_rescale_maxabs_centered_grays.txt} | 0 .../overlay_rescale_maxabs_centered_jet.txt | 3 ++ ...verlay_rescale_maxabs_centered_seismic.txt | 3 ++ ... overlay_rescale_maxabs_extrema_grays.txt} | 0 .../overlay_rescale_maxabs_extrema_jet.txt | 3 ++ ...overlay_rescale_maxabs_extrema_seismic.txt | 3 ++ ...> overlay_rescale_norm_centered_grays.txt} | 0 .../overlay_rescale_norm_centered_jet.txt | 3 ++ .../overlay_rescale_norm_centered_seismic.txt | 3 ++ ...=> overlay_rescale_norm_extrema_grays.txt} | 0 .../overlay_rescale_norm_extrema_jet.txt | 3 ++ .../overlay_rescale_norm_extrema_seismic.txt | 3 ++ .../overlay_rescale_sum_centered_grays.txt | 3 ++ .../overlay_rescale_sum_centered_jet.txt | 3 ++ .../overlay_rescale_sum_centered_seismic.txt | 3 ++ .../overlay_rescale_sum_extrema_grays.txt | 3 ++ .../overlay_rescale_sum_extrema_jet.txt | 3 ++ .../overlay_rescale_sum_extrema_seismic.txt | 3 ++ .../overlay_rescale_sumabs_centered_grays.txt | 3 ++ .../overlay_rescale_sumabs_centered_jet.txt | 3 ++ ...verlay_rescale_sumabs_centered_seismic.txt | 3 ++ .../overlay_rescale_sumabs_extrema_grays.txt | 3 ++ .../overlay_rescale_sumabs_extrema_jet.txt | 3 ++ ...overlay_rescale_sumabs_extrema_seismic.txt | 3 ++ .../references/overlay_sum_centered_grays.txt | 1 + test/references/overlay_sum_centered_jet.txt | 1 + .../overlay_sum_centered_seismic.txt | 1 + test/references/overlay_sum_extrema_grays.txt | 1 + test/references/overlay_sum_extrema_jet.txt | 1 + .../overlay_sum_extrema_seismic.txt | 1 + .../overlay_sumabs_centered_grays.txt | 1 + .../overlay_sumabs_centered_jet.txt | 1 + .../overlay_sumabs_centered_seismic.txt | 1 + .../overlay_sumabs_extrema_grays.txt | 1 + .../references/overlay_sumabs_extrema_jet.txt | 1 + .../overlay_sumabs_extrema_seismic.txt | 1 + test/references/sum_centered_grays.txt | 1 + test/references/sum_centered_jet.txt | 1 + test/references/sum_centered_seismic.txt | 1 + test/references/sum_extrema_grays.txt | 1 + test/references/sum_extrema_jet.txt | 1 + test/references/sum_extrema_seismic.txt | 1 + test/references/sumabs_centered_grays.txt | 1 + test/references/sumabs_centered_jet.txt | 1 + test/references/sumabs_centered_seismic.txt | 1 + test/references/sumabs_extrema_grays.txt | 1 + test/references/sumabs_extrema_jet.txt | 1 + test/references/sumabs_extrema_seismic.txt | 1 + test/test_heatmap.jl | 35 +++++++++------ test/test_xaibase.jl | 44 +++++++++++++------ 92 files changed, 162 insertions(+), 27 deletions(-) create mode 100644 test/references/abssum_centered_grays.txt create mode 100644 test/references/abssum_centered_jet.txt create mode 100644 test/references/abssum_centered_seismic.txt create mode 100644 test/references/abssum_extrema_grays.txt create mode 100644 test/references/abssum_extrema_jet.txt create mode 100644 test/references/abssum_extrema_seismic.txt create mode 100644 test/references/maxabs_centered_grays.txt create mode 100644 test/references/maxabs_centered_jet.txt create mode 100644 test/references/maxabs_centered_seismic.txt create mode 100644 test/references/maxabs_extrema_grays.txt create mode 100644 test/references/maxabs_extrema_jet.txt create mode 100644 test/references/maxabs_extrema_seismic.txt create mode 100644 test/references/norm_centered_grays.txt create mode 100644 test/references/norm_centered_jet.txt create mode 100644 test/references/norm_centered_seismic.txt create mode 100644 test/references/norm_extrema_grays.txt create mode 100644 test/references/norm_extrema_jet.txt create mode 100644 test/references/norm_extrema_seismic.txt rename test/references/{overlay_abssum_centered.txt => overlay_abssum_centered_grays.txt} (100%) rename test/references/{overlay_maxabs_centered.txt => overlay_abssum_centered_jet.txt} (100%) rename test/references/{overlay_norm_centered.txt => overlay_abssum_centered_seismic.txt} (100%) rename test/references/{overlay_abssum_extrema.txt => overlay_abssum_extrema_grays.txt} (100%) rename test/references/{overlay_maxabs_extrema.txt => overlay_abssum_extrema_jet.txt} (100%) rename test/references/{overlay_norm_extrema.txt => overlay_abssum_extrema_seismic.txt} (100%) rename test/references/{overlay_sum_centered.txt => overlay_maxabs_centered_grays.txt} (100%) rename test/references/{overlay_sumabs_centered.txt => overlay_maxabs_centered_jet.txt} (100%) create mode 100644 test/references/overlay_maxabs_centered_seismic.txt rename test/references/{overlay_sum_extrema.txt => overlay_maxabs_extrema_grays.txt} (100%) rename test/references/{overlay_sumabs_extrema.txt => overlay_maxabs_extrema_jet.txt} (100%) create mode 100644 test/references/overlay_maxabs_extrema_seismic.txt create mode 100644 test/references/overlay_norm_centered_grays.txt create mode 100644 test/references/overlay_norm_centered_jet.txt create mode 100644 test/references/overlay_norm_centered_seismic.txt create mode 100644 test/references/overlay_norm_extrema_grays.txt create mode 100644 test/references/overlay_norm_extrema_jet.txt create mode 100644 test/references/overlay_norm_extrema_seismic.txt rename test/references/{overlay_rescale_abssum_centered.txt => overlay_rescale_abssum_centered_grays.txt} (100%) rename test/references/{overlay_rescale_sum_centered.txt => overlay_rescale_abssum_centered_jet.txt} (100%) rename test/references/{overlay_rescale_sumabs_centered.txt => overlay_rescale_abssum_centered_seismic.txt} (100%) rename test/references/{overlay_rescale_abssum_extrema.txt => overlay_rescale_abssum_extrema_grays.txt} (100%) rename test/references/{overlay_rescale_maxabs_extrema.txt => overlay_rescale_abssum_extrema_jet.txt} (100%) rename test/references/{overlay_rescale_sum_extrema.txt => overlay_rescale_abssum_extrema_seismic.txt} (100%) rename test/references/{overlay_rescale_maxabs_centered.txt => overlay_rescale_maxabs_centered_grays.txt} (100%) create mode 100644 test/references/overlay_rescale_maxabs_centered_jet.txt create mode 100644 test/references/overlay_rescale_maxabs_centered_seismic.txt rename test/references/{overlay_rescale_sumabs_extrema.txt => overlay_rescale_maxabs_extrema_grays.txt} (100%) create mode 100644 test/references/overlay_rescale_maxabs_extrema_jet.txt create mode 100644 test/references/overlay_rescale_maxabs_extrema_seismic.txt rename test/references/{overlay_rescale_norm_centered.txt => overlay_rescale_norm_centered_grays.txt} (100%) create mode 100644 test/references/overlay_rescale_norm_centered_jet.txt create mode 100644 test/references/overlay_rescale_norm_centered_seismic.txt rename test/references/{overlay_rescale_norm_extrema.txt => overlay_rescale_norm_extrema_grays.txt} (100%) create mode 100644 test/references/overlay_rescale_norm_extrema_jet.txt create mode 100644 test/references/overlay_rescale_norm_extrema_seismic.txt create mode 100644 test/references/overlay_rescale_sum_centered_grays.txt create mode 100644 test/references/overlay_rescale_sum_centered_jet.txt create mode 100644 test/references/overlay_rescale_sum_centered_seismic.txt create mode 100644 test/references/overlay_rescale_sum_extrema_grays.txt create mode 100644 test/references/overlay_rescale_sum_extrema_jet.txt create mode 100644 test/references/overlay_rescale_sum_extrema_seismic.txt create mode 100644 test/references/overlay_rescale_sumabs_centered_grays.txt create mode 100644 test/references/overlay_rescale_sumabs_centered_jet.txt create mode 100644 test/references/overlay_rescale_sumabs_centered_seismic.txt create mode 100644 test/references/overlay_rescale_sumabs_extrema_grays.txt create mode 100644 test/references/overlay_rescale_sumabs_extrema_jet.txt create mode 100644 test/references/overlay_rescale_sumabs_extrema_seismic.txt create mode 100644 test/references/overlay_sum_centered_grays.txt create mode 100644 test/references/overlay_sum_centered_jet.txt create mode 100644 test/references/overlay_sum_centered_seismic.txt create mode 100644 test/references/overlay_sum_extrema_grays.txt create mode 100644 test/references/overlay_sum_extrema_jet.txt create mode 100644 test/references/overlay_sum_extrema_seismic.txt create mode 100644 test/references/overlay_sumabs_centered_grays.txt create mode 100644 test/references/overlay_sumabs_centered_jet.txt create mode 100644 test/references/overlay_sumabs_centered_seismic.txt create mode 100644 test/references/overlay_sumabs_extrema_grays.txt create mode 100644 test/references/overlay_sumabs_extrema_jet.txt create mode 100644 test/references/overlay_sumabs_extrema_seismic.txt create mode 100644 test/references/sum_centered_grays.txt create mode 100644 test/references/sum_centered_jet.txt create mode 100644 test/references/sum_centered_seismic.txt create mode 100644 test/references/sum_extrema_grays.txt create mode 100644 test/references/sum_extrema_jet.txt create mode 100644 test/references/sum_extrema_seismic.txt create mode 100644 test/references/sumabs_centered_grays.txt create mode 100644 test/references/sumabs_centered_jet.txt create mode 100644 test/references/sumabs_centered_seismic.txt create mode 100644 test/references/sumabs_extrema_grays.txt create mode 100644 test/references/sumabs_extrema_jet.txt create mode 100644 test/references/sumabs_extrema_seismic.txt diff --git a/test/references/abssum_centered_grays.txt b/test/references/abssum_centered_grays.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/abssum_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/abssum_centered_jet.txt b/test/references/abssum_centered_jet.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/abssum_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/abssum_centered_seismic.txt b/test/references/abssum_centered_seismic.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/abssum_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/abssum_extrema_grays.txt b/test/references/abssum_extrema_grays.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/abssum_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/abssum_extrema_jet.txt b/test/references/abssum_extrema_jet.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/abssum_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/abssum_extrema_seismic.txt b/test/references/abssum_extrema_seismic.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/abssum_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/maxabs_centered_grays.txt b/test/references/maxabs_centered_grays.txt new file mode 100644 index 0000000..4e4381a --- /dev/null +++ b/test/references/maxabs_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/maxabs_centered_jet.txt b/test/references/maxabs_centered_jet.txt new file mode 100644 index 0000000..4e4381a --- /dev/null +++ b/test/references/maxabs_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/maxabs_centered_seismic.txt b/test/references/maxabs_centered_seismic.txt new file mode 100644 index 0000000..4e4381a --- /dev/null +++ b/test/references/maxabs_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/maxabs_extrema_grays.txt b/test/references/maxabs_extrema_grays.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/maxabs_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/maxabs_extrema_jet.txt b/test/references/maxabs_extrema_jet.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/maxabs_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/maxabs_extrema_seismic.txt b/test/references/maxabs_extrema_seismic.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/maxabs_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/norm_centered_grays.txt b/test/references/norm_centered_grays.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/norm_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/norm_centered_jet.txt b/test/references/norm_centered_jet.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/norm_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/norm_centered_seismic.txt b/test/references/norm_centered_seismic.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/norm_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/norm_extrema_grays.txt b/test/references/norm_extrema_grays.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/norm_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/norm_extrema_jet.txt b/test/references/norm_extrema_jet.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/norm_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/norm_extrema_seismic.txt b/test/references/norm_extrema_seismic.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/norm_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_abssum_centered.txt b/test/references/overlay_abssum_centered_grays.txt similarity index 100% rename from test/references/overlay_abssum_centered.txt rename to test/references/overlay_abssum_centered_grays.txt diff --git a/test/references/overlay_maxabs_centered.txt b/test/references/overlay_abssum_centered_jet.txt similarity index 100% rename from test/references/overlay_maxabs_centered.txt rename to test/references/overlay_abssum_centered_jet.txt diff --git a/test/references/overlay_norm_centered.txt b/test/references/overlay_abssum_centered_seismic.txt similarity index 100% rename from test/references/overlay_norm_centered.txt rename to test/references/overlay_abssum_centered_seismic.txt diff --git a/test/references/overlay_abssum_extrema.txt b/test/references/overlay_abssum_extrema_grays.txt similarity index 100% rename from test/references/overlay_abssum_extrema.txt rename to test/references/overlay_abssum_extrema_grays.txt diff --git a/test/references/overlay_maxabs_extrema.txt b/test/references/overlay_abssum_extrema_jet.txt similarity index 100% rename from test/references/overlay_maxabs_extrema.txt rename to test/references/overlay_abssum_extrema_jet.txt diff --git a/test/references/overlay_norm_extrema.txt b/test/references/overlay_abssum_extrema_seismic.txt similarity index 100% rename from test/references/overlay_norm_extrema.txt rename to test/references/overlay_abssum_extrema_seismic.txt diff --git a/test/references/overlay_sum_centered.txt b/test/references/overlay_maxabs_centered_grays.txt similarity index 100% rename from test/references/overlay_sum_centered.txt rename to test/references/overlay_maxabs_centered_grays.txt diff --git a/test/references/overlay_sumabs_centered.txt b/test/references/overlay_maxabs_centered_jet.txt similarity index 100% rename from test/references/overlay_sumabs_centered.txt rename to test/references/overlay_maxabs_centered_jet.txt diff --git a/test/references/overlay_maxabs_centered_seismic.txt b/test/references/overlay_maxabs_centered_seismic.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_maxabs_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sum_extrema.txt b/test/references/overlay_maxabs_extrema_grays.txt similarity index 100% rename from test/references/overlay_sum_extrema.txt rename to test/references/overlay_maxabs_extrema_grays.txt diff --git a/test/references/overlay_sumabs_extrema.txt b/test/references/overlay_maxabs_extrema_jet.txt similarity index 100% rename from test/references/overlay_sumabs_extrema.txt rename to test/references/overlay_maxabs_extrema_jet.txt diff --git a/test/references/overlay_maxabs_extrema_seismic.txt b/test/references/overlay_maxabs_extrema_seismic.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_maxabs_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_norm_centered_grays.txt b/test/references/overlay_norm_centered_grays.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_norm_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_norm_centered_jet.txt b/test/references/overlay_norm_centered_jet.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_norm_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_norm_centered_seismic.txt b/test/references/overlay_norm_centered_seismic.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_norm_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_norm_extrema_grays.txt b/test/references/overlay_norm_extrema_grays.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_norm_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_norm_extrema_jet.txt b/test/references/overlay_norm_extrema_jet.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_norm_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_norm_extrema_seismic.txt b/test/references/overlay_norm_extrema_seismic.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_norm_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_abssum_centered.txt b/test/references/overlay_rescale_abssum_centered_grays.txt similarity index 100% rename from test/references/overlay_rescale_abssum_centered.txt rename to test/references/overlay_rescale_abssum_centered_grays.txt diff --git a/test/references/overlay_rescale_sum_centered.txt b/test/references/overlay_rescale_abssum_centered_jet.txt similarity index 100% rename from test/references/overlay_rescale_sum_centered.txt rename to test/references/overlay_rescale_abssum_centered_jet.txt diff --git a/test/references/overlay_rescale_sumabs_centered.txt b/test/references/overlay_rescale_abssum_centered_seismic.txt similarity index 100% rename from test/references/overlay_rescale_sumabs_centered.txt rename to test/references/overlay_rescale_abssum_centered_seismic.txt diff --git a/test/references/overlay_rescale_abssum_extrema.txt b/test/references/overlay_rescale_abssum_extrema_grays.txt similarity index 100% rename from test/references/overlay_rescale_abssum_extrema.txt rename to test/references/overlay_rescale_abssum_extrema_grays.txt diff --git a/test/references/overlay_rescale_maxabs_extrema.txt b/test/references/overlay_rescale_abssum_extrema_jet.txt similarity index 100% rename from test/references/overlay_rescale_maxabs_extrema.txt rename to test/references/overlay_rescale_abssum_extrema_jet.txt diff --git a/test/references/overlay_rescale_sum_extrema.txt b/test/references/overlay_rescale_abssum_extrema_seismic.txt similarity index 100% rename from test/references/overlay_rescale_sum_extrema.txt rename to test/references/overlay_rescale_abssum_extrema_seismic.txt diff --git a/test/references/overlay_rescale_maxabs_centered.txt b/test/references/overlay_rescale_maxabs_centered_grays.txt similarity index 100% rename from test/references/overlay_rescale_maxabs_centered.txt rename to test/references/overlay_rescale_maxabs_centered_grays.txt diff --git a/test/references/overlay_rescale_maxabs_centered_jet.txt b/test/references/overlay_rescale_maxabs_centered_jet.txt new file mode 100644 index 0000000..e7a720c --- /dev/null +++ b/test/references/overlay_rescale_maxabs_centered_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_maxabs_centered_seismic.txt b/test/references/overlay_rescale_maxabs_centered_seismic.txt new file mode 100644 index 0000000..e7a720c --- /dev/null +++ b/test/references/overlay_rescale_maxabs_centered_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sumabs_extrema.txt b/test/references/overlay_rescale_maxabs_extrema_grays.txt similarity index 100% rename from test/references/overlay_rescale_sumabs_extrema.txt rename to test/references/overlay_rescale_maxabs_extrema_grays.txt diff --git a/test/references/overlay_rescale_maxabs_extrema_jet.txt b/test/references/overlay_rescale_maxabs_extrema_jet.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_maxabs_extrema_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_maxabs_extrema_seismic.txt b/test/references/overlay_rescale_maxabs_extrema_seismic.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_maxabs_extrema_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_norm_centered.txt b/test/references/overlay_rescale_norm_centered_grays.txt similarity index 100% rename from test/references/overlay_rescale_norm_centered.txt rename to test/references/overlay_rescale_norm_centered_grays.txt diff --git a/test/references/overlay_rescale_norm_centered_jet.txt b/test/references/overlay_rescale_norm_centered_jet.txt new file mode 100644 index 0000000..863212c --- /dev/null +++ b/test/references/overlay_rescale_norm_centered_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_norm_centered_seismic.txt b/test/references/overlay_rescale_norm_centered_seismic.txt new file mode 100644 index 0000000..863212c --- /dev/null +++ b/test/references/overlay_rescale_norm_centered_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_norm_extrema.txt b/test/references/overlay_rescale_norm_extrema_grays.txt similarity index 100% rename from test/references/overlay_rescale_norm_extrema.txt rename to test/references/overlay_rescale_norm_extrema_grays.txt diff --git a/test/references/overlay_rescale_norm_extrema_jet.txt b/test/references/overlay_rescale_norm_extrema_jet.txt new file mode 100644 index 0000000..d46bb45 --- /dev/null +++ b/test/references/overlay_rescale_norm_extrema_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_norm_extrema_seismic.txt b/test/references/overlay_rescale_norm_extrema_seismic.txt new file mode 100644 index 0000000..d46bb45 --- /dev/null +++ b/test/references/overlay_rescale_norm_extrema_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sum_centered_grays.txt b/test/references/overlay_rescale_sum_centered_grays.txt new file mode 100644 index 0000000..bcfcb11 --- /dev/null +++ b/test/references/overlay_rescale_sum_centered_grays.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sum_centered_jet.txt b/test/references/overlay_rescale_sum_centered_jet.txt new file mode 100644 index 0000000..bcfcb11 --- /dev/null +++ b/test/references/overlay_rescale_sum_centered_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sum_centered_seismic.txt b/test/references/overlay_rescale_sum_centered_seismic.txt new file mode 100644 index 0000000..bcfcb11 --- /dev/null +++ b/test/references/overlay_rescale_sum_centered_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sum_extrema_grays.txt b/test/references/overlay_rescale_sum_extrema_grays.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_sum_extrema_grays.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sum_extrema_jet.txt b/test/references/overlay_rescale_sum_extrema_jet.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_sum_extrema_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sum_extrema_seismic.txt b/test/references/overlay_rescale_sum_extrema_seismic.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_sum_extrema_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sumabs_centered_grays.txt b/test/references/overlay_rescale_sumabs_centered_grays.txt new file mode 100644 index 0000000..bcfcb11 --- /dev/null +++ b/test/references/overlay_rescale_sumabs_centered_grays.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sumabs_centered_jet.txt b/test/references/overlay_rescale_sumabs_centered_jet.txt new file mode 100644 index 0000000..bcfcb11 --- /dev/null +++ b/test/references/overlay_rescale_sumabs_centered_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sumabs_centered_seismic.txt b/test/references/overlay_rescale_sumabs_centered_seismic.txt new file mode 100644 index 0000000..bcfcb11 --- /dev/null +++ b/test/references/overlay_rescale_sumabs_centered_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sumabs_extrema_grays.txt b/test/references/overlay_rescale_sumabs_extrema_grays.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_sumabs_extrema_grays.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sumabs_extrema_jet.txt b/test/references/overlay_rescale_sumabs_extrema_jet.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_sumabs_extrema_jet.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_rescale_sumabs_extrema_seismic.txt b/test/references/overlay_rescale_sumabs_extrema_seismic.txt new file mode 100644 index 0000000..bccc955 --- /dev/null +++ b/test/references/overlay_rescale_sumabs_extrema_seismic.txt @@ -0,0 +1,3 @@ +▀▀▀▀▀▀ +▀▀▀▀▀▀ +▀▀▀▀▀▀ \ No newline at end of file diff --git a/test/references/overlay_sum_centered_grays.txt b/test/references/overlay_sum_centered_grays.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_sum_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sum_centered_jet.txt b/test/references/overlay_sum_centered_jet.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_sum_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sum_centered_seismic.txt b/test/references/overlay_sum_centered_seismic.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_sum_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sum_extrema_grays.txt b/test/references/overlay_sum_extrema_grays.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_sum_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sum_extrema_jet.txt b/test/references/overlay_sum_extrema_jet.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_sum_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sum_extrema_seismic.txt b/test/references/overlay_sum_extrema_seismic.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_sum_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sumabs_centered_grays.txt b/test/references/overlay_sumabs_centered_grays.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_sumabs_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sumabs_centered_jet.txt b/test/references/overlay_sumabs_centered_jet.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_sumabs_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sumabs_centered_seismic.txt b/test/references/overlay_sumabs_centered_seismic.txt new file mode 100644 index 0000000..57d3560 --- /dev/null +++ b/test/references/overlay_sumabs_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sumabs_extrema_grays.txt b/test/references/overlay_sumabs_extrema_grays.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_sumabs_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sumabs_extrema_jet.txt b/test/references/overlay_sumabs_extrema_jet.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_sumabs_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/overlay_sumabs_extrema_seismic.txt b/test/references/overlay_sumabs_extrema_seismic.txt new file mode 100644 index 0000000..0c01456 --- /dev/null +++ b/test/references/overlay_sumabs_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sum_centered_grays.txt b/test/references/sum_centered_grays.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/sum_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sum_centered_jet.txt b/test/references/sum_centered_jet.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/sum_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sum_centered_seismic.txt b/test/references/sum_centered_seismic.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/sum_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sum_extrema_grays.txt b/test/references/sum_extrema_grays.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/sum_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sum_extrema_jet.txt b/test/references/sum_extrema_jet.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/sum_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sum_extrema_seismic.txt b/test/references/sum_extrema_seismic.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/sum_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sumabs_centered_grays.txt b/test/references/sumabs_centered_grays.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/sumabs_centered_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sumabs_centered_jet.txt b/test/references/sumabs_centered_jet.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/sumabs_centered_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sumabs_centered_seismic.txt b/test/references/sumabs_centered_seismic.txt new file mode 100644 index 0000000..fd55c97 --- /dev/null +++ b/test/references/sumabs_centered_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sumabs_extrema_grays.txt b/test/references/sumabs_extrema_grays.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/sumabs_extrema_grays.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sumabs_extrema_jet.txt b/test/references/sumabs_extrema_jet.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/sumabs_extrema_jet.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/references/sumabs_extrema_seismic.txt b/test/references/sumabs_extrema_seismic.txt new file mode 100644 index 0000000..d00dbcc --- /dev/null +++ b/test/references/sumabs_extrema_seismic.txt @@ -0,0 +1 @@ +▀▀ \ No newline at end of file diff --git a/test/test_heatmap.jl b/test/test_heatmap.jl index bf9efc3..53eb924 100644 --- a/test/test_heatmap.jl +++ b/test/test_heatmap.jl @@ -9,29 +9,36 @@ batch = reshape(collect(Float32, 1:prod(shape)), shape) img = [RGB(1, 0, 0) RGB(0, 1, 0); RGB(0, 0, 1) RGB(1, 1, 1)] img2 = [RGB(x, y, 0) for x in 0:0.2:1, y in 0:0.2:1] +colorschemes = [:seismic, :grays, :jet] reducers = [:sum, :maxabs, :norm, :sumabs, :abssum] rangescales = [:extrema, :centered] @testset "Single input" begin - for reducer in reducers - for rangescale in rangescales - h = heatmap(A; reduce=reducer, rangescale=rangescale) - @test_reference "references/$(reducer)_$(rangescale).txt" h - h2 = heatmap(A; reduce=reducer, rangescale=rangescale, unpack_singleton=false)[1] - @test h ≈ h2 + for colorscheme in colorschemes + for reducer in reducers + for rangescale in rangescales + h = heatmap(A; reduce=reducer, rangescale=rangescale) + @test_reference "references/$(reducer)_$(rangescale)_$(colorscheme).txt" h + h2 = heatmap( + A; reduce=reducer, rangescale=rangescale, unpack_singleton=false + )[1] + @test h ≈ h2 - ho = heatmap_overlay(A, img; reduce=reducer, rangescale=rangescale) - @test size(ho) == size(img) - @test_reference "references/overlay_$(reducer)_$(rangescale).txt" ho + ho = heatmap_overlay(A, img; reduce=reducer, rangescale=rangescale) + @test size(ho) == size(img) + @test_reference "references/overlay_$(reducer)_$(rangescale)_$(colorscheme).txt" ho + end end end end @testset "Overlay rescaling" begin - for reducer in reducers - for rangescale in rangescales - ho = heatmap_overlay(A, img2; reduce=reducer, rangescale=rangescale) - @test size(ho) == size(img2) - @test_reference "references/overlay_rescale_$(reducer)_$(rangescale).txt" ho + for colorscheme in colorschemes + for reducer in reducers + for rangescale in rangescales + ho = heatmap_overlay(A, img2; reduce=reducer, rangescale=rangescale) + @test size(ho) == size(img2) + @test_reference "references/overlay_rescale_$(reducer)_$(rangescale)_$(colorscheme).txt" ho + end end end end diff --git a/test/test_xaibase.jl b/test/test_xaibase.jl index b200550..4614c83 100644 --- a/test/test_xaibase.jl +++ b/test/test_xaibase.jl @@ -5,19 +5,37 @@ using XAIBase @testset "Single input" begin shape = (2, 2, 3, 1) val = output = reshape(collect(Float32, 1:prod(shape)), shape) - output_selection = [CartesianIndex(1, 2)] # irrelevant - expl = Explanation(val, output, [output_selection], :LRP, :attribution) - - reducers = [:sum, :maxabs, :norm, :sumabs, :abssum] - rangescales = [:extrema, :centered] - for reducer in reducers - for rangescale in rangescales - local h = heatmap(expl; reduce=reducer, rangescale=rangescale) - @test_reference "references/$(reducer)_$(rangescale).txt" h - h2 = heatmap( - expl; reduce=reducer, rangescale=rangescale, unpack_singleton=false - )[1] - @test h ≈ h2 + output_selection = [[CartesianIndex(1, 2)]] # irrelevant + + # Test presets + @testset "Heatmapping presets" begin + expl = Explanation(val, output, output_selection, :DummyAnalyzer, :attribution) + h = heatmap(expl) + @test_reference "references/sum_centered_seismic.txt" h + expl = Explanation(val, output, output_selection, :DummyAnalyzer, :sensitivity) + h = heatmap(expl; colorscheme=:seismic) + @test_reference "references/norm_extrema_grays.txt" h + expl = Explanation(val, output, output_selection, :DummyAnalyzer, :cam) + h = heatmap(expl; colorscheme=:seismic) + @test_reference "references/sum_extrema_jet.txt" h + end + + @testset "Overriding presets" begin + # The following Explanation selects the jet colorscheme + expl = Explanation(val, output, output_selection, :DummyAnalyzer, :attribution) + + # Custom configuration + reducers = [:sum, :maxabs, :norm, :sumabs, :abssum] + rangescales = [:extrema, :centered] + for reducer in reducers + for rangescale in rangescales + local h = heatmap(expl; reduce=reducer, rangescale=rangescale) + @test_reference "references/$(reducer)_$(rangescale)_jet.txt" h + h2 = heatmap( + expl; reduce=reducer, rangescale=rangescale, unpack_singleton=false + )[1] + @test h ≈ h2 + end end end end From 81591fdbb324c3f0ac66ddaddef774991bc3c03e Mon Sep 17 00:00:00 2001 From: Adrian Hill Date: Tue, 20 Feb 2024 15:27:03 +0100 Subject: [PATCH 5/7] Fixes to XAIBase --- src/xaibase.jl | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/xaibase.jl b/src/xaibase.jl index befdc3f..cebf35f 100644 --- a/src/xaibase.jl +++ b/src/xaibase.jl @@ -1,16 +1,21 @@ -const HEATMAP_PRESETS = Dict{Symbol,Function}( - :attribution => (kwargs...) -> HeatmapOptions(; colorscheme=:seismic, reduce=:sum, rangescale=:centered, kwargs...), - :sensitivity => (kwargs...) -> HeatmapOptions(; colorscheme=:grays, reduce=:norm, rangescale=:extrema, kwargs...), - :cam => (kwargs...) -> HeatmapOptions(; colorscheme=:jet, reduce=:sum, rangescale=:extrema, kwargs...), +const HEATMAP_PRESETS = Dict{ + Symbol,@NamedTuple{colorscheme::Symbol, reduce::Symbol, rangescale::Symbol} +}( + :attribution => (colorscheme=:seismic, reduce=:sum, rangescale=:centered), + :sensitivity => (colorscheme=:grays, reduce=:norm, rangescale=:extrema), + :cam => (colorscheme=:jet, reduce=:sum, rangescale=:extrema), ) -DEFAULT_HEATMAP_PRESET = (kwargs...) -> HeatmapOptions(; kwargs...) +DEFAULT_HEATMAP_PRESET = ( + colorscheme=DEFAULT_COLORSCHEME, reduce=DEFAULT_REDUCE, rangescale=DEFAULT_RANGESCALE +), # Override HeatmapConfig preset with keyword arguments -function get_heatmapping_options(expl::Explanation; kwargs...) - constructor = get(HEATMAP_PRESETS, expl.heatmap, DEFAULT_HEATMAP_PRESET) - options = constructor(kwargs...) - return options +function HeatmapOptions(expl::Explanation; kwargs...) + c = get(HEATMAP_PRESETS, expl.heatmap, DEFAULT_HEATMAP_PRESET) + return HeatmapOptions(; + colorscheme=c.colorscheme, reduce=c.reduce, rangescale=c.rangescale, kwargs... + ) end #=========# @@ -26,10 +31,7 @@ Assumes WHCN convention (width, height, channels, batch dimension) for `explanat This will use the default heatmapping style for the given type of explanation. Defaults can be overridden via keyword arguments. """ -function heatmap(expl::Explanation; kwargs...) - options = get_heatmapping_options(expl; kwargs...) - return heatmap(expl.val, options) -end +heatmap(expl::Explanation; kwargs...) = heatmap(expl.val, HeatmapOptions(expl; kwargs...)) """ heatmap(input::AbstractArray, analyzer::AbstractXAIMethod) From 2758e82fe13d77cc6e736b38204b117ff186b5a7 Mon Sep 17 00:00:00 2001 From: Adrian Hill Date: Tue, 20 Feb 2024 15:27:23 +0100 Subject: [PATCH 6/7] Use `HeatmapOptions` in heatmap overlays --- src/overlay.jl | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/overlay.jl b/src/overlay.jl index 23148f4..5ef5d96 100644 --- a/src/overlay.jl +++ b/src/overlay.jl @@ -1,4 +1,5 @@ const DEFAULT_OVERLAY_ALPHA = 0.6 +const DEFAULT_RESIZE_METHOD = Lanczos(1) """ heatmap_overlay(val, img) @@ -19,8 +20,8 @@ function heatmap_overlay( val::AbstractArray{T,N}, im::AbstractMatrix{<:Colorant}; alpha=DEFAULT_OVERLAY_ALPHA, - resize_method=Lanczos(1), - kwargs..., + resize_method=DEFAULT_RESIZE_METHOD, + heatmap_kwargs..., ) where {T,N} N != 4 && throw(InputDimensionError) if size(val, 4) != 1 @@ -33,7 +34,9 @@ function heatmap_overlay( if alpha < 0 || alpha > 1 throw(ArgumentError("alpha must be in the range [0, 1]")) end - hm = heatmap(val; kwargs...) + + options = HeatmapOptions(; heatmap_kwargs...) + hm = heatmap(val, options) hmsize = size(hm) imsize = size(im) if hmsize != imsize From 0a95dedd2e8a1516c40b33ce0f42bbe7f7d18198 Mon Sep 17 00:00:00 2001 From: Adrian Hill Date: Tue, 20 Feb 2024 15:36:09 +0100 Subject: [PATCH 7/7] Reorganized source code: * added config.jl file * removed xaibase.jl and moved all `heatmap` methods into heatmap.jl --- src/VisionHeatmaps.jl | 6 ++--- src/config.jl | 39 +++++++++++++++++++++++++++++++ src/heatmap.jl | 53 +++++++++++++++++++++++++++++-------------- src/xaibase.jl | 51 ----------------------------------------- 4 files changed, 78 insertions(+), 71 deletions(-) create mode 100644 src/config.jl delete mode 100644 src/xaibase.jl diff --git a/src/VisionHeatmaps.jl b/src/VisionHeatmaps.jl index 4b18905..fcc413d 100644 --- a/src/VisionHeatmaps.jl +++ b/src/VisionHeatmaps.jl @@ -7,9 +7,9 @@ using ImageCore using XAIBase: Explanation, AbstractXAIMethod, analyze using Configurations: @option -include("heatmap.jl") -include("overlay.jl") -include("xaibase.jl") +include("config.jl") # HeatmapOptions +include("heatmap.jl") # heatmap +include("overlay.jl") # heatmap_overlay export heatmap, heatmap_overlay diff --git a/src/config.jl b/src/config.jl new file mode 100644 index 0000000..20d056a --- /dev/null +++ b/src/config.jl @@ -0,0 +1,39 @@ +const DEFAULT_COLORSCHEME = :seismic +const DEFAULT_REDUCE = :sum +const DEFAULT_RANGESCALE = :centered + +@option struct HeatmapOptions + colorscheme::Union{ColorScheme,Symbol} = DEFAULT_COLORSCHEME + reduce::Symbol = DEFAULT_REDUCE + rangescale::Symbol = DEFAULT_RANGESCALE + permute::Bool = true + process_batch::Bool = false + unpack_singleton::Bool = true +end + +get_colorscheme(options::HeatmapOptions) = get_colorscheme(options.colorscheme) +get_colorscheme(c::ColorScheme) = c +get_colorscheme(s::Symbol)::ColorScheme = colorschemes[s] + +#=================# +# XAIBase support # +#=================# + +const HEATMAP_PRESETS = Dict{ + Symbol,@NamedTuple{colorscheme::Symbol, reduce::Symbol, rangescale::Symbol} +}( + :attribution => (colorscheme=:seismic, reduce=:sum, rangescale=:centered), + :sensitivity => (colorscheme=:grays, reduce=:norm, rangescale=:extrema), + :cam => (colorscheme=:jet, reduce=:sum, rangescale=:extrema), +) +const DEFAULT_HEATMAP_PRESET = ( + colorscheme=DEFAULT_COLORSCHEME, reduce=DEFAULT_REDUCE, rangescale=DEFAULT_RANGESCALE +) + +# Override HeatmapOptions preset with keyword arguments +function HeatmapOptions(expl::Explanation; kwargs...) + c = get(HEATMAP_PRESETS, expl.heatmap, DEFAULT_HEATMAP_PRESET) + return HeatmapOptions(; + colorscheme=c.colorscheme, reduce=c.reduce, rangescale=c.rangescale, kwargs... + ) +end diff --git a/src/heatmap.jl b/src/heatmap.jl index 75b341e..853464b 100644 --- a/src/heatmap.jl +++ b/src/heatmap.jl @@ -2,18 +2,10 @@ const DEFAULT_COLORSCHEME = :seismic const DEFAULT_REDUCE = :sum const DEFAULT_RANGESCALE = :centered -@option struct HeatmapOptions - colorscheme::Union{ColorScheme,Symbol} = DEFAULT_COLORSCHEME - reduce::Symbol = DEFAULT_REDUCE - rangescale::Symbol = DEFAULT_RANGESCALE - permute::Bool = true - process_batch::Bool = false - unpack_singleton::Bool = true -end - -get_colorscheme(options::HeatmapOptions) = get_colorscheme(options.colorscheme) -get_colorscheme(c::ColorScheme) = c -get_colorscheme(s::Symbol)::ColorScheme = colorschemes[s] +const InputDimensionError = ArgumentError( + "heatmap assumes the WHCN convention for input array dimensions (width, height, color channels, batch dimension). + Please reshape your input to match this format if your model doesn't adhere to this convention.", +) """ heatmap(x::AbstractArray) @@ -58,11 +50,6 @@ function heatmap(val::AbstractArray{T,N}, options::HeatmapOptions) where {T,N} return [single_heatmap(v, options) for v in eachslice(val; dims=4)] end -const InputDimensionError = ArgumentError( - "heatmap assumes the WHCN convention for input array dimensions (width, height, color channels, batch dimension). - Please reshape your input to match this format if your model doesn't adhere to this convention.", -) - # Lower level function, mapped along batch dimension function single_heatmap(val, options::HeatmapOptions) img = dropdims(reduce_color_channel(val, options.reduce); dims=3) @@ -96,3 +83,35 @@ function reduce_color_channel(val::AbstractArray, method::Symbol) ), ) end + +#=================# +# XAIBase support # +#=================# + +""" + heatmap(expl::Explanation) + +Visualize `Explanation` from XAIBase as a vision heatmap. +Assumes WHCN convention (width, height, channels, batch dimension) for `explanation.val`. + +This will use the default heatmapping style for the given type of explanation. +Defaults can be overridden via keyword arguments. +""" +heatmap(expl::Explanation; kwargs...) = heatmap(expl.val, HeatmapOptions(expl; kwargs...)) + +""" + heatmap(input::AbstractArray, analyzer::AbstractXAIMethod) + +Compute an `Explanation` for a given `input` using the XAI method `analyzer` and visualize it +as a vision heatmap. + +Any additional arguments and keyword arguments are passed to the analyzer. +Refer to the `analyze` documentation for more information on available keyword arguments. + +To customize the heatmapping style, first compute an explanation using `analyze` +and then call [`heatmap`](@ref) on the explanation. +""" +function heatmap(input, analyzer::AbstractXAIMethod, analyze_args...; analyze_kwargs...) + expl = analyze(input, analyzer, analyze_args...; analyze_kwargs...) + return heatmap(expl) +end diff --git a/src/xaibase.jl b/src/xaibase.jl deleted file mode 100644 index cebf35f..0000000 --- a/src/xaibase.jl +++ /dev/null @@ -1,51 +0,0 @@ -const HEATMAP_PRESETS = Dict{ - Symbol,@NamedTuple{colorscheme::Symbol, reduce::Symbol, rangescale::Symbol} -}( - :attribution => (colorscheme=:seismic, reduce=:sum, rangescale=:centered), - :sensitivity => (colorscheme=:grays, reduce=:norm, rangescale=:extrema), - :cam => (colorscheme=:jet, reduce=:sum, rangescale=:extrema), -) - -DEFAULT_HEATMAP_PRESET = ( - colorscheme=DEFAULT_COLORSCHEME, reduce=DEFAULT_REDUCE, rangescale=DEFAULT_RANGESCALE -), - -# Override HeatmapConfig preset with keyword arguments -function HeatmapOptions(expl::Explanation; kwargs...) - c = get(HEATMAP_PRESETS, expl.heatmap, DEFAULT_HEATMAP_PRESET) - return HeatmapOptions(; - colorscheme=c.colorscheme, reduce=c.reduce, rangescale=c.rangescale, kwargs... - ) -end - -#=========# -# Heatmap # -#=========# - -""" - heatmap(expl::Explanation) - -Visualize `Explanation` from XAIBase as a vision heatmap. -Assumes WHCN convention (width, height, channels, batch dimension) for `explanation.val`. - -This will use the default heatmapping style for the given type of explanation. -Defaults can be overridden via keyword arguments. -""" -heatmap(expl::Explanation; kwargs...) = heatmap(expl.val, HeatmapOptions(expl; kwargs...)) - -""" - heatmap(input::AbstractArray, analyzer::AbstractXAIMethod) - -Compute an `Explanation` for a given `input` using the XAI method `analyzer` and visualize it -as a vision heatmap. - -Any additional arguments and keyword arguments are passed to the analyzer. -Refer to the `analyze` documentation for more information on available keyword arguments. - -To customize the heatmapping style, first compute an explanation using `analyze` -and then call [`heatmap`](@ref) on the explanation. -""" -function heatmap(input, analyzer::AbstractXAIMethod, analyze_args...; analyze_kwargs...) - expl = analyze(input, analyzer, analyze_args...; analyze_kwargs...) - return heatmap(expl) -end