×

从原始音频数据中检测火花声音

消耗积分:2 | 格式:zip | 大小:2.35 MB | 2023-07-03

分享资料个

描述

从原始音频数据中检测火花声音

抽象的:

该项目的目的是从原始时域信号中解决模式识别任务。我们使用 Sparkfun RedBoard Artemis ATP 模块和集成 MEMS 麦克风来记录和分类环境声音。在这个项目摘要中,我们为初学者提供了一个简单的管道来训练和部署一个简单的神经网络 (NN) 以及可用于提高模型性能的高级方法。我们希望在这次挑战中收集到的经验可以用于我们为大象设计的枪声探测器。

介绍:

用于声音分类的神经网络通常将其输入解释为图像。这是通过计算原始音频记录的 2D 频谱图来完成的。但是,也存在频谱图转换导致相关信息丢失的情况。一个例子是枪声检测,其中弹道冲击波声音具有如此独特的形状(类似于大写字母 N),基于这种原始信号形状的检测器比基于频谱图的解决方案更准确地工作。我们的想法来自这种情况,因为在时域中可能有许多具有特定形状的可能事件。

在我们的例子中,这些独特形状的音频信号是由火花产生的火花是一种突然的放电,会产生短暂的光发射和尖锐的裂纹或啪啪声。这种声音包含非常高的频率并且时间长度很短(大约 4 毫秒)。这种火花声事件可以通过集成在 Redboard Artemis ATP 上的 MEMS 麦克风进行记录,图 1 显示了一个示例记录。

pYYBAGODzsmAOJ6hAAAmxHlZWg4708.png
图 1:MEMS 麦克风记录的火花声音示例
 

记录的火花噪声的形状并不完全相同,但它们都包含几个长度相似的尖峰。NN 应该理解这些相似性以执行检测任务。

目标、实验设置和数据收集:

总之,我们构建了一个可以检测火花噪声的分类器。为了实现这一目标,我们使用扬声器、火花发生器和 RedBoard Artemis 作为数据收集器,收集了具有不同脉冲背景噪声的火花声音。背景噪声有助于概括检测器的知识。并使检测任务更加困难。

使用的背景噪音是:汽车喇叭、说话的数字、狗叫声、高斯噪音、枪声、手提钻、各种音乐、警报器、沉默。

基本管道如下:

  • 记录扬声器产生的具有不同背景噪音的火花
  • 仅将背景噪音记录为负样本
  • 将这些记录收集到带有二进制标签的数据集中——0:没有火花;1:包含火花
  • 训练一个简单的模型并将其部署在 Sparkfun Redboard Artemis ATP 上
  • 使用涉及的高级方法训练各种模型
  • 评估模型

数据收集设置包含 RedBoard Artemis 作为记录设备。一个额外的设备,一个 Arduino Due 控制一个继电器,该继电器通过大电流通过 DC-DC 升压器产生火花。整个过程由 PC 同步,PC 还通过扬声器播放各种背景噪音。设置如图 2 所示。RedBoard Artemis ATP 记录了背景噪声和火花声的叠加。图 3 说明了一种这样的组合记录,其中car_horn在测量过程中产生了噪声。可以发现录音中间的脉冲区域,对应于火花声。在录音中,火花的位置会有所不同,以防止过度拟合到特定位置。

pYYBAGODzsuAZz1VAAAhQBRXJDA697.png
图 2. 数据收集设置。
 
poYBAGODzs2AbhvrAAA9IbdEfXw586.png
图 3.:包含带有汽车喇叭背景噪音的火花的示例录音。
 

生成的数据集包含:

pYYBAGODzs-AcqtXAAASs83LKPM184.png
数据集
 

从所有类中,100 个样本被添加到训练集,30 个样本被添加到测试集,20 个样本被添加到验证集。

我们已将训练过程的源代码添加到该项目中,但它也可以在此处作为 Python 笔记本获得:Training notebook Google Colaboratory 是初学者在受控环境中使用免费提供的 GPU 测试他们的想法的好地方。

本笔记本包含模型训练的主要步骤,包括:

  • 数据加载:正面和负面的例子
  • 数据分离为训练集、验证集和测试集:100 + 20 + 30 个样本
  • 神经网络模型创建:简单的卷积神经网络
  • 模型拟合 - 训练:默认训练参数
  • 模型评估:在测试数据集上评估
  • 模型转换为 TensorFlow Lite 模型。
  • 模型转换为字节数组,可以上传到 Artemis Board。

本例中使用的模型由一个具有 2 个内核的卷积层和一个最大池化层组成。它涵盖了卷积产生的整个特征向量。由于其简单性,该模型几乎无法泛化知识,但在测试数据集上可以达到 94% 左右的高精度,在可接受的范围内。架构如图 4 所示。(注意:使用了 Conv2D,因为 TF Lite Micro 仅支持此操作,否则需要使用 Conv1D。)

poYBAGODztGAB9ibAAA3TAGDI7U509.png
图 4.:从原始音频输入执行火花声音检测的建议神经网络的结构
 

训练有素的模型有利有弊:

+ 体积小,只有 71 个可训练参数

+ 可以处理 12000 个样本的长输入

+ Artemis 板可在 1 秒内运行

- 对噪音非常敏感,不能一概而论

[数据收集详细信息] -> [在 GPU 上训练] -> [模型部署] -> [推理]

部署从字节数组开始,字节数组是在上一节训练期间生成的。左侧可见Arduino连接,表示当发送一个's'字符时,会产生火花。很快,“检测到火花!” 右侧应该有消息,它会打印来自 Artemis Board 的消息。

 

概括:

在本节中,我们提出了一个检测问题的基线解决方案,旨在基于火花声音包含对录音进行分类。我们包括用于数据收集、模型训练以及模型部署和推理的源代码。

进阶方法:

上一节中训练的简单模型在测试数据集上达到了可接受的准确度,但是,在其真实世界的评估过程中,我们可以测试它对鼓掌或敲击等其他脉冲响亮事件的鲁棒性。基于这些实验,可以得出结论,该模型能够识别响亮的脉冲事件,而不仅仅是火花声。如此简单的架构无法泛化知识以检测复杂背景噪声中的这些复杂模式是合理的。

在本节中,我们展示了高级方法的使用,这些方法可以帮助找到更合适的模型,具有更高的准确性和鲁棒性,以及最佳的内存和计算复杂性。

准确率:正确分类示例的比率
鲁棒性:误导分类器的平均输入扰动幅度的度量
内存复杂度:运行模型所需的内存总量
计算复杂度:运行模型必须执行的浮点运算总数

前面介绍的简单模型是根据一些经验以临时方式创建的。即使初始架构已知,其提供最佳结果的超参数也是未知的。因此,我们从基线模型开始,实现了一种能够找到优越超参数集的搜索算法。这种方法称为网格搜索,它从给定的间隔将超参数收集到集合中,并根据一些指标测试这些配置。在我们的案例中,考虑的参数如下:

  • 卷积层中的内核数:[3, 5, 8, 13]
  • 卷积核的膨胀率:[1, 2, 3]
  • 卷积核的大小:[15, 36, 57, 93, 150]

为了评估特定的超参数集,我们使用了准确性和鲁棒性指标。准确率很简单,就是正确分类的样本数与样本总数的比值。鲁棒性更复杂。在没有完整的科学背景的情况下,它可以概括为模型对输入扰动不敏感的度量,而这些暗示错误分类的扰动的平均幅度就是该属性的度量。研究这个参数的研究领域称为对抗性机器学习。我们使用了DeepFool方法的略微修改版本来测量我们的 NN 的这一属性。

除了超参数优化之外,我们还通过在输入中添加具有不同标准差值的高斯噪声来扩展模型性能检查。随着噪声水平的增加,信噪比降低,这使得检测问题变得更加困难。噪声参数选自 [0.00, 0.01, 0.05, 0.1] 集合。为了使这些值具有可解释性,图 5 显示了具有不同噪声级别的示例记录。可以观察到,在最极端的情况下,火花形状完全消失在噪声中。

poYBAGODztSAHZ-BAABUDVyHOt4989.png
图 5:各种噪声水平影响的可视化。
 

选择来自呈现的参数值区间的所有组合,并相应地生成相应的神经网络。这产生了240 个生成的模型。每个网络都在相同的训练数据集上进行了训练,并在验证数据集上进行了评估。高斯噪声是在训练期间动态生成的,使用以下参数进行:

  • 批量:5
  • Early Stopping:以 10 个 epoch 的耐心监测训练损失
  • 优化器:亚当

网格搜索的结果如图 6 所示。这里,x 轴表示精度,y 轴表示平均扰动大小的对数。较大的扰动表示更好的鲁棒性。图上的每个符号都有一个编码噪声水平的形状、一个表示记忆复杂度的直径和一个编码神经网络计算复杂度的颜色。噪音等级符号:star- 不添加噪音;circle - 噪声级 0.01;square - 噪声级 0.05;triangle - 噪音水平 0.1。

pYYBAGODztmAdYj1AAFjhBKTG14159.png
图 6:关于 240 个训练模型的 5 维图。
 

在图 6 中,可以识别出几个点簇。例如,可以观察到较高的噪声水平会降低准确性,但会增强鲁棒性(triangles在左上角)。另一个例子是squares中间的簇,它同时从左到右,从下到上同时进化,这意味着一些参数集也提高了准确性和鲁棒性。

在我们的案例中,需要具有良好性能和鲁棒性的模型,但由于我们希望将其部署在微控制器上,因此还必须考虑内存和计算复杂性。这些参数被编码成一个点的颜色和大小。根据彩条,需要一个小直径的蓝色点,从图的右侧开始,该点也可以最大限度地提高鲁棒性。我们选择了模型,它由位于circle 集群顶部右侧的圆圈集群上方的单个离群蓝色表示squares 该模型在测试数据集上进行了评估。模型的参数和性能如下:

Accuracy on the test dataset:        0.99074
Accuracy on the training dataset:    0.99444
Robustness:                          0.00136
---------------------------------------------
Dilation rate:         1
Kernel size:           57
Number of kernels:     5
Added noise level:     0.01
---------------------------------------------
Memory complexity:         238 KB
Computational complexity:  3.4 MFLOP  (12kS input size)

该模型的计算复杂度高于我们的基准模型,因此推断需要激活 Apollo 3 MCU 的突发模式。在这种状态下,核心时钟频率从 48 MHz 翻倍到 96 MHz。

所提出的 NN 架构的另一个优点是全窗口最大池化(称为 GlobalMaxPooling,但 TF Lite Micro 不支持)使模型能够接受各种输入长度。例如,我们发现如果我们将输入长度从 12000 个样本减少到 3000 个样本,内存复杂度可以显着降低:从 238 KB 到 14 KB。一个缺点是,如果我们想要在具有重叠区域的信号上运行检测器以确保完全包含火花事件,我们必须调用推理 7 次,而不是之前的 2 次。但是,MCU 足够快以处理计算开销(总共 5.6 个 MFLOP)。

当我们应用对抗性攻击来测量 NN 结构的鲁棒性时,很容易将这些对抗性示例中的一些可视化。图 7 显示了一个这样的示例。这里的目标是生成一个记录,该记录位于已训练的神经网络结构的决策表面的边缘。这个例子是从一个最初的负样本(绝对沉默)生成的,但在当前的形式中,它欺骗了网络,以便它产生一个正标签。

poYBAGODztuAb0HAAAAkaLzaUJk885.png
图 7.:从沉默中生成的对抗性示例。它欺骗了产生正面标签的网络。
 

这些方法很复杂,我们认为源代码的发布不会有助于上述说明的普遍适用性,因此我们仅应要求通过电子邮件共享这些文件。

项目总结:

我们实现了一个基于神经网络的火花声音检测器,可以部署在 SparkFun RedBoard Artemis ATP 上。数据是通过使用相同的设备及其集成的 MEMS 麦克风收集的。数据采集​​采用具有不同背景噪声的火花产生。

为初学者解释了一个简单的管道,并部署了一个基线神经网络模型。我们共享了解决类似问题所需的所有主要步骤的源代码。

此外,还包括更先进的方法和想法,可以提高模型性能和鲁棒性。

未来,我们计划将 Artemis 板集成到我们正在积极开发的兽传枪声探测器中。本报告中呈现的先进成果可为这些方向的研究提供基础。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'从原始音频数据中检测火花声音',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);