annotate tests/test_load_features.py @ 105:edd82eb89b4b branch-tests tip

Merge
author Maria Panteli
date Sun, 15 Oct 2017 13:36:59 +0100
parents 9b2beffa5fdd
children
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
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