wolffd@0: function demo8classification wolffd@0: % To get familiar with different approaches of classification using wolffd@0: % MIRtoolbox, and to assess their performances. wolffd@0: wolffd@0: % Part 1. The aim of this experiment is to categorize a set of very short wolffd@0: % musical excerpts according to their genres, through a supervised learning. wolffd@0: wolffd@0: % 1.3. Select the training set for current directory. wolffd@0: try wolffd@0: cd train_set wolffd@0: catch wolffd@0: error('Please change current directory to ''MIRtoolboxDemos'' directory') wolffd@0: end wolffd@0: wolffd@0: % Load all the files of the folder into one audio structure (called for wolffd@0: % instance training), and associate for each folder a label defined by the wolffd@0: % first two letters of the respective file name. wolffd@0: train = miraudio('Folder','Label',1:2); wolffd@0: cd .. wolffd@0: wolffd@0: % In the same way, select the testing set for current directory, and load wolffd@0: % all the files including their labels: wolffd@0: cd test_set wolffd@0: test = miraudio('Folder','Label',1:2); wolffd@0: cd .. wolffd@0: wolffd@0: % 1.4. Compute the mel-frequency cepstrum coefficient for each different wolffd@0: % audio file of both sets: wolffd@0: mfcc_train = mirmfcc(train); wolffd@0: mfcc_test = mirmfcc(test); wolffd@0: wolffd@0: % 1.5. Estimate the label (i.e., genre) of each file from the testing set, wolffd@0: % based on a prior learning using the training set. Use for this purpose wolffd@0: % the classify function. wolffd@0: help mirclassify wolffd@0: wolffd@0: % Let's first try a classification based of mfcc, for instance, using the wolffd@0: % minimum distance strategy: wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train) wolffd@0: wolffd@0: % The results indicates the outcomes and the total correct classification wolffd@0: % rate (CCR). wolffd@0: wolffd@0: % 1.6. Let's try a k-nearest-neighbour strategy. For instance, for k = 5: wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train,5) wolffd@0: wolffd@0: % 1.7. Use a Gaussian mixture modelling with one gaussian per class: wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train,'GMM',1) wolffd@0: wolffd@0: % try also with three Gaussians per class. wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train,'GMM',3) wolffd@0: wolffd@0: % As this strategy is stochastic, the results vary for every trial. wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train,'GMM',1) wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train,'GMM',1) wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train,'GMM',3) wolffd@0: mirclassify(test,mfcc_test,train,mfcc_train,'GMM',3) wolffd@0: wolffd@0: % 1.8. Carry out the classification using other features such as spectral wolffd@0: % centroid: wolffd@0: spectrum_train = mirspectrum(train); wolffd@0: spectrum_test = mirspectrum(test); wolffd@0: centroid_train = mircentroid(spectrum_train); wolffd@0: centroid_test = mircentroid(spectrum_test); wolffd@0: mirclassify(test,centroid_test,train,centroid_train,'GMM',1) wolffd@0: mirclassify(test,centroid_test,train,centroid_train,'GMM',1) wolffd@0: mirclassify(test,centroid_test,train,centroid_train,'GMM',3) wolffd@0: mirclassify(test,centroid_test,train,centroid_train,'GMM',3) wolffd@0: wolffd@0: % try also spectral entropy and spectral irregularity. wolffd@0: entropy_train = mirentropy(spectrum_train); wolffd@0: entropy_test = mirentropy(spectrum_test); wolffd@0: mirclassify(test,entropy_test,train,entropy_train,'GMM',1) wolffd@0: mirclassify(test,entropy_test,train,entropy_train,'GMM',1) wolffd@0: mirclassify(test,entropy_test,train,entropy_train,'GMM',3) wolffd@0: mirclassify(test,entropy_test,train,entropy_train,'GMM',3) wolffd@0: wolffd@0: irregularity_train = mirregularity(spectrum_train,'Contrast',.1); wolffd@0: irregularity_test = mirregularity(spectrum_test,'Contrast',.1); wolffd@0: mirclassify(test,irregularity_test,train,irregularity_train,'GMM',1) wolffd@0: mirclassify(test,irregularity_test,train,irregularity_train,'GMM',1) wolffd@0: mirclassify(test,irregularity_test,train,irregularity_train,'GMM',3) wolffd@0: mirclassify(test,irregularity_test,train,irregularity_train,'GMM',3) wolffd@0: wolffd@0: % Try classification based on a set of features such as: wolffd@0: mirclassify(test,{entropy_test,centroid_test},... wolffd@0: train,{entropy_train,centroid_train},'GMM',1) wolffd@0: mirclassify(test,{entropy_test,centroid_test},... wolffd@0: train,{entropy_train,centroid_train},'GMM',1) wolffd@0: mirclassify(test,{entropy_test,centroid_test},... wolffd@0: train,{entropy_train,centroid_train},'GMM',3) wolffd@0: mirclassify(test,{entropy_test,centroid_test},... wolffd@0: train,{entropy_train,centroid_train},'GMM',3) wolffd@0: wolffd@0: % 1.9. By varying the features used for classification, the strategies and wolffd@0: % their parameters, try to find an optimal strategy that give best correct wolffd@0: % classification rate. wolffd@0: bright_train = mirbrightness(spectrum_train); wolffd@0: bright_test = mirbrightness(spectrum_test); wolffd@0: rolloff_train = mirbrightness(spectrum_train); wolffd@0: rolloff_test = mirbrightness(spectrum_test); wolffd@0: spread_train = mirspread(spectrum_train); wolffd@0: spread_test = mirspread(spectrum_test); wolffd@0: mirclassify(test,{bright_test,rolloff_test,spread_test},... wolffd@0: train,{bright_train,rolloff_train,spread_train},'GMM',3) wolffd@0: skew_train = mirskewness(spectrum_train); wolffd@0: skew_test = mirskewness(spectrum_test); wolffd@0: kurtosis_train = mirkurtosis(spectrum_train); wolffd@0: kurtosis_test = mirkurtosis(spectrum_test); wolffd@0: flat_train = mirflatness(spectrum_train); wolffd@0: flat_test = mirflatness(spectrum_test); wolffd@0: mirclassify(test,{skew_test,kurtosis_test,flat_test},... wolffd@0: train,{skew_train,kurtosis_train,flat_train},'GMM',3) wolffd@0: for i = 1:3 wolffd@0: mirclassify(test,{mfcc_test,centroid_test,skew_test,kurtosis_test,... wolffd@0: flat_test,entropy_test,irregularity_test,... wolffd@0: bright_test,rolloff_test,spread_test},... wolffd@0: train,{mfcc_train,centroid_train,skew_train,kurtosis_train,... wolffd@0: flat_train,entropy_train,irregularity_train,... wolffd@0: bright_train,rolloff_train,spread_train},'GMM',3) wolffd@0: end wolffd@0: wolffd@0: % You can also try to change the size of the training and testing sets (by wolffd@0: % simply interverting them for instance). wolffd@0: for i = 1:3 wolffd@0: mirclassify(train,{mfcc_train,centroid_train,skew_train,kurtosis_train,... wolffd@0: flat_train,entropy_train,irregularity_train,... wolffd@0: bright_train,rolloff_train,spread_train},... wolffd@0: test,{mfcc_test,centroid_test,skew_test,kurtosis_test,... wolffd@0: flat_test,entropy_test,irregularity_test,... wolffd@0: bright_test,rolloff_test,spread_test},'GMM',3) wolffd@0: end wolffd@0: wolffd@0: %% wolffd@0: % Part 2. In this second experiment, we will try to cluster the segments of wolffd@0: % an audio file according to their mutual similarity. wolffd@0: wolffd@0: % 2.1. To simplify the computation, downsample wolffd@0: % the audio file to 11025 Hz. wolffd@0: a = miraudio('czardas','Sampling',11025); wolffd@0: wolffd@0: % 2.2. Decompose the file into successive frames of 2 seconds with half- wolffd@0: % overlapping. wolffd@0: f = mirframe(a,2,.1); wolffd@0: wolffd@0: % 2.3. Segment the file based on the novelty of the key strengths. wolffd@0: n = mirnovelty(mirkeystrength(f),'KernelSize',5) wolffd@0: p = mirpeaks(n) wolffd@0: s = mirsegment(a,p) wolffd@0: wolffd@0: % 2.4. Compute the key strengths of each segment. wolffd@0: ks = mirkeystrength(s) wolffd@0: wolffd@0: % 2.5. Cluster the segments according to their key strengths. wolffd@0: help mircluster wolffd@0: mircluster(s,ks) wolffd@0: wolffd@0: % The k means algorithm used in the clustering is stochastic, and its wolffd@0: % results may vary at each run. By default, the algorithm is run 5 times wolffd@0: % and the best result is selected. Try the analysis with a higher number of wolffd@0: % runs: wolffd@0: mircluster(s,ks,'Runs',10)