主要内容

声场景识别使用后期融合

这个例子展示了如何创建一个多模型融合声场景识别系统。火车的例子使用梅尔卷积神经网络(CNN)谱图并使用小波散射一个分类器。图坦卡蒙的例子使用了数据集的训练和评估[1]

介绍

声场景分类(ASC)分类的任务环境的声音。ASC是一个通用的分类问题,是上下文感知的基础设备,机器人,和许多其他应用程序[1]。早期的尝试ASC使用mel-frequency cepstral系数(mfcc)和高斯混合模型(gmm)来描述他们的统计分布。其他受欢迎的特性用于ASC包括零交叉率、频谱质心(spectralCentroid)、光谱滚边(spectralRolloffPoint),谱通量(spectralFlux)和线性预测系数(lpc的)[5]。隐马尔科夫模型(摘要)被训练来描述gmm的演化。最近,表现最好的系统使用深度学习,通常cnn,融合多个模型。最受欢迎的特性为顶级系统2017年DCASE比赛是梅尔谱图(melSpectrogram)。顶级系统融合和数据增加后期使用的挑战来帮助他们的系统概括。

为了说明一个简单的方法,产生合理的结果,这个例子列车CNN使用梅尔使用小波散射谱图和一个分类器。CNN和系综分类器产生整体精度大致相当,但执行更好的区分不同声场景。提高整体精度,你合并CNN和系综分类器使用后期融合结果。

负载声场景识别数据集

要运行示例,您必须先下载数据集[1]。完整的数据集大约是15.5 GB。根据你的机器和网络连接,下载的数据可能需要4个小时。

downloadFolder = tempdir;数据集= fullfile (downloadFolder,“啧声-情景- 2017”);如果~ datasetExists(集)disp (“下载图坦卡蒙-声场景- 2017 (15.5 GB)……”)HelperDownload_TUT_acoustic_scenes_2017(数据集);结束

阅读发展集元数据表。表变量名称文件名,AcousticScene,SpecificLocation

trainMetaData = readtable (fullfile(数据集,”图坦卡蒙-声场景- 2017 -发展”,“元”),分隔符= {' \ t '},ReadVariableNames = false);trainMetaData.Properties。VariableNames = [“文件名”,“AcousticScene”,“SpecificLocation”];头(trainMetaData)
ans =8×3表文件名AcousticScene SpecificLocation __________________________ _________________ ___________{音频/ b020_90_100。wav”}{“海滩”}{‘b020}{音频/ b020_110_120。wav”}{“海滩”}{‘b020}{音频/ b020_100_110。wav”}{“海滩”}{‘b020}{音频/ b020_40_50。wav”}{“海滩”}{‘b020}{音频/ b020_50_60。wav”}{“海滩”}{‘b020}{音频/ b020_30_40。wav”}{“海滩”}{‘b020}{音频/ b020_160_170。wav”}{“海滩”}{‘b020}{音频/ b020_170_180。wav”}{“海滩”}{' b020 '}
testMetaData = readtable (fullfile(数据集,”图坦卡蒙-声场景- 2017 -评价”,“元”),分隔符= {' \ t '},ReadVariableNames = false);testMetaData.Properties。VariableNames = [“文件名”,“AcousticScene”,“SpecificLocation”];头(testMetaData)
ans =8×3表文件名AcousticScene SpecificLocation _____________ _________________ ___________{音频/ 1245。wav”}{“海滩”}{‘b174}{音频/ 1456。wav”}{“海滩”}{‘b174}{音频/ 1318。wav”}{“海滩”}{‘b174}{音频/ 967。wav”}{“海滩”}{' b174 '}{'audio/203.wav' } {'beach'} {'b174'} {'audio/777.wav' } {'beach'} {'b174'} {'audio/231.wav' } {'beach'} {'b174'} {'audio/768.wav' } {'beach'} {'b174'}

注意,具体记录位置特定记录的测试集不相交位置在开发集。这使得它更容易验证训练模型可以推广到真实世界的场景。

sharedRecordingLocations =相交(testMetaData.SpecificLocation trainMetaData.SpecificLocation);disp (“数量的特定记录位置在训练集和测试集= "+元素个数(sharedRecordingLocations))
数量的特定记录位置在训练集和测试集= 0

元数据表的第一个变量包含文件名。连接文件路径的文件名。

trainFilePaths = fullfile(数据集,”图坦卡蒙-声场景- 2017 -发展”,trainMetaData.FileName);testFilePaths = fullfile(数据集,”图坦卡蒙-声场景- 2017 -评价”,testMetaData.FileName);

可能有文件中列出的元数据中不存在的数据集。删除filepaths和声学场景对应的标签丢失的文件。

广告= audioDatastore(数据集,IncludeSubfolders = true);allFiles = ads.Files;trainIdxToRemove = ~ ismember (trainFilePaths allFiles);trainFilePaths (trainIdxToRemove) = [];trainLabels =分类(trainMetaData.AcousticScene);trainLabels (trainIdxToRemove) = [];testIdxToRemove = ~ ismember (testFilePaths allFiles);testFilePaths (testIdxToRemove) = [];testLabels =分类(testMetaData.AcousticScene);testLabels (testIdxToRemove) = [];

创建音频数据存储为训练集和测试集。设置标签财产的audioDatastore声场景。调用countEachLabel来验证标签的均匀分布在训练集和测试集。

adsTrain = audioDatastore (trainFilePaths,标签= trainLabels,IncludeSubfolders = true);显示器(countEachLabel (adsTrain))
15×2表标签数___________ _____海滩312总线312咖啡馆/餐厅312车312 city_center 312 forest_path 312 grocery_store 312家312图书馆312 metro_station 312办公室312公园312 residential_area 312列车312电车312
adsTest = audioDatastore (testFilePaths,标签=分类(testMetaData.AcousticScene),IncludeSubfolders = true);显示器(countEachLabel (adsTest))
15×2表标签数___________ _____海滩108总线108咖啡馆/餐厅108车108 city_center 108 forest_path 108 grocery_store 108家108图书馆108 metro_station 108办公室108公园108 residential_area 108列车108电车108

可以减少在这个例子中使用的数据集来加速运行时性能为代价的。一般来说,减少数据集开发和调试是一个很好的实践。集speedupExample真正的减少数据集。

speedupExample =;如果speedupExample adsTrain = splitEachLabel (adsTrain 20);adsTest = splitEachLabel (adsTest 10);结束

调用获得一个文件的数据和采样率从数据库中的训练集。音频采样率和持续时间一致。规范化的音频,听它。显示相应的标签。

(数据、adsInfo) =阅读(adsTrain);data =有悖于/ max(数据,[],“所有”);fs = adsInfo.SampleRate;声音(数据、fs) disp (“声景= "+字符串(adsTrain.Labels (1)))
声场景=海滩

调用重置返回其初始条件的数据存储。

重置(adsTrain)

特征提取为CNN

每个数据集包含10秒的音频剪辑立体声音频(左右)。特征提取管道和CNN架构在这个例子中是基于[3]。Hyperparameters特征提取,CNN的架构,从原始论文和训练选项修改使用系统hyperparameter优化工作流程。

首先,将音频转换为mid-side编码。[3]表明mid-side编码的数据提供更好的空间信息,CNN可以用来识别移动来源(如火车穿越一个声场景)。

dataMidSide =[总和(数据,2),数据(:1)拼(:,2)];

把信号分成一秒钟与重叠部分。最终的系统使用的概率加权平均一秒钟段预测每个10秒的音频剪辑的场景在测试集。将音频片段划分为一秒钟段使网络更容易训练,帮助防止过度拟合训练集的特定声学事件。重叠有助于确保所有的组合特性相对于另一个由训练数据捕获。它也为系统提供了额外的数据,可以在增加独特的混合。

segmentLength = 1;segmentOverlap = 0.5;[dataBufferedMid, ~] =缓冲区(dataMidSide(: 1),圆(segmentLength * fs),圆(segmentOverlap * fs),“nodelay”);[dataBufferedSide, ~] =缓冲区(dataMidSide(:, 2),圆(segmentLength * fs),圆(segmentOverlap * fs),“nodelay”);dataBuffered = 0(大小(dataBufferedMid, 1),大小(dataBufferedMid 2) +大小(dataBufferedSide, 2));dataBuffered(: 1:2:结束)= dataBufferedMid;dataBuffered(: 2:2:结束)= dataBufferedSide;

使用melSpectrogram将数据转换成一个紧凑的频域表示。定义参数的梅尔·光谱图所显示[3]

windowLength = 2048;samplesPerHop = 1024;samplesOverlap = windowLength - samplesPerHop;fftLength = 2 * windowLength;numBands = 128;

melSpectrogram独立经营的渠道。优化处理时间,电话melSpectrogram与整个缓冲信号。

规范= melSpectrogram (dataBuffered fs,窗口=汉明(windowLength,“周期”),OverlapLength = samplesOverlap,FFTLength = FFTLength,NumBands = NumBands);

梅尔·声谱图转换为对数刻度。

规范= log10(规范+ eps);

重塑数组维度(乐队)————(跳数)————(频道)————(段)的数量。当你将一个图像到一个神经网络,第一个二维图像的高度和宽度,第三个维度是渠道,第四维分离单个图像。

X =重塑(规格、尺寸(规范,1),大小(规范,2),大小(数据,2),[]);

调用melSpectrogram没有输出参数绘制梅尔中期通道的光谱图一秒钟前六的增量。

tiledlayout (2)频道= 1:2:11 nexttile melSpectrogram (dataBuffered(:,渠道),fs,窗口=汉明(windowLength,“周期”),OverlapLength = samplesOverlap,FFTLength = FFTLength,NumBands = NumBands);标题(“段”+装天花板(频道/ 2))结束

辅助函数HelperSegmentedMelSpectrograms执行上述特征提取步骤。

加快处理,提取梅尔谱图数据存储中的所有音频文件使用数组。与内存中的数组,高大的数组仍未评价的,直到你请求计算进行使用收集函数。这延迟评价使您能够快速处理大型数据集。当你最终请求输出使用收集,MATLAB结合排队的计算在可能的情况下,需要通过数据的最小数量。如果你有并行计算工具箱™,你可以在你当地的MATLAB会话使用高数组,或在本地平行池。您还可以运行高数组计算集群上如果你有MATLAB®服务器™安装平行。

如果你没有并行计算工具箱™,这个例子中的代码仍然运行。

train_set_tall =高(adsTrain);xTrain = cellfun (@ (x) HelperSegmentedMelSpectrograms (x, fs,SegmentLength = SegmentLength,SegmentOverlap = SegmentOverlap,WindowLength = WindowLength,HopLength = samplesPerHop,NumBands = NumBands,FFTLength = FFTLength),train_set_tall,UniformOutput = false);xTrain =收集(xTrain);
评估高表达式使用并行池“当地”:通过1对1:0%完成评价0%完成-通过1 1:3分56秒完成评估完成3分56秒
xTrain =猫(4,xTrain {:});test_set_tall =高(adsTest);xTest = cellfun (@ (x) HelperSegmentedMelSpectrograms (x, fs,SegmentLength = SegmentLength,SegmentOverlap = SegmentOverlap,WindowLength = WindowLength,HopLength = samplesPerHop,NumBands = NumBands,FFTLength = FFTLength),test_set_tall,UniformOutput = false);xTest =收集(xTest);
评估高表达式使用并行池“当地”:通过1对1:在1分26秒内完成评估在1分26秒内完成
xTest =猫(4 xTest {:});

复制标签的训练集和测试集,这样他们在与部分一一对应。

numSegmentsPer10seconds =大小(dataBuffered, 2) / 2;yTrain = repmat (adsTrain.Labels 1 numSegmentsPer10seconds)”;yTrain = yTrain (:);欧美= repmat (adsTest.Labels 1 numSegmentsPer10seconds)”;欧美=欧美(:);

CNN的数据增加

DCASE 2017数据集包含一个相对较少的原声录音的任务,和发展集和评价集记录在不同的特定位置。因此,很容易overfit培训期间的数据。一个流行的方法来减少过度拟合混合。在混合,增加你的数据集通过混合两个不同的类的功能。当你混合的特性,混合比例相等的标签。那就是:

x = λ x + ( 1 - - - - - - λ ) x j y = λ y + ( 1 - - - - - - λ ) y j

混合物被新配方[2]标签来自一个概率分布,而不是混合标签。的实现混合在这个例子中是一个混合的简化版本:每个光谱图的谱图和一个不同的标签与λ设置为0.5。最初的和复杂的数据集进行训练。

xTrainExtra = xTrain;yTrainExtra = yTrain;λ= 0.5;2 = 1:尺寸(xTrain, 4)%找到所有可用的谱图有不同的标签。availableSpectrograms =找到(yTrain ~ = yTrain (ii));%随机选择一个可用的谱图有不同的标签。numAvailableSpectrograms =元素个数(availableSpectrograms);,numAvailableSpectrograms idx =兰迪([1]);%的组合。xTrainExtra(:,:,:,(二)=λ* xTrain(:,:,:,(二)+(1λ)* xTrain (:,:,:, availableSpectrograms (idx));%指定标签作为随机设定的λ。如果兰德>λyTrainExtra (ii) = yTrain (availableSpectrograms (idx));结束结束xTrain =猫(4 xTrain xTrainExtra);yTrain = [yTrain; yTrainExtra];

调用总结显示标签为增强训练集的分布。

总结(yTrain)
海滩11769总线11904咖啡馆/餐厅11873车11820 city_center 11886 forest_path 11936 grocery_store 11914家11923图书馆11817 metro_station 11804办公室11922公园11871 residential_area 11704列车11773电车11924

定义和火车CNN

定义了CNN的架构。这个架构是基于[1]通过试验和错误和修改。看到深度学习层的列表(深度学习工具箱)更多地了解深度学习层中可用MATLAB®。

imgSize = [(xTrain, 1),大小(xTrain, 2),大小(xTrain, 3)];numF = 32;层= [imageInputLayer (imgSize) batchNormalizationLayer convolution2dLayer (3 numF填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3 numF填充=“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer(3步= 2填充=“相同”)convolution2dLayer (3 2 * numF填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3 2 * numF填充=“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer(3步= 2填充=“相同”)convolution2dLayer (3、4 * numF填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3、4 * numF、填充=“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer(3步= 2填充=“相同”)convolution2dLayer (3 8 * numF填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3 8 * numF填充=“相同”)batchNormalizationLayer reluLayer globalAveragePooling2dLayer dropoutLayer (0.5) fullyConnectedLayer (15) softmaxLayer classificationLayer];

定义trainingOptions(深度学习工具箱)美国有线电视新闻网。这些选项是基于[3]通过工作流系统hyperparameter优化和修改。

miniBatchSize = 128;tuneme = 128;lr = 0.05 * miniBatchSize / tuneme;选择= trainingOptions (“个”,动量= 0.9,L2Regularization = 0.005,MiniBatchSize = MiniBatchSize,MaxEpochs = 8,洗牌=“every-epoch”,情节=“训练进步”,Verbose = false,InitialLearnRate = lr,LearnRateSchedule =“分段”,LearnRateDropPeriod = 2,LearnRateDropFactor = 0.2,ValidationData = {xTest,欧美},ValidationFrequency =地板(大小(xTrain 4) / miniBatchSize));

调用trainNetwork(深度学习工具箱)来训练网络。

trainedNet = trainNetwork (xTrain、yTrain层,选择);

评估美国有线电视新闻网

调用预测(深度学习工具箱)预测反应从训练网络使用了测试集。

cnnResponsesPerSegment =预测(trainedNet xTest);

平均在每10秒的音频剪辑的响应。

类= trainedNet.Layers . class(结束);numFiles =元素个数(adsTest.Files);counter = 1;cnnResponses = 0 (numFiles元素个数(类));频道= 1:numFiles cnnResponses(频道:)=总和(cnnResponsesPerSegment(计数器:计数器+ numSegmentsPer10seconds-1:), 1) / numSegmentsPer10seconds;counter = counter + numSegmentsPer10seconds;结束

对于每一个10秒的音频剪辑,选择最大的预测,然后将其映射到相应的预测位置。

[~,classIdx] = max (cnnResponses [], 2);cnnPredictedLabels =类(classIdx);

调用confusionchart(深度学习工具箱)可视化测试集上的准确性。

图(单位=“归一化”位置= [0.2 - 0.2 0.5 - 0.5])confusionchart (adsTest.Labels cnnPredictedLabels,title = (“测试精度- CNN”,“平均准确率= "+的意思是(adsTest.Labels = = cnnPredictedLabels) * 100),ColumnSummary =“column-normalized”RowSummary =“row-normalized”);

系综分类器的特征提取

小波散射所示[4]提供一个良好的声学场景表示。定义一个waveletScattering(小波工具箱)对象。不变性的规模和质量因素决定通过试验和错误。

科幻小说= waveletScattering (SignalLength =大小(数据,1),SamplingFrequency = fs,InvarianceScale = 0.75,QualityFactors = 1 [4]);

将音频信号转换为mono,然后调用featureMatrix(小波工具箱)返回散射的散射系数分解框架,科幻小说

dataMono =意味着(数据,2);scatteringCoeffients = featureMatrix(科幻、dataMono变换=“日志”);

平均散射系数超过10秒的音频剪辑。

featureVector =意味着(scatteringCoeffients, 2);disp (“每10秒小波功能片段的数量=”+元素个数(featureVector));
每10秒片段= 286多小波的特性

辅助函数HelperWaveletFeatureVector执行上面的步骤。使用一个数组cellfunHelperWaveletFeatureVector并行化特征提取。提取小波的特征向量训练集和测试集。

scatteringTrain = cellfun (@ (x) HelperWaveletFeatureVector (x,科幻小说),train_set_tall, UniformOutput = false);xTrain =收集(scatteringTrain);xTrain = cell2mat (xTrain ') ';
scatteringTest = cellfun (@ (x) HelperWaveletFeatureVector (x,科幻小说),test_set_tall, UniformOutput = false);xTest =收集(scatteringTest);xTest = cell2mat (xTest ') ';

定义和合奏训练分类器

使用fitcensemble创建一个合奏训练分类模型(ClassificationEnsemble)。

subspaceDimension = min(150年,大小(xTrain, 2) - 1);numLearningCycles = 30;classificationEnsemble = fitcensemble (xTrain adsTrain.Labels,方法=“子”,NumLearningCycles = NumLearningCycles,学习者=“判别”,NPredToSample = subspaceDimension,一会= removecats(独特(adsTrain.Labels)));

评估系综分类器

对于每一个10秒的音频剪辑,电话预测返回标签和权重,然后将其映射到相应的预测位置。调用confusionchart(深度学习工具箱)可视化测试集上的准确性。

[waveletPredictedLabels, waveletResponses] =预测(classificationEnsemble xTest);图(单位=“归一化”位置= [0.2 - 0.2 0.5 - 0.5])confusionchart (adsTest.Labels waveletPredictedLabels,title = (“测试精度-小波散射”,“平均准确率= "+的意思是(adsTest.Labels = = waveletPredictedLabels) * 100),ColumnSummary =“column-normalized”RowSummary =“row-normalized”);

流(的平均分类精度= % 0.2 f \ n ',意味着(adsTest.Labels = = waveletPredictedLabels) * 100)
分类器的平均精度= 75.74

应用后期融合

每10秒,电话预测小波的分类器和CNN返回向量表示的相对的信心他们的决定。乘以waveletResponsescnnResponses创建一个后期融合系统。

融合= waveletResponses。* cnnResponses;[~,classIdx] = max(融合,[],2);predictedLabels =类(classIdx);

评价晚了融合

调用confusionchart可视化融合分类精度。

图(单位=“归一化”位置= [0.2 - 0.2 0.5 - 0.5])confusionchart (adsTest.Labels predictedLabels,Title = (“测试精度-融合”,“平均准确率= "+的意思是(adsTest.Labels = = predictedLabels) * 100),ColumnSummary =“column-normalized”RowSummary =“row-normalized”);

万博1manbetx支持功能

HelperSegmentedMelSpectrograms

函数X = HelperSegmentedMelSpectrograms (X, fs,变长度输入宗量)% 2019 - 2021版权MathWorks公司。p = inputParser;addParameter (p, WindowLength = 1024);addParameter (p, HopLength = 512);addParameter (p, NumBands = 128);addParameter (p, SegmentLength = 1);addParameter (p, SegmentOverlap = 0);addParameter (p, FFTLength = 1024);解析(p,变长度输入宗量{:})params = p.Results;x = [(x, 2)和x (: 1) - x (:, 2)];x = x / max (max (x)); [xb_m,~] = buffer(x(:,1),round(params.SegmentLength*fs),round(params.SegmentOverlap*fs),“nodelay”);[xb_s, ~] =缓冲区(x(:, 2),圆(params.SegmentLength * fs),圆(params.SegmentOverlap * fs),“nodelay”);xb = 0(大小(xb_m, 1),大小(xb_m 2) +大小(xb_s, 2));xb = xb_m(1:2,::结束);xb = xb_s(: 2:2:结束);规范= melSpectrogram (xb, fs,窗口=汉明(params.WindowLength,“周期”),OverlapLength =参数。WindowLength params.HopLength,FFTLength = params.FFTLength,NumBands = params.NumBands,FrequencyRange =[0,地板(fs / 2)));规范= log10(规范+ eps);X =重塑(规格、尺寸(规范,1),大小(规范,2),大小(X, 2), []);结束

HelperWaveletFeatureExtractor

函数特点= HelperWaveletFeatureVector (x,科幻小说)% 2019 - 2021版权MathWorks公司。x =意味着(x, 2);特点= = featureMatrix(科幻x变换“日志”);特点=意味着(功能,2);结束

引用

[1]a . Mesaros t . Heittola, t·维尔塔宁。声场景分类:概述2017年DCASE挑战条目。proc。国际研讨会声学信号增强,2018年。

[2]Huszar,费伦茨。“混合:视数据增大。”InFERENCe. November 03, 2017. Accessed January 15, 2019.https://www.inference.vc/mixup-data-dependent-data-augmentation/

[3]汉、Yoonchang Jeongsoo公园,Kyogu李。“卷积神经网络与双耳表示声场景分类和背景减法。”声场景和事件的检测和分类(DCASE) (2017): 1 - 5。

[4]Lostanlen,文森特,乔阿欣,然后。双耳与小波散射场景分类。技术报告,DCASE2016挑战,2016年。

[5]a . j . Eronen v, t·奥马斯•佩尔托宁j . t . Tuomi a . p . Klapuri s Fagerlund t .主席g . Lorho和j . Huopaniemi IEEE反式“以听力上下文识别”。在音频、语音和语言处理,14卷,没有。1,第329 - 321页,2006年1月。

[6]图坦卡蒙声场景2017年,开发数据集

[7]2017年图坦卡蒙声场景,评估数据集