Coverage for src/bob/bio/spear/utils.py: 100%
51 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-06 22:04 +0100
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-06 22:04 +0100
1import numpy as np
4def normalize_std_array(vector: np.ndarray):
5 """Applies a unit mean and variance normalization to an arrayset"""
6 return (
7 vector
8 if vector.std(axis=0) == 0
9 else (vector - vector.mean(axis=0)) / vector.std(axis=0)
10 )
13def smoothing(labels, smoothing_window):
14 """Applies a smoothing on VAD"""
16 if np.sum(labels) < smoothing_window:
17 return labels
19 segments = []
20 for k in range(1, len(labels) - 1):
21 if labels[k] == 0 and labels[k - 1] == 1 and labels[k + 1] == 1:
22 labels[k] = 1
23 for k in range(1, len(labels) - 1):
24 if labels[k] == 1 and labels[k - 1] == 0 and labels[k + 1] == 0:
25 labels[k] = 0
27 seg = np.array([0, 0, labels[0]])
28 for k in range(1, len(labels)):
29 if labels[k] != labels[k - 1]:
30 seg[1] = k - 1
31 segments.append(seg)
32 seg = np.array([k, k, labels[k]])
33 seg[1] = len(labels) - 1
34 segments.append(seg)
36 if len(segments) < 2:
37 return labels
39 curr = segments[0]
40 next = segments[1]
42 # Look at the first segment. If it's short enough, just change its labels
43 if (curr[1] - curr[0] + 1) < smoothing_window and (
44 next[1] - next[0] + 1
45 ) > smoothing_window:
46 if curr[2] == 1:
47 labels[curr[0] : (curr[1] + 1)] = 0
48 curr[2] = 0
49 else: # curr[2]==0
50 labels[curr[0] : (curr[1] + 1)] = 1
51 curr[2] = 1
53 for k in range(1, len(segments) - 1):
54 prev = segments[k - 1]
55 curr = segments[k]
56 next = segments[k + 1]
58 if (
59 (curr[1] - curr[0] + 1) < smoothing_window
60 and (prev[1] - prev[0] + 1) > smoothing_window
61 and (next[1] - next[0] + 1) > smoothing_window
62 ):
63 if curr[2] == 1:
64 labels[curr[0] : (curr[1] + 1)] = 0
65 curr[2] = 0
66 else: # curr[2]==0
67 labels[curr[0] : (curr[1] + 1)] = 1
68 curr[2] = 1
70 prev = segments[-2]
71 curr = segments[-1]
73 if (curr[1] - curr[0] + 1) < smoothing_window and (
74 prev[1] - prev[0] + 1
75 ) > smoothing_window:
76 if curr[2] == 1:
77 labels[curr[0] : (curr[1] + 1)] = 0
78 curr[2] = 0
79 else: # if curr[2]==0
80 labels[curr[0] : (curr[1] + 1)] = 1
81 curr[2] = 1
83 return labels
86# gets sphinx autodoc done right - don't remove it
87__all__ = [_ for _ in dir() if not _.startswith("_")]