听即信:通过计算机视觉彻底改变人工智能的音频分类

引言
在人工智能和机器学习领域,我们经常听到计算机视觉是一种强大的处理和理解视觉数据的工具。但是,如果我们告诉您计算机视觉不仅能“看”东西,还能做更多呢?想象一个计算机能够聆听、理解和分类声音的世界。欢迎来到通过计算机视觉进行音频分类的迷人领域。在本文中,我们将探索视觉和听觉的这种卓越协同,深入研究计算机视觉如何扩展其视野以包括听觉领域。
视觉与听觉智能的融合
传统上,计算机视觉专注于分析和解释视觉数据。它驱动了面部识别、物体检测和图像分割等应用程序,改变了从医疗保健到自动驾驶等行业。但在一个数据日益多模态的世界中,将音频数据整合到混合中是一项颠覆性创新。
通过计算机视觉进行的音频分类将这两个领域结合起来,将视觉理解的原理应用于音频数据。它利用深度学习技术来“看”声音,就像它处理图像一样。这项创新为曾经遥不可及的众多应用打开了大门。
计算机视觉在音频分类中的应用
环境声音分析:音频分类最受影响的应用之一是环境声音分析。计算机视觉算法可以处理音频数据以检测和分类警报器、警报或动物叫声等声音。这在城市规划、野生动物保护和公共安全等领域具有无价的价值。
医疗保健:在医疗领域,通过计算机视觉进行的音频分类可用于诊断呼吸系统疾病。它可以识别不规则的呼吸模式或咳嗽声,从而为患者提供早期干预。
内容审核:在线平台和社交媒体网络可以使用音频分类来检测音频消息或直播中的仇恨言论、亵渎或不适当内容。这确保了更安全的在线环境。
语音命令识别:通过将音频分类与计算机视觉相结合,我们可以构建更强大的语音命令识别系统。这些系统通过识别给出命令的上下文变得更智能。
音频分类背后的技术
通过计算机视觉进行音频分类的核心技术是深度学习。卷积神经网络 (CNN) 是一类主要用于图像分析的深度神经网络,经过调整可用于处理声谱图或其他声音的视觉表示。声谱图是音频的二维表示,其中时间表示在 x 轴上,频率表示在 y 轴上。通过将音频数据转换为声谱图,CNN 可以像处理图像一样应用于分析和分类音频。
数据预处理
在深入模型开发之前,让我们先探讨一下通过计算机视觉进行音频分类所涉及的关键步骤。数据预处理是理解音频数据的第一步。原始音频数据被转换为深度学习模型可以理解的视觉格式——声谱图。这些本质上是表示声音随时间变化的二维图像。
可视化数据集
下一步是可视化数据集。通过将音频数据转换为声谱图,我们可以深入了解数据的结构。可视化可以揭示数据集中的模式、趋势和潜在挑战,帮助我们做出关于数据预处理和模型选择的明智决策。
训练-测试-分割
数据集准备和可视化后,下一步是将其分成训练集和测试集。这种划分对于在一个数据集上训练模型并在另一个数据集上评估其性能至关重要。还可以应用交叉验证技术来确保稳健的模型评估。
准备验证数据
验证数据对于微调模型和防止过拟合至关重要。此数据在训练过程中不使用,但有助于监控模型的性能并进行必要的调整。
模型训练
模型训练是魔法发生的地方。深度学习模型,通常是卷积神经网络 (CNN),在声谱图数据上进行训练。模型学习识别不同音频类别的模式和独特的“指纹”。这就是模型变得擅长音频分类的地方。
模型预测
一旦模型训练完毕,它就可以对新的、未见过的音频数据进行预测。它可以准确地将声音分类到预定义的类别中,从而实现实时分类和决策。
代码实现:将声音可视化
在本节中,我们将深入探讨使用计算机视觉实现音频分类的具体细节。我们将逐步介绍数据预处理、训练深度学习模型和进行预测的关键步骤。尽管以下代码是一个简化示例,但它为理解该过程提供了基础。
步骤 1:安装和导入库
第一个关键步骤是将原始音频数据转换为声谱图。确保您已安装必要的库
!pip install -q datasets git+https://github.com/huggingface/transformers split-folders ultralytics
#lets get the dataset
!git clone https://github.com/karolpiczak/ESC-50.git
# import the libraries
import numpy as np
from matplotlib import pyplot as plt
from numpy.lib import stride_tricks
import os
import pandas as pd
import scipy.io.wavfile as wav
步骤 2:可视化数据集
可视化数据集是数据分析和机器学习中必不可少的一步。它可以帮助您深入了解数据、理解其结构并识别潜在的模式或异常。在计算机视觉音频分类的背景下,可视化可能与传统的数值数据有所不同
esc50_df = pd.read_csv('/content/ESC-50/meta/esc50.csv')
esc50_df.head()
def plot_spectrogram(location, categorie, plotpath=None, binsize=2**10, colormap="jet"):
samplerate, samples = wav.read(location)
s = fourier_transformation(samples, binsize)
sshow, freq = make_logscale(s, factor=1.0, sr=samplerate)
ims = 20.*np.log10(np.abs(sshow)/10e-6) # amplitude to decibel
timebins, freqbins = np.shape(ims)
print("timebins: ", timebins)
print("freqbins: ", freqbins)
plt.figure(figsize=(15, 7.5))
plt.title('Class Label: ' + categorie)
plt.imshow(np.transpose(ims), origin="lower", aspect="auto", cmap=colormap, interpolation="none")
plt.colorbar()
plt.xlabel("time (s)")
plt.ylabel("frequency (hz)")
plt.xlim([0, timebins-1])
plt.ylim([0, freqbins])
xlocs = np.float32(np.linspace(0, timebins-1, 5))
plt.xticks(xlocs, ["%.02f" % l for l in ((xlocs*len(samples)/timebins)+(0.5*binsize))/samplerate])
ylocs = np.int16(np.round(np.linspace(0, freqbins-1, 10)))
plt.yticks(ylocs, ["%.02f" % freq[i] for i in ylocs])
if plotpath:
plt.savefig(plotpath, bbox_inches="tight")
else:
plt.show()
plt.clf()
return ims
plot = plot_spectrogram('/content/ESC-50/audio/' + esc50_df[esc50_df['category'] == 'crow']['filename'].iloc[0], categorie='Crow')
步骤 3:数据处理
conversion = []
for i in range(len(esc50_df.index)):
filename = esc50_df['filename'].iloc[i]
location = 'dataset/ESC-50/audio/' + filename
category = esc50_df['category'].iloc[i]
catpath = 'dataset/ESC-50/spectrogram/' + category
filepath = catpath + '/' + filename[:-4] + '.jpg'
conversion.append({location, filepath})
conversion[0]
{'/content/ESC-50/audio/1-100032-A-0.wav',
'/content/ESC-50/spectrogram/dog/1-100032-A-0.jpg'}
for i in range(len(esc50_df.index)):
filename = esc50_df['filename'].iloc[i]
location = '/content/ESC-50/audio/' + filename
category = esc50_df['category'].iloc[i]
catpath = '/content/ESC-50/spectrogram/' + category
filepath = catpath + '/' + filename[:-4] + '.jpg'
os.makedirs(catpath, exist_ok=True)
audio_vis(location, filepath)
步骤 4:训练-测试-分割
import splitfolders
input_folder = '/content/ESC-50/spectrogram'
output = '/conent/data'
splitfolders.ratio(input_folder, output=output, seed=42, ratio=(.8, .2))
步骤 5:准备验证数据
testing = [
'/content/data/test/helicopter-fly-over-01.wav'
]
def test_vis(location, filepath, binsize=2**10, colormap="jet"):
samplerate, samples = wav.read(location)
s = fourier_transformation(samples, binsize)
sshow, freq = make_logscale(s, factor=1.0, sr=samplerate)
with np.errstate(divide='ignore'):
ims = 20.*np.log10(np.abs(sshow)/10e-6) # amplitude to decibel
timebins, freqbins = np.shape(ims)
plt.figure(figsize=(15, 7.5))
plt.imshow(np.transpose(ims), origin="lower", aspect="auto", cmap=colormap, interpolation="none")
plt.axis('off')
plt.xlim([0, timebins-1])
plt.ylim([0, freqbins])
plt.savefig(filepath, bbox_inches="tight")
plt.close()
return
test_vis(testing[0], filepath='/content/data/helicopter-fly-over-01.jpg')
步骤 6:使用 YOLO 进行图像分类
from ultralytics import YOLO
model = YOLO('yolov8n-cls.pt')
步骤 7:模型训练
results = model.train(data='./data', epochs=20, imgsz=640)
metrics = model.val()
步骤 8:模型预测
pred = model('/content/data/helicopter-fly-over-01.jpg')
image 1/1 /workspace/yolo-listen/data/helicopter-fly-over-01.jpg: 640x640 thunderstorm 0.98, airplane 0.01, crickets 0.01, frog 0.00, wind 0.00, 2.2ms
Speed: 27.3ms preprocess, 2.2ms inference, 0.1ms postprocess per image at shape (1, 3, 640, 640)
结论:
在探索计算机视觉音频分类的过程中,我们发现了听觉和视觉智能之间创新的协同作用。这种显著的融合使我们能够让机器不仅“看”而且“听”,为各个领域广泛的应用打开了大门。我们首先介绍了计算机视觉音频分类的概念,强调了其在环境声音分析、医疗保健、内容审核和语音命令识别等领域的潜在影响。通过将计算机视觉原理与音频数据相结合,我们踏上了通过多感官增强对世界理解的旅程。在理解音频分类背后的技术时,我们发现了深度学习,特别是卷积神经网络 (CNN) 的关键作用。这些网络经过调整,可以处理声谱图(音频数据的二维表示),揭示不同声音的模式和“指纹”。这一基础步骤对于任何音频分类任务都至关重要。接下来,我们介绍了数据预处理、训练-测试分割、模型训练和进行预测等关键实践方面。通过声谱图可视化音频数据提供了独特的视角,帮助我们识别音频数据中的模式和结构。尽管 YOLO (You Only Look Once) 在目标检测领域有其优点,但它不适合音频分类,因为音频分类依赖于顺序和时间相关的特征。相反,卷积神经网络 (CNN) 和循环神经网络 (RNN) 仍然是音频分类的首选,它们能够处理音频数据及其表示的复杂性。随着我们进入计算机视觉音频分类的未来,我们可以预见更多的突破和创新。机器学习将继续丰富我们解释和与世界互动能力,不仅通过视觉,还通过视觉和声音的和谐融合。这项技术有望为我们带来一个更安全、更智能、更互联的世界,重新定义我们感知和理解周围环境的方式。
“保持联系,并通过各种平台支持我的工作
- GitHub:要查看我所有的开源项目和笔记本,您可以访问我的 GitHub 个人资料:https://github.com/andysingal。如果您觉得我的内容有价值,请不要犹豫,点亮一颗星。
- Patreon:如果您想提供额外的支持,可以考虑在我的 Patreon 页面上成为赞助人:https://www.patreon.com/AndyShanu。
- Medium:您可以在 Medium 上阅读我最新的文章和见解:https://medium.com/@andysingal。
- Kaggle:查看我的 Kaggle 个人资料,了解数据科学和机器学习项目:https://www.kaggle.com/alphasingal。
- Huggingface:对于自然语言处理和人工智能相关项目,您可以在 https://huggingface.co/Andyrasika 查看我的 Huggingface 个人资料。
- YouTube:要观看我的视频内容,请访问我的 YouTube 频道:https://www.youtube.com/@andy111007。
- LinkedIn:要及时了解我的最新项目和帖子,您可以在 LinkedIn 上关注我。这是我的个人资料链接:https://www.linkedin.com/in/ankushsingal/。"
- 请求和问题:如果您有想让我参与的项目,或者对我的解释有任何疑问,请随时告诉我。我一直在寻找未来笔记本的新想法,并且乐于帮助解决您可能遇到的任何疑问。
请记住,每一个“赞”、“分享”和“星标”都极大地有助于我的工作,并激励我继续创作更多高质量的内容。感谢您的支持!
资源