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

1import numpy as np 

2 

3 

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 ) 

11 

12 

13def smoothing(labels, smoothing_window): 

14 """Applies a smoothing on VAD""" 

15 

16 if np.sum(labels) < smoothing_window: 

17 return labels 

18 

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 

26 

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) 

35 

36 if len(segments) < 2: 

37 return labels 

38 

39 curr = segments[0] 

40 next = segments[1] 

41 

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 

52 

53 for k in range(1, len(segments) - 1): 

54 prev = segments[k - 1] 

55 curr = segments[k] 

56 next = segments[k + 1] 

57 

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 

69 

70 prev = segments[-2] 

71 curr = segments[-1] 

72 

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 

82 

83 return labels 

84 

85 

86# gets sphinx autodoc done right - don't remove it 

87__all__ = [_ for _ in dir() if not _.startswith("_")]