mi@0
|
1 #!/usr/bin/env python
|
mi@0
|
2 # encoding: utf-8
|
mi@0
|
3 """
|
mi@0
|
4 SegEval.py
|
mi@0
|
5
|
mi@0
|
6 The main segmentation program.
|
mi@0
|
7
|
mi@0
|
8 Created by mi tian on 2015-04-02.
|
mi@0
|
9 Copyright (c) 2015 __MyCompanyName__. All rights reserved.
|
mi@0
|
10 """
|
mi@0
|
11
|
mi@0
|
12 # Load starndard python libs
|
mi@0
|
13 import sys, os, optparse, csv
|
mi@0
|
14 from itertools import combinations
|
mi@0
|
15 from os.path import join, isdir, isfile, abspath, dirname, basename, split, splitext
|
mi@0
|
16 from copy import copy
|
mi@0
|
17
|
mi@0
|
18 import matplotlib
|
mi@0
|
19 # matplotlib.use('Agg')
|
mi@0
|
20 import matplotlib.pyplot as plt
|
mi@0
|
21 import matplotlib.gridspec as gridspec
|
mi@0
|
22 import numpy as np
|
mi@0
|
23 import scipy as sp
|
mi@0
|
24 from scipy.signal import correlate2d, convolve2d, filtfilt, resample
|
mi@0
|
25 from scipy.ndimage.filters import *
|
mi@0
|
26 from sklearn.decomposition import PCA
|
mi@0
|
27 from sklearn.mixture import GMM
|
mi@0
|
28 from sklearn.cluster import KMeans
|
mi@0
|
29 from sklearn.preprocessing import normalize
|
mi@0
|
30 from sklearn.metrics.pairwise import pairwise_distances
|
mi@0
|
31
|
mi@0
|
32 # Load dependencies
|
mi@0
|
33 from utils.SegUtil import getMean, getStd, getDelta, getSSM, reduceSSM, upSample, normaliseFeature
|
mi@0
|
34 from utils.PeakPickerUtil import PeakPicker
|
mi@0
|
35 from utils.gmmdist import *
|
mi@0
|
36 from utils.GmmMetrics import GmmDistance
|
mi@0
|
37 from utils.RankClustering import rClustering
|
mi@0
|
38 from utils.kmeans import Kmeans
|
mi@0
|
39 from utils.PathTracker import PathTracker
|
mi@0
|
40
|
mi@0
|
41 # Load bourdary retrieval utilities
|
mi@0
|
42 import cnmf as cnmf_S
|
mi@0
|
43 import foote as foote_S
|
mi@0
|
44 import sf as sf_S
|
mi@0
|
45 import fmc2d as fmc2d_S
|
mitian@1
|
46 import novelty as novelty_S
|
mitian@1
|
47
|
mitian@1
|
48 # Algorithm params
|
mitian@1
|
49 h = 8 # Size of median filter for features in C-NMF
|
mitian@1
|
50 R = 15 # Size of the median filter for the activation matrix C-NMF
|
mitian@3
|
51 rank = 8 # Rank of decomposition for the boundaries
|
mitian@1
|
52 rank_labels = 6 # Rank of decomposition for the labels
|
mitian@1
|
53 R_labels = 6 # Size of the median filter for the labels
|
mitian@1
|
54 # Foote
|
mitian@1
|
55 M = 2 # Median filter for the audio features (in beats)
|
mitian@1
|
56 Mg = 32 # Gaussian kernel size
|
mitian@1
|
57 L = 16 # Size of the median filter for the adaptive threshold
|
mitian@1
|
58 # 2D-FMC
|
mitian@1
|
59 N = 8 # Size of the fixed length segments (for 2D-FMC)
|
mitian@1
|
60
|
mi@0
|
61
|
mi@0
|
62 # Define arg parser
|
mi@0
|
63 def parse_args():
|
mi@0
|
64 op = optparse.OptionParser()
|
mi@0
|
65 # IO options
|
mi@0
|
66 op.add_option('-g', '--gammatonegram-features', action="store", dest="GF", default='/Volumes/c4dm-03/people/mit/features/gammatonegram/qupujicheng/2048', type="str", help="Loading gammatone features from.." )
|
mi@0
|
67 op.add_option('-s', '--spectrogram-features', action="store", dest="SF", default='/Volumes/c4dm-03/people/mit/features/spectrogram/qupujicheng/2048', type="str", help="Loading spectral features from.." )
|
mi@0
|
68 op.add_option('-t', '--tempogram-features', action="store", dest="TF", default='/Volumes/c4dm-03/people/mit/features/tempogram/qupujicheng/tempo_features_6s', type="str", help="Loading tempogram features from.." )
|
mi@0
|
69 op.add_option('-f', '--featureset', action="store", dest="FEATURES", default='[0, 1, 2, 3]', type="str", help="Choose feature subsets (input a list of integers) used for segmentation -- gammtone, chroma, timbre, tempo -- 0, 1, 2, 3." )
|
mi@0
|
70 op.add_option('-a', '--annotations', action="store", dest="GT", default='/Volumes/c4dm-03/people/mit/annotation/qupujicheng/lowercase', type="str", help="Loading annotation files from.. ")
|
mi@0
|
71 op.add_option('-o', '--ouput', action="store", dest="OUTPUT", default='/Volumes/c4dm-03/people/mit/segmentation/gammatone/qupujicheng', type="str", help="Write segmentation results to ")
|
mi@0
|
72
|
mi@0
|
73 # boundary retrieval options
|
mitian@1
|
74 op.add_option('-b', '--bounrary-method', action="store", dest="BOUNDARY", type='choice', choices=['novelty', 'cnmf', 'foote', 'sf'], default='novelty', help="Choose boundary retrieval algorithm ('novelty', 'cnmf', 'sf', 'fmc2d')." )
|
mitian@1
|
75 op.add_option('-l', '--labeling-method', action="store", dest="LABEL", type='choice', choices=['cnmf', 'fmc2d'], default='cnmf', help="Choose boundary labeling algorithm ('cnmf', 'fmc2d')." )
|
mi@0
|
76
|
mi@0
|
77 # Plot/print/mode options
|
mi@0
|
78 op.add_option('-p', '--plot', action="store_true", dest="PLOT", default=False, help="Save plots")
|
mi@0
|
79 op.add_option('-e', '--test-mode', action="store_true", dest="TEST", default=False, help="Test mode")
|
mi@0
|
80 op.add_option('-v', '--verbose-mode', action="store_true", dest="VERBOSE", default=False, help="Print results in verbose mode.")
|
mi@0
|
81
|
mi@0
|
82 return op.parse_args()
|
mi@0
|
83 options, args = parse_args()
|
mi@0
|
84
|
mi@0
|
85 class FeatureObj() :
|
mi@0
|
86 __slots__ = ['key', 'audio', 'timestamps', 'gammatone_features', 'tempo_features', 'timbre_features', 'harmonic_features', 'gammatone_ssm', 'tempo_ssm', 'timbre_features', 'harmonic_ssm', 'ssm_timestamps']
|
mi@0
|
87
|
mi@0
|
88 class AudioObj():
|
mi@0
|
89 __slots__ = ['name', 'feature_list', 'gt', 'label', 'gammatone_features', 'tempo_features', 'timbre_features', 'harmonic_features', 'combined_features',\
|
mi@0
|
90 'gammatone_ssm', 'tempo_ssm', 'timbre_ssm', 'harmonic_ssm', 'combined_ssm', 'ssm', 'ssm_timestamps', 'tempo_timestamps']
|
mi@0
|
91
|
mi@0
|
92 class EvalObj():
|
mi@0
|
93 __slots__ = ['TP', 'FP', 'FN', 'P', 'R', 'F', 'AD', 'DA']
|
mi@0
|
94
|
mi@0
|
95
|
mi@0
|
96 class SSMseg(object):
|
mi@0
|
97 '''The main segmentation object'''
|
mi@0
|
98 def __init__(self):
|
mi@0
|
99 self.SampleRate = 44100
|
mi@0
|
100 self.NqHz = self.SampleRate/2
|
mi@0
|
101 self.timestamp = []
|
mi@0
|
102 self.previousSample = 0.0
|
mi@0
|
103 self.featureWindow = 6.0
|
mi@0
|
104 self.featureStep = 3.0
|
mi@0
|
105 self.kernel_size = 64 # Adjust this param according to the feature resolution.pq
|
mi@0
|
106 self.blockSize = 2048
|
mi@0
|
107 self.stepSize = 1024
|
mi@0
|
108
|
mi@0
|
109 '''NOTE: Match the following params with those used for feature extraction!'''
|
mi@0
|
110
|
mi@0
|
111 '''NOTE: Unlike spectrogram ones, Gammatone features are extracted without taking an FFT. The windowing is done under the purpose of chunking
|
mi@0
|
112 the audio to facilitate the gammatone filtering with the specified blockSize and stepSize. The resulting gammatonegram is aggregated every
|
mi@0
|
113 gammatoneLen without overlap.'''
|
mi@0
|
114 self.gammatoneLen = 2048
|
mi@0
|
115 self.gammatoneBandGroups = [0, 2, 6, 10, 13, 17, 20]
|
mi@0
|
116 self.nGammatoneBands = 20
|
mi@0
|
117 self.lowFreq = 100
|
mi@0
|
118 self.highFreq = self.SampleRate / 4
|
mi@0
|
119
|
mi@0
|
120 '''Settings for extracting tempogram features.'''
|
mi@0
|
121 self.tempoWindow = 6.0
|
mi@0
|
122 self.bpmBands = [30, 45, 60, 80, 100, 120, 180, 240, 400, 600]
|
mi@0
|
123
|
mitian@3
|
124 '''Peak picking settings for novelty based method'''
|
mi@0
|
125 self.threshold = 50
|
mi@0
|
126 self.confidence_threshold = 0.5
|
mi@0
|
127 self.delta_threshold = 0.0
|
mi@0
|
128 self.backtracking_threshold = 1.9
|
mi@0
|
129 self.polyfitting_on = True
|
mi@0
|
130 self.medfilter_on = True
|
mi@0
|
131 self.LPfilter_on = True
|
mi@0
|
132 self.whitening_on = False
|
mi@0
|
133 self.aCoeffs = [1.0000, -0.5949, 0.2348]
|
mi@0
|
134 self.bCoeffs = [0.1600, 0.3200, 0.1600]
|
mi@0
|
135 self.cutoff = 0.34
|
mi@0
|
136 self.medianWin = 7
|
mi@0
|
137
|
mi@0
|
138
|
mitian@3
|
139 def pairwiseF(self, annotation, detection, tolerance=3.0, combine=1.0, idx2time=None):
|
mi@0
|
140 '''Pairwise F measure evaluation of detection rates.'''
|
mitian@3
|
141
|
mitian@3
|
142 if idx2time:
|
mitian@3
|
143 # Map detected idxs to real time
|
mitian@3
|
144 detection = [idx2time[int(np.rint(i))] for i in detection] + [ao.gt[-1]]
|
mi@0
|
145 # print 'detection', detection
|
mi@0
|
146 detection = np.append(detection, annotation[-1])
|
mi@0
|
147 res = EvalObj()
|
mi@0
|
148 res.TP = 0 # Total number of matched ground truth and experimental data points
|
mi@0
|
149 gt = len(annotation) # Total number of ground truth data points
|
mi@0
|
150 dt = len(detection) # Total number of experimental data points
|
mi@0
|
151 foundIdx = []
|
mi@0
|
152 D_AD = np.zeros(gt)
|
mi@0
|
153 D_DA = np.zeros(dt)
|
mi@0
|
154
|
mi@0
|
155 for dtIdx in xrange(dt):
|
mi@0
|
156 D_DA[dtIdx] = np.min(abs(detection[dtIdx] - annotation))
|
mi@0
|
157 for gtIdx in xrange(gt):
|
mi@0
|
158 D_AD[gtIdx] = np.min(abs(annotation[gtIdx] - detection))
|
mi@0
|
159 for dtIdx in xrange(dt):
|
mi@0
|
160 if (annotation[gtIdx] >= detection[dtIdx] - tolerance/2.0) and (annotation[gtIdx] <= detection[dtIdx] + tolerance/2.0):
|
mi@0
|
161 res.TP = res.TP + 1.0
|
mi@0
|
162 foundIdx.append(gtIdx)
|
mi@0
|
163 foundIdx = list(set(foundIdx))
|
mi@0
|
164 res.TP = len(foundIdx)
|
mi@0
|
165 res.FP = max(0, dt - res.TP)
|
mi@0
|
166 res.FN = max(0, gt - res.TP)
|
mi@0
|
167
|
mi@0
|
168 res.AD = np.mean(D_AD)
|
mi@0
|
169 res.DA = np.mean(D_DA)
|
mi@0
|
170
|
mi@0
|
171 res.P, res.R, res.F = 0.0, 0.0, 0.0
|
mi@0
|
172
|
mi@0
|
173 if res.TP == 0:
|
mi@0
|
174 return res
|
mi@0
|
175
|
mi@0
|
176 res.P = res.TP / float(dt)
|
mi@0
|
177 res.R = res.TP / float(gt)
|
mi@0
|
178 res.F = 2 * res.P * res.R / (res.P + res.R)
|
mi@0
|
179 return res
|
mi@0
|
180
|
mitian@3
|
181 def wirteIndividualHeader(self, filename):
|
mitian@3
|
182 '''Write header of output files for individual features.'''
|
mitian@3
|
183
|
mitian@3
|
184 with open(filename, 'a') as f:
|
mitian@3
|
185 csvwriter = csv.writer(f, delimiter=',')
|
mitian@3
|
186 csvwriter.writerow(['audio', 'gammatone_tp_05', 'gammatone_fp_05', 'gammatone_fn_05', 'gammatone_P_05', 'gammatone_R_05', 'gammatone_F_05', 'gammatone_AD_05', 'gammatone_DA_05', 'gammatone_tp_3', \
|
mitian@3
|
187 'gammatone_fp_3', 'gammatone_fn_3', 'gammatone_P_3', 'gammatone_R_3', 'gammatone_F_3', 'gammatone_AD_3', 'gammatone_DA_3', 'harmonic_tp_05', 'harmonic_fp_05', 'harmonic_fn_05', 'harmonic_P_05', \
|
mitian@3
|
188 'harmonic_R_05', 'harmonic_F_05', 'harmonic_AD_05', 'harmonic_DA_05', 'harmonic_tp_3', 'harmonic_fp_3', 'harmonic_fn_3', 'harmonic_P_3', 'harmonic_R_3', 'harmonic_F_3', 'harmonic_AD_3', 'harmonic_DA_3', \
|
mitian@3
|
189 'timbre_tp_05', 'timbre_fp_05', 'timbre_fn_05', 'timbre_P_05', 'timbre_R_05', 'timbre_F_05', 'timbre_AD_05', 'timbre_DA_05', 'timbre_tp_3', 'timbre_fp_3', 'timbre_fn_3', 'timbre_P_3', 'timbre_R_3', \
|
mitian@3
|
190 'timbre_F_3', 'timbre_AD_3', 'timbre_DA_3', 'tempo_tp_05', 'tempo_fp_05', 'tempo_fn_05', 'tempo_P_05', 'tempo_R_05', 'tempo_F_05', 'tempo_AD_05', 'tempo_DA_05', \
|
mitian@3
|
191 'tempo_tp_3', 'tempo_fp_3', 'tempo_fn_3', 'tempo_P_3', 'tempo_R_3', 'tempo_F_3', 'tempo_AD_3', 'tempo_DA_3'])
|
mitian@3
|
192
|
mitian@3
|
193 def wirteIndividualRes(self, filename, ao_name, gt_res_05, gt_res_3, harmonic_res_05, harmonic_res_3, timbre_res_05, timbre_res_3, tempo_res_05, tempo_res_3):
|
mitian@3
|
194 '''Write result of single detection for individual features.'''
|
mitian@3
|
195
|
mitian@3
|
196 with open(filename, 'a') as f:
|
mitian@3
|
197 csvwriter = csv.writer(f, delimiter=',')
|
mitian@3
|
198 csvwriter.writerow([ao_name, gt_res_05.TP, gt_res_05.FP, gt_res_05.FN, gt_res_05.P, gt_res_05.R, gt_res_05.F, gt_res_05.AD, gt_res_05.DA, gt_res_3.TP, gt_res_3.FP, gt_res_3.FN, gt_res_3.P, \
|
mitian@3
|
199 gt_res_3.R, gt_res_3.F, gt_res_3.AD, gt_res_3.DA, harmonic_res_05.TP, harmonic_res_05.FP, harmonic_res_05.FN, harmonic_res_05.P, harmonic_res_05.R, harmonic_res_05.F, harmonic_res_05.AD, harmonic_res_05.DA, \
|
mitian@3
|
200 harmonic_res_3.TP, harmonic_res_3.FP, harmonic_res_3.FN, harmonic_res_3.P, harmonic_res_3.R, harmonic_res_3.F, harmonic_res_3.AD, harmonic_res_3.DA, timbre_res_05.TP, timbre_res_05.FP, \
|
mitian@3
|
201 timbre_res_05.FN, timbre_res_05.P, timbre_res_05.R, timbre_res_05.F, timbre_res_05.AD, timbre_res_05.DA, timbre_res_3.TP, timbre_res_3.FP, timbre_res_3.FN, timbre_res_3.P, timbre_res_3.R, timbre_res_3.F, \
|
mitian@3
|
202 timbre_res_3.AD, timbre_res_3.DA, tempo_res_05.TP, tempo_res_05.FP, tempo_res_05.FN, tempo_res_05.P, tempo_res_05.R, tempo_res_05.F, tempo_res_05.AD, tempo_res_05.DA, tempo_res_3.TP, tempo_res_3.FP, \
|
mitian@3
|
203 tempo_res_3.FN, tempo_res_3.P, tempo_res_3.R, tempo_res_3.F, tempo_res_3.AD, tempo_res_3.DA])
|
mitian@3
|
204
|
mitian@3
|
205 def writeCombinedHeader(self, filename):
|
mitian@3
|
206 '''Write header of output files for combined features.'''
|
mitian@3
|
207
|
mitian@3
|
208 with open(filename, 'a') as f:
|
mitian@3
|
209 csvwriter = csv.writer(f, delimiter=',')
|
mitian@3
|
210 csvwriter.writerow(['audio', 'gt_tb_P_0.5', 'gt_tb_R_0.5', 'gt_tb_F_0.5', 'gt_tb_P_3', 'gt_tb_R_3', 'gt_tb_F_3', 'gt_tp_P_0.5', 'gt_tp_R_0.5', 'gt_tp_F_0.5', 'gt_tp_P_3', 'gt_tp_R_3', 'gt_tp_F_3',\
|
mitian@3
|
211 'gt_hm_P_0.5', 'gt_hm_R_0.5', 'gt_hm_F_0.5', 'gt_hm_P_3', 'gt_hm_R_3', 'gt_hm_F_3', 'tb_tp_P_0.5', 'tb_tp_R_0.5', 'tb_tp_F_0.5', 'tb_tp_P_3', 'tb_tp_R_3', 'tb_tp_F_3', 'tb_hm_P_0.5', 'tb_hm_R_0.5', 'tb_hm_F_0.5', \
|
mitian@3
|
212 'tb_hm_P_3', 'tb_hm_R_3', 'tb_hm_F_3', 'tp_hm_P_0.5', 'tp_hm_R_0.5', 'tp_hm_F_0.5', 'tp_hm_P_3', 'tp_hm_R_3', 'tp_hm_F_3', 'gt_tb_tp_P_0.5', 'gt_tb_tp_R_0.5', 'gt_tb_tp_F_0.5', 'gt_tb_tp_P_3', 'gt_tb_tp_R_3', \
|
mitian@3
|
213 'gt_tb_tp_F_3', 'gt_tb_hm_P_0.5', 'gt_tb_hm_R_0.5', 'gt_tb_hm_F_0.5', 'gt_tb_hm_P_3', 'gt_tb_hm_R_3', 'gt_tb_hm_F_3', 'gt_tp_hm_P_0.5', 'gt_tp_hm_R_0.5', 'gt_tp_hm_F_0.5', 'gt_tp_hm_P_3', 'gt_tp_hm_R_3', 'gt_tp_hm_F_3', \
|
mitian@3
|
214 'tb_tp_hm_P_0.5', 'tb_tp_hm_R_0.5', 'tb_tp_hm_F_0.5', 'tb_tp_hm_P_3', 'tb_tp_hm_R_3', 'tb_tp_hm_F_3', 'gt_tb_tp_hm_P_0.5', 'gt_tb_tp_hm_R_0.5', 'gt_tb_tp_hm_F_0.5', 'gt_tb_tp_hm_P_3', 'gt_tb_tp_hm_R_3', 'gt_tb_tp_hm_F_3'])
|
mitian@3
|
215
|
mitian@3
|
216 def wirteCombinedRes(self, filename, ao_name, gt_hm_res_05, gt_hm_res_3, gt_tb_res_05, gt_tb_res_3, gt_tp_res_05, gt_tp_res_3, hm_tb_res_05, hm_tb_res_3, hm_tp_res_05, hm_tp_res_3, \
|
mitian@3
|
217 tb_tp_res_05, tb_tp_res_3, gt_hm_tb_res_05, gt_hm_tb_res_3, gt_hm_tp_res_05, gt_hm_tp_res_3, gt_tb_tp_res_05, gt_tb_tp_res_3, hm_tb_tp_res_05, hm_tb_tp_res_3):
|
mitian@3
|
218 '''Write result of single detection for combined features.'''
|
mitian@3
|
219
|
mitian@3
|
220 with open(filename, 'a') as f:
|
mitian@3
|
221 csvwriter = csv.writer(f, delimiter=',')
|
mitian@3
|
222 csvwriter.writerow([ao_name, gt_tb_res_05.P, gt_tb_res_05.R, gt_tb_res_05.F, gt_tb_res_3.P, gt_tb_res_3.R, gt_tb_res_3.F, gt_tp_res_05.P, gt_tp_res_05.R, gt_tp_res_05.F, gt_tp_res_3.P, gt_tp_res_3.R, gt_tp_res_3.F, \
|
mitian@3
|
223 gt_hm_res_05.P, gt_hm_res_05.R, gt_hm_res_05.F, gt_hm_res_3.P, gt_hm_res_3.R, gt_hm_res_3.F, tb_tp_res_05.P, tb_tp_res_05.R, tb_tp_res_05.F, tb_tp_res_3.P, tb_tp_res_3.R, tb_tp_res_3.F, \
|
mitian@3
|
224 tb_hm_res_05.P, tb_hm_res_05.R, tb_hm_res_05.F, tb_hm_res_3.P, tb_hm_res_3.R, tb_hm_res_3.F, tp_hm_res_05.P, tp_hm_res_05.R, tp_hm_res_05.F, tp_hm_res_3.P, tp_hm_res_3.R, tp_hm_res_3.F, \
|
mitian@3
|
225 gt_tb_tp_res_05.P, gt_tb_tp_res_05.R, gt_tb_tp_res_05.F, gt_tb_tp_res_3.P, gt_tb_tp_res_3.R, gt_tb_tp_res_3.F, gt_tb_hm_res_05.P, gt_tb_hm_res_05.R, gt_tb_hm_res_05.F, gt_tb_hm_res_3.P, gt_tb_hm_res_3.R, gt_tb_hm_res_3.F, \
|
mitian@3
|
226 gt_tp_hm_res_05.P, gt_tp_hm_res_05.R, gt_tp_hm_res_05.F, gt_tp_hm_res_3.P, gt_tp_hm_res_3.R, gt_tp_hm_res_3.F, tb_tp_hm_res_05.P, tb_tp_hm_res_05.R, tb_tp_hm_res_05.F, tb_tp_hm_res_3.P, tb_tp_hm_res_3.R, tb_tp_hm_res_3.F, \
|
mitian@3
|
227 gt_tb_tp_hm_res_05.P, gt_tb_tp_hm_res_05.R, gt_tb_tp_hm_res_05.F, gt_tb_tp_hm_res_3.P, gt_tb_tp_hm_res_3.R, gt_tb_tp_hm_res_3.F])
|
mitian@3
|
228
|
mitian@3
|
229
|
mi@0
|
230 def process(self):
|
mi@0
|
231 '''For the aggregated input features, discard a propertion each time as the pairwise distances within the feature space descending.
|
mi@0
|
232 In the meanwhile evaluate the segmentation result and track the trend of perfomance changing by measuring the feature selection
|
mi@0
|
233 threshold - segmentation f measure curve.
|
mi@0
|
234 '''
|
mi@0
|
235
|
mi@0
|
236 peak_picker = PeakPicker()
|
mi@0
|
237 peak_picker.params.alpha = 9.0 # Alpha norm
|
mi@0
|
238 peak_picker.params.delta = self.delta_threshold # Adaptive thresholding delta
|
mi@0
|
239 peak_picker.params.QuadThresh_a = (100 - self.threshold) / 1000.0
|
mi@0
|
240 peak_picker.params.QuadThresh_b = 0.0
|
mi@0
|
241 peak_picker.params.QuadThresh_c = (100 - self.threshold) / 1500.0
|
mi@0
|
242 peak_picker.params.rawSensitivity = 20
|
mi@0
|
243 peak_picker.params.aCoeffs = self.aCoeffs
|
mi@0
|
244 peak_picker.params.bCoeffs = self.bCoeffs
|
mi@0
|
245 peak_picker.params.preWin = self.medianWin
|
mi@0
|
246 peak_picker.params.postWin = self.medianWin + 1
|
mi@0
|
247 peak_picker.params.LP_on = self.LPfilter_on
|
mi@0
|
248 peak_picker.params.Medfilt_on = self.medfilter_on
|
mi@0
|
249 peak_picker.params.Polyfit_on = self.polyfitting_on
|
mi@0
|
250 peak_picker.params.isMedianPositive = False
|
mi@0
|
251
|
mi@0
|
252 # Settings used for feature extraction
|
mi@0
|
253 feature_window_frame = int(self.SampleRate / self.gammatoneLen * self.featureWindow)
|
mi@0
|
254 feature_step_frame = int(0.5 * self.SampleRate / self.gammatoneLen * self.featureStep)
|
mi@0
|
255 aggregation_window, aggregation_step = 100, 50
|
mi@0
|
256 featureRate = float(self.SampleRate) / self.stepSize
|
mi@0
|
257
|
mi@0
|
258 audio_files = [x for x in os.listdir(options.GT) if not x.startswith(".") ]
|
mi@0
|
259 # audio_files = audio_files[:2]
|
mi@0
|
260 audio_files.sort()
|
mi@0
|
261 audio_list = []
|
mi@0
|
262
|
mi@0
|
263 gammatone_feature_list = [i for i in os.listdir(options.GF) if not i.startswith('.')]
|
mi@0
|
264 gammatone_feature_list = ['contrast4', 'rolloff', 'dct']
|
mi@0
|
265 tempo_feature_list = [i for i in os.listdir(options.TF) if not i.startswith('.')]
|
mi@0
|
266 tempo_feature_list = ['intensity_bpm', 'loudness_bpm']
|
mi@0
|
267 timbre_feature_list = ['mfcc']
|
mi@0
|
268 harmonic_feature_list = ['nnls']
|
mi@0
|
269
|
mi@0
|
270 gammatone_feature_list = [join(options.GF, f) for f in gammatone_feature_list]
|
mi@0
|
271 timbre_feature_list = [join(options.SF, f) for f in timbre_feature_list]
|
mi@0
|
272 tempo_feature_list = [join(options.TF, f) for f in tempo_feature_list]
|
mi@0
|
273 harmonic_feature_list = [join(options.SF, f) for f in harmonic_feature_list]
|
mi@0
|
274
|
mi@0
|
275 fobj_list = []
|
mi@0
|
276
|
mi@0
|
277 # For each audio file, load specific features
|
mi@0
|
278 for audio in audio_files:
|
mi@0
|
279 ao = AudioObj()
|
mi@0
|
280 ao.name = splitext(audio)[0]
|
mi@0
|
281 print ao.name
|
mi@0
|
282 # annotation_file = join(options.GT, ao.name+'.txt') # iso, salami
|
mi@0
|
283 # ao.gt = np.genfromtxt(annotation_file, usecols=0)
|
mi@0
|
284 # ao.label = np.genfromtxt(annotation_file, usecols=1, dtype=str)
|
mi@0
|
285 annotation_file = join(options.GT, ao.name+'.csv') # qupujicheng
|
mi@0
|
286 ao.gt = np.genfromtxt(annotation_file, usecols=0, delimiter=',')
|
mi@0
|
287 ao.label = np.genfromtxt(annotation_file, usecols=1, delimiter=',', dtype=str)
|
mi@0
|
288
|
mi@0
|
289 gammatone_featureset, timbre_featureset, tempo_featureset, harmonic_featureset = [], [], [], []
|
mi@0
|
290 for feature in gammatone_feature_list:
|
mi@0
|
291 for f in os.listdir(feature):
|
mi@0
|
292 if f[:f.find('_vamp')]==ao.name:
|
mi@0
|
293 gammatone_featureset.append(np.genfromtxt(join(feature, f), delimiter=',',filling_values=0.0)[:,1:])
|
mi@0
|
294 break
|
mi@0
|
295 if len(gammatone_feature_list) > 1:
|
mi@0
|
296 n_frame = np.min([x.shape[0] for x in gammatone_featureset])
|
mi@0
|
297 gammatone_featureset = [x[:n_frame,:] for x in gammatone_featureset]
|
mi@0
|
298 ao.gammatone_features = np.hstack((gammatone_featureset))
|
mi@0
|
299 else:
|
mi@0
|
300 ao.gammatone_features = gammatone_featureset[0]
|
mi@0
|
301
|
mi@0
|
302 for feature in timbre_feature_list:
|
mi@0
|
303 for f in os.listdir(feature):
|
mi@0
|
304 if f[:f.find('_vamp')]==ao.name:
|
mi@0
|
305 timbre_featureset.append(np.genfromtxt(join(feature, f), delimiter=',',filling_values=0.0)[:,1:])
|
mi@0
|
306 break
|
mi@0
|
307 if len(timbre_feature_list) > 1:
|
mi@0
|
308 n_frame = np.min([x.shape[0] for x in timbre_featureset])
|
mi@0
|
309 timbre_featureset = [x[:n_frame,:] for x in timbre_featureset]
|
mi@0
|
310 ao.timbre_features = np.hstack((timbre_featureset))
|
mi@0
|
311 else:
|
mi@0
|
312 ao.timbre_features = timbre_featureset[0]
|
mi@0
|
313 for feature in tempo_feature_list:
|
mi@0
|
314 for f in os.listdir(feature):
|
mi@0
|
315 if f[:f.find('_vamp')]==ao.name:
|
mi@0
|
316 tempo_featureset.append(np.genfromtxt(join(feature, f), delimiter=',',filling_values=0.0)[1:,1:])
|
mi@0
|
317 ao.tempo_timestamps = np.genfromtxt(join(feature, f), delimiter=',',filling_values=0.0)[1:,0]
|
mi@0
|
318 break
|
mi@0
|
319 if len(tempo_feature_list) > 1:
|
mi@0
|
320 n_frame = np.min([x.shape[0] for x in tempo_featureset])
|
mi@0
|
321 tempo_featureset = [x[:n_frame,:] for x in tempo_featureset]
|
mi@0
|
322 ao.tempo_features = np.hstack((tempo_featureset))
|
mi@0
|
323 else:
|
mi@0
|
324 ao.tempo_features = tempo_featureset[0]
|
mi@0
|
325 for feature in harmonic_feature_list:
|
mi@0
|
326 for f in os.listdir(feature):
|
mi@0
|
327 if f[:f.find('_vamp')]==ao.name:
|
mi@0
|
328 harmonic_featureset.append(np.genfromtxt(join(feature, f), delimiter=',',filling_values=0.0)[:,1:])
|
mi@0
|
329 break
|
mi@0
|
330 if len(harmonic_feature_list) > 1:
|
mi@0
|
331 n_frame = np.min([x.shape[0] for x in harmonic_featureset])
|
mi@0
|
332 harmonic_featureset = [x[:n_frame,:] for x in harmonic_featureset]
|
mi@0
|
333 ao.harmonic_features = np.hstack((harmonic_featureset))
|
mi@0
|
334 else:
|
mi@0
|
335 ao.harmonic_features = harmonic_featureset[0]
|
mi@0
|
336
|
mi@0
|
337 # Get aggregated features for computing ssm
|
mi@0
|
338 aggregation_window, aggregation_step = 1,1
|
mi@0
|
339 featureRate = float(self.SampleRate) /self.stepSize
|
mi@0
|
340 pca = PCA(n_components=5)
|
mi@0
|
341
|
mi@0
|
342 # Resample and normalise features
|
mi@0
|
343 ao.gammatone_features = resample(ao.gammatone_features, step)
|
mi@0
|
344 ao.gammatone_features = normaliseFeature(ao.gammatone_features)
|
mi@0
|
345 ao.timbre_features = resample(ao.timbre_features, step)
|
mi@0
|
346 ao.timbre_features = normaliseFeature(ao.timbre_features)
|
mi@0
|
347 ao.harmonic_features = resample(ao.harmonic_features, step)
|
mi@0
|
348 ao.harmonic_features = normaliseFeature(ao.harmonic_features)
|
mi@0
|
349 ao.tempo_features = normaliseFeature(ao.harmonic_features)
|
mi@0
|
350
|
mi@0
|
351 pca.fit(ao.gammatone_features)
|
mi@0
|
352 ao.gammatone_features = pca.transform(ao.gammatone_features)
|
mi@0
|
353 ao.gammatone_ssm = getSSM(ao.gammatone_features)
|
mi@0
|
354
|
mi@0
|
355 pca.fit(ao.tempo_features)
|
mi@0
|
356 ao.tempo_features = pca.transform(ao.tempo_features)
|
mi@0
|
357 ao.tempo_ssm = getSSM(ao.tempo_features)
|
mi@0
|
358
|
mi@0
|
359 pca.fit(ao.timbre_features)
|
mi@0
|
360 ao.timbre_features = pca.transform(ao.timbre_features)
|
mi@0
|
361 ao.timbre_ssm = getSSM(ao.timbre_features)
|
mi@0
|
362
|
mi@0
|
363 pca.fit(ao.harmonic_features)
|
mi@0
|
364 ao.harmonic_features = pca.transform(ao.harmonic_features)
|
mi@0
|
365 ao.harmonic_ssm = getSSM(ao.harmonic_features)
|
mi@0
|
366
|
mi@0
|
367 ao.ssm_timestamps = np.array(map(lambda x: ao.tempo_timestamps[aggregation_step*x], np.arange(0, ao.gammatone_ssm.shape[0])))
|
mi@0
|
368
|
mi@0
|
369 audio_list.append(ao)
|
mi@0
|
370
|
mitian@3
|
371 # Prepare output files.
|
mitian@3
|
372 outfile1 = join(options.OUTPUT, 'individual_novelty.csv')
|
mitian@3
|
373 outfile2 = join(options.OUTPUT, 'individual_foote.csv')
|
mitian@3
|
374 outfile3 = join(options.OUTPUT, 'individual_sf.csv')
|
mitian@3
|
375 outfile4 = join(options.OUTPUT, 'individual_cnmf.csv')
|
mitian@3
|
376
|
mitian@3
|
377 outfile5 = join(options.OUTPUT, 'combined_novelty.csv')
|
mitian@3
|
378 outfile6 = join(options.OUTPUT, 'combined_foote.csv')
|
mitian@3
|
379 outfile7 = join(options.OUTPUT, 'combined_sf.csv')
|
mitian@3
|
380 outfile8 = join(options.OUTPUT, 'combined_cnmf.csv')
|
mitian@3
|
381
|
mitian@3
|
382 self.wirteIndividualHeader(outfile1)
|
mitian@3
|
383 self.wirteIndividualHeader(outfile2)
|
mitian@3
|
384 self.wirteIndividualHeader(outfile3)
|
mitian@3
|
385 self.wirteIndividualHeader(outfile4)
|
mitian@3
|
386
|
mitian@3
|
387 # self.wirteCombinedlHeader(outfile5)
|
mitian@3
|
388 # self.wirteCombinedlHeader(outfile6)
|
mitian@3
|
389 self.wirteCombinedlHeader(outfile7)
|
mitian@3
|
390 # self.wirteCombinedlHeader(outfile8)
|
mitian@3
|
391
|
mi@0
|
392 print 'Segmenting using %s method' %options.BOUNDARY
|
mi@0
|
393 for i,ao in enumerate(audio_list):
|
mi@0
|
394 print 'processing: %s' %ao.name
|
mitian@3
|
395
|
mitian@3
|
396 ############################################################################################################################################
|
mitian@3
|
397 # Experiment 1: segmentation using individual features.
|
mitian@3
|
398
|
mitian@3
|
399 gammatone_novelty, smoothed_gammatone_novelty, gammatone_novelty_idxs = novelty_S.process(ao.gammatone_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
400 timbre_novelty, smoothed_timbre_novelty, timbre_novelty_idxs = novelty_S.process(ao.timbre_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
401 tempo_novelty, smoothed_harmonic_novelty, tempo_novelty_idxs = novelty_S.process(ao.tempo_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
402 harmonic_novelty, smoothed_tempo_novelty, harmonic_novelty_idxs = novelty_S.process(ao.harmonic_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
403
|
mitian@3
|
404 gammatone_cnmf_idxs = cnmf_S.segmentation(ao.gammatone_features, rank=rank, R=R, h=h, niter=300)
|
mitian@3
|
405 timbre_cnmf_idxs = cnmf_S.segmentation(ao.timbre_features, rank=rank, R=R, h=h, niter=300)
|
mitian@3
|
406 tempo_cnmf_idxs = cnmf_S.segmentation(ao.tempo_features, rank=rank, R=R, h=h, niter=300)
|
mitian@3
|
407 harmonic_cnmf_idxs = cnmf_S.segmentation(ao.harmonic_features, rank=rank, R=R, h=h, niter=300)
|
mitian@3
|
408
|
mitian@3
|
409 gammatone_foote_idxs = foote_S.segmentation(ao.gammatone_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
410 timbre_foote_idxs = foote_S.segmentation(ao.timbre_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
411 tempo_foote_idxs = foote_S.segmentation(ao.tempo_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
412 harmonic_foote_idxs = foote_S.segmentation(ao.harmonic_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
413
|
mitian@3
|
414 gammatone_sf_idxs = sf_S.segmentation(ao.gammatone_features)
|
mitian@3
|
415 timbre_sf_idxs = sf_S.segmentation(ao.timbre_features)
|
mitian@3
|
416 tempo_sf_idxs = sf_S.segmentation(ao.tempo_features)
|
mitian@3
|
417 harmonic_sf_idxs = sf_S.segmentation(ao.harmonic_features)
|
mitian@1
|
418
|
mitian@3
|
419 # Evaluate and write results.
|
mitian@3
|
420 gt_novelty_05 = self.pairwiseF(ao.gt, gammatone_novelty_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
421 gt_novelty_3 = self.pairwiseF(ao.gt, gammatone_novelty_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
422 harmonic_novelty_05 = self.pairwiseF(ao.gt, harmonic_novelty_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
423 harmonic_novelty_3 = self.pairwiseF(ao.gt, harmonic_novelty_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
424 tempo_novelty_05 = self.pairwiseF(ao.gt, tempo_novelty_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
425 tempo_novelty_3 = self.pairwiseF(ao.gt, tempo_novelty_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
426 timbre_novelty_05 = self.pairwiseF(ao.gt, timbre_novelty_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
427 timbre_novelty_3 = self.pairwiseF(ao.gt, timbre_novelty_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mi@0
|
428
|
mitian@3
|
429 gt_cnmf_05 = self.pairwiseF(ao.gt, gammatone_cnmf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
430 gt_cnmf_3 = self.pairwiseF(ao.gt, gammatone_cnmf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
431 harmonic_cnmf_05 = self.pairwiseF(ao.gt, harmonic_cnmf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
432 harmonic_cnmf_3 = self.pairwiseF(ao.gt, harmonic_cnmf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
433 tempo_cnmf_05 = self.pairwiseF(ao.gt, tempo_cnmf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
434 tempo_cnmf_3 = self.pairwiseF(ao.gt, tempo_cnmf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
435 timbre_cnmf_05 = self.pairwiseF(ao.gt, timbre_cnmf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
436 timbre_cnmf_3 = self.pairwiseF(ao.gt, timbre_cnmf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
437
|
mitian@3
|
438 gt_sf_05 = self.pairwiseF(ao.gt, gammatone_sf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
439 gt_sf_3 = self.pairwiseF(ao.gt, gammatone_sf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
440 harmonic_sf_05 = self.pairwiseF(ao.gt, harmonic_sf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
441 harmonic_sf_3 = self.pairwiseF(ao.gt, harmonic_sf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
442 tempo_sf_05 = self.pairwiseF(ao.gt, tempo_sf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
443 tempo_sf_3 = self.pairwiseF(ao.gt, tempo_sf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
444 timbre_sf_05 = self.pairwiseF(ao.gt, timbre_sf_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
445 timbre_sf_3 = self.pairwiseF(ao.gt, timbre_sf_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
446
|
mitian@3
|
447 gt_foote_05 = self.pairwiseF(ao.gt, gammatone_foote_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
448 gt_foote_3 = self.pairwiseF(ao.gt, gammatone_foote_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
449 harmonic_foote_05 = self.pairwiseF(ao.gt, harmonic_foote_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
450 harmonic_foote_3 = self.pairwiseF(ao.gt, harmonic_foote_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
451 tempo_foote_05 = self.pairwiseF(ao.gt, tempo_foote_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
452 tempo_foote_3 = self.pairwiseF(ao.gt, tempo_foote_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
453 timbre_foote_05 = self.pairwiseF(ao.gt, timbre_foote_idxs, tolerance=0.5, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@3
|
454 timbre_foote_3 = self.pairwiseF(ao.gt, timbre_foote_idxs, tolerance=3, combine=1.0, idx2time=ao.ssm_timestamps)
|
mitian@1
|
455
|
mitian@3
|
456 self.writeIndividualRes(ao.name, outfile1, gt_novelty_05, gt_novelty_3, harmonic_novelty_05, harmonic_novelty_3, tempo_novelty_05, timbre_novelty_05, timbre_novelty_05, timbre_novelty_3)
|
mitian@3
|
457 self.writeIndividualRes(ao.name, outfile2, gt_cnmf_05, gt_cnmf_3, harmonic_cnmf_05, harmonic_cnmf_3, tempo_cnmf_05, timbre_cnmf_05, timbre_cnmf_05, timbre_cnmf_3)
|
mitian@3
|
458 self.writeIndividualRes(ao.name, outfile3, gt_sf_05, gt_sf_3, harmonic_sf_05, harmonic_sf_3, tempo_sf_05, timbre_sf_05, timbre_sf_05, timbre_sf_3)
|
mitian@3
|
459 self.writeIndividualRes(ao.name, outfile4, gt_foote_05, gt_foote_3, harmonic_foote_05, harmonic_foote_3, tempo_foote_05, timbre_foote_05, timbre_foote_05, timbre_foote_3)
|
mitian@1
|
460
|
mitian@1
|
461
|
mitian@3
|
462 ############################################################################################################################################
|
mitian@3
|
463 # Experiment 2: segmentation using combined features.
|
mi@2
|
464
|
mitian@3
|
465 # Dumping features.
|
mitian@3
|
466 gt_hm = np.hstack([ao.gammatone_features, ao.harmonic_features])
|
mitian@3
|
467 gt_tb = np.hstack([ao.gammatone_features, ao.timbre_features])
|
mitian@3
|
468 gt_tp = np.hstack([ao.gammatone_features, ao.tempo_features])
|
mitian@3
|
469 hm_tb = np.hstack([ao.harmonic_features, ao.timbre_features])
|
mitian@3
|
470 hm_tp = np.hstack([ao.harmonic_features, ao.tempo_features])
|
mitian@3
|
471 tb_tp = np.hstack([ao.timbre_features, ao.tempo_features])
|
mitian@3
|
472 gt_hm_tp = np.hstack([ao.gammatone_features, ao.harmonic_features, ao.tempo_features])
|
mitian@3
|
473 gt_tb_tp = np.hstack([ao.gammatone_features, ao.timbre_features, ao.tempo_features])
|
mitian@3
|
474 hm_tb_tp = np.hstack([ao.harmonic_features, ao.timbre_features, ao.tempo_features])
|
mitian@3
|
475 gt_hm_tb_tp = np.hstack([ao.gammatone_features, ao.harmonic_features, ao.timbre_features, ao.tempo_features])
|
mitian@3
|
476
|
mitian@3
|
477 gt_hm_sf_idxs = sf_S.segmentation(gt_hm)
|
mitian@3
|
478 gt_tb_sf_idxs = sf_S.segmentation(gt_tb)
|
mitian@3
|
479 gt_tp_sf_idxs = sf_S.segmentation(gt_tp)
|
mitian@3
|
480 hm_tb_sf_idxs = sf_S.segmentation(hm_tb)
|
mitian@3
|
481 hm_tp_sf_idxs = sf_S.segmentation(hm_tp)
|
mitian@3
|
482 tb_tp_sf_idxs = sf_S.segmentation(tb_tp)
|
mitian@3
|
483 gt_hm_tb_sf_idxs = sf_S.segmentation(gt_hm_tb)
|
mitian@3
|
484 gt_hm_tp_sf_idxs = sf_S.segmentation(gt_hm_tp)
|
mitian@3
|
485 gt_tb_tp_sf_idxs = sf_S.segmentation(gt_tb_tp)
|
mitian@3
|
486 hm_tb_tp_sf_idxs = sf_S.segmentation(hm_tb_tp)
|
mitian@3
|
487 gt_hm_tb_tp_sf_idxs = sf_S.segmentation(gt_hm_tb_tp)
|
mitian@3
|
488
|
mitian@3
|
489 gt_hm_05 = self.pairwiseF(ao.gt, gt_hm_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
490 gt_tb_05 = self.pairwiseF(ao.gt, gt_tb_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
491 gt_tp_05 = self.pairwiseF(ao.gt, gt_tp_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
492 hm_tb_05 = self.pairwiseF(ao.gt, hm_tb_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
493 hm_tp_05 = self.pairwiseF(ao.gt, hm_tp_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
494 tb_tp_05 = self.pairwiseF(ao.gt, tb_tp_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
495 gt_hm_tb_05 = self.pairwiseF(ao.gt, gt_hm_tb_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
496 gt_hm_tp_05 = self.pairwiseF(ao.gt, gt_hm_tp_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
497 gt_tb_tp_05 = self.pairwiseF(ao.gt, gt_tb_tp_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
498 hm_tb_tp_05 = self.pairwiseF(ao.gt, hm_tb_tp_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
499 gt_hm_tb_tp_05 = self.pairwiseF(ao.gt, gt_hm_tb_tp_sf_idxs, tolerance=0.5, combine=1.0)
|
mitian@3
|
500
|
mitian@3
|
501 gt_hm_3 = self.pairwiseF(ao.gt, gt_hm_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
502 gt_tb_3 = self.pairwiseF(ao.gt, gt_tb_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
503 gt_tp_3 = self.pairwiseF(ao.gt, gt_tp_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
504 hm_tb_3 = self.pairwiseF(ao.gt, hm_tb_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
505 hm_tp_3 = self.pairwiseF(ao.gt, hm_tp_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
506 tb_tp_3 = self.pairwiseF(ao.gt, tb_tp_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
507 gt_hm_tb_3 = self.pairwiseF(ao.gt, gt_hm_tb_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
508 gt_hm_tp_3 = self.pairwiseF(ao.gt, gt_hm_tp_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
509 gt_tb_tp_3 = self.pairwiseF(ao.gt, gt_tb_tp_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
510 hm_tb_tp_3 = self.pairwiseF(ao.gt, hm_tb_tp_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
511 gt_hm_tb_tp_3 = self.pairwiseF(ao.gt, gt_hm_tb_tp_sf_idxs, tolerance=3, combine=1.0)
|
mitian@3
|
512
|
mitian@3
|
513 self.writeCombinedRes(ao.name, outfile7, gt_hm_05, gt_hm_3, gt_tb_05, gt_tb_3, gt_tp_05, gt_tp_3, hm_tb_05, hm_tb_3, hm_tp_05, hm_tp_3, tb_tp_05, tb_tp_3\
|
mitian@3
|
514 gt_hm_tb_05, gt_hm_tb_3, gt_hm_tp_05, gt_hm_tp_3, gt_tb_tp_05, gt_tb_tp_3, hm_tb_tp_05, hm_tb_tp_3, gt_hm_tb_tp_05, gt_hm_tb_tp_3)
|
mitian@3
|
515
|
mitian@3
|
516 ############################################################################################################################################
|
mitian@3
|
517 # Experiment 3: Pruning boundaries detected by individual boundary algorithms.
|
mitian@3
|
518
|
mitian@3
|
519
|
mitian@3
|
520 # if options.BOUNDARY == 'novelty':
|
mitian@3
|
521 # gammatone_novelty, smoothed_gammatone_novelty, gammatone_bound_idxs = novelty_S.process(ao.gammatone_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
522 # timbre_novelty, smoothed_timbre_novelty, timbre_bound_idxs = novelty_S.process(ao.timbre_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
523 # tempo_novelty, smoothed_harmonic_novelty, tempo_bound_idxs = novelty_S.process(ao.tempo_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
524 # harmonic_novelty, smoothed_tempo_novelty, harmonic_bound_idxs = novelty_S.process(ao.harmonic_ssm, self.kernel_size, peak_picker)
|
mitian@3
|
525 #
|
mitian@3
|
526 # if options.BOUNDARY == 'cnmf':
|
mitian@3
|
527 # gammatone_cnmf_idxs = cnmf_S.segmentation(ao.gammatone_features, rank=rank, R=R, h=8, niter=300)
|
mitian@3
|
528 # timbre_cnmf_idxs = cnmf_S.segmentation(ao.timbre_features, rank=rank, R=R, h=h, niter=300)
|
mitian@3
|
529 # tempo_cnmf_idxs = cnmf_S.segmentation(ao.tempo_features, rank=rank, R=R, h=h, niter=300)
|
mitian@3
|
530 # harmonic_cnmf_idxs = cnmf_S.segmentation(ao.harmonic_features, rank=rank, R=R, h=h, niter=300)
|
mitian@3
|
531 #
|
mitian@3
|
532 # if options.BOUNDARY == 'foote':
|
mitian@3
|
533 # gammatone_foote_idxs = foote_S.segmentation(ao.gammatone_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
534 # timbre_foote_idxs = foote_S.segmentation(ao.timbre_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
535 # tempo_foote_idxs = foote_S.segmentation(ao.tempo_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
536 # harmonic_foote_idxs = foote_S.segmentation(ao.harmonic_features, M=M, Mg=Mg, L=L)
|
mitian@3
|
537 #
|
mitian@3
|
538 # if options.BOUNDARY == 'sf':
|
mitian@3
|
539 # gammatone_sf_idxs = sf_S.segmentation(ao.gammatone_features)
|
mitian@3
|
540 # timbre_sf_idxs = sf_S.segmentation(ao.timbre_features)
|
mitian@3
|
541 # tempo_sf_idxs = sf_S.segmentation(ao.tempo_features)
|
mitian@3
|
542 # harmonic_sf_idxs = sf_S.segmentation(ao.harmonic_features)
|
mitian@3
|
543 #
|
mitian@3
|
544 # gammatone_novelty_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in gammatone_novelty_peaks]
|
mitian@3
|
545 # timbre_novelty_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in timbre_novelty_peaks]
|
mitian@3
|
546 # harmonic_novelty_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in harmonic_novelty_peaks]
|
mitian@3
|
547 # tempo_novelty_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in tempo_novelty_peaks]
|
mitian@3
|
548 #
|
mitian@3
|
549 # gammatone_cnmf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in gammatone_cnmf_peaks]
|
mitian@3
|
550 # timbre_cnmf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in timbre_cnmf_peaks]
|
mitian@3
|
551 # harmonic_cnmf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in harmonic_cnmf_peaks]
|
mitian@3
|
552 # tempo_cnmf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in tempo_cnmf_peaks]
|
mitian@3
|
553 #
|
mitian@3
|
554 # gammatone_sf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in gammatone_sf_peaks]
|
mitian@3
|
555 # timbre_sf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in timbre_sf_peaks]
|
mitian@3
|
556 # harmonic_sf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in harmonic_sf_peaks]
|
mitian@3
|
557 # tempo_sf_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in tempo_sf_peaks]
|
mitian@3
|
558 #
|
mitian@3
|
559 # gammatone_foote_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in gammatone_foote_peaks]
|
mitian@3
|
560 # timbre_foote_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in timbre_foote_peaks]
|
mitian@3
|
561 # harmonic_foote_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in harmonic_foote_peaks]
|
mitian@3
|
562 # tempo_foote_detection = [0.0] + [ao.ssm_timestamps[int(np.rint(i))] for i in tempo_foote_peaks]
|
mitian@3
|
563 #
|
mitian@3
|
564 # # Experiment 2: Trying combined features using the best boundary retrieval method
|
mitian@3
|
565 # ao_featureset = [ao.gammatone_features, ao.harmonic_features, ao.timbre_features, ao.tempo_features]
|
mitian@3
|
566 # feature_sel = [int(x) for x in options.FEATURES if x.isdigit()]
|
mitian@3
|
567 # fused_featureset = [ao_featureset[i] for i in feature_sel]
|
mitian@3
|
568
|
mitian@3
|
569 # if options.LABEL == 'fmc2d':
|
mitian@3
|
570 # gammatone_fmc2d_labels = fmc2d_S.compute_similarity(gammatone_bound_idxs, xmeans=True, N=N)
|
mitian@3
|
571 # timbre_fmc2d_labels = fmc2d_S.compute_similarity(timbre_bound_idxs, xmeans=True, N=N)
|
mitian@3
|
572 # tempo_fmc2d_labels = fmc2d_S.compute_similarity(tempo_bound_idxs, xmeans=True, N=N)
|
mitian@3
|
573 # harmonic_fmc2d_labels = fmc2d_S.compute_similarity(harmonic_bound_idxs, xmeans=True, N=N)
|
mitian@3
|
574 #
|
mitian@3
|
575 # if options.LABEL == 'cnmf':
|
mitian@3
|
576 # gammatone_cnmf_labels = cnmf_S.compute_labels(gammatone_bound_idxs, est_bound_idxs, nFrames)
|
mitian@3
|
577 # timbre_cnmf_labels = cnmf_S.compute_labels(timbre_bound_idxs, est_bound_idxs, nFrames)
|
mitian@3
|
578 # tempo_cnmf_labels = cnmf_S.compute_labels(tempo_bound_idxs, est_bound_idxs, nFrames)
|
mitian@3
|
579 # harmonic_cnmf_labels = cnmf_S.compute_labels(harmonic_bound_idxs, est_bound_idxs, nFrames)
|
mitian@3
|
580 #
|
mitian@3
|
581 #
|
mitian@3
|
582
|
mi@0
|
583
|
mi@0
|
584
|
mi@0
|
585 def main():
|
mi@0
|
586
|
mi@0
|
587 segmenter = SSMseg()
|
mi@0
|
588 segmenter.process()
|
mi@0
|
589
|
mi@0
|
590
|
mi@0
|
591 if __name__ == '__main__':
|
mi@0
|
592 main()
|
mi@0
|
593
|