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