主要内容

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

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

GTZAN数据集

在此示例中使用的数据集是GTZAN类型收集[7] [8]。数据提供为Quiped Tar归档,其约为1.2 GB。未压缩的数据集需要大约3 GB的磁盘空间。从引用中提供的链接中提取压缩的tar文件创建一个包含十个子文件夹的文件夹。每个子文件夹都被命名为它包含的音乐样本类型。类型是:蓝调,古典,国家,迪斯科,嘻哈,爵士,金属,流行,雷鬼和岩石。每个类型的每个类型的示例,每个音频文件都包含在22050Hz上采样约30秒的数据。在原文中,作者使用了许多时域和频域特征,包括从每个音乐示例中提取的MEL频率谱系(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 Genre Collection[7][8]。本例中的说明假设您将数据集下载到临时目录,tempdir在MATLAB®。如果您选择在不同的文件夹中下载数据tempdir,请在后续说明中修改目录名称。使用gunzip下载并解压缩数据集。然后使用untar.提取tar文件的内容。的文件夹类型中创建tempdir。里面类型是十个子文件夹,一个用于每个音乐类型。

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

小波散射框架

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

sn = waveletScattering (“SignalLength”,2 ^ 19,“SamplingFrequency”, 22050,......'invariarcescale', 0.5);

为了理解不变性尺度的作用,从第一滤波器组中,取最粗尺度小波的实部和虚部,在时间上绘制尺度滤波器。注意,按设计,缩放滤波器的时间支持基本金宝app上是0.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);ylimits情节([-0.25 - -0.25],'k-');ylimits情节([0.25 - 0.25],'k-');xlim ([-0.6 - 0.6]);包含('秒');ylabel(“振幅”);wavplt = plot(time,[real(psiL1) imag(psiL1)]);传奇([scalplt wavplt (1) wavplt (2)),......{“扩展功能”'小波真的部分'“Wavelet-Imaginary部分”});标题({“扩展功能”“最粗尺度小波第一滤波器组”})举行

音频数据存储

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

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

运行以下内容以在数据集中获取音乐类型的计数。

CountAckeLabel(广告)
ans =10×2表标签数__________ _____蓝调100古典100国家100迪斯科100个Hiphop 100爵士100爵士100张歌曲100 reggae 100摇滚100

如前所述,有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嘻哈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,请设置金宝appuseGPU真正的在下面的代码和散射变换将使用GPU计算。使用64个批量大小的NVIDIA Titan V GPU,本例中的散射特性的计算速度大约是使用CPU的9倍。

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

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

numtimewindows =尺寸(sctrain,2);

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

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

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

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

[~, 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);

每一行的训练费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 (......“KernelFunction”多项式的......'polynomialOrder'3,......“KernelScale”'汽车'......'boxconstraint',1,......“标准化”,真正的);类= {'蓝调'“经典”'国家'“迪斯科”“嘻哈”'爵士乐'......'金属''流行音乐'“雷鬼”'岩石'};classificationSVM = fitcecoc (......TrainFeatures,......Trainlabels,......'学习者'模板,......“编码”'Onevsone'“类名”,分类(类));

测试集预测

使用SVM模型拟合训练数据的散射变换来预测测试数据的音乐类型。回想一下散射变换中每个信号都有43个时间窗。使用简单多数投票来预测类型。辅助函数helperMajorityVote获得所有43个散射窗口的类型标签模式。如果没有唯一的模式,helperMajorityVote返回由指示的分类错误'nounquemode'。这导致混淆矩阵中的额外列。源代码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. 李涛、陈雅博和陈雅博。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语音和音频处理汇刊》,第10卷,第5期,293-302页。

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

附录—支持功能金宝app

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

类型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倍的限量。如果useGPU被设置为真正的,在GPU上计算散射变换。

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

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

函数batchout = helperReadBatch (N, ds batchsize)%这个函数只支持小波工具箱的例子。金宝app它可能%更改或在未来的版本中删除。%batchout = ReadReadbatch(DS,N,Batchsize),其中DS是数据存储和% ds是数据存储%batchsize是批量化kk = 1;(hasdata(ds)) && kk <= batchsize tmpRead = read(ds);batchout (:, kk) =投(tmpRead (1: N),“单一”);% #好< AGROW >kk = kk + 1;结束结束

也可以看看

相关的话题