m@2
|
1 # -*- coding: utf-8 -*-
|
m@2
|
2 """
|
m@2
|
3 Created on Fri Sep 1 19:11:52 2017
|
m@2
|
4
|
m@2
|
5 @author: mariapanteli
|
m@2
|
6 """
|
m@2
|
7
|
m@2
|
8 import pytest
|
m@2
|
9
|
Maria@35
|
10 import os
|
m@2
|
11 import numpy as np
|
Maria@35
|
12 import pandas as pd
|
Maria@3
|
13 import scripts.load_features as load_features
|
m@2
|
14
|
m@2
|
15 feat_loader = load_features.FeatureLoader(win2sec=8)
|
m@2
|
16
|
Maria@3
|
17
|
m@2
|
18 def test_get_music_idx_from_bounds():
|
m@6
|
19 bounds = np.array([['0', '10.5', 'm']])
|
Maria@3
|
20 sr = feat_loader.framessr2
|
Maria@3
|
21 music_bounds = feat_loader.get_music_idx_from_bounds(bounds, sr=sr)
|
Maria@3
|
22 # upper bound minus half window size
|
Maria@34
|
23 #half_win_sec = 4.0 # assume 8-second window
|
Maria@34
|
24 win_sec = 8
|
Maria@34
|
25 music_bounds_true = np.arange(np.round(sr * (np.float(bounds[-1, 1]) - win_sec)), dtype=int)
|
Maria@3
|
26 assert np.array_equal(music_bounds, music_bounds_true)
|
Maria@3
|
27
|
Maria@3
|
28
|
Maria@3
|
29 def test_get_music_idx_from_bounds_short_segment():
|
Maria@3
|
30 # anything less than half window size is not processed
|
Maria@34
|
31 bounds = np.array([['0', '7.9', 'm']])
|
m@6
|
32 sr = feat_loader.framessr2
|
Maria@3
|
33 music_bounds = feat_loader.get_music_idx_from_bounds(bounds, sr=sr)
|
Maria@3
|
34 music_bounds_true = np.array([])
|
Maria@3
|
35 assert np.array_equal(music_bounds, music_bounds_true)
|
Maria@3
|
36
|
Maria@3
|
37
|
m@6
|
38 def test_get_music_idx_from_bounds_single_frame():
|
Maria@34
|
39 bounds = np.array([['0', '8.1', 'm']])
|
Maria@34
|
40 sr = feat_loader.framessr2
|
m@6
|
41 music_bounds = feat_loader.get_music_idx_from_bounds(bounds, sr=sr)
|
m@6
|
42 music_bounds_true = np.array([0])
|
m@6
|
43 assert np.array_equal(music_bounds, music_bounds_true)
|
m@6
|
44
|
m@6
|
45
|
Maria@3
|
46 def test_get_music_idx_from_bounds_mix_segments():
|
m@2
|
47 bounds = np.array([['0', '10.5', 'm'],
|
Maria@3
|
48 ['10.5', '3.0', 's'],
|
Maria@3
|
49 ['13.5', '5.0', 'm']])
|
m@2
|
50 sr = feat_loader.framessr2
|
m@2
|
51 music_bounds = feat_loader.get_music_idx_from_bounds(bounds, sr=sr)
|
Maria@34
|
52 #half_win_sec = 4.0 # assume 8-second window
|
Maria@34
|
53 win_sec = 8.0 # assume 8-second window
|
Maria@34
|
54 music_bounds_true = np.concatenate([np.arange(np.round(sr * (10.5 - win_sec)), dtype=int),
|
Maria@34
|
55 np.arange(np.round(sr * 13.5),
|
Maria@34
|
56 np.round(sr * (18.5 - win_sec)), dtype=int)])
|
m@2
|
57 assert np.array_equal(music_bounds, music_bounds_true)
|
m@6
|
58
|
m@6
|
59
|
m@6
|
60 def test_get_music_idx_from_bounds_overlap_segments():
|
m@6
|
61 bounds = np.array([['0', '10.5', 'm'],
|
m@6
|
62 ['9.5', '3.0', 's'],
|
m@6
|
63 ['11.5', '5.0', 'm']])
|
m@6
|
64 sr = feat_loader.framessr2
|
m@6
|
65 music_bounds = feat_loader.get_music_idx_from_bounds(bounds, sr=sr)
|
m@6
|
66 half_win_sec = 4.0 # assume 8-second window
|
Maria@34
|
67 win_sec = 8.0 # assume 8-second window
|
Maria@34
|
68 music_bounds_true = np.concatenate([np.arange(np.round(sr * (10.5 - win_sec)), dtype=int),
|
Maria@34
|
69 np.arange(np.round(sr * 11.5),
|
Maria@34
|
70 np.round(sr * (16.5 - win_sec)), dtype=int)])
|
m@6
|
71 assert np.array_equal(music_bounds, music_bounds_true)
|
m@6
|
72
|
m@6
|
73
|
m@8
|
74 def test_average_local_frames():
|
m@8
|
75 frames = np.array([[0, 0.5, 1], [1, 1, 1]])
|
m@8
|
76 aveframes = feat_loader.average_local_frames(frames)
|
m@8
|
77 aveframes_true = np.array([[0.5], [1]])
|
m@8
|
78 assert np.array_equal(aveframes, aveframes_true)
|
m@8
|
79
|
m@8
|
80
|
m@8
|
81 def test_average_local_frames_multiple_frames():
|
m@8
|
82 frames1 = np.concatenate([np.repeat(0.5, feat_loader.hop2), np.repeat(0, feat_loader.win2)])
|
m@8
|
83 frames2 = np.concatenate([np.repeat(1.5, feat_loader.hop2), np.repeat(1, feat_loader.win2)])
|
m@8
|
84 frames = np.vstack([frames1, frames2])
|
m@8
|
85 aveframes = feat_loader.average_local_frames(frames)
|
m@8
|
86 aveframes_true = np.array([[0.5, 0], [1.5, 1]])
|
m@8
|
87 # test only the second frame which contains values 0 or values 1 for all 8-second frame entries
|
m@8
|
88 assert np.array_equal(aveframes[:, 1], aveframes_true[:, 1])
|
m@8
|
89
|
m@8
|
90
|
m@8
|
91 def test_average_local_frames_std():
|
m@8
|
92 frames1 = np.concatenate([np.repeat(0.5, feat_loader.hop2), np.repeat(0, feat_loader.win2)])
|
m@8
|
93 frames2 = np.concatenate([np.repeat(1.5, feat_loader.hop2), np.repeat(1, feat_loader.win2)])
|
m@8
|
94 frames = np.vstack([frames1, frames2])
|
m@8
|
95 aveframes = feat_loader.average_local_frames(frames, getstd=True)
|
m@8
|
96 aveframes_true = np.array([[0.5, 0], [1.5, 1], [0.1, 0], [0.1, 0]])
|
m@8
|
97 # test only the second frame which contains values 0 or values 1 for all 8-second frame entries
|
m@8
|
98 assert np.array_equal(aveframes[:, 1], aveframes_true[:, 1])
|
Maria@35
|
99
|
Maria@35
|
100
|
Maria@35
|
101 def test_get_op_from_melspec_n_frames():
|
Maria@35
|
102 dur_sec = 10.0
|
Maria@35
|
103 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
104 np.random.seed(1)
|
Maria@35
|
105 melspec = np.random.randn(40, dur_frames) # melspec with 40 melbands
|
Maria@35
|
106 melspec = melspec - np.min(melspec) # melspec must be positive
|
Maria@35
|
107 opmel = feat_loader.get_op_from_melspec(melspec)
|
Maria@35
|
108 n_frames = opmel.shape[0]
|
Maria@35
|
109 # expect 4 frames for windows not centered and .5 sec hop size
|
Maria@35
|
110 # np.round((dur_sec - feat_loader.win2sec) * feat_loader.framessr2)
|
Maria@35
|
111 assert n_frames == 4
|
Maria@35
|
112
|
Maria@35
|
113
|
Maria@35
|
114 def test_get_op_from_melspec_n_bins():
|
Maria@35
|
115 dur_sec = 10.0
|
Maria@35
|
116 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
117 np.random.seed(1)
|
Maria@35
|
118 melspec = np.random.randn(40, dur_frames) # melspec with 40 melbands
|
Maria@35
|
119 melspec = melspec - np.min(melspec) # melspec must be positive
|
Maria@35
|
120 opmel = feat_loader.get_op_from_melspec(melspec)
|
Maria@35
|
121 n_bins = opmel.shape[1]
|
Maria@35
|
122 assert n_bins == 40 * 200
|
Maria@35
|
123
|
Maria@35
|
124
|
Maria@35
|
125 def test_get_op_from_melspec_K_bands():
|
Maria@35
|
126 dur_sec = 10.0
|
Maria@35
|
127 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
128 np.random.seed(1)
|
Maria@35
|
129 melspec = np.random.randn(40, dur_frames) # melspec with 40 melbands
|
Maria@35
|
130 melspec = melspec - np.min(melspec) # melspec must be positive
|
Maria@35
|
131 K = 2
|
Maria@35
|
132 opmel = feat_loader.get_op_from_melspec(melspec, K=K)
|
Maria@35
|
133 n_bins = opmel.shape[1]
|
Maria@35
|
134 assert n_bins == K * 200
|
Maria@35
|
135
|
Maria@35
|
136
|
Maria@35
|
137 def test_get_mfcc_from_melspec_n_coef():
|
Maria@35
|
138 dur_sec = 10.0
|
Maria@35
|
139 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
140 np.random.seed(1)
|
Maria@35
|
141 melspec = np.random.randn(40, dur_frames) # melspec with 40 melbands
|
Maria@35
|
142 melspec = melspec - np.min(melspec) # melspec must be positive
|
Maria@35
|
143 mfcc = feat_loader.get_mfcc_from_melspec(melspec, deltamfcc=False, avelocalframes=False)
|
Maria@35
|
144 assert mfcc.shape[1] == 20
|
Maria@35
|
145
|
Maria@35
|
146
|
Maria@35
|
147 def test_get_mfcc_from_melspec_n_coef_delta():
|
Maria@35
|
148 dur_sec = 10.0
|
Maria@35
|
149 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
150 np.random.seed(1)
|
Maria@35
|
151 melspec = np.random.randn(40, dur_frames) # melspec with 40 melbands
|
Maria@35
|
152 melspec = melspec - np.min(melspec) # melspec must be positive
|
Maria@35
|
153 mfcc = feat_loader.get_mfcc_from_melspec(melspec, deltamfcc=True, avelocalframes=False)
|
Maria@35
|
154 assert mfcc.shape[1] == 40
|
Maria@35
|
155
|
Maria@35
|
156
|
Maria@35
|
157 def test_get_mfcc_from_melspec_n_frames():
|
Maria@35
|
158 dur_sec = 10.0
|
Maria@35
|
159 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
160 np.random.seed(1)
|
Maria@35
|
161 melspec = np.random.randn(40, dur_frames) # melspec with 40 melbands
|
Maria@35
|
162 melspec = melspec - np.min(melspec) # melspec must be positive
|
Maria@35
|
163 mfcc = feat_loader.get_mfcc_from_melspec(melspec, deltamfcc=False, avelocalframes=False)
|
Maria@35
|
164 assert mfcc.shape[0] == dur_frames
|
Maria@35
|
165
|
Maria@35
|
166
|
Maria@35
|
167 def test_get_mfcc_from_melspec_n_frames_win2():
|
Maria@35
|
168 dur_sec = 10.0
|
Maria@35
|
169 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
170 np.random.seed(1)
|
Maria@35
|
171 melspec = np.random.randn(40, dur_frames) # melspec with 40 melbands
|
Maria@35
|
172 melspec = melspec - np.min(melspec) # melspec must be positive
|
Maria@35
|
173 mfcc = feat_loader.get_mfcc_from_melspec(melspec, deltamfcc=False, avelocalframes=True)
|
Maria@35
|
174 n_frames_true = np.round((dur_sec - feat_loader.win2sec) * feat_loader.framessr2)
|
Maria@35
|
175 assert mfcc.shape[0] == n_frames_true
|
Maria@35
|
176
|
Maria@35
|
177
|
Maria@35
|
178 def test_get_ave_chroma_align():
|
Maria@35
|
179 dur_sec = 10.0
|
Maria@35
|
180 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
181 np.random.seed(1)
|
Maria@35
|
182 chroma = np.random.randn(60, dur_frames) # chroma with 60 bins
|
Maria@35
|
183 chroma = chroma - np.min(chroma) # chroma must be positive
|
Maria@35
|
184 ave_chroma = feat_loader.get_ave_chroma(chroma, alignchroma=True, avelocalframes=False)
|
Maria@35
|
185 # the maximum bin across time is the first bin (after alignment)
|
Maria@35
|
186 assert np.argmax(np.sum(ave_chroma, axis=0)) == 0
|
Maria@35
|
187
|
Maria@35
|
188
|
Maria@35
|
189 def test_get_ave_chroma_n_frames():
|
Maria@35
|
190 dur_sec = 10.0
|
Maria@35
|
191 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
192 np.random.seed(1)
|
Maria@35
|
193 chroma = np.random.randn(60, dur_frames) # chroma with 60 bins
|
Maria@35
|
194 chroma = chroma - np.min(chroma) # chroma must be positive
|
Maria@35
|
195 ave_chroma = feat_loader.get_ave_chroma(chroma, avelocalframes=True, stdlocalframes=False)
|
Maria@35
|
196 n_frames_true = np.round((dur_sec - feat_loader.win2sec) * feat_loader.framessr2)
|
Maria@35
|
197 assert ave_chroma.shape[0] == n_frames_true
|
Maria@35
|
198
|
Maria@35
|
199
|
Maria@35
|
200 def test_get_ave_chroma_n_bins():
|
Maria@35
|
201 dur_sec = 10.0
|
Maria@35
|
202 dur_frames = np.int(np.round(dur_sec * feat_loader.framessr))
|
Maria@35
|
203 np.random.seed(1)
|
Maria@35
|
204 chroma = np.random.randn(60, dur_frames) # chroma with 60 bins
|
Maria@35
|
205 chroma = chroma - np.min(chroma) # chroma must be positive
|
Maria@35
|
206 ave_chroma = feat_loader.get_ave_chroma(chroma, avelocalframes=True, stdlocalframes=True)
|
Maria@35
|
207 assert ave_chroma.shape[1] == 120
|
Maria@35
|
208
|
Maria@35
|
209
|
Maria@35
|
210 def test_get_pb_for_file_empty():
|
Maria@35
|
211 pbihist = feat_loader.get_pb_for_file('')
|
Maria@35
|
212 assert np.array_equal(pbihist, [])
|
Maria@35
|
213
|
Maria@35
|
214
|
Maria@35
|
215 def test_get_pb_for_file_n_bins():
|
Maria@35
|
216 pbihist = feat_loader.get_pb_for_file('data/sample_dataset/Melodia/mel_1_2_1.csv', nmfpb=False, scale=False)
|
Maria@35
|
217 assert pbihist.shape[1] == 3600
|
Maria@35
|
218
|
Maria@35
|
219
|
Maria@35
|
220 def test_get_pb_for_file_align():
|
Maria@35
|
221 pbihist = feat_loader.get_pb_for_file('data/sample_dataset/Melodia/mel_1_2_1.csv', nmfpb=False, scale=False)
|
Maria@35
|
222 pbihist = pbihist.get_values()
|
Maria@35
|
223 assert np.sum(pbihist[:, :60].ravel()) > np.sum(pbihist[:, 60:120].ravel())
|
Maria@35
|
224
|
Maria@35
|
225
|
Maria@35
|
226 def test_get_pb_for_file_nmf():
|
Maria@35
|
227 pbihist = feat_loader.get_pb_for_file('data/sample_dataset/Melodia/mel_1_2_1.csv', nmfpb=True, scale=False)
|
Maria@35
|
228 assert pbihist.shape[1] == 240
|
Maria@35
|
229
|
Maria@35
|
230
|
Maria@35
|
231 def test_get_features():
|
Maria@35
|
232 df = pd.read_csv('data/sample_dataset/metadata.csv')
|
Maria@35
|
233 df = df.iloc[:1, :]
|
Maria@35
|
234 os.chdir('data/')
|
Maria@35
|
235 data_list = feat_loader.get_features(df)
|
Maria@35
|
236 os.chdir('..')
|
Maria@35
|
237 assert len(np.unique(data_list[-1])) == 1
|
Maria@35
|
238
|
Maria@35
|
239
|
Maria@35
|
240 def test_get_features_n_files():
|
Maria@35
|
241 df = pd.read_csv('data/sample_dataset/metadata.csv')
|
Maria@35
|
242 n_files = 3
|
Maria@35
|
243 df = df.iloc[:n_files, :]
|
Maria@35
|
244 os.chdir('data/')
|
Maria@35
|
245 data_list = feat_loader.get_features(df)
|
Maria@35
|
246 os.chdir('..')
|
Maria@35
|
247 assert len(np.unique(data_list[-1])) == n_files
|
Maria@35
|
248
|
Maria@35
|
249
|
Maria@35
|
250 def test_get_features_n_frames():
|
Maria@35
|
251 df = pd.read_csv('data/sample_dataset/metadata.csv')
|
Maria@35
|
252 df = df.iloc[:1, :]
|
Maria@35
|
253 os.chdir('data/')
|
Maria@35
|
254 data_list = feat_loader.get_features(df)
|
Maria@35
|
255 os.chdir('..')
|
Maria@35
|
256 dur_sec = 11.5 # duration of first file in metadata.csv is > 11 seconds
|
Maria@35
|
257 n_frames_true = np.round((dur_sec - feat_loader.win2sec) * feat_loader.framessr2)
|
Maria@35
|
258 assert len(data_list[0]) == n_frames_true
|
Maria@35
|
259 |