主要内容

基于小波时间散射的音乐类型分类

这个例子展示了如何使用小波时间散射和音频数据存储对音乐摘录的类型进行分类。在小波散射中,数据通过一系列小波变换、非线性和平均来传播,以产生数据的低方差表示。然后将这些低方差表示用作分类器的输入。

GTZAN数据集

本例中使用的数据集是GTZAN Genre Collection[7][8]。数据以压缩tar存档的形式提供,大小约为1.2 GB。未压缩的数据集大约需要3gb的磁盘空间。从参考资料中提供的链接提取压缩tar文件将创建一个包含10个子文件夹的文件夹。每个子文件夹以其包含的音乐样本类型命名。音乐类型有:蓝调、古典、乡村、迪斯科、嘻哈、爵士、金属、流行、雷鬼和摇滚。每种类型有100个例子,每个音频文件由大约30秒的22050 Hz采样数据组成。在原始论文中,作者使用了大量的时域和频域特征,包括从每个音乐示例中提取的梅尔频率倒谱(MFC)系数和高斯混合模型(GMM)分类,以实现61%的准确率[7]。随后,深度学习网络被应用于这些数据。在大多数情况下,这些深度学习方法由卷积神经网络(CNN)组成,其中MFC系数或频谱图作为深度CNN的输入。 These approaches have resulted in performance of around 84% [4]. An LSTM approach with spectrogram time slices resulted in 79% accuracy and time-domain and frequency-domain features coupled with an ensemble learning approach (AdaBoost) resulted in 82% accuracy on a test set [2][3]. Recently, a sparse representation machine learning approach achieved approximately 89% accuracy [6].

下载数据

第一步是下载GTZAN流派集[7][8]。本例中的说明假设您将数据集下载到临时目录,tempdir,在MATLAB®。如果选择在不同的文件夹中下载数据tempdir,在后续提示中修改目录名称。使用gunzip下载并解压缩数据集。然后使用解压来提取tar文件的内容。的文件夹类型创建于tempdir.内部类型是十个子文件夹,每个子文件夹对应一个音乐类型。

dataURL =“http://opihi.cs.uvic.ca/sound/genres.tar.gz”;gunzip (dataURL tempdir)%在tempdir中创建types .tar将(fullfile (tempdir,解压“genres.tar”), tempdir)%创建流派文件夹

小波散射框架

在小波时间散射网络中要指定的唯一参数是时不变性的持续时间、小波滤波器组的数量和每八度的小波数。对于大多数应用,通过两个小波滤波器组级联数据就足够了。在这个例子中,我们使用默认的散射网络,它使用两个小波滤波器组。第一个滤波器组每八度有8个小波,第二个滤波器组每八度有1个小波。对于本例,将不变尺度设置为0.5秒,对于给定的采样率,这对应于略多于11,000个样本。建立小波时间散射分解网络。

小波散射(“SignalLength”2 ^ 19,“SamplingFrequency”, 22050,...“InvarianceScale”, 0.5);

为了理解不变性尺度的作用,从第一个滤波器组中获取并及时绘制缩放滤波器以及最粗尺度小波的实部和虚部。注意,缩放滤波器的时间支持按照设计基本万博1manbetx上是0.5秒。此外,最粗尺度小波的时间支持不超过小万博1manbetx波散射分解的不变尺度。

[fb,f,filterparams] = filterbank(sn);Phi = ifftshift(ifft(fb{1}.phift));psiL1 = ifftshift(ifft(fb{2}.psift(:,end)));Dt = 1/22050;时间= -2^18*dt:dt:2^18*dt-dt;Scalplt = plot(时间,,“线宽”, 1.5);持有网格Ylimits = [-3e-4 3e-4];Ylim (ylimits) plot([-0.25 -0.25],ylimits,“k——”) plot([0.25 0.25],ylimits,“k——”xlim([-0.6 0.6])“秒”) ylabel (“振幅”) wavplt = plot(time,[real(psiL1) imag(psiL1)]);图例([scalplt wavplt(1) wavplt(2)],...“扩展功能”“Wavelet-Real部分”“Wavelet-Imaginary部分”({})标题“扩展功能”“最粗尺度小波第一滤波器组”})举行

音频数据存储

音频数据存储使您能够管理音频数据文件的集合。对于机器或深度学习,音频数据存储不仅管理来自文件和文件夹的音频数据流,音频数据存储还管理标签与数据的关联,并提供将数据随机划分为不同的集以进行训练、验证和测试的能力。在本例中,使用音频数据存储来管理GTZAN音乐类型集合。回忆一下,集合的每个子文件夹都以它所代表的类型命名。设置“IncludeSubFolders”财产真正的指示音频数据存储使用子文件夹并设置“LabelSource”财产“foldernames”根据子文件夹名称创建数据标签。这个例子假设顶层目录在MATLAB中tempdir目录和被称为“类型”。确保位置是计算机上顶级数据文件夹的正确路径。机器上的顶级数据文件夹应该包含10个子文件夹,每个子文件夹以10种类型命名,并且必须只包含与这些类型对应的音频文件。

位置= fullfile(tempdir,“类型”);ads = audioDatastore(位置,“IncludeSubFolders”,真的,...“LabelSource”“foldernames”);

运行以下命令获取数据集中音乐类型的计数。

countEachLabel(广告)
ans =10×2表厂牌计数_________ _____蓝调100古典100乡村100迪斯科100嘻哈100爵士100金属100流行100雷鬼100摇滚100

如前所述,有10种类型,每种类型有100个文件。

训练和测试集

创建训练和测试集来开发和测试我们的分类器。我们用80%的数据进行训练,剩下的20%进行测试。的洗牌音频数据存储的功能随机打乱数据。在按标签分割数据以随机化数据之前执行此操作。在本例中,我们为可再现性设置随机数生成器种子。使用音频数据存储splitEachLabel命令执行80-20分割。splitEachLabel确保所有类都被平等地表示。

Rng(100)广告= shuffle(广告);[adsTrain,adsTest] = splitEachLabel(ads,0.8);countEachLabel (adsTrain)
ans =10×2表厂牌计数_________ _____蓝调80古典80乡村80迪斯科80嘻哈80爵士80金属80流行80雷鬼80摇滚80
countEachLabel (adsTest)
ans =10×2表厂牌计数_________ _____蓝调20古典20乡村20迪斯科20嘻哈20爵士20金属20流行20雷鬼20摇滚20

您可以看到训练数据中有800条记录,而测试数据中有200条记录。此外,在训练集中每种流派有80个例子,在测试集中每种流派有20个例子。

为了获得散射特征,使用一个辅助函数,helperbatchscatfeatures的散射特征的自然对数 2 1 9 每个音频文件的样本和子样本的数量散射窗口6。的源代码helperbatchscatfeatures在附录中列出。小波散射特征计算使用的批大小为64个信号。

如果您有并行计算工具箱™和受支持的GPU,请设置万博1manbetxuseGPU真正的在下面的代码中,散射变换将使用GPU计算。使用批处理大小为64的NVIDIA Titan V GPU,本例中的散射特征计算速度大约是使用CPU的9倍。

N = 2^19;批量大小= 64;scTrain = [];useGPU = false;%设置为true,表示使用GPUhasdata(adsTrain) sc = helperbatchscatfeatures(adsTrain,sn,N,batchsize,useGPU);scTrain = cat(3,scTrain,sc);结束

记录散射变换中用于创建标签的时间窗口的数量。

numTimeWindows = size(scTrain,2);

在这个例子中,每个散射路径有43个时间窗口或帧。

对测试数据重复相同的特征提取过程。

scTest = [];hasdata(adsTest) sc = helperbatchscatfeatures(adsTest,sn,N,batchsize,useGPU);scTest = cat(3,scTest,sc);结束

确定散射网络中的路径数量,并将训练和测试特征重塑为2-D矩阵。

[~,npaths] = sn.paths();Npaths = sum(Npaths);TrainFeatures = permute(scTrain,[2 3 1]);TrainFeatures =重塑(TrainFeatures,[],Npaths);TestFeatures = permute(scTest,[2 3 1]);TestFeatures =重塑(TestFeatures,[],Npaths);

每行TrainFeatures而且TestFeatures是每个音频信号散射变换中334条路径上的一个散射时间窗口。对于每个音乐样本,我们有43个这样的时间窗口。相应地,训练数据的特征矩阵为34400 × 334。行数等于训练示例数(800)乘以每个示例的散射窗口数(43)。同样,测试数据的散射特征矩阵为8600 × 334。有200个测试示例,每个示例有43个窗口。为训练数据的小波散射特征矩阵中的43个窗口中的每个窗口创建一个类型标签。

trainLabels = adsTrain.Labels;numTrainSignals = numel(trainLabels);trainLabels = repmat(trainLabels,1,numTimeWindows);trainLabels =重塑(trainLabels',numTrainSignals*numTimeWindows,1);

对测试数据重复此过程。

testLabels = adsTest.Labels;numTestSignals = numel(testLabels);testLabels = repmat(testLabels,1,numTimeWindows);testLabels =重塑(testLabels',numTestSignals*numTimeWindows,1);

在本例中,使用带有三次多项式核的多类支持向量机(SVM)分类器。万博1manbetx将SVM与训练数据进行拟合。

template = templateSVM(...“KernelFunction”多项式的...“PolynomialOrder”3,...“KernelScale”“汽车”...“BoxConstraint”, 1...“标准化”,真正的);类= {“蓝调”“经典”“国家”“迪斯科”“嘻哈”“爵士乐”...“金属”“流行”“雷鬼”“岩石”};分类svm = fitcecoc(...TrainFeatures,...trainLabels,...“学习者”模板,...“编码”“onevsone”“类名”分类(类));

测试集预测

利用SVM模型拟合训练数据的散射变换,预测测试数据的音乐类型。回忆一下,散射变换中每个信号有43个时间窗口。使用简单多数投票来预测流派。辅助函数helperMajorityVote获取所有43个散射窗口的类型标签的模式。如果没有唯一模式,helperMajorityVote返回由指示的分类错误“NoUniqueMode”.这会在混淆矩阵中增加一个额外的列。的源代码helperMajorityVote在附录中列出。

predLabels = predict(classificationSVM,TestFeatures);[TestVotes,TestCounts] = helperMajorityVote(predLabels,adsTest.Labels,categorical(Classes));testAccuracy = sum(eq(TestVotes,adsTest.Labels))/numTestSignals*100
testAccuracy = 87.5000

测试的准确性,testAccuracy大约是88%。这种准确性与GTZAN数据集的技术水平相当。

显示混淆矩阵以检查不同体裁的准确率。每节课有20个例子。

cm = confusionchart(adsTest.Labels,TestVotes);

从混淆矩阵图的对角线可以看出,对于单个类型的分类准确率总体上是相当不错的。分别提取这些类型的准确性和情节。

cmat = cm.NormalizedValues;Cmat (end,:) = [];genreAccuracy = diag(cmat)./20*100;图形栏(genreAccuracy)设置(gca,“XTickLabels”,类)xtickangle(gca,30) title(“按类型划分的正确百分比-测试集”

总结

本例演示了小波时间散射和音频数据存储在音乐类型分类中的应用。在本例中,小波时间散射实现了与GTZAN数据集的最先进性能相当的分类精度。相对于其他方法需要提取大量的时域和频域特征,小波散射只需要指定单个参数,即时不变量的尺度。音频数据存储使我们能够有效地管理从磁盘到MATLAB的大型数据集的传输,并允许我们随机化数据,并通过分类工作流程准确地保留随机化数据的类型成员。

参考文献

  1. 安登,J.和马拉特,S. 2014。深散射光谱。IEEE信号处理汇刊,Vol. 62, 16, pp. 4114-4128。

  2. Bergstra, J., Casagrande, N., Erhan, D., Eck, D.和Kegl, B.音乐分类的聚合特征和AdaBoost。机器学习,第65卷,第2-3期,第473-484页。

  3. Irvin, J., Chartock, E, and Hollander, N. 2016。带有注意的递归神经网络类型分类。https://www.semanticscholar.org/paper/Recurrent-Neural-Networks-with-Attention-for-Genre-Irvin/6da301817851f19107447e4c72e682e3f183ae8a

  4. 李,T.,陈,a.b.,和Chun, A. 2010。基于卷积神经网络的音乐模式特征自动提取。国际会议数据挖掘与应用。

  5. Mallat。美国2012年。群不变散射。纯粹数学与应用数学通讯,Vol. 65, 10, pp. 1331-1398。

  6. 帕纳加基斯,Y., Kotropoulos, C.L,和Arce, G.R. 2014。基于音频特征联合稀疏低秩表示的音乐类型分类。IEEE音频,语音和语言处理汇刊,22,12,页1905-1917。

  7. 扎内塔基斯,G.和库克,P. 2002。音频信号的音乐类型分类。IEEE语音与音频处理汇刊,第10卷,第5期,第293-302页。

  8. GTZAN流派集合http://marsyas.info/downloads/datasets.html

附录—支持功能万博1manbetx

helperMajorityVote——这个函数返回在一些特征向量上预测的类标签的模式。在小波时间散射中,我们为每个时间窗口获得一个类标签。如果没有找到唯一模式,则标签为“NoUniqueMode”返回以表示分类错误。

类型helperMajorityVote
function [ClassVotes,ClassCounts] = helperMajorityVote(predLabels,origLabels,classes) %此函数仅支持小波散射示例。万博1manbetx它可能会在将来的版本中被更改或删除。%如果标签还不是分类数组,则创建分类数组predLabels = categorical(predLabels);origLabels = categorical(origLabels);%期望predLabels和origLabels都是分类向量Npred = numel(predLabels);Norig =数字(origLabels);Nwin = Npred/Norig;predLabels =重塑(predLabels,Nwin,Norig);ClassCounts = countcats(predLabels);[mxcount,idx] = max(ClassCounts); ClassVotes = classes(idx); % Check for any ties in the maximum values and ensure they are marked as % error if the mode occurs more than once tmpsum = sum(ClassCounts == mxcount); ClassVotes(tmpsum > 1) = categorical({'NoUniqueMode'}); ClassVotes = ClassVotes(:);

helperbatchscatfeatures-该函数返回给定输入信号的小波时间散射特征矩阵。在这种情况下,我们使用小波散射系数的自然对数。在此基础上计算了散射特征矩阵 2 1 9 信号的样本。散射特征被6倍的下采样。如果useGPU设置为真正的,在GPU上计算散射变换。

函数sc = helperbatchscatfeatures(ds,sn,N,batchsize,useGPU)此函数仅用于支持小波中的示例万博1manbetx%的工具箱。在将来的版本中可能会更改或删除它。从音频数据存储中读取一批数据batch = helperReadBatch(ds,N,batchsize);如果useGPU batch = gpuArray(batch);结束获得散射特征S = sn.featureMatrix(batch,“转换”“日志”);收集(批处理);S =集合(S);对特征进行子抽样sc = S(:,1:6:end,:);结束

helperReadBatch-该函数从数据存储中读取指定大小的批,并以单精度返回输出。输出的每一列都是来自数据存储的单独信号。如果数据存储没有足够的记录,则输出的列可能比批处理大小少。

函数batchout = helperReadBatch(ds,N,batchsize)此函数仅支持小波工具箱示例。万博1manbetx它可能%更改或在将来的版本中删除。% batchout = readReadBatch(ds,N,batchsize),其中ds是数据存储和% ds是数据存储% batchsize是批处理大小Kk = 1;(hasdata(ds)) && kk <= batchsize tmpRead = read(ds);batchout(:,kk) = cast(tmpRead(1:N),“单一”);% #好< AGROW >Kk = Kk +1;结束结束

另请参阅

相关的例子

更多关于