声音分类的迁移学习
识别我们周围环境中的声音是我们人类每天很轻松就能做到的事情,但是对于计算机相当困难。如果计算机可以准确识别声音,它将会在机器人,安全和许多其他领域得到广泛应用。 最近有许多与计算机视觉有关的发展,通过深入学习和建立大型数据集如 ImageNet 来训练深入学习模型。 然而,听觉感知领域还没有完全赶上计算机视觉。谷歌三月份发布了AudioSet,这是一种大型的带注释的声音数据集。希望我们能看到声音分类和类似领域的主要改进。 在这篇文章中,我们将会研究如何利用图像分类方面的最新进展来改善声音分类。
在城市环境中分类声音
我们的目标是使用机器学习对环境中的不同声音进行分类。对于这个任务,我们将使用一个名为UrbanSound8K的数据集。此数据集包含8732个音频文件。有10种不同类型的声音: 冷气机 汽车喇叭 儿童玩耍 狗吠声 钻孔 发动机空转 枪射击 手持式凿岩机 警笛 街头音乐 每个录音长度约为4s。数据集被组织成10个折叠。我们训练这些数据集,因为我们使用的脚本会自动生成验证集。这个数据集是一个很好的开始试验的规模,但最终我希望在AudioSet上训练一个模型。
特性
有许多不同的特性可以训练我们的模型。在相关的语音识别领域中,通常使用mell -频率感知系数(MFCC)。MFCC的优点是它们是原始音频的一个非常稀疏的表示形式,通常在16khz的大多数研究数据集中取样。 然而,最近有一种直接针对原始数据的培训模式的转变。例如,DeepMind设计了一个名为WaveNet 的卷积架构来生成音频。这些WaveNets是基于原始音频进行培训的,它们不仅可以用于生成音频,还可以用于语音识别和其他分类任务。 能够在比MFCC功能更多的信息上对模型进行培训是件好事,但是WaveNets可以在计算上花费很高的成本,同时也可以运行。如果有一个特性保留了原始信号的大量信息,而且计算起来也很便宜,那该怎么办呢? 这是就是频谱图有用的地方。在听觉研究中,频谱图是在垂直轴表示频率,在水平轴表示时间的音频的图示,而第三维颜色表示每个时间点x频率位置处的声音的强度。 例如,这里是小提琴演奏的频谱图:
链接:CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=202335 在这个频谱图中,我们可以看到许多频率,是音符的基本频率的数倍。这些在音乐里被称为和音。频谱图中的垂直线是弓在拉小提琴拉时的短暂停顿。所以看起来谱图包含了很多有关不同声音的性质的信息。 使用频谱图的另一个好处就是我们现在把问题变成了一个图像分类,图像分类最近有了很多的突破。 这是有一个可以将每个wav文件转换成频谱图的脚本。每个频谱图存储在与其类别相对应的文件夹中。
使用卷积神经网络
现在声音被表示为图像,我们可以使用神经网络对它们进行分类。大多数图像处理任务选择的神经网络是卷积神经网络(CNN)。 使用UrbanSound8K数据集的问题是,它对于深度学习应用程序来说非常小。如果我们从头开始训练一个CNN,它可能会过度拟合数据,例如,它会记住在UrbanSound8K中狗吠声的所有声音,但无法概括出现实世界中其他狗狗的叫声。 这里.有Aaqib Saeed博客上使用CNN的例子。然而,我们将采取不同的方法使用迁移学习。 迁移学习是我们在一个神经网络上接受过类似的数据集的训练,并重新训练了网络的最后几层来进行新的分类。这个想法是,网络的开始层正在解决诸如边缘检测和基本形状检测的问题,这将推广到其他类别。具体来说,Google已经发布了一个名为“Inception”的预培训模型,该模型已经接受了ImageNet数据集中分类图像的训练。事实上,Tensorflow已经有一个示例脚本,用于在新类别上重新训练Inception。 开始,我们将调整来自Tanticflow for Poet Google Codelab 的示例。 首先,运行此命令下载再培训脚本。
curl -O https://raw.githubusercontent.com/tensorflow/tensorflow/r1.1/tensorflow/examples/image_retraining/retrain.py
现在我们可以运行脚本来重新训练我们的频谱图
python retrain.py
--bottleneck_dir=bottlenecks
--how_many_training_steps=8000
--model_dir=inception
--summaries_dir=training_summaries/basic
--output_graph=retrained_graph.pb
--output_labels=retrained_labels.txt
--image_dir=spectrograms
在另一个终端选项卡中,您可以运行
tensorboard --logdir training_summaries
开始一个tensorboard,在浏览器中观察培训进度和准确性。在大约16k次迭代之后,验证集的精度达大约达到86%。对于一个相当初步的分类方法来说还是不错的。
分类来自麦克风的声音
现在我们有一个分类声音的模型,可以将其应用于分类麦克风声音。Tensorflow再训练示例有用于标记图像的脚本。 我修改了这个脚本来标记麦克风的声音。首先,脚本使用pyaudio从麦克风播放音频,并使用webrtcvad包来检测麦克风是否存在声音。如果存在声音,则记录3秒钟,然后转换成谱图,最后标记。 脚本改编自该要旨,用于麦克风声音的记录,并且这要旨使用librosa生成频谱图,以及将label_image.py在tensorflow标注脚本。
下一步
在这篇文章中,我们看到了如何通过将迁移学习应用于图像分类域来分类声音。通过调整再培训的参数,或通过在光谱图上从头开始训练模型,绝对有改进的余地。我还希望训练一个模型来对声音进行分类,然后使用WaveNet 。 你可以在这里.查阅本教程的代码 本文为编译作品,作者 LUKAS GRASSE,原网站为 http://tatalab.ca/2017/07/17/transfer-learning-for-sound-classification/
- 关于不可见索引的学习(r3笔记74天)
- 【专业技术第五讲】动态链接库及其用法
- 用scrapy爬虫抓取慕课网课程数据详细步骤
- 关于pl/sql中的绑定变量(r3笔记第73天)
- python爬取网易云音乐并分析:用户有什么样的音乐偏好?
- shell基础学习总结(二) (r3笔记第72天)
- 对IMP-00013问题的思考(r3笔记第71天)
- 搭建LSTM(深度学习模型)做文本情感分类的代码
- 【大牛经验】高吞吐低延迟Java应用的垃圾回收优化
- shell的图形化实现简单示例(r3笔记第70天)
- 关于查询转换的一些简单分析(三) (r3笔记第69天)
- 【大牛经验】Web服务器的工作原理
- 使用shell定制addm脚本(r3笔记第88天)
- 【专业技术第十三讲】指针和内存泄露
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打印流
- 文件分割与合并
- 其他流---基本数据处理流
- 其他流---字节数组流与文件流对接
- 其他流---字节流数组
- 字符流出现乱码问题
- 缓冲流---为字节流和字符流复制文件增加缓冲流
- 字符流---输入输出与复制文本文件
- Spring 中的几个 PostProcessor 的区别与联系
- Spring 中基于注解的事务控制及原理分析
- Spring 中根据环境切换配置 @Profile
- Spring 中的属性赋值
- Spring 中控制 Bean 生命周期的几种方式及 BeanPostProcessor 执行原理
- Spring 中的 @Import 注解及向容器中添加 Bean 的几种方式
- Spring 注解开发之 @Conditional