基于深度学习的婴儿啼哭识别项目详解

news/2024/7/27 12:14:49/文章来源:https://blog.csdn.net/qq_36315683/article/details/135574028

基于深度学习的婴儿啼哭识别项目详解

  • 基于深度学习的婴儿啼哭识别项目详解
    • 一、项目背景
      • 1.1 项目背景
      • 1.2 数据说明
    • 二、PaddleSpeech环境准备
    • 三、数据预处理
      • 3.1 数据解压缩
      • 3.2 查看声音文件
      • 3.3 音频文件长度处理
    • 四、自定义数据集与模型训练
      • 4.1 自定义数据集
      • 4.2 模型训练
      • 4.3 模型训练
    • 五、模型测试
    • 六、注意事项

基于深度学习的婴儿啼哭识别项目详解

一、项目背景

婴儿啼哭声是婴儿沟通需求的重要信号,对于父母和护理者而言至关重要。本项目基于PaddleSpeech框架,致力于构建婴儿啼哭识别系统,通过深度学习将啼哭声翻译成成人语言,帮助理解婴儿的需求和状态。
在这里插入图片描述

1.1 项目背景

婴儿啼哭声是一种生物报警器,传递婴儿的生理和心理需求。有效地识别啼哭声有助于提高婴儿护理的效率和质量。

1.2 数据说明

项目使用六类人工添加噪声的哭声作为训练数据集,分别代表不同的婴儿需求,如苏醒、换尿布、要抱抱、饥饿、困乏、不舒服。噪声数据来自Noisex-92标准数据库。

二、PaddleSpeech环境准备

安装PaddleSpeech和PaddleAudio,确保环境准备就绪。

!python -m pip install -q -U pip --user
!pip install paddlespeech paddleaudio -U -q

三、数据预处理

3.1 数据解压缩

解压缩训练数据集,获取音频文件。

!unzip -qoa data/data41960/dddd.zip

3.2 查看声音文件

通过可视化展示音频波形,了解样本数据的特征。

from paddleaudio import load
data, sr = load(file='train/awake/awake_0.wav', mono=True, dtype='float32')  
print('wav shape: {}'.format(data.shape))
print('sample rate: {}'.format(sr))
plt.figure()
plt.plot(data)
plt.show()

3.3 音频文件长度处理

统一音频文件长度,确保训练数据格式一致。

# 音频信息查看
import soundfile as sf
import numpy as np
import librosadata, samplerate = sf.read('hungry_0.wav')
channels = len(data.shape)
length_s = len(data) / float(samplerate)
format_rate = 16000
print(f"channels: {channels}")
print(f"length_s: {length_s}")
print(f"samplerate: {samplerate}")

四、自定义数据集与模型训练

4.1 自定义数据集

创建自定义数据集类,包含六类婴儿需求的音频文件。

class CustomDataset(AudioClassificationDataset):# List all the class labelslabel_list = ['awake','diaper','hug','hungry','sleepy','uncomfortable']train_data_dir = './train/'def __init__(self, **kwargs):files, labels = self._get_data()super(CustomDataset, self).__init__(files=files, labels=labels, feat_type='raw', **kwargs)# 返回音频文件、label值def _get_data(self):'''This method offer information of wave files and labels.'''files = []labels = []for i in range(len(self.label_list)):single_class_path = os.path.join(self.train_data_dir, self.label_list[i])for sound in os.listdir(single_class_path):if 'wav' in sound:sound = os.path.join(single_class_path, sound)files.append(sound)labels.append(i)return files, labels

4.2 模型训练

选取预训练模型作为特征提取器,构建分类模型进行模型训练。

# 选取cnn14作为 backbone,用于提取音频的特征
from paddlespeech.cls.models import cnn14
backbone = cnn14(pretrained=True, extract_embedding=True)# 构建分类模型
class SoundClassifier(nn.Layer):def __init__(self, backbone, num_class, dropout=0.1):super().__init__()self.backbone = backboneself.dropout = nn.Dropout(dropout)self.fc = nn.Linear(self.backbone.emb_size, num_class)def forward(self, x):x = x.unsqueeze(1)x = self.backbone(x)x = self.dropout(x)logits = self.fc(x)return logitsmodel = SoundClassifier(backbone, num_class=len(train_ds.label_list))

4.3 模型训练

定义优化器和损失函数,进行模型训练。

# 定义优化器和 Loss
optimizer = paddle.optimizer.Adam(learning_rate=1e-4, parameters=model.parameters())
criterion = paddle.nn.loss.CrossEntropyLoss()# 模型训练
epochs = 20
steps_per_epoch = len(train_loader)
log_freq = 10
eval_freq = 10for epoch in range(1, epochs + 1):model.train()avg_loss = 0num_corrects = 0num_samples = 0for batch_idx, batch in enumerate(train_loader):waveforms, labels = batchfeats = feature_extractor(waveforms)feats = paddle.transpose(feats, [0, 2, 1])  logits = model(feats)loss = criterion(logits, labels)loss.backward()optimizer.step()if isinstance(optimizer._learning_rate, paddle.optimizer.lr.LRScheduler):optimizer._learning_rate.step()optimizer.clear_grad()# 计算损失avg_loss += loss.numpy()[0]# 计算指标preds = paddle.argmax(logits, axis=1)num_corrects += (preds == labels).numpy().sum()num_samples += feats.shape[0]if (batch_idx + 1) % log_freq == 0:lr = optimizer.get_lr()avg_loss /= log_freqavg_acc = num_corrects / num_samplesprint_msg = 'Epoch={}/{}, Step={}/{}'.format(epoch, epochs, batch_idx + 1, steps_per_epoch)print_msg += ' loss={:.4f}'.format(avg_loss)print_msg += ' acc={:.4f}'.format(avg_acc)print_msg += ' lr={:.6f}'.format(lr)logger.train(print_msg)avg_loss = 0num_corrects = 0num_samples = 0

五、模型测试

通过模型对测试音频进行推理,输出对应的婴儿需求概率。

# 模型测试
top_k = 3
wav_file = 'test/test_0.wav'
n_fft = 1024
win_length = 1024
hop_length = 320
f_min = 50.0
f_max = 16000.0waveform, sr = load(wav_file, sr=sr)
feature_extractor = LogMelSpectrogram(sr=sr, n_fft=n_fft, hop_length=hop_length, win_length=win_length, window='hann', f_min=f_min, f_max=f_max, n_mels=64)
feats = feature_extractor(paddle.to_tensor(paddle.to_tensor(waveform).unsqueeze(0)))
feats = paddle.transpose(feats, [0, 2, 1])logits = model(feats)
probs = nn.functional.softmax(logits, axis=1).numpy()sorted_indices = probs[0].argsort()msg = f'[{wav_file}]\n'
for idx in sorted_indices[-1:-top_k-1:-1]:msg += f'{train_ds.label_list[idx]}: {probs[0][idx]:.5f}\n'
print(msg)

六、注意事项

  1. 自定义数据集格式参考文档;
  2. 统一音频尺寸,确保音频长度和采样频率一致;
  3. 可学习PaddleSpeech课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_925360.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ACL 2023】 The Art of Prompting Event Detection based on Type Specific Prompts

【ACL 2023】 The Art of Prompting: Event Detection based on Type Specific Prompts 论文:https://aclanthology.org/2023.acl-short.111/ 代码:https://github.com/VT-NLP/Event_APEX Abstract 我们比较了各种形式的提示来表示事件类型&#xff0…

C#,入门教程(66)——枚举Enum的高等用法

前言:国内码农与国外优秀程序员的最大区别是,我们的专家、教授喜欢唾沫横飞地,夸夸其谈语言特性、框架、性能,唯一目的是带私货(书籍或教程),很少能写出真有用的程序。差距在哪呢?基…

扫雷游戏棋盘的打印,判断输赢,深度分析

少年们,大家好,我是博主那一脸阳光,我来分享扫雷的打印和判断输赢,代码如何编写,如何使用,深度理解扫雷的游戏。 数据结构的分析和理论 我上次介绍棋盘的初始化,但是如果不打印出来&#xff0…

图解智慧:数据可视化如何助你高效洞悉信息?

在信息爆炸的时代,数据扮演着越来越重要的角色,而数据可视化则成为解读和理解海量数据的得力工具。那么,数据可视化是如何帮助我们高效了解数据的呢?下面我就以可视化从业者的角度来简单聊聊这个话题。 无需深奥的专业知识&#x…

【Leetcode 2707】字符串中的额外字符 —— 动态规划

2707. 字符串中的额外字符 给你一个下标从0开始的字符串s和一个单词字典dictionary。你需要将s分割成若干个互不重叠的子字符串,每个子字符串都在dictionary中出现过。s中可能会有一些额外的字符不在任何子字符串中。 请你采取最优策略分割s,使剩下的字…

【ONE·MySQL || 常见的基本函数】

总言 主要内容:介绍了MySQL中常用的基本函数。一些聚合函数、时间日期函数、字符串函数、数字函数等。       文章目录 总言1、聚合函数1.1、汇总1.2、COUNT()函数1.2.1、基本说明1.2.2、使用演示 1.3、SUM( )函数1.3.1、基本说明1.3.2、使用演示 1.4、AVG( )函…

java基础知识点系列——数据输入(五)

java基础知识点系列——数据输入(五) 数据输入概述 Scanner使用步骤 (1)导包 import java.util.Scanner(2)创建对象 Scanner sc new Scanner(System.in)(3)接收数据 int i sc…

PHP开发日志 ━━ php8.3安装与使用组件Xdebug

今天开头写点历史: 二十年前流行asp,当时用vb整合常用函数库写了一个dll给asp调用,并在此基础上开发一套仿windows界面的后台管理系统;后来asp逐渐没落,于是在十多年前转投php,不久后用php写了一套mvc框架&…

C++——map和set的基本使用

目录 一,关联式容器 二,键值对 三,set的使用 3.1 set介绍 3.2 set的插入和删除 3.3 set的pair 3.4 multiset 四,map的使用 4.1 map介绍 4.2 map实现简易字典 4.3 map实现统计次数 4.4 map的[] 五,使用map或…

TRB 2024论文分享:基于生成对抗网络和Transformer模型的交通事件检测混合模型

TRB(Transportation Research Board,美国交通研究委员会,简称TRB)会议是交通研究领域知名度最高学术会议之一,近年来的参会人数已经超过了2万名,是参与人数和国家最多的学术盛会。TRB会议几乎涵盖了交通领域…

【REST2SQL】07 GO 操作 Mysql 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 MySQL是一个关系型数据库管理系统&#xf…

系统性学习vue-vue核心

做了三年前端,但很多系统性的知识没有学习 还是从头系统学习一遍吧 课程是b站的Vue2.0Vue3.0课程 后续还会学习的如下,就重新开一篇了,不然太长,之后放链接 vue组件化编程 vue-cli 脚手架 vue中的ajax vue-router vuex element-ui vue3 老师推荐的vscode针对vue的插件: Vue 3…

在线项目实习|2024寒假项目实战火热报名中!

一、在线实习项目分类 二、在线实习项目流程 三、在线实习项目优惠及项目特色 1、师傅带练教学模式,手把手教你掌握 采用“师带徒”的教学模式,课程以“项目前置知识学习 师傅带练 项目实战”贯穿,强调动手实操,内容以代码落地为…

mp4文件全部转换为mp3

问题 今天突发奇想,想把mp4视频转换为mp3来收听,于是想到了ffmpeg工具 步骤 安装ffmpeg环境 要在 Windows 上配置 FFmpeg 环境,你可以按照以下步骤进行操作: 下载 FFmpeg: 首先,你需要下载 FFmpeg 的 W…

图像处理:孤立点的检测

图像处理-孤立点的检测 孤立点的检测在图像处理中通常涉及到检测图像中的突变或者边缘,而使用二阶导数是一种常见的方法。一阶导数可以帮助找到图像中的边缘,而二阶导数则有助于检测边缘上的峰值,这些峰值可能对应于孤立点或者特殊的图像结构…

如何在30秒内学会使用pprof分析Go

假设下面的代码是你要分析的 Go 代码: package mainimport ("fmt""sync""time" )// 模拟耗时操作 func hardWork(wg *sync.WaitGroup) {defer wg.Done()fmt.Printf("Start: %v\n", time.Now())// 模拟耗内存a : []string{…

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量(单例中会使用)3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

伪装目标检测模型论文阅读之:Zoom in and out

论文链接:https://arxiv.org/abs/2203.02688 代码;https://github.com/lartpang/zoomnet 1.摘要 最近提出的遮挡对象检测(COD)试图分割视觉上与其周围环境融合的对象,这在现实场景中是非常复杂和困难的。除了与它们的背景具有高…

C语言中关于指针的理解及用法

关于指针意思的参考:https://baike.baidu.com/item/%e6%8c%87%e9%92%88/2878304 指针 指针变量 地址 野指针 野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的) 以下是导致野指针的原因 1.指针…

力扣每日一练(24-1-13)

如果用列表生成式,可以满足输出的型式,但是不满足题意: nums[:] [i for i in nums if i ! val]return len(nums) 题意要求是: 你需要原地修改数组,并且只使用O(1)的额外空间。这意味着我们不能创建新的列表&#xff…