主要内容

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

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

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,请在后续说明中修改目录名称。使用解压缩下载并解压缩数据集。然后使用解压提取tar文件的内容。的文件夹类型中创建tempdir在…内类型有十个子文件夹,每个音乐类型一个。

数据URL='http://opihi.cs.uvic.ca/sound/genres.tar.gz';gunzip (dataURL tempdir)在tempdir中创建genre .taruntar(完整文件(临时目录),“genres.tar”),tempdir)%创建流派文件夹

小波散射的框架

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

sn=小波模式(“信号长度”2 ^ 19,“SamplingFrequency”,22050,...“InvarianceScale”,0.5);

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

[fb,f,filterparams]=filterbank(sn);phi=ifftshift(ifft(fb{1}.phift));psiL1=ifftshift(ifft(fb{2}.psift(:,end));dt=1/22050;time=-2^18*dt:dt:2^18*dt;shopplt=plot(time,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(“秒”)伊拉贝尔(“振幅”) wavplt = plot(time,[real(psiL1) imag(psiL1)]);传奇([scalplt wavplt (1) wavplt (2)),...“扩展功能”,“Wavelet-Real部分”,“小波虚部”})头衔({“扩展功能”“最粗尺度小波第一滤波器组”})持有

音频数据存储

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

位置= fullfile (tempdir,“流派”); ads=音频数据存储(位置,“包含子文件夹”符合事实的...“标签源”,“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) ads = shuffle(ads);[adsTrain, adsTest] = splitEachLabel(广告,0.8);countEachLabel (adsTrain)
ans =10×2表唱片计数80古典80乡村80迪斯科80嘻哈80爵士80金属80流行80雷鬼80摇滚80
计数标签(adsTest)
ans =10×2表唱片计数(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数)(唱片计数

您可以看到训练数据中有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,使用图形处理器虽然hasdata(adsTrain)sc=助手bachscat特征(adsTrain,sn,N,batchsize,useGPU);scTrain=cat(3,scTrain,sc);结束

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

numTimeWindows=大小(scTrain,2);

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

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

sct = [];虽然hasdata(adsTest)sc=helperBachScatFeatures(adsTest、sn、N、batchsize、useGPU);scTest=cat(3,scTest,sc);结束

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

[~,npath]=sn.paths();npath=sum(npath);TrainFeatures=permute(scTrain,[2 3 1]);TrainFeatures=reformate(TrainFeatures,[],npath);TestFeatures=permute(scTest,[2 3 1]);TestFeatures=reformate(TestFeatures,[],npath);

每行TrainFeatures测试特性是每个音频信号散射变换中334条路径上的一个散射时间窗口。对于每个音乐样本,我们有43个这样的时间窗口。相应地,训练数据的特征矩阵为34400×334。行数等于训练示例数(800)乘以每个示例(43)的散射窗口数。同样,测试数据的散射特征矩阵为8600-x-334。每个示例有200个测试示例和43个窗口。为训练数据的小波散射特征矩阵中的43个窗口中的每一个创建类型标签。

列车标签=adsTrain.标签;numTrainSignals=numel(列车标签);trainLabels=repmat(trainLabels,1,numTimeWindows);列车标签=重塑(列车标签’,numTrainSignals*numTimeWindows,1);

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

testLabels=adsTest.Labels;numTestSignals=numel(testLabels);testLabels=repmat(testLabels,1,numTimeWindows);testLabels=Reformat(testLabels,1,numTestSignals*numTimeWindows,1);

在本例中,使用具有三次多项式核的多类支持向量机(SVM)分类器。将SV金宝appM与训练数据相匹配。

template=templateSVM(...“内核函数”,“多项式”,...“PolynomialOrder”3,...“KernelScale”,“汽车”,...“BoxConstraint”, 1...“标准化”,true);类={“蓝调”,“经典”,“国家”,“迪斯科”,“嘻哈”,“爵士乐”,...“金属”,“流行”,“雷鬼”,“岩石”};分类VM=FITCECOCC(...列车特征,...trainLabels,...“学习者”样板...“编码”,“一对一”,“类名”分类(类));

测试集预测

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

predLabels=预测(classificationSVM、TestFeatures);[TestVotes,TestCounts]=HelperMajorityNote(predLabels,adsTest.Labels,Category(Class));testAccuracy=sum(等式(testvots,adsTest.Labels))/numTestSignals*100
测试精度=87.5000

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

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

cm=混淆图(adsTest.Labels、testvots);

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

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

总结

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

工具书类

  1. Anden,J.和Mallat,S.2014.深散射光谱。IEEE信号处理学报,第62卷,第16页,第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/paper/Recurrent-Neural-Networks-with-Attention-for-Genre-Irvin/6da301817851f19107447e4c72e682e3f183ae8a

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

  5. Mallat.S.2012.群不变散射。纯数学和应用数学通讯,第65卷,第10卷,第1331-1398页。

  6. Y.Panagakis.,Kotropoulos,C.L.和Arce,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——这个函数返回在许多特征向量上预测的类标签的模式。在小波时间散射中,我们为每个时间窗口取一个类标签。如果没有找到唯一模式,则为“NoUniqueMode”返回以表示分类错误。

类型helperMajorityVote
函数[ClassVotes,ClassCounts]=HelperMajorityNote(predLabels,origLabels,classes)%此函数仅支持小波散射示例。它可能会%更改或在将来的版本中删除。金宝app%n如果标签尚未分类,则创建分类数组predLabels=Category(predLabels);origLabels=Category(origLabels);%期望predLabels和origLabels都是分类向量Npred=numel(predLabels);Norig=numel(origLabels);Nwin=Npred/Norig;predLabels=Reformate(predLabels,Nwin,Norig);ClassCounts=COUNTCTS(predLabels);[mxcount,idx]=max(ClassCounts);CLASSVOUTS=classes(idx);%检查最大值中的任何关联,如果模式出现多次,则确保它们标记为%error tmpsum=sum(ClassCounts==mxcount);CLASSOVERS(tmpsum>1)=分类({'NONUNIQUEMODE'});CLASSOVERS=CLASSOVERS(:);

helperbatchscatfeatures-该函数返回给定输入信号的小波时间散射特征矩阵。在这种情况下,我们使用小波散射系数的自然对数。计算了散射特征矩阵 2. 1. 9 信号的样本。散射特征以6的因子进行二次采样。如果useGPU设置为符合事实的,在GPU上计算散射变换。

作用sc=HelperBachScatFeatures(ds、sn、N、批次大小、使用GPU)%此函数仅用于支持小波中的示例金宝app%工具箱。它可能会在将来的版本中更改或删除。%从音频数据存储读取批数据batch=helperReadBatch(ds、N、batchsize);如果useGPU批次=gpuArray(批次);结束%获取散射特征S=序列号特征矩阵(批次,“转变”,“日志”);聚集(批);S=聚集;%对特征进行子采样sc=S(:,1:6:end,:);结束

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;结束结束

另请参阅

相关实例

更多关于