主要内容

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

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

gtzan dataset.

本例中使用的数据集是GTZAN流派集合[7][8]。数据以压缩tar存档的形式提供,约为1.2GB。未压缩的数据集需要大约3 GB的磁盘空间。从引用中提供的链接中提取压缩的tar文件将创建一个包含十个子文件夹的文件夹。每个子文件夹都根据其包含的音乐样本类型命名。音乐类型有:布鲁斯、古典、乡村、迪斯科、嘻哈、爵士、金属、流行、雷鬼和摇滚。每种类型有100个示例,每个音频文件由大约30秒的22050 Hz采样数据组成。在最初的论文中,作者使用了大量时域和频域特征,包括从每个音乐示例中提取的mel频率倒谱(MFC)系数和高斯混合模型(GMM)分类,以实现61%的准确率[7]。随后,深度学习网络被应用于这些数据。在大多数情况下,这些深度学习方法由卷积神经网络(CNN)组成,其中MFC系数或频谱图作为深度CNN的输入。这些方法产生了约84%的性能[4]。带有谱图时间切片的LSTM方法的准确率为79%,时域和频域特征加上集成学习方法(ADABOST)在测试集上的准确率为82%[2][3]。最近,稀疏表示机器学习方法实现了大约89%的准确率[6]。

下载数据

第一步是下载GTZAN Genre Collection[7][8]。本例中的说明假设您将数据集下载到临时目录,tempdir在MATLAB®。如果您选择在不同的文件夹中下载数据tempdir,请在后续说明中修改目录名称。使用枪声下载并解压缩数据集。然后使用解压提取tar文件的内容。的文件夹类型中创建tempdir。里面类型有十个子文件夹,每种音乐类型一个子文件夹。

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

小波散射框架

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

Sn =小波示踪剂('signallength',2 ^ 19,“SamplingFrequency”,22050,......'invariarcescale',0.5);

要了解不变性缩放的作用,请及时获取和绘制缩放滤波器以及来自第一滤波器组的粗略级小波的实际和虚部。请注意,缩放滤波器的时间支持基本上是0金宝app.5秒的设计。此外,粗略小波的时间支持不超过小波散金宝app射分解的不变尺度。

[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);绘图([ -  0.25-0.25],ylimits,“k——”);绘图([0.25 0.25],ylimits,“k——”);XLIM([ -  0.6 0.6]);Xlabel('秒');ylabel('振幅');wavplt = plot(time,[real(psiL1) imag(psiL1)]);传奇([scalplt wavplt (1) wavplt (2)),......{“扩展功能”“小波实部”'小波虚构的部分'});标题({“扩展功能”“最粗尺度小波第一滤波器组”})举行离开

音频数据存储

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

位置= fullfile(tempdir,'penres');广告= audioDatastore(位置,“IncludeSubFolders”,真的,......'labelsource''foldernames');

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

countEachLabel(ads)
ans =10×2表唱片计数(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数

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

培训和测试集

创建培训和测试集以开发和测试我们的分类器。我们使用80%的数据进行培训,并持有剩余的20%进行测试。这洗牌音频数据存储的功能随机随机洗牌数据。在通过标签拆分数据之前执行此操作以随机化数据。在此示例中,我们设置了随机数发生器种子以进行再现性。使用音频数据存储splitEachLabel功能要执行80-20匹配。splitEachLabel确保所有类都是平等的。

Rng (100) ads = shuffle(ads);[adsTrain, adsTest] = splitEachLabel(广告,0.8);countEachLabel (adsTrain)
ans =10×2表标签数_________ _____蓝调80古典80国家80迪斯科80个Hiphop 80爵士80金属80 POP 80 Reggae 80 Rock 80
CountAckeLabel(adstest)
ans =10×2表标签数_________ _____蓝调20古典20国家20迪斯科20个Hiphop 20爵士20金属20 Pop 20 Reggae 20 Rock 20

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

要获取散射特征,请使用辅助函数,helperbatchscatfeatures,可获得散射功能的自然对数 2 1 9. 对每个音频文件进行采样,并将散射窗口数再采样6次helperbatchscatfeatures列在附录中。小波散射特征的计算使用批处理大小的64个信号。

如果您有并行计算工具箱™和支持的GPU,请设置金宝app使用gpu.真的在下面的代码和散射变换将使用GPU计算。使用64个批量大小的NVIDIA Titan V GPU,本例中的散射特性的计算速度大约是使用CPU的9倍。

n = 2 ^ 19;Batchsize = 64;sctrain = [];使用gpu = false;%设置为true以使用GPU尽管hasdata(adstrain)sc = helperbatchscatfeatures(adstrain,sn,n,batchsize,使用gpu);Sctrain =猫(3,Sctrain,SC);结束

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

numtimewindows =尺寸(sctrain,2);

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

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

sct = [];尽管Hasdata(adstest)sc = helperbatchscatfeatures(adstest,sn,n,批量化,使用gpu);SCTEST =猫(3,SCTEST,SC);结束

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

[〜,npaths] = sn.paths();npaths = sum(npaths);训练训练=换算(Sctrain,[2 3 1]);训练费用=重塑(训练治疗,[],NPaths,1);TestFeatures =换算(SCTEST,[2 3 1]);testfeatures =重塑(Testfeatures,[],NPaths,1);

每一排列车特征testfeatures.在每个音频信号的散射变换中的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)分类器。金宝app将SVM适合培训数据。

模板= templateSVM (......'骨箱''多项式'......“多项式序”3,......“KernelScale”“自动”......“BoxConstraint”1.......'标准化', 真的);类= {“布鲁斯”“经典”'国家'“迪斯科”“嘻哈”'爵士乐'......'金属'“流行”“雷鬼”“摇滚乐”};Classificationsvm = fitcecoc(......训练疗法,......列车标签,......'学习者'模板,......'编码''Onevsone''classnames',分类(类));

测试设置预测

使用SVM模型适合培训数据的散射变换,以预测测试数据的音乐类型。召回散射变换中的每个信号有43个时间窗口。使用简单的大多数投票来预测流派。辅助功能helperMajorityVote在所有43个散射窗口上获得类型标签的模式。如果没有唯一模式,helperMajorityVote返回由指示的分类错误“NonuniqueMode”. 这会在混淆矩阵中增加一列。的源代码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)

从混淆矩阵图的对角线可以看出,分类准确率总体上很好。分别提取这些体裁的准确性和情节。

厘米= confusionmat (TestVotes adsTest.Labels);厘米(:,结束)= [];genreAccuracy =诊断接头(cm)。/ 20 * 100;图;栏(genreAccuracy)集(gca,“XTickLabels”、类);甘氨胆酸xtickangle (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. 欧文,J.,查托克,E.和霍兰德,N. 2016。注意类型分类的递归神经网络。https://www.semanticscholar.org/pare/recurrent-neural-networks-with-attention-for-genre-irvin/6da301817851f19107447e4c72e682e3f183ae8a.

  4. 李,T.,Chan,A.B.和Chun,A. 2010.使用卷积神经网络自动音乐模式特征提取。国际会议数据挖掘和应用。

  5. 马利拉特。S. 2012.集团不变散。纯净和应用数学的通信,Vol。65,10,pp。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语音和音频处理汇刊》,第10卷,第5期,293-302页。

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

附录 - 支持功能金宝app

helperMajorityVote--此函数用于返回在多个特征向量上预测的类标签的模式。在小波时间散射中,我们为每个时间窗口获得一个类标签。如果未找到唯一模式,则会显示一个标签“NonuniqueMode”返回以表示分类错误。

类型helperMajorityVote
函数[classvotes,classcounts] = HelpermajorityVote(predlabels,Origlabels,类)%此功能仅支持小波散射示例。金宝app它可能会更改或在将来的释放中删除。%制作分类阵列如果标签尚未分类预测标签=分类(预测);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倍的限量。如果使用gpu.被设置为真的,在GPU上计算散射变换。

功能SC = Helperbatchscatfeatures(DS,Sn,N,Batchsize,DeveryGPU)%此函数仅用于支持小波中的示例金宝app% 工具箱。它可以在将来的释放中更改或删除。%从音频数据存储读取批数据Batch = HelperReadbatch(DS,N,Batchsize);如果使用gpu batch = gpuarray(批量);结束%获得散射功能s = sn.featurematrix(批量,'转变''日志');聚集(批量);s =聚集(s);%subsamplpplesc = s(:,1:6:结束,:);结束

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

功能batchout = helperReadBatch (N, ds batchsize)%此函数仅支持小波工具箱示例。金宝app有可能%更改或在未来的版本中删除。%batchout=ReadBatch(ds,N,batchsize),其中ds是数据存储,而%ds是数据存储%batchsize是批量化kk = 1;尽管(hasdata(ds)) && kk <= batchsize tmpRead = read(ds);batchout (:, kk) =投(tmpRead (1: N),“单一”);% #好< AGROW >kk = kk + 1;结束结束

另见

相关话题