annotate tests/test_load_features.py @ 43:b1d9ba5f888e branch-tests

debugging tests
author Maria Panteli <m.x.panteli@gmail.com>
date Fri, 15 Sep 2017 16:17:55 +0100
parents c4428589b82b
children 3ed4c6af5a93
rev   line source
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