主要内容

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

这个例子展示了如何分类的流派音乐摘录使用小波散射和音频数据存储的时间。在小波散射,数据传播通过一系列的小波变换,非线性,平均生产低温度差的表示的数据。这些低温度差表示作为分类器的输入。

GTZAN数据集

在这个例子中使用的数据集是GTZAN类型集合[7][8]。提供数据的压缩tar存档,大约是1.2 GB。未压缩的数据集需要大约3 GB的磁盘空间。提取压缩的tar文件中提供的链接引用十子文件夹创建一个文件夹。每个子文件夹命名的样品它包含喜欢的音乐流派。类型有:蓝调、古典、乡村、迪斯科,嘻哈,爵士,金属,流行,雷鬼音乐,摇滚。有100的例子,每个流派和每个音频文件由大约30秒的数据采样在22050赫兹。在最初的论文中,作者使用的时域和频域特性包括mel-frequency cepstral (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将(fullfile (tempdir,解压“genres.tar”),tempdir)%创建类型文件夹

小波散射的框架

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

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

理解不变性的作用,及时获取和情节扩展过滤器的实部和虚部coarsest-scale小波从第一个过滤器银行。注意时支持缩放滤波器的设计本质上是0.金宝app5秒。此外,coarsest-scale小金宝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 =[3军医3军医];ylim (ylimits)情节(ylimits (-0.25 - -0.25),“k——”)情节([0.25 - 0.25],ylimits“k——”)xlim([-0.6 - 0.6])包含(“秒”)ylabel (“振幅”)wavplt =情节(时间,真正的(psiL1)图像放大(psiL1)]);传奇([scalplt wavplt (1) wavplt (2)),{“扩展功能”,“Wavelet-Real部分”,“Wavelet-Imaginary部分”({})标题“扩展功能”;“Coarsest-Scale小波第一过滤器银行”})举行

音频数据存储

音频数据存储使您能够管理音频数据文件的集合。机器或深度学习,不仅音频数据存储管理的音频数据流文件和文件夹,音频数据存储还与数据管理协会的标签,并能够随机数据分割成不同的训练、验证和测试。在这个例子中,使用音频数据存储管理GTZAN音乐类型集合。记得每个集合的子文件夹命名为它所代表的风格。设置“IncludeSubFolders”财产真正的指导使用子文件夹并设置音频数据存储“LabelSource”财产“foldernames”创建数据标签基于文件夹的名字。这个例子假定顶级目录是在MATLABtempdir目录和被称为“流派”。确保位置顶级数据是正确的路径文件夹在您的机器上。顶级数据文件夹在您的机器上十子文件夹应该包含每个命名的十个类型,必须只包含音频文件对应于这些类型。

位置= fullfile (tempdir,“类型”);广告= 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(广告,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每个流派在测试集的例子。

获得的散射特性,使用一个helper函数,helperbatchscatfeatures,获得散射特性的自然对数 2 1 9 每个音频文件和次级样本样品散射窗户的数量6。的源代码helperbatchscatfeatures列在附录中。小波散射特性计算使用批处理大小为64的信号。

如果你有并行计算工具箱™和支持GPU,集金宝appuseGPU真正的在下面的代码和散射变换将使用GPU计算。使用NVIDIA泰坦与批处理大小为64 V GPU,本例中的散射特性是使用CPU计算大约9倍。

N = 2 ^ 19;batchsize = 64;scTrain = [];useGPU = false;使用GPU %设置为truehasdata (adsTrain) sc = helperbatchscatfeatures (adsTrain、锡、N, batchsize useGPU);scTrain =猫(3 scTrain sc);结束

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

numTimeWindows =大小(scTrain, 2);

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

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

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

确定散射路径的网络和重塑训练和测试功能到二维矩阵。

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

每一行的TrainFeaturesTestFeatures是一个散射时间窗口在334年每一个音频信号的散射变换路径。对于每个音乐样本,我们有43个这样的时间窗口。因此,训练数据的特征矩阵是34400 - 334。的行数等于训练例子的数量(800)的数量乘以散射windows /例(43)。同样,散射特征矩阵的测试数据是8600 - 334。有200个测试例子和43个windows /例子。创建一个类型标签的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“标准化”,真正的);类= {“蓝调”,“经典”,“国家”,“迪斯科”,“嘻哈”,“爵士乐”,“金属”,“流行”,“雷鬼”,“岩石”};classificationSVM = fitcecoc (TrainFeatures,trainLabels,“学习者”模板,“编码”,“onevsone”,“类名”分类(类));

测试集预测

使用支持向量机模型适合训练数据预测的散射变换的音乐流派的测试数据。回忆中有43个时间窗口为每个信号散射变换。使用一个简单多数投票预测类型。辅助函数helperMajorityVote获得43散射模式类型标签的所有窗户。如果没有独特的模式,helperMajorityVote返回一个表示分类错误“NoUniqueMode”。这导致了混乱中的一个额外的列矩阵。的源代码helperMajorityVote列在附录中。

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

测试的准确性,testAccuracy,大约是88%。这个精度是比得上GTZAN数据集的艺术的状态。

显示混淆矩阵检查genre-by-genre准确率。记得在每个类有20个例子。

厘米= confusionchart (adsTest.Labels TestVotes);

混淆矩阵的对角线情节显示单个类型的分类精度很好。分别提取这些类型精度和情节。

cmat = cm.NormalizedValues;cmat (,) = [];genreAccuracy =诊断接头(cmat)。/ 20 * 100;图酒吧(genreAccuracy)集(gca,“XTickLabels”甘氨胆酸、类)xtickangle(30)标题(的正确百分比类型——测试集)

总结

这个例子演示了使用小波散射和音频数据存储在音乐体裁分类。在这个例子中,小波时间散射实现了分类精度与艺术表演为GTZAN数据集的状态。相对于其他方法需要的提取时域和频域特性,小波散射只需要单个参数的规范,时不变的规模。音频数据存储使我们能够有效地管理一个大型数据集的转移从磁盘到MATLAB和允许我们随机数据和准确地保留类型会员通过分类随机数据的工作流。

引用

  1. 然后,j .和Mallat s . 2014。深的散射光谱。IEEE信号处理,62卷,16日,页。4114 - 4128。

  2. Bergstra, J。,Casagrande, N., Erhan, D., Eck, D., and Kegl, B. Aggregate features and AdaBoost for music classification. Machine Learning, Vol. 65, Issue 2-3, pp. 473-484.

  3. 欧文,J。,Chartock, E., and Hollander, N. 2016. Recurrent neural networks with attention for genre classification.https://www.semanticscholar.org/paper/Recurrent-Neural-Networks-with-Attention-for-Genre-Irvin/6da301817851f19107447e4c72e682e3f183ae8a

  4. 李,T。,Chan, A.B., and Chun, A. 2010. Automatic musical pattern feature extraction using convolutional neural network. International Conference Data Mining and Applications.

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

  6. Panagakis Y。,Kotropoulos, C.L., and Arce, G.R. 2014. Music genre classification via joint sparse low-rank representation of audio features. IEEE Transactions on Audio, Speech, and Language Processing, 22, 12, pp. 1905-1917.

  7. Tzanetakis, g和厨师,p . 2002。音乐流派分类的音频信号。IEEE语音和音频处理,10卷,5号,第293 - 302页。

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

附录——支持功能金宝app

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

类型helperMajorityVote
函数[ClassVotes ClassCounts] = helperMajorityVote (predLabels、origLabels类)%这个函数只支持小波散射的例子。金宝app它可能变化百分比或在将来的版本中被删除。%进行分类数组如果标签还没有直言predLabels =分类(predLabels);origLabels =分类(origLabels);%预计predLabels和origLabels分类向量npr =元素个数(predLabels);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批= gpuArray(批处理);结束%获得散射特性S = sn.featureMatrix(批处理,“转换”,“日志”);收集(批处理);S =收集(年代);%子样品的特性1:6 sc = S (::,:);结束

helperReadBatch——这个函数从数据存储中读取指定大小的批次,并返回单一的输出精度。每一列的输出是一个单独的信号从数据存储中。列的输出可能少于batchsize如果数据存储没有足够的记录。

函数batchout = helperReadBatch (N, ds batchsize)%这个函数只支持小波工具箱的例子。金宝app它可能变化百分比或在将来的版本中被删除。%% batchout = readReadBatch (N, ds batchsize) ds是数据存储的地方% ds是数据存储% batchsize batchsizekk = 1;(hasdata (ds) & & kk < = batchsize tmpRead =阅读(ds);batchout (:, kk) =投(tmpRead (1: N),“单一”);% #好< AGROW >kk = kk + 1;结束结束

另请参阅

相关的例子

更多关于