主要内容

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

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

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 Genre Collection[7][8]。本例中的说明假设您将数据集下载到临时目录,tempdir在MATLAB®。如果您选择在不同的文件夹中下载数据tempdir,请在后续说明中修改目录名称。使用gunzip下载并解压缩数据集。然后使用解压提取tar文件的内容。的文件夹类型中创建tempdir.内部类型是十个子文件夹,一个用于每个音乐类型。

数据URL=“http://opihi.cs.uvic.ca/sound/genres.tar.gz”;gunzip (dataURL tempdir)在tempdir中创建genre .tar将(fullfile (tempdir,解压“genres.tar”), tempdir)%创建类型文件夹

小波散射框架

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

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

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

[fb, f, filterparams] = filterbank (sn);φ= ifftshift(传输线(神奇动物{1}.phift));psiL1 = ifftshift(传输线(神奇动物{2}.psift (:,)));dt = 1/22050;时间= 2 ^ 18 * dt: dt: 2 ^ 18 * dt-dt;scalplt =情节(时间、φ“线宽”, 1.5);持有在…上网格在…上Ylimits = [-3e-4 3e-4];ylim (ylimits)情节(ylimits (-0.25 - -0.25),'k-')情节([0.25 - 0.25],ylimits'k-'xlabel([-0.6 0.6])“秒”) ylabel (“振幅”)Wavplt = plot(时间,[真实(psil1)imag(psil1)]);图例([scalplt wavplt(1)波普(2)],......{“扩展功能”'小波真的部分'“Wavelet-Imaginary部分”({})标题“扩展功能”“最粗尺度小波第一滤波器组”})举行

音频数据存储

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

位置= fullfile(tempdir,“类型”);广告= 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
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,请设置金宝appuseGPU真正的在下面的代码和散射变换将使用GPU计算。使用64个批量大小的NVIDIA Titan V GPU,本例中的散射特性的计算速度大约是使用CPU的9倍。

N = 2 ^ 19;batchsize = 64;scTrain = [];useGPU = false;%设置为true以使用gpuhasdata(adsTrain) sc = helperbatchscatfeatures(adsTrain,sn,N,batchsize,useGPU);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);TestFeatures = permute(scTest,[2 3 1]);[], TestFeatures =重塑(TestFeatures Npaths);

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

trainLabels = adsTrain.Labels;numTrainSignals =元素个数(trainLabels);trainLabels = repmat (trainLabels 1 numTimeWindows);trainLabels =重塑(trainLabels numTrainSignals * numTimeWindows, 1);

对测试数据重复上述过程。

testLabels = adsTest.Labels;numTestSignals =元素个数(testLabels);testLabels = repmat (testLabels 1 numTimeWindows);testLabels =重塑(testLabels numTestSignals * numTimeWindows, 1);

在这个例子中,使用一个三次多项式核的多类支持向量机(SVM)分类器。金宝app将支持向量机与训练数据进行拟合。

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

测试集预测

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

predLabels =预测(classificationSVM TestFeatures);[TestVotes, TestCounts] = helperMajorityVote (predLabels adsTest.Labels,分类(类));testAccuracy =总和(eq (TestVotes adsTest.Labels)) / numTestSignals * 100
testAccuracy = 87.5000

测试的准确性,testAccuracy,约为88%。这种准确性与GTZAN数据集的领域相当。

显示混淆矩阵以检查类型的类型逐个精度速率。回想一下每个班级中有20个例子。

厘米= confusionchart (adsTest.Labels TestVotes);

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

Cmat = cm.normalizedValues;cmat(结束,:) = [];Genreaccuracy = Diag(CMAT)./ 20 * 100;图栏(Genreacuracy)设置(GCA,“XTickLabels”,课程)XTickangle(GCA,30)标题(“类型的正确百分比-测试集”

总结

此示例展示了使用小波时间散射和音乐类型分类中的音频数据存储。在该示例中,小波时间散射实现了与GTZAN数据集的最新性能的状态相当的分类精度。与需要提取多个时域和频域特征的其他方法相反,小波散射仅需要单个参数的规格,时间不变。音频数据存储使我们能够有效地管理从磁盘到MATLAB的大型数据集的传输,并允许我们通过分类工作流程准确地保留随机数据的类型成员资格。

工具书类

  1. Anden J.和Mallat S. 2014。深的散射光谱。《信号处理学报》,Vol. 62, 16, pp. 414 -4128。

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

  3. 欧文,J.,查托克,E.和霍兰德,N. 2016。注意类型分类的递归神经网络。https://www.semanticscholar.org/paper/Recurrent-Neural-Networks-with-Attention-for-Genre-Irvin/6da301817851f19107447e4c72e682e3f183ae8a

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

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

  6. 帕纳加基斯,科特罗普洛斯,C.L.和阿尔切,G.R. 2014。基于音频特征联合稀疏低秩表示的音乐类型分类。IEEE音频、语音和语言处理汇刊,22,12,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
这个函数只支持小波散射的例子。金宝app它可能会在未来的版本中更改或删除。predLabels = categorical(predLabels);origLabels =分类(origLabels);%预期predLabels和origLabels都是分类向量Norig =元素个数(origLabels);Nwin = npr / 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、锡、N, batchsize useGPU)%此函数仅用于支持小波中的示例金宝app%的工具箱。它可能会在未来的版本中被更改或删除。%从音频数据存储读取批数据批= helperReadBatch (ds, N, batchsize);如果useGPU batch = gpuArray(batch);结束获得散射特征S = sn.featureMatrix(批处理,“转换”“日志”);收集(批处理);S =收集(年代);%子样本的特点1:6 sc = S (::,:);结束

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

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

也可以看看

相关的例子

更多关于