From 94ccafef04860d699a04f64762a7bc389bb07c2c Mon Sep 17 00:00:00 2001 From: Andre Anjos <andre.dos.anjos@gmail.com> Date: Wed, 15 Jul 2020 17:02:25 +0200 Subject: [PATCH] [engine.significance] Minor optimisations on patch performance calculation --- bob/ip/binseg/engine/significance.py | 68 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/bob/ip/binseg/engine/significance.py b/bob/ip/binseg/engine/significance.py index f162d7e8..8ed7b1d8 100644 --- a/bob/ip/binseg/engine/significance.py +++ b/bob/ip/binseg/engine/significance.py @@ -81,27 +81,21 @@ def _performance_summary(size, patch_perf, patch_size, patch_stride, figure): n = numpy.zeros(final_size, dtype=int) ylen = ((final_size[0] - patch_size[0]) // patch_stride[0]) + 1 xlen = ((final_size[1] - patch_size[1]) // patch_stride[1]) + 1 - for j in range(ylen): - for i in range(xlen): - yup = slice( - patch_stride[0] * j, (patch_stride[0] * j) + patch_size[0], 1 - ) - xup = slice( - patch_stride[1] * i, (patch_stride[1] * i) + patch_size[1], 1 - ) - n[yup, xup] += 1 # calculates the stacked performance - layers = n.max() + layers = int(numpy.ceil(patch_size[0] / patch_stride[0]) * numpy.ceil( + patch_size[1] / patch_stride[1] + )) perf = numpy.zeros( [layers] + final_size, dtype=patch_perf[figure].iloc[0].dtype ) n = -1 * numpy.ones(final_size, dtype=int) + col = numpy.array(patch_perf[figure]) for j in range(ylen): + yup = slice( + patch_stride[0] * j, (patch_stride[0] * j) + patch_size[0], 1 + ) for i in range(xlen): - yup = slice( - patch_stride[0] * j, (patch_stride[0] * j) + patch_size[0], 1 - ) xup = slice( patch_stride[1] * i, (patch_stride[1] * i) + patch_size[1], 1 ) @@ -112,11 +106,9 @@ def _performance_summary(size, patch_perf, patch_size, patch_stride, figure): range(xup.start, xup.stop, xup.step), indexing="ij", ) - perf[nup.flat, yr.flat, xr.flat] = patch_perf.loc[ - (patch_perf["y"] == j) & (patch_perf["x"] == i) - ][figure] + perf[nup.flat, yr.flat, xr.flat] = col[(j*xlen)+i] - # for each element in the ``perf``matrix, calculated avg and std. + # for each element in the ``perf``matrix, calculates avg and std. n += 1 # adjust for starting at -1 before avg = perf.sum(axis=0) / n # calculate variances @@ -500,7 +492,9 @@ def patch_performances( return dict(data) -def _visual_performances_for_sample(size, stride, dataset, k, df, figure, outdir): +def _visual_performances_for_sample( + size, stride, dataset, k, df, figure, outdir +): """ Displays patch performances per sample @@ -685,7 +679,13 @@ def visual_performances( data = [] for k in pbar: df = _visual_performances_for_sample( - size, stride, dataset[name], k, dfs[stems[k]], figure, outdir, + size, + stride, + dataset[name], + k, + dfs[stems[k]], + figure, + outdir, ) data.append(df) @@ -758,22 +758,22 @@ def write_analysis_text(names, da, db, f): diff = da - db f.write("#Samples/Median/Avg/Std.Dev./Normality Conf. F1-scores:\n") f.write( - f"* {names[0]}: {len(da)}" \ - f" / {numpy.median(da):.3f}" \ - f" / {numpy.mean(da):.3f}" \ + f"* {names[0]}: {len(da)}" + f" / {numpy.median(da):.3f}" + f" / {numpy.mean(da):.3f}" f" / {numpy.std(da, ddof=1):.3f}\n" ) f.write( - f"* {names[1]}: {len(db)}" \ - f" / {numpy.median(db):.3f}" \ - f" / {numpy.mean(db):.3f}" \ + f"* {names[1]}: {len(db)}" + f" / {numpy.median(db):.3f}" + f" / {numpy.mean(db):.3f}" f" / {numpy.std(db, ddof=1):.3f}\n" ) f.write( - f"* {names[0]}-{names[1]}: {len(diff)}" \ - f" / {numpy.median(diff):.3f}" \ - f" / {numpy.mean(diff):.3f}" \ - f" / {numpy.std(diff, ddof=1):.3f}" \ + f"* {names[0]}-{names[1]}: {len(diff)}" + f" / {numpy.median(diff):.3f}" + f" / {numpy.mean(diff):.3f}" + f" / {numpy.std(diff, ddof=1):.3f}" f" / gaussian? p={scipy.stats.normaltest(diff)[1]:.3f}\n" ) @@ -792,13 +792,13 @@ def write_analysis_text(names, da, db, f): w, p = scipy.stats.wilcoxon(diff, alternative="greater") f.write( - f"Wilcoxon test (md({names[0]}) < md({names[1]})?): " \ + f"Wilcoxon test (md({names[0]}) < md({names[1]})?): " f"W = {w:g}, p = {p:.5f}\n" ) w, p = scipy.stats.wilcoxon(diff, alternative="less") f.write( - f"Wilcoxon test (md({names[0]}) > md({names[1]})?): " \ + f"Wilcoxon test (md({names[0]}) > md({names[1]})?): " f"W = {w:g}, p = {p:.5f}\n" ) @@ -873,9 +873,9 @@ def write_analysis_figures(names, da, db, fname): plt.grid() plt.hist(diff, bins=bins) plt.title( - f"Systems ({names[0]} - {names[1]}) " \ - f"(N={len(diff)}; M={numpy.median(diff):.3f}; " \ - f"$\mu$={numpy.mean(diff):.3f}; " \ + f"Systems ({names[0]} - {names[1]}) " + f"(N={len(diff)}; M={numpy.median(diff):.3f}; " + f"$\mu$={numpy.mean(diff):.3f}; " f"$\sigma$={numpy.std(diff, ddof=1):.3f})" ) pdf.savefig() -- GitLab