主要内容

使用小波时间散射的音乐流派分类

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

GTZAN数据集

本例中使用的数据集是GTZAN Genre Collection[7][8]。数据以压缩后的tar存档文件的形式提供,大约有1.2 GB。未压缩的数据集需要大约3gb的磁盘空间。从参考文献中提供的链接中提取压缩的tar文件将创建一个包含10个子文件夹的文件夹。每个子文件夹都以它所包含的音乐样本类型命名。音乐类型有:蓝调、古典、乡村、迪斯科、嘻哈、爵士、金属、流行、雷鬼和摇滚。每种类型都有100个例子,每个音频文件包含大约30秒的22050赫兹采样数据。在最初的论文中,作者使用了大量的时域和频域特征,包括从每个音乐示例中提取的梅尔-频率倒谱(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下载并解压缩数据集。然后使用untar.要提取TAR文件的内容。文件夹类型是创建的Tempdir..里面类型有十个子文件夹,每个音乐类型一个。

dataURL ='http://opihi.cs.uvic.ca/sound/genres.tar.gz';Gunzip(Dataull,Tempdir)%在Tempdir中创建Genres.tarUntar(fullfile(tempdir,'genres.tar'), tempdir)%创建了Genres文件夹

小波散射的框架

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

sn = waveletScattering (“SignalLength”,2 ^ 19,'采样频率', 22050,......'invariarcescale', 0.5);

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

[FB,F,FilterParams] = FilterBank(Sn);PHI = IFFTSHIFT(IFFT(FB {1} .FLIFT));psil1 = ifftshift(ifft(fb {2} .psift(:,结束)));dt = 1/22050;时间= -2 ^ 18 * dt:dt:2 ^ 18 * dt-dt;scalplt = plot(时间,phi,“线宽”, 1.5);持有网格Ylimits = [-3e-4 3e-4];ylim (ylimits);ylimits情节([-0.25 - -0.25],“k——”);ylimits情节([0.25 - 0.25],“k——”);xlim ([-0.6 - 0.6]);包含('秒');ylabel(“振幅”);Wavplt = plot(时间,[真实(psil1)imag(psil1)]);图例([scalplt wavplt(1)波普(2)],......'缩放功能'“Wavelet-Real部分”“Wavelet-Imaginary部分”});标题({'缩放功能';'粗略小波首次过滤器银行'}) 抓住

音频数据存储

音频数据存储允许您管理音频数据文件的集合。对于机器或深度学习,音频数据存储不仅可以管理文件和文件夹中的音频数据流,音频数据存储还可以管理标签与数据的关联,并提供将数据随机分区为不同的集合以进行培训,验证和测试。在此示例中,使用音频数据存储来管理GTZAN音乐类型集合。回想一下集合的每个子文件夹都以其代表的类型命名。设定'insertumbfolders'财产真正的指示音频数据存储使用子文件夹并设置“LabelSource”财产'foldernames'根据子文件夹名称创建数据标签。这个例子假设顶级目录在MATLAB中Tempdir.目录并称为“类型”。确保这件事地点是计算机上顶级数据文件夹的正确路径。你机器上的顶级数据文件夹应该包含10个子文件夹,每个文件夹都以10种类型命名,并且必须只包含与这些类型相对应的音频文件。

位置= fullfile(tempdir,'penres');广告= audiodatastore(位置,'insertumbfolders',真的,......“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)广告=洗牌(广告);[adstrain,adstest] = splitheachlabel(广告,0.8);CountAckeLabel(adstrain)
ans =.10×2表标签数_________ _____蓝调80古典80乡村80迪斯科80嘻哈80爵士80金属80流行乐80雷鬼80摇滚80
CountAckeLabel(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;Batchsize = 64;sctrain = [];使用gpu = false;%设置为true,使用图形处理器hasdata(adstrain)sc = helperbatchscatfeatures(adstrain,sn,n,batchsize,使用gpu);Sctrain =猫(3,Sctrain,SC);结尾

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

numtimewindows =尺寸(sctrain,2);

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

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

sctest = [];hasdata(adsTest) sc = helperbatchscatfeatures(adsTest,sn,N,batchsize,useGPU);sct =猫(3 sct sc);结尾

确定散射网络中的路径数,将训练和测试特征重塑为二维矩阵。

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

每一行的TrainFeaturestestfeatures.在每个音频信号的散射变换中的334路径上是一个散射时间窗口。对于每个音乐样本,我们有43个这样的时间窗口。因此,训练数据的特征矩阵是34400-by-334。行的数量等于培训示例(800)的数量乘以每示例的散射窗数(43)。类似地,测试数据的散射特征矩阵为8600×334。每个示例有200个测试示例和43个窗口。为训练数据中的小波散射功能矩阵中的43个窗口中的每一个创建一个类型的标签。

trainlabels = adstrain.labels;numtrainsignals = numel(trainlabels);Trainlabels = Repmat(Trainlabels,1,NumtimewWindows);TrainLabels = Reshape(Trainlabels',Numtrainsignals * Numtimewindows,1);

重复测试数据的过程。

testlabels = adstest.labels;numtestsignals = numel(testlabels);testlabels = repmat(testlabels,1,numtimewwows);testlabels =重塑(testlabels',numtestsignals * numtimewindows,1);

在此示例中,使用具有立方多项式内核的多级支持向量机(SVM)分类器。万博1manbetx将SVM适合培训数据。

template = templatesvm(......“KernelFunction”多项式的......“PolynomialOrder”,3,......'kernelscale'“汽车”......“BoxConstraint”, 1......“标准化”,真正的);类= {“蓝调”'古典''国家''迪斯科''嘻哈(音乐''爵士乐'......'金属''流行音乐''reggae'“岩石”};classificationSVM = fitcecoc (......TrainFeatures,......trainLabels,......'学习者', 模板,......“编码”'Onevsone'“类名”分类(类));

测试集预测

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

predlabels = predict(分类,testfeatures);[testvotes,testcounts] = HelpermajorityVote(Predlabels,Adstest.Labels,分类(类));testaccuracy = sum(eq(testvotes,adstest.labels)/ numtestsignals * 100
testAccuracy = 87.5000

测试精度,testaguracy.大约是88%。这种精度可与GTZAN数据集的最新技术相媲美。

显示混淆矩阵以检查不同类型的准确率。回想一下,每节课有20个例子。

ConfusionChart(TestVotes,Adstest.Labels)

混乱矩阵图的对角线表明,个体类型的分类精度一般都很好。分别提取这些类型的精确度并绘制。

cm = confusionmat(testvotes,adstest.labels);cm(:,结束)= [];Genreaccuracy = Diag(cm)./ 20 * 100;数字;Bar(GenreaCuracy)设置(GCA,'xticklabels',课程);XTickangle(GCA,30);标题('通过类型的百分比正确 - 测试集');

总结

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

参考文献

  1. anden,J.和Mallat,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.和Hollander,N.2016。经常性的神经网络,注意流派分类。https://www.semanticscholar.org/pare/recurrent-neural-networks-with-attention-for-genre-irvin/6da301817851f19107447e4c72e682e3f183ae8a.

  4. 李涛、陈雅博和陈雅博。2010。基于卷积神经网络的音乐模式特征自动提取。国际会议数据挖掘和应用。

  5. Mallat。美国2012年。集团不变的散射。《纯粹和应用数学通讯》,第65卷,第10页,1331-1398。

  6. Panagakis,Y.,Kotropoulos,C.L.和Arce,G.R.2014.音乐流派分类通过关节稀疏低级音频功能表示。IEEE在音频,语音和语言处理中的交易,22,12,PP。1905-1917。

  7. Tzanetakis,G.和Cook,P. 2002.音乐类型音频信号分类。IEEE关于语音和音频处理的交易,Vol。10,第5页,第5页,第293-302。

  8. GTZAN类型集合http://marsyas.info/downloads/datasets.html

附录—支持功能万博1manbetx

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

类型HelpermajorityVote.
函数[classvotes,classcounts] = HelpermajorityVote(predlabels,Origlabels,类)%此功能仅支持小波散射示例。万博1manbetx它可能会更改或在将来的释放中删除。%制作分类阵列如果标签尚未分类预测标签=分类(预测);origlabels =分类(origlabels);%期望Predlabels和Origlabels都是NPRED = NUM​​EL(预标签)的分类向量;norig = numel(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,DeveryGPU)%此函数仅旨在支持小波中的示例万博1manbetx% 工具箱。它可以在将来的释放中更改或删除。%从音频数据存储读取数据读数批= helperReadBatch (ds, N, batchsize);如果使用gpu batch = gpuarray(批量);结尾获得散射特征S = sn.featureMatrix(批处理,'转变''日志');聚集(批量);s =聚集(s);%subsamplpple1:6 sc = S (::,:);结尾

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

函数Batchout = HelperReadbatch(DS,N,Batchsize)%这个函数只支持小波工具箱的例子。万博1manbetx它可能%更改或在将来的释放中删除。% batchout = readReadBatch(ds,N,batchsize),其中ds是数据存储% ds是数据存储%batchsize是批量化kk = 1;(hasdata(DS))&& KK <= Batchsize Tmpread =读取(DS);batchout(:,kk)=施放(tmpread(1:n),'单身的');%#OK kk = kk + 1;结尾结尾

另请参阅

相关的话题