From d66314d12f627361dfcdeb5a7698c4a2388f1f70 Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Tue, 26 May 2020 18:36:15 +0530 Subject: [PATCH 01/14] Add turbo color map --- blueoil/common.py | 56 +++++++++++++++++++----------------- blueoil/turbo_cmap_data.npy | Bin 0 -> 6272 bytes 2 files changed, 29 insertions(+), 27 deletions(-) create mode 100644 blueoil/turbo_cmap_data.npy diff --git a/blueoil/common.py b/blueoil/common.py index f33885d8d..71df1dc5c 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -16,6 +16,7 @@ from __future__ import division import math +import numpy as np from enum import Enum @@ -26,34 +27,35 @@ class Tasks(Enum): KEYPOINT_DETECTION = "IMAGE.KEYPOINT_DETECTION" -# Color Palette for General Purpose -# Sample image is here -# https://github.com/blue-oil/blueoil/tree/master/docs/_static/color_map.png -COLOR_MAP = [ - (192, 0, 128), # COLOR00 - (0, 128, 192), # COLOR01 - (0, 128, 64), # COLOR02 - (128, 0, 0), # COLOR03 - (64, 0, 128), # COLOR04 - (64, 0, 192), # COLOR05 - (192, 128, 64), # COLOR06 - (192, 192, 128), # COLOR07 - (64, 64, 128), # COLOR08 - (128, 0, 192), # COLOR09 - (192, 0, 64), # COLOR10 - (128, 128, 64), # COLOR11 - (192, 0, 192), # COLOR12 - (128, 64, 64), # COLOR13 - (64, 192, 128), # COLOR14 - (64, 64, 0), # COLOR15 - (128, 64, 128), # COLOR16 - (128, 128, 192), # COLOR17 - (0, 0, 192), # COLOR18 - (192, 128, 128) # COLOR19 -] +# Color Palette for all tasks: Turbo color map: +# https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html +# The colormap allows for a large number of quantization levels: +# https://github.com/blue-oil/blueoil/tree/master/docs/_static/turbo_cmap.png +# Implementation inspired from the following gist: +# https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f +TURBO_CMAP_DATA = np.load('turbo_cmap_data.npy') +def interpolate(colormap, x): + x = max(0.0, min(1.0, x)) + a = int(x*255.0) + b = min(255, a + 1) + f = x*255.0 - a + return [colormap[a][0] + (colormap[b][0] - colormap[a][0]) * f, + colormap[a][1] + (colormap[b][1] - colormap[a][1]) * f, + colormap[a][2] + (colormap[b][2] - colormap[a][2]) * f] + +def interpolate_or_clip(colormap, x): + if x < 0.0: return [0.0, 0.0, 0.0] + elif x > 1.0: return [1.0, 1.0, 1.0] + else: return interpolate(colormap, x) def get_color_map(length): # This function generate arbitrary length color map. - color_map = COLOR_MAP * int(math.ceil(length / len(COLOR_MAP))) - return color_map[:length] + # First of all, generate `length` uniformly spaced floats in [0, 1] + x = np.linspace(0.0, 1.0, num=length, endpoint=True) + color_map = [] + for x_i in x: + color = interpolate_or_clip(TURBO_CMAP_DATA, x_i) + color = [int(c * 255) for c in color] + color_map.append(color) + return color_map diff --git a/blueoil/turbo_cmap_data.npy b/blueoil/turbo_cmap_data.npy new file mode 100644 index 0000000000000000000000000000000000000000..dce4ff5395570d8607af13468eda5bfeff2cfb2a GIT binary patch literal 6272 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 w*U&rMKJXl Date: Wed, 27 May 2020 01:10:08 +0900 Subject: [PATCH 02/14] Make changes for PR --- blueoil/common.py | 69 ++++++++-- blueoil/turbo_cmap_data.npy | Bin 6272 -> 0 bytes blueoil/turbo_color_map.py | 258 ++++++++++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+), 13 deletions(-) delete mode 100644 blueoil/turbo_cmap_data.npy create mode 100644 blueoil/turbo_color_map.py diff --git a/blueoil/common.py b/blueoil/common.py index 71df1dc5c..a3527b8cf 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -19,6 +19,8 @@ import numpy as np from enum import Enum +from blueoil.turbo_color_map import TURBO_CMAP_DATA + class Tasks(Enum): CLASSIFICATION = "IMAGE.CLASSIFICATION" @@ -27,14 +29,44 @@ class Tasks(Enum): KEYPOINT_DETECTION = "IMAGE.KEYPOINT_DETECTION" -# Color Palette for all tasks: Turbo color map: +# Color Palette for General Purpose +# Sample image is here +# https://github.com/blue-oil/blueoil/tree/master/docs/_static/color_map.png +COLOR_MAP = [ + (192, 0, 128), # COLOR00 + (0, 128, 192), # COLOR01 + (0, 128, 64), # COLOR02 + (128, 0, 0), # COLOR03 + (64, 0, 128), # COLOR04 + (64, 0, 192), # COLOR05 + (192, 128, 64), # COLOR06 + (192, 192, 128), # COLOR07 + (64, 64, 128), # COLOR08 + (128, 0, 192), # COLOR09 + (192, 0, 64), # COLOR10 + (128, 128, 64), # COLOR11 + (192, 0, 192), # COLOR12 + (128, 64, 64), # COLOR13 + (64, 192, 128), # COLOR14 + (64, 64, 0), # COLOR15 + (128, 64, 128), # COLOR16 + (128, 128, 192), # COLOR17 + (0, 0, 192), # COLOR18 + (192, 128, 128) # COLOR19 +] + + +def get_color_map(length): + # This function generate arbitrary length color map. + color_map = COLOR_MAP * int(math.ceil(length / len(COLOR_MAP))) + return color_map[:length] + +# For replacing the Matplotlib Jet colormap, we use the Turbo color map # https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html # The colormap allows for a large number of quantization levels: # https://github.com/blue-oil/blueoil/tree/master/docs/_static/turbo_cmap.png # Implementation inspired from the following gist: # https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f -TURBO_CMAP_DATA = np.load('turbo_cmap_data.npy') - def interpolate(colormap, x): x = max(0.0, min(1.0, x)) a = int(x*255.0) @@ -44,18 +76,29 @@ def interpolate(colormap, x): colormap[a][1] + (colormap[b][1] - colormap[a][1]) * f, colormap[a][2] + (colormap[b][2] - colormap[a][2]) * f] + def interpolate_or_clip(colormap, x): if x < 0.0: return [0.0, 0.0, 0.0] elif x > 1.0: return [1.0, 1.0, 1.0] else: return interpolate(colormap, x) -def get_color_map(length): - # This function generate arbitrary length color map. - # First of all, generate `length` uniformly spaced floats in [0, 1] - x = np.linspace(0.0, 1.0, num=length, endpoint=True) - color_map = [] - for x_i in x: - color = interpolate_or_clip(TURBO_CMAP_DATA, x_i) - color = [int(c * 255) for c in color] - color_map.append(color) - return color_map + +def color_map_apply(image): + TURBO_CMAP_DATA = np.asarray(TURBO_CMAP_DATA) + image = np.asarray(image) + # If image range is [0, 1], continue ahead. Else convert to that range. + if image.max() > 1.0: + image = (image - image.min()) / image.max() + + x = image.clip(0.0, 1.0) + a = (x * 255).astype(int) + b = (a + 1).clip(max=255) + f = x * 255.0 - a + image_colored = ( + TURBO_CMAP_DATA[a] + + (TURBO_CMAP_DATA[b] - TURBO_CMAP_DATA[a]) * f[..., None] + ) + image_colored[image < 0.0] = 0.0 + image_colored[image > 1.0] = 1.0 + return image_colored + diff --git a/blueoil/turbo_cmap_data.npy b/blueoil/turbo_cmap_data.npy deleted file mode 100644 index dce4ff5395570d8607af13468eda5bfeff2cfb2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6272 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 w*U&rMKJXl Date: Wed, 27 May 2020 02:02:04 +0900 Subject: [PATCH 03/14] Fix pep8 test erors --- blueoil/common.py | 17 +++-- blueoil/turbo_color_map.py | 140 ++++++++++++++++++------------------- 2 files changed, 80 insertions(+), 77 deletions(-) diff --git a/blueoil/common.py b/blueoil/common.py index a3527b8cf..66548e456 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -61,6 +61,7 @@ def get_color_map(length): color_map = COLOR_MAP * int(math.ceil(length / len(COLOR_MAP))) return color_map[:length] + # For replacing the Matplotlib Jet colormap, we use the Turbo color map # https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html # The colormap allows for a large number of quantization levels: @@ -78,13 +79,16 @@ def interpolate(colormap, x): def interpolate_or_clip(colormap, x): - if x < 0.0: return [0.0, 0.0, 0.0] - elif x > 1.0: return [1.0, 1.0, 1.0] - else: return interpolate(colormap, x) + if x < 0.0: + return [0.0, 0.0, 0.0] + elif x > 1.0: + return [1.0, 1.0, 1.0] + else: + return interpolate(colormap, x) def color_map_apply(image): - TURBO_CMAP_DATA = np.asarray(TURBO_CMAP_DATA) + turbo_cmap_data = np.asarray(TURBO_CMAP_DATA) image = np.asarray(image) # If image range is [0, 1], continue ahead. Else convert to that range. if image.max() > 1.0: @@ -95,10 +99,9 @@ def color_map_apply(image): b = (a + 1).clip(max=255) f = x * 255.0 - a image_colored = ( - TURBO_CMAP_DATA[a] - + (TURBO_CMAP_DATA[b] - TURBO_CMAP_DATA[a]) * f[..., None] + turbo_cmap_data[a] + + (turbo_cmap_data[b] - turbo_cmap_data[a]) * f[..., None] ) image_colored[image < 0.0] = 0.0 image_colored[image > 1.0] = 1.0 return image_colored - diff --git a/blueoil/turbo_color_map.py b/blueoil/turbo_color_map.py index 8bc536d2f..685e9bd13 100644 --- a/blueoil/turbo_color_map.py +++ b/blueoil/turbo_color_map.py @@ -3,30 +3,30 @@ [0.19483, 0.08339, 0.26149], [0.19956, 0.09498, 0.29024], [0.20415, 0.10652, 0.31844], - [0.2086 , 0.11802, 0.34607], + [0.20860, 0.11802, 0.34607], [0.21291, 0.12947, 0.37314], [0.21708, 0.14087, 0.39964], [0.22111, 0.15223, 0.42558], - [0.225 , 0.16354, 0.45096], + [0.22500, 0.16354, 0.45096], [0.22875, 0.17481, 0.47578], [0.23236, 0.18603, 0.50004], - [0.23582, 0.1972 , 0.52373], + [0.23582, 0.19720, 0.52373], [0.23915, 0.20833, 0.54686], [0.24234, 0.21941, 0.56942], [0.24539, 0.23044, 0.59142], - [0.2483 , 0.24143, 0.61286], + [0.24830, 0.24143, 0.61286], [0.25107, 0.25237, 0.63374], [0.25369, 0.26327, 0.65406], [0.25618, 0.27412, 0.67381], - [0.25853, 0.28492, 0.693 ], + [0.25853, 0.28492, 0.69300], [0.26074, 0.29568, 0.71162], - [0.2628 , 0.30639, 0.72968], + [0.26280, 0.30639, 0.72968], [0.26473, 0.31706, 0.74718], [0.26652, 0.32768, 0.76412], - [0.26816, 0.33825, 0.7805 ], + [0.26816, 0.33825, 0.78050], [0.26967, 0.34878, 0.79631], [0.27103, 0.35926, 0.81156], - [0.27226, 0.3697 , 0.82624], + [0.27226, 0.36970, 0.82624], [0.27334, 0.38008, 0.84037], [0.27429, 0.39043, 0.85393], [0.27509, 0.40072, 0.86692], @@ -36,19 +36,19 @@ [0.27691, 0.44145, 0.91328], [0.27701, 0.45152, 0.92347], [0.27698, 0.46153, 0.93309], - [0.2768 , 0.47151, 0.94214], + [0.27680, 0.47151, 0.94214], [0.27648, 0.48144, 0.95064], [0.27603, 0.49132, 0.95857], [0.27543, 0.50115, 0.96594], [0.27469, 0.51094, 0.97275], [0.27381, 0.52069, 0.97899], - [0.27273, 0.5304 , 0.98461], - [0.27106, 0.54015, 0.9893 ], + [0.27273, 0.53040, 0.98461], + [0.27106, 0.54015, 0.98930], [0.26878, 0.54995, 0.99303], [0.26592, 0.55979, 0.99583], [0.26252, 0.56967, 0.99773], [0.25862, 0.57958, 0.99876], - [0.25425, 0.5895 , 0.99896], + [0.25425, 0.58950, 0.99896], [0.24946, 0.59943, 0.99835], [0.24427, 0.60937, 0.99697], [0.23874, 0.61931, 0.99485], @@ -58,39 +58,39 @@ [0.21382, 0.65886, 0.97959], [0.20708, 0.66866, 0.97423], [0.20021, 0.67842, 0.96833], - [0.19326, 0.68812, 0.9619 ], + [0.19326, 0.68812, 0.96190], [0.18625, 0.69775, 0.95498], [0.17923, 0.70732, 0.94761], - [0.17223, 0.7168 , 0.93981], - [0.16529, 0.7262 , 0.93161], + [0.17223, 0.71680, 0.93981], + [0.16529, 0.72620, 0.93161], [0.15844, 0.73551, 0.92305], [0.15173, 0.74472, 0.91416], [0.14519, 0.75381, 0.90496], - [0.13886, 0.76279, 0.8955 ], - [0.13278, 0.77165, 0.8858 ], - [0.12698, 0.78037, 0.8759 ], + [0.13886, 0.76279, 0.89550], + [0.13278, 0.77165, 0.88580], + [0.12698, 0.78037, 0.87590], [0.12151, 0.78896, 0.86581], - [0.11639, 0.7974 , 0.85559], + [0.11639, 0.79740, 0.85559], [0.11167, 0.80569, 0.84525], [0.10738, 0.81381, 0.83484], [0.10357, 0.82177, 0.82437], [0.10026, 0.82955, 0.81389], - [0.0975 , 0.83714, 0.80342], + [0.09750, 0.83714, 0.80342], [0.09532, 0.84455, 0.79299], [0.09377, 0.85175, 0.78264], - [0.09287, 0.85875, 0.7724 ], - [0.09267, 0.86554, 0.7623 ], - [0.0932 , 0.87211, 0.75237], + [0.09287, 0.85875, 0.77240], + [0.09267, 0.86554, 0.76230], + [0.09320, 0.87211, 0.75237], [0.09451, 0.87844, 0.74265], [0.09662, 0.88454, 0.73316], - [0.09958, 0.8904 , 0.72393], - [0.10342, 0.896 , 0.715 ], + [0.09958, 0.89040, 0.72393], + [0.10342, 0.89600, 0.71500], [0.10815, 0.90142, 0.70599], [0.11374, 0.90673, 0.69651], - [0.12014, 0.91193, 0.6866 ], + [0.12014, 0.91193, 0.68660], [0.12733, 0.91701, 0.67627], [0.13526, 0.92197, 0.66556], - [0.14391, 0.9268 , 0.65448], + [0.14391, 0.92680, 0.65448], [0.15323, 0.93151, 0.64308], [0.16319, 0.93609, 0.63137], [0.17377, 0.94053, 0.61938], @@ -100,7 +100,7 @@ [0.22142, 0.95692, 0.56914], [0.23449, 0.96065, 0.55614], [0.24797, 0.96423, 0.54303], - [0.2618 , 0.96765, 0.52981], + [0.26180, 0.96765, 0.52981], [0.27597, 0.97092, 0.51653], [0.29042, 0.97403, 0.50321], [0.30513, 0.97697, 0.48987], @@ -113,66 +113,66 @@ [0.41229, 0.99268, 0.39826], [0.42778, 0.99419, 0.38575], [0.44321, 0.99551, 0.37345], - [0.45854, 0.99663, 0.3614 ], + [0.45854, 0.99663, 0.36140], [0.47375, 0.99755, 0.34963], [0.48879, 0.99828, 0.33816], [0.50362, 0.99879, 0.32701], - [0.51822, 0.9991 , 0.31622], + [0.51822, 0.99910, 0.31622], [0.53255, 0.99919, 0.30581], [0.54658, 0.99907, 0.29581], [0.56026, 0.99873, 0.28623], [0.57357, 0.99817, 0.27712], [0.58646, 0.99739, 0.26849], [0.59891, 0.99638, 0.26038], - [0.61088, 0.99514, 0.2528 ], + [0.61088, 0.99514, 0.25280], [0.62233, 0.99366, 0.24579], [0.63323, 0.99195, 0.23937], [0.64362, 0.98999, 0.23356], [0.65394, 0.98775, 0.22835], - [0.66428, 0.98524, 0.2237 ], - [0.67462, 0.98246, 0.2196 ], + [0.66428, 0.98524, 0.22370], + [0.67462, 0.98246, 0.21960], [0.68494, 0.97941, 0.21602], - [0.69525, 0.9761 , 0.21294], + [0.69525, 0.97610, 0.21294], [0.70553, 0.97255, 0.21032], [0.71577, 0.96875, 0.20815], - [0.72596, 0.9647 , 0.2064 ], - [0.7361 , 0.96043, 0.20504], + [0.72596, 0.96470, 0.20640], + [0.73610, 0.96043, 0.20504], [0.74617, 0.95593, 0.20406], [0.75617, 0.95121, 0.20343], [0.76608, 0.94627, 0.20311], - [0.77591, 0.94113, 0.2031 ], + [0.77591, 0.94113, 0.20310], [0.78563, 0.93579, 0.20336], [0.79524, 0.93025, 0.20386], [0.80473, 0.92452, 0.20459], - [0.8141 , 0.91861, 0.20552], + [0.81410, 0.91861, 0.20552], [0.82333, 0.91253, 0.20663], [0.83241, 0.90627, 0.20788], [0.84133, 0.89986, 0.20926], - [0.8501 , 0.89328, 0.21074], - [0.85868, 0.88655, 0.2123 ], + [0.85010, 0.89328, 0.21074], + [0.85868, 0.88655, 0.21230], [0.86709, 0.87968, 0.21391], - [0.8753 , 0.87267, 0.21555], + [0.87530, 0.87267, 0.21555], [0.88331, 0.86553, 0.21719], - [0.89112, 0.85826, 0.2188 ], - [0.8987 , 0.85087, 0.22038], + [0.89112, 0.85826, 0.21880], + [0.89870, 0.85087, 0.22038], [0.90605, 0.84337, 0.22188], [0.91317, 0.83576, 0.22328], [0.92004, 0.82806, 0.22456], - [0.92666, 0.82025, 0.2257 ], + [0.92666, 0.82025, 0.22570], [0.93301, 0.81236, 0.22667], [0.93909, 0.80439, 0.22744], - [0.94489, 0.79634, 0.228 ], + [0.94489, 0.79634, 0.22800], [0.95039, 0.78823, 0.22831], - [0.9556 , 0.78005, 0.22836], + [0.95560, 0.78005, 0.22836], [0.96049, 0.77181, 0.22811], [0.96507, 0.76352, 0.22754], [0.96931, 0.75519, 0.22663], [0.97323, 0.74682, 0.22536], [0.97679, 0.73842, 0.22369], - [0.98 , 0.73 , 0.22161], - [0.98289, 0.7214 , 0.21918], - [0.98549, 0.7125 , 0.2165 ], - [0.98781, 0.7033 , 0.21358], + [0.98000, 0.73000, 0.22161], + [0.98289, 0.72140, 0.21918], + [0.98549, 0.71250, 0.21650], + [0.98781, 0.70330, 0.21358], [0.98986, 0.69382, 0.21043], [0.99163, 0.68408, 0.20706], [0.99314, 0.67408, 0.20348], @@ -187,18 +187,18 @@ [0.99517, 0.57549, 0.16412], [0.99419, 0.56386, 0.15918], [0.99297, 0.55214, 0.15417], - [0.99153, 0.54036, 0.1491 ], + [0.99153, 0.54036, 0.14910], [0.98987, 0.52854, 0.14398], [0.98799, 0.51667, 0.13883], - [0.9859 , 0.50479, 0.13367], - [0.9836 , 0.49291, 0.12849], + [0.98590, 0.50479, 0.13367], + [0.98360, 0.49291, 0.12849], [0.98108, 0.48104, 0.12332], - [0.97837, 0.4692 , 0.11817], - [0.97545, 0.4574 , 0.11305], + [0.97837, 0.46920, 0.11817], + [0.97545, 0.45740, 0.11305], [0.97234, 0.44565, 0.10797], [0.96904, 0.43399, 0.10294], [0.96555, 0.42241, 0.09798], - [0.96187, 0.41093, 0.0931 ], + [0.96187, 0.41093, 0.09310], [0.95801, 0.39958, 0.08831], [0.95398, 0.38836, 0.08362], [0.94977, 0.37729, 0.07905], @@ -208,7 +208,7 @@ [0.93125, 0.33482, 0.06218], [0.92623, 0.32473, 0.05837], [0.92105, 0.31489, 0.05475], - [0.91572, 0.3053 , 0.05134], + [0.91572, 0.30530, 0.05134], [0.91024, 0.29599, 0.04814], [0.90463, 0.28696, 0.04516], [0.89888, 0.27824, 0.04243], @@ -216,18 +216,18 @@ [0.88691, 0.26152, 0.03753], [0.88066, 0.25334, 0.03521], [0.87422, 0.24526, 0.03297], - [0.8676 , 0.2373 , 0.03082], + [0.86760, 0.23730, 0.03082], [0.86079, 0.22945, 0.02875], - [0.8538 , 0.2217 , 0.02677], + [0.85380, 0.22170, 0.02677], [0.84662, 0.21407, 0.02487], [0.83926, 0.20654, 0.02305], [0.83172, 0.19912, 0.02131], [0.82399, 0.19182, 0.01966], [0.81608, 0.18462, 0.01809], - [0.80799, 0.17753, 0.0166 ], - [0.79971, 0.17055, 0.0152 ], + [0.80799, 0.17753, 0.01660], + [0.79971, 0.17055, 0.01520], [0.79125, 0.16368, 0.01387], - [0.7826 , 0.15693, 0.01264], + [0.78260, 0.15693, 0.01264], [0.77377, 0.15028, 0.01148], [0.76476, 0.14374, 0.01041], [0.75556, 0.13731, 0.00942], @@ -235,24 +235,24 @@ [0.73661, 0.12477, 0.00769], [0.72686, 0.11867, 0.00695], [0.71692, 0.11268, 0.00629], - [0.7068 , 0.1068 , 0.00571], - [0.6965 , 0.10102, 0.00522], + [0.70680, 0.10680, 0.00571], + [0.69650, 0.10102, 0.00522], [0.68602, 0.09536, 0.00481], - [0.67535, 0.0898 , 0.00449], + [0.67535, 0.08980, 0.00449], [0.66449, 0.08436, 0.00424], [0.65345, 0.07902, 0.00408], - [0.64223, 0.0738 , 0.00401], + [0.64223, 0.07380, 0.00401], [0.63082, 0.06868, 0.00401], - [0.61923, 0.06367, 0.0041 ], + [0.61923, 0.06367, 0.00410], [0.60746, 0.05878, 0.00427], - [0.5955 , 0.05399, 0.00453], + [0.59550, 0.05399, 0.00453], [0.58336, 0.04931, 0.00486], [0.57103, 0.04474, 0.00529], [0.55852, 0.04028, 0.00579], [0.54583, 0.03593, 0.00638], [0.53295, 0.03169, 0.00705], - [0.51989, 0.02756, 0.0078 ], + [0.51989, 0.02756, 0.00780], [0.50664, 0.02354, 0.00863], [0.49321, 0.01963, 0.00955], - [0.4796 , 0.01583, 0.01055] + [0.47960, 0.01583, 0.01055] ] From e5f075386b86f6fee238a782d2611b21f535498c Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Thu, 28 May 2020 20:22:01 +0900 Subject: [PATCH 04/14] Add symlink and turbo_cmap in static docs --- docs/_static/turbo_cmap.png | Bin 0 -> 31074 bytes .../python/blueoil/turbo_color_map.py | 1 + 2 files changed, 1 insertion(+) create mode 100644 docs/_static/turbo_cmap.png create mode 120000 output_template/python/blueoil/turbo_color_map.py diff --git a/docs/_static/turbo_cmap.png b/docs/_static/turbo_cmap.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8139e0adbd0ec2d2c2dd51a12d165863aa3afe GIT binary patch literal 31074 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 literal 0 HcmV?d00001 diff --git a/output_template/python/blueoil/turbo_color_map.py b/output_template/python/blueoil/turbo_color_map.py new file mode 120000 index 000000000..845c37cd4 --- /dev/null +++ b/output_template/python/blueoil/turbo_color_map.py @@ -0,0 +1 @@ +blueoil/turbo_color_map.py \ No newline at end of file From 5575a8abd46898939c429b6d116f66696e0c9f15 Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Fri, 29 May 2020 13:00:25 +0900 Subject: [PATCH 05/14] Update turbo_color_map symlink --- output_template/python/blueoil/turbo_color_map.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/output_template/python/blueoil/turbo_color_map.py b/output_template/python/blueoil/turbo_color_map.py index 845c37cd4..8b80e0860 120000 --- a/output_template/python/blueoil/turbo_color_map.py +++ b/output_template/python/blueoil/turbo_color_map.py @@ -1 +1 @@ -blueoil/turbo_color_map.py \ No newline at end of file +../../../blueoil/turbo_color_map.py \ No newline at end of file From 7409446f125e5ccf79e524b89969aa2b6e4d1dca Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Mon, 1 Jun 2020 11:07:34 +0900 Subject: [PATCH 06/14] Add LICENSE header in turbo_color_map --- blueoil/turbo_color_map.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/blueoil/turbo_color_map.py b/blueoil/turbo_color_map.py index 685e9bd13..7573cb143 100644 --- a/blueoil/turbo_color_map.py +++ b/blueoil/turbo_color_map.py @@ -1,3 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 The Blueoil Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + TURBO_CMAP_DATA = [ [0.18995, 0.07176, 0.23217], [0.19483, 0.08339, 0.26149], From c6a15d8d0c955ff5fdda56ad240db8cc086039cf Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Mon, 1 Jun 2020 11:36:29 +0900 Subject: [PATCH 07/14] Trailing whitespaces - copy paste problem --- blueoil/turbo_color_map.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/blueoil/turbo_color_map.py b/blueoil/turbo_color_map.py index 7573cb143..b012bf24e 100644 --- a/blueoil/turbo_color_map.py +++ b/blueoil/turbo_color_map.py @@ -1,17 +1,17 @@ -# -*- coding: utf-8 -*- -# Copyright 2018 The Blueoil Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# -*- coding: utf-8 -*- +# Copyright 2018 The Blueoil Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. # ============================================================================= TURBO_CMAP_DATA = [ From 7adde5a167dd82cfc90fdc5d910de846cfb52c27 Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Tue, 9 Jun 2020 20:54:39 +0900 Subject: [PATCH 08/14] Update according to comments. Remove unwanted code --- blueoil/common.py | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/blueoil/common.py b/blueoil/common.py index 66548e456..be393ae1c 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -68,33 +68,11 @@ def get_color_map(length): # https://github.com/blue-oil/blueoil/tree/master/docs/_static/turbo_cmap.png # Implementation inspired from the following gist: # https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f -def interpolate(colormap, x): - x = max(0.0, min(1.0, x)) - a = int(x*255.0) - b = min(255, a + 1) - f = x*255.0 - a - return [colormap[a][0] + (colormap[b][0] - colormap[a][0]) * f, - colormap[a][1] + (colormap[b][1] - colormap[a][1]) * f, - colormap[a][2] + (colormap[b][2] - colormap[a][2]) * f] - - -def interpolate_or_clip(colormap, x): - if x < 0.0: - return [0.0, 0.0, 0.0] - elif x > 1.0: - return [1.0, 1.0, 1.0] - else: - return interpolate(colormap, x) - - -def color_map_apply(image): +def apply_color_map(image): turbo_cmap_data = np.asarray(TURBO_CMAP_DATA) - image = np.asarray(image) - # If image range is [0, 1], continue ahead. Else convert to that range. - if image.max() > 1.0: - image = (image - image.min()) / image.max() + x = np.asarray(image) + x = x.clip(0., 1.) - x = image.clip(0.0, 1.0) a = (x * 255).astype(int) b = (a + 1).clip(max=255) f = x * 255.0 - a @@ -102,6 +80,4 @@ def color_map_apply(image): turbo_cmap_data[a] + (turbo_cmap_data[b] - turbo_cmap_data[a]) * f[..., None] ) - image_colored[image < 0.0] = 0.0 - image_colored[image > 1.0] = 1.0 return image_colored From cae723562c73b68a1a9f206448e36bf06cca7efe Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Wed, 10 Jun 2020 15:17:44 +0900 Subject: [PATCH 09/14] Use numpy modf --- blueoil/common.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/blueoil/common.py b/blueoil/common.py index be393ae1c..6f7bd5cc9 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -73,9 +73,21 @@ def apply_color_map(image): x = np.asarray(image) x = x.clip(0., 1.) - a = (x * 255).astype(int) + # Use numpy.modf to get the integer and decimal parts of feature values + # in the input feature map (or heatmap) that has to be colored. + # Example: + # >>> import numpy as np + # >>> x = np.array([1.2, 2.3, 4.5, 20.45, 6.75, 8.88]) + # >>> f, i = np.modf(x) # returns a tuple of length 2 + # >>> print(i.shape, f.shape) + # >>> (6,) (6,) + # >>> print(i) + # >>> [ 1. 2. 4. 20. 6. 8.] + # >>> print(f) + # >>> [0.2 0.3 0.5 0.45 0.75 0.88] + f, a = np.modf(x * 255.0) + a = a.astype(int) b = (a + 1).clip(max=255) - f = x * 255.0 - a image_colored = ( turbo_cmap_data[a] + (turbo_cmap_data[b] - turbo_cmap_data[a]) * f[..., None] From a0ab3934c0f6e93c5d949e85cb588e34c9a24e62 Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Fri, 3 Jul 2020 08:50:34 +0530 Subject: [PATCH 10/14] Add the LICENSE identifier --- blueoil/common.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/blueoil/common.py b/blueoil/common.py index 6f7bd5cc9..6f72c8c9e 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -68,6 +68,10 @@ def get_color_map(length): # https://github.com/blue-oil/blueoil/tree/master/docs/_static/turbo_cmap.png # Implementation inspired from the following gist: # https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f + +# Copyright 2019 Google LLC. +# SPDX-License-Identifier: Apache-2.0 + def apply_color_map(image): turbo_cmap_data = np.asarray(TURBO_CMAP_DATA) x = np.asarray(image) From 70ca9b47d4b626d7c1136226c1f275958a05f18f Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Fri, 3 Jul 2020 11:43:43 +0530 Subject: [PATCH 11/14] Put the LICENSE and copyright in colormap table file --- blueoil/common.py | 6 ------ blueoil/turbo_color_map.py | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/blueoil/common.py b/blueoil/common.py index 6f72c8c9e..f4234abdf 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -66,12 +66,6 @@ def get_color_map(length): # https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html # The colormap allows for a large number of quantization levels: # https://github.com/blue-oil/blueoil/tree/master/docs/_static/turbo_cmap.png -# Implementation inspired from the following gist: -# https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f - -# Copyright 2019 Google LLC. -# SPDX-License-Identifier: Apache-2.0 - def apply_color_map(image): turbo_cmap_data = np.asarray(TURBO_CMAP_DATA) x = np.asarray(image) diff --git a/blueoil/turbo_color_map.py b/blueoil/turbo_color_map.py index b012bf24e..6d95a0618 100644 --- a/blueoil/turbo_color_map.py +++ b/blueoil/turbo_color_map.py @@ -14,6 +14,11 @@ # limitations under the License. # ============================================================================= +# Colormap table taken from the following gist: +# https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f +# Copyright 2019 Google LLC. +# SPDX-License-Identifier: Apache-2.0 + TURBO_CMAP_DATA = [ [0.18995, 0.07176, 0.23217], [0.19483, 0.08339, 0.26149], From 0b733f15a800a6babc5849d5437f0a904f834b8e Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Thu, 9 Jul 2020 09:33:06 +0530 Subject: [PATCH 12/14] Copyright year. Add changes --- blueoil/common.py | 11 +++++++++++ blueoil/turbo_color_map.py | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/blueoil/common.py b/blueoil/common.py index f4234abdf..996bf0f77 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -66,6 +66,17 @@ def get_color_map(length): # https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html # The colormap allows for a large number of quantization levels: # https://github.com/blue-oil/blueoil/tree/master/docs/_static/turbo_cmap.png + +# Referred from the following gist: +# https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f +# Copyright 2019 Google LLC. +# SPDX-License-Identifier: Apache-2.0 + +# Changes: +# 1. Vectorized the implementation using numpy +# 2. Use numpy.modf to get integer and float parts +# 3. Provided an example in comments + def apply_color_map(image): turbo_cmap_data = np.asarray(TURBO_CMAP_DATA) x = np.asarray(image) diff --git a/blueoil/turbo_color_map.py b/blueoil/turbo_color_map.py index 6d95a0618..148959a06 100644 --- a/blueoil/turbo_color_map.py +++ b/blueoil/turbo_color_map.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2018 The Blueoil Authors. All Rights Reserved. +# Copyright 2020 The Blueoil Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 9f81c44a636498b208c8162c7b7dd1ad12f807cd Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Thu, 9 Jul 2020 12:21:07 +0530 Subject: [PATCH 13/14] Remove image we do not own copyright to --- blueoil/common.py | 2 +- docs/_static/turbo_cmap.png | Bin 31074 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 docs/_static/turbo_cmap.png diff --git a/blueoil/common.py b/blueoil/common.py index 996bf0f77..014622d14 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -65,7 +65,7 @@ def get_color_map(length): # For replacing the Matplotlib Jet colormap, we use the Turbo color map # https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html # The colormap allows for a large number of quantization levels: -# https://github.com/blue-oil/blueoil/tree/master/docs/_static/turbo_cmap.png +# https://tinyurl.com/ybm3kpql # Referred from the following gist: # https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f diff --git a/docs/_static/turbo_cmap.png b/docs/_static/turbo_cmap.png deleted file mode 100644 index 0d8139e0adbd0ec2d2c2dd51a12d165863aa3afe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31074 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 From 8fdbcbb0200757a55d6e8c6612e04eda66efca30 Mon Sep 17 00:00:00 2001 From: kalpitthakkar-lm Date: Fri, 10 Jul 2020 11:22:29 +0530 Subject: [PATCH 14/14] Example string: fix format --- blueoil/common.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blueoil/common.py b/blueoil/common.py index 014622d14..2e8d5052f 100644 --- a/blueoil/common.py +++ b/blueoil/common.py @@ -89,11 +89,11 @@ def apply_color_map(image): # >>> x = np.array([1.2, 2.3, 4.5, 20.45, 6.75, 8.88]) # >>> f, i = np.modf(x) # returns a tuple of length 2 # >>> print(i.shape, f.shape) - # >>> (6,) (6,) + # (6,) (6,) # >>> print(i) - # >>> [ 1. 2. 4. 20. 6. 8.] + # array([ 1. 2. 4. 20. 6. 8.]) # >>> print(f) - # >>> [0.2 0.3 0.5 0.45 0.75 0.88] + # array([0.2 0.3 0.5 0.45 0.75 0.88]) f, a = np.modf(x * 255.0) a = a.astype(int) b = (a + 1).clip(max=255)