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