annotate tests/test_load_features.py @ 35:c4428589b82b branch-tests

more tests in load_features
author Maria Panteli
date Thu, 14 Sep 2017 13:07:19 +0100
parents 115774aff442
children b1d9ba5f888e
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
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