【人工智能项目】深度学习实现50种环境声音分类

099基于深度学习的动物声音分类 089基于深度学习的小样本数据检测_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mob。083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet。088基于深度学习的番茄病害检测小程序版本_含10多种模型包括alexnet、DenseNet、DLA、Google。081基于深度学习的农业病虫害检测小程序版本_含10多种模型包括alexnet、DenseNet、DLA、Goog。 阅读详情
AI摘要

本文介绍了一个使用深度学习实现的项目,针对50种环境声音进行分类,包括数据提取、特征转换、数据增强及模型构建。通过ESC-50数据集训练,采用Mel-Spectrogram并应用多种数据增强技术提升模型性能。

【人工智能项目】深度学习实现50种环境声音分类

在这里插入图片描述

任务说明

本次准确识别5种大类,共计50种小类的音频。每个音频文件时长5秒,格式为wav。

数据集来自freesound.org公开项目,从中手动提取。训练集共计1600个,测试集400个。
在这里插入图片描述

导包

import os
import random
import numpy as np
import pandas as pd
import librosa
import librosa.display
import matplotlib.pyplot as plt
import seaborn as sn
from sklearn import model_selection
from sklearn import preprocessing
import IPython.display as ipd

前期准备

# define directories
base_dir = "."
esc_dir = os.path.join(base_dir, "ESC-50-master")
meta_file = os.path.join(esc_dir, "esc50.csv")
audio_dir = os.path.join(esc_dir, "audio/audio/")
# load metadata
meta_data = pd.read_csv(meta_file,header=None,names=["filename","target"])
meta_data

在这里插入图片描述

# get data size
data_size = meta_data.shape
print(data_size)

(2000, 2)

加载数据

# load a wave data
def load_wave_data(audio_dir, file_name):
    file_path = os.path.join(audio_dir, file_name)
    x, fs = librosa.load(file_path, sr=44100)
    return x,fs
# change wave data to mel-stft
def calculate_melsp(x, n_fft=1024, hop_length=128):
    stft = np.abs(librosa.stft(x, n_fft=n_fft, hop_length=hop_length))**2
    log_stft = librosa.power_to_db(stft)
    melsp = librosa.feature.melspectrogram(S=log_stft,n_mels=128)
    return melsp
# display wave in plots
def show_wave(x):
    plt.plot(x)
    plt.show()
# display wave in heatmap
def show_melsp(melsp, fs):
    librosa.display.specshow(melsp, sr=fs)
    plt.colorbar()
    plt.show()
# example data
x, fs = load_wave_data(audio_dir, meta_data.loc[0,"filename"])
melsp = calculate_melsp(x)
print("wave size:{0}\nmelsp size:{1}\nsamping rate:{2}".format(x.shape, melsp.shape, fs))
show_wave(x)
show_melsp(melsp, fs)

wave size:(220500,)
melsp size:(128, 1723)
samping rate:44100

在这里插入图片描述
在这里插入图片描述

ipd.Audio(x, rate=fs)

augment audio data

# data augmentation: add white noise
def add_white_noise(x, rate=0.002):
    return x + rate*np.random.randn(len(x))
x_wn = add_white_noise(x)
melsp = calculate_melsp(x_wn)
print("wave size:{0}\nmelsp size:{1}\nsamping rate:{2}".format(x_wn.shape, melsp.shape, fs))
show_wave(x_wn)
show_melsp(melsp, fs)

wave size:(220500,)
melsp size:(128, 1723)
samping rate:44100

在这里插入图片描述
在这里插入图片描述

ipd.Audio(x_wn, rate=fs)
# data augmentation: shift sound in timeframe
def shift_sound(x, rate=2):
    return np.roll(x, int(len(x)//rate))
x_ss = shift_sound(x)
melsp = calculate_melsp(x_ss)
print("wave size:{0}\nmelsp size:{1}\nsamping rate:{2}".format(x_ss.shape, melsp.shape, fs))
show_wave(x_ss)
show_melsp(melsp, fs)

melsp size:(128, 1723)
samping rate:44100

在这里插入图片描述
在这里插入图片描述

ipd.Audio(x_ss, rate=fs)
# data augmentation: stretch sound
def stretch_sound(x, rate=1.1):
    input_length = len(x)
    x = librosa.effects.time_stretch(x, rate)
    if len(x)>input_length:
        return x[:input_length]
    else:
        return np.pad(x, (0, max(0, input_length - len(x))), "constant")
x_st = stretch_sound(x)
melsp = calculate_melsp(x_st)
print("wave size:{0}\nmelsp size:{1}\nsamping rate:{2}".format(x_st.shape, melsp.shape, fs))
show_wave(x_st)
show_melsp(melsp, fs)

wave size:(220500,)
melsp size:(128, 1723)
samping rate:44100

在这里插入图片描述
在这里插入图片描述

ipd.Audio(x_st, rate=fs)

Split training dataset and test dataset

# get training dataset and target dataset
x = list(meta_data.loc[:,"filename"])
y = list(meta_data.loc[:, "target"])

x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.2, stratify=y)
print("x train:{0}\ny train:{1}\nx test:{2}\ny test:{3}".format(len(x_train),
                                                                len(y_train), 
                                                                len(x_test), 
                                                                len(y_test)))

x train:1600
y train:1600
x test:400
y test:400

Transform wav data to mel-stft array

freq = 128
time = 1723
# save wave data in npz, with augmentation
def save_np_data(filename, x, y, aug=None, rates=None):
    np_data = np.zeros(freq*time*len(x)).reshape(len(x), freq, time)
    np_targets = np.zeros(len(y))
    for i in range(len(y)):
        _x, fs = load_wave_data(audio_dir, x[i])
        if aug is not None:
            _x = aug(x=_x, rate=rates[i])
        _x = calculate_melsp(_x)
        np_data[i] = _x
        np_targets[i] = y[i]
    np.savez(filename, x=np_data, y=np_targets)  
# save raw training dataset
if not os.path.exists("esc_melsp_all_train_raw.npz"):
    save_np_data("esc_melsp_all_train_raw.npz", x_train,  y_train)
# save test dataset
if not os.path.exists("esc_melsp_all_test.npz"):
    save_np_data("esc_melsp_all_test.npz", x_test,  y_test)
# save training dataset with white noise
if not os.path.exists("esc_melsp_train_white_noise.npz"):
    rates = np.random.randint(1,50,len(x_train))/10000
    save_np_data("esc_melsp_train_white_noise.npz", x_train,  y_train, aug=add_white_noise, rates=rates)
# save training dataset with sound shift
if not os.path.exists("esc_melsp_train_shift_sound.npz"):
    rates = np.random.choice(np.arange(2,6),len(y_train))
    save_np_data("esc_melsp_train_shift_sound.npz", x_train,  y_train, aug=shift_sound, rates=rates)
# save training dataset with stretch
if not os.path.exists("esc_melsp_train_stretch_sound.npz"):
    rates = np.random.choice(np.arange(80,120),len(y_train))/100
    save_np_data("esc_melsp_train_stretch_sound.npz", x_train,  y_train, aug=stretch_sound, rates=rates)
# save training dataset with combination of white noise and shift or stretch
if not os.path.exists("esc_melsp_train_combination.npz"):
    np_data = np.zeros(freq*time*len(x_train)).reshape(len(x_train), freq, time)
    np_targets = np.zeros(len(y_train))
    for i in range(len(y_train)):
        x, fs = load_wave_data(audio_dir, x_train[i])
        x = add_white_noise(x=x, rate=np.random.randint(1,50)/1000)
        if np.random.choice((True,False)):
            x = shift_sound(x=x, rate=np.random.choice(np.arange(2,6)))
        else:
            x = stretch_sound(x=x, rate=np.random.choice(np.arange(80,120))/100)
        x = calculate_melsp(x)
        np_data[i] = x
        np_targets[i] = y_train[i]
    np.savez("esc_melsp_train_combination.npz", x=np_data, y=np_targets)

Audio classification with deep learning

Preparation for deep learning

import keras
from keras.models import Model
from keras.layers import Input, Dense, Dropout, Activation
from keras.layers import Conv2D, GlobalAveragePooling2D
from keras.layers import BatchNormalization, Add
from keras.callbacks import EarlyStopping, ModelCheckpoint,ReduceLROnPlateau
from keras.models import load_model
import warnings
warnings.filterwarnings("ignore")
# dataset files
train_files = ["esc_melsp_all_train_raw.npz"]
test_file = "esc_melsp_all_test.npz"
train_num = len(x_train)
test_num = len(x_test)
print(train_num)
print(test_num)

1600
400

# define dataset placeholders
x_train = np.zeros(freq*time*train_num*len(train_files)).reshape(train_num*len(train_files), freq, time)
y_train = np.zeros(train_num*len(train_files))
# load dataset
for i in range(len(train_files)):
    data = np.load(train_files[i])
    x_train[i*train_num:(i+1)*train_num] = data["x"]
    y_train[i*train_num:(i+1)*train_num] = data["y"]
# load test dataset
test_data = np.load(test_file)
x_test = test_data["x"]
y_test = test_data["y"]
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

(1600, 128, 1723)
(1600,)
(400, 128, 1723)
(400,)

# redefine target data into one hot vector
classes = 50
y_train = keras.utils.to_categorical(y_train, classes)
y_test = keras.utils.to_categorical(y_test, classes)
# reshape training dataset
x_train = x_train.reshape(train_num*1, freq, time, 1)
x_test = x_test.reshape(test_num, freq, time, 1)
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

(1600, 128, 1723, 1)
(1600, 50)
(400, 128, 1723, 1)
(400, 50)

print("x train:{0}\ny train:{1}\nx test:{2}\ny test:{3}".format(x_train.shape,
                                                                y_train.shape, 
                                                                x_test.shape, 
                                                                y_test.shape))
x train:(1600, 128, 1723, 1)
y train:(1600, 50)
x test:(400, 128, 1723, 1)
y test:(400, 50)

Define convolutional neural network

def cba(inputs, filters, kernel_size, strides):
    x = Conv2D(filters, kernel_size=kernel_size, strides=strides, padding='same')(inputs)
    x = BatchNormalization()(x)
    x = Activation("relu")(x)
    return x
# define CNN
inputs = Input(shape=(x_train.shape[1:]))

x_1 = cba(inputs, filters=32, kernel_size=(1,8), strides=(1,2))
x_1 = cba(x_1, filters=32, kernel_size=(8,1), strides=(2,1))
x_1 = cba(x_1, filters=64, kernel_size=(1,8), strides=(1,2))
x_1 = cba(x_1, filters=64, kernel_size=(8,1), strides=(2,1))

x_2 = cba(inputs, filters=32, kernel_size=(1,16), strides=(1,2))
x_2 = cba(x_2, filters=32, kernel_size=(16,1), strides=(2,1))
x_2 = cba(x_2, filters=64, kernel_size=(1,16), strides=(1,2))
x_2 = cba(x_2, filters=64, kernel_size=(16,1), strides=(2,1))

x_3 = cba(inputs, filters=32, kernel_size=(1,32), strides=(1,2))
x_3 = cba(x_3, filters=32, kernel_size=(32,1), strides=(2,1))
x_3 = cba(x_3, filters=64, kernel_size=(1,32), strides=(1,2))
x_3 = cba(x_3, filters=64, kernel_size=(32,1), strides=(2,1))

x_4 = cba(inputs, filters=32, kernel_size=(1,64), strides=(1,2))
x_4 = cba(x_4, filters=32, kernel_size=(64,1), strides=(2,1))
x_4 = cba(x_4, filters=64, kernel_size=(1,64), strides=(1,2))
x_4 = cba(x_4, filters=64, kernel_size=(64,1), strides=(2,1))

x = Add()([x_1, x_2, x_3, x_4])

x = cba(x, filters=128, kernel_size=(1,16), strides=(1,2))
x = cba(x, filters=128, kernel_size=(16,1), strides=(2,1))

x = GlobalAveragePooling2D()(x)
x = Dense(classes)(x)
x = Activation("softmax")(x)

model = Model(inputs, x)
model.summary()

Optimization and callbacks

# initiate Adam optimizer
opt = keras.optimizers.adam(lr=0.0001, decay=1e-6, amsgrad=True)

# Let's train the model using Adam with amsgrad
model.compile(loss='categorical_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])
# directory for model checkpoints
model_dir = "./models"
if not os.path.exists(model_dir):
    os.mkdir(model_dir)

# early stopping and model checkpoint# early  
es_cb = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True,verbose=1, mode='min')
chkpt = os.path.join(model_dir, 'esc50_.{epoch:02d}_{val_loss:.4f}_{val_acc:.4f}.hdf5')
cp_cb = ModelCheckpoint(filepath = chkpt, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
reduce_lr = ReduceLROnPlateau(monitor="val_loss",factor=0.6,patience=3,verbose=1,mode="min")

Train CNN model with between class dataset

# between class data generator
class MixupGenerator():
    def __init__(self, x_train, y_train, batch_size=16, alpha=0.2, shuffle=True):
        self.x_train = x_train
        self.y_train = y_train
        self.batch_size = batch_size
        self.alpha = alpha
        self.shuffle = shuffle
        self.sample_num = len(x_train)

    def __call__(self):
        while True:
            indexes = self.__get_exploration_order()
            itr_num = int(len(indexes) // (self.batch_size * 2))

            for i in range(itr_num):
                batch_ids = indexes[i * self.batch_size * 2:(i + 1) * self.batch_size * 2]
                x, y = self.__data_generation(batch_ids)

                yield x, y

    def __get_exploration_order(self):
        indexes = np.arange(self.sample_num)

        if self.shuffle:
            np.random.shuffle(indexes)

        return indexes

    def __data_generation(self, batch_ids):
        _, h, w, c = self.x_train.shape
        _, class_num = self.y_train.shape
        x1 = self.x_train[batch_ids[:self.batch_size]]
        x2 = self.x_train[batch_ids[self.batch_size:]]
        y1 = self.y_train[batch_ids[:self.batch_size]]
        y2 = self.y_train[batch_ids[self.batch_size:]]
        l = np.random.beta(self.alpha, self.alpha, self.batch_size)
        x_l = l.reshape(self.batch_size, 1, 1, 1)
        y_l = l.reshape(self.batch_size, 1)

        x = x1 * x_l + x2 * (1 - x_l)
        y = y1 * y_l + y2 * (1 - y_l)

        return x, y
# train model
batch_size = 16
epochs = 1000

training_generator = MixupGenerator(x_train, y_train)()
model.fit_generator(generator=training_generator,
                    steps_per_epoch=x_train.shape[0] // batch_size,
                    validation_data=(x_test, y_test),
                    epochs=epochs, 
                    verbose=1,
                    shuffle=True,
                    callbacks=[es_cb, cp_cb,reduce_lr])

在这里插入图片描述

evaluation = model.evaluate(x_test, y_test)

evaluation = model.evaluate(x_test, y_test)
print(evaluation)

320/320 [==============================] - 48s 151ms/step
[1.4442142248153687, 0.675]

prediction

freq = 128
time = 1723
predict_audio_dir = os.path.join(esc_dir, "audio/test/")
predict_file = os.path.join(esc_dir,"test.csv")
predict_data = pd.read_csv("test.csv",header=None,names=["filename"])
predict_data

在这里插入图片描述

predict_data.shape[0]

400

predict = list(predict_data.loc[:,"filename"])
# save wave data in npz, with augmentation
def save_np_data(filename, x, aug=None, rates=None):
    np_data = np.zeros(freq*time*len(x)).reshape(len(x), freq, time)
    for i in range(len(predict)):
        _x, fs = load_wave_data(predict_audio_dir, x[i])
        if aug is not None:
            _x = aug(x=_x, rate=rates[i])
        _x = calculate_melsp(_x)
        np_data[i] = _x
    np.savez(filename, x=np_data)  
# save raw training dataset
if not os.path.exists("esc_melsp_predict_raw.npz"):
    save_np_data("esc_melsp_predict_raw.npz", predict)
predict_file = "esc_melsp_predict_raw.npz"
# load test dataset
predict = np.load(predict_file)
x_predict = predict["x"]
x_predict = x_predict.reshape(predict_data.shape[0],freq,time,1)
pred = None
for model_path in ["models/esc50_.14_1.3803_0.7312.hdf5","models/esc50_.18_1.2065_0.7000.hdf5","models/esc50_.20_1.1664_0.7594.hdf5"]:
    model = load_model(model_path)
    if pred is None:
        pred = model.predict(x_predict)
    else:
        pred += model.predict(x_predict)
print(pred.shape)
res = np.argmax(pred,axis=1)
print(res[:5])
import pandas as pd

df = pd.DataFrame({"img_path":predict_data["filename"], "tags":res})
df.to_csv("submit.csv",index=None,header=None)

小结

下次见!!!
在这里插入图片描述

102基于CNN识别50种环境声音 这是运行python 03pyqt.py的可视化界面,通过第一个按钮加载需要检测的音频,运行第三个按钮就会将检测结果,比如加载风这个环境声音的音频,就能对检测结果显示在下方Result处。089基于深度学习的小样本数据检测_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mob。081基于深度学习的农业病虫害检测小程序版本_含10多种模型包括alexnet、DenseNet、DLA、Goog。有兴趣的小伙伴也可以自行扩充数据集,或训练自己的数据集。 阅读详情

相关推荐

使用深度学习进行音频分类

欢迎来到我的博客!今天,我们将探讨如何使用深度学习进行音频分类。我们将逐步展示如何使用 Python 和深度学习库,例如 TensorFlow 和 librosa,来处理和分类音频数据。

YOLO 1346

循环神经网络RNN用于分类任务

介绍使用RNN进行分类(图像分类)的方法。RNN用于分类任务的结构是多对一结构。假设图像的尺寸是28x28的黑白图片,将每一个张图片作为RNN的输入,每一行作为一个输入特征,所有的行构成一个序列。 RNN的输出只选择最后一行的输出(使用out[:, -1, :]),这就是多对一的精髓。最后再套一个全连接层,使用交叉熵作为判断准则。

... 2746

声音分类及其实战(一)

玩过CV的都知道猫狗识别,通过输入一张猫狗图片之后经过神经网络就能知道这张图片属于猫还是狗,图像识别的输入是很直观的,这源于我们对图像理性的认识(RGB图像有三个通道,每个通道中每个像素点都是一个数字....)。但声音显然是一个朦胧的概念,声音是如何实现分类的呢?CV有人脸识别,声音也存在声纹识别,这些在人工智能里面都是如何判断的,让我们从一篇简单的声音分类开始吧!

码匀的博客 4735

【项目实战】Python基于librosa和人工神经网络实现语音识别分类模型(ANN算法)项目实战

Python基于librosa和人工神经网络实现语音识别分类模型(ANN算法)项目实战

张陈亚的博客 1万+

KNN算法在语音情感分类识别中的MATLAB GUI改进

在情感分类的回调函数中,你需要编写KNN分类器的训练和测试逻辑,并将分类结果输出到文本输出框中。接下来,我们将使用MATLAB的GUI设计工具来创建一个交互式界面,以便用户可以方便地加载音频数据集、选择分类器参数和进行情感分类识别。在上述代码中,我们创建了一个简单的GUI界面,包含了加载音频文件的按钮、选择K值的下拉菜单、进行情感分类的按钮和显示分类结果的文本输出框。当用户点击"情感分类"按钮时,GUI界面将调用相应的回调函数,完成音频文件的加载、参数的选择和情感分类的过程。如有任何疑问,请随时提问。

qq_39605374的博客 164

嵌入式学习之QT学习---14 QT跨平台运行之把QT程序交叉编译到ARM开发板

想要把qt工程放到开发板上运行,就需要用到交叉编译。由于qt是跨平台的,所以只需要换个编译器编译一下就可以。 以“定时器”的例子为例,在移植之前还需要进行一个准备工作,在windows下运行的时候,电脑屏幕很大,但是运行的窗口只有一点点大,开发板也有外接屏幕,如何让运行窗口自动适配开发板的外接屏幕呢?令其占满屏幕显示,而不是一小块。 第一步:需要设置一下,先给ui布局,如果不布局,控件就不会随着屏幕的大小的变化而变化。 第二步:利用代码来获取屏幕的大小,给widget.cpp文件下添加如下代码 #inclu

qq_42822743的博客 5457

语音识别 AI 挑战赛上线:用深度学习三种结构,对 50 种环境声音分类!

雷锋网 AI 源创评论按:此前,AI 研习社(https://god.yanxishe.com )陆续推出了医疗、美食、安全等多个领域的图像识别挑战赛以及 NLP 方向的挑战赛 30 余场。在这过程中,各位 AI 大神在各个挑战赛中不仅进一步提升了自己的编程实力,也为更多开发者留下了令人印象深刻、受益匪浅的作品。据一些大神选手反馈,可以肯定的是比赛主题选取都很新颖且有实际意义,只是现在的他们已经不...

q6q6q的专栏 999

避坑指南:为什么你的conda环境装不上Mamba?从CUDA到ABI的深度排查

本文深入解析conda环境中安装Mamba架构时常见的CUDA版本冲突、ABI不匹配等问题,提供从基础检查到深度排查的系统化解决方案。针对`causal-conv1d`和`mamba-ssm`安装失败场景,详细讲解PyTorch版本绑定、编译器工具链兼容性等关键技术要点,并给出预编译wheel选择、动态链接库配置等实用修复方案。

weixin_33738555的博客 346

【日拱一卒01】基于边缘的深度学习森林环境声音分类综述

森林生态系统在地球生命可持续存在中发挥着至关重要的作用。声学监视系统支持当局管 理对这类环境产生不利影响的人工和自然场景。本调查文章探讨了在边缘开发FSC系统的 主要方法,包括声音预处理技术、可用的标准数据集、最先进的深度学习模型以及不同的 硬件配置和评估指标。最后,我们为ESC领域提供了推荐技术,并讨论了未来研究方向中 的挑战,这将有助于该领域的研究人员和开发者。

weixin_51349796的博客 754

基于PSO-BP神经网络的风电功率预测研究论文复现

风电功率预测。基于PSO-BP神经网络的风电功率预测论文复现。matlab程序,注释清晰。

weixin_825487230的博客 2295

生成式引擎优化(GEO)- 搜索引擎优化

生成式引擎优化(GEO)是针对AI内容生成平台(如ChatGPT)的新型优化策略,旨在提升品牌内容在AI生成答案中的引用率,与传统SEO存在显著差异。GEO通过优化内容权威性、结构化和语义关联,适应AI的RAG技术架构,采用3C原则(可爬性、网络共识、反馈校正)提升内容可见性。其核心区别在于目标(引用率vs排名)、技术(语义优化vs关键词)及算法透明度(封闭vs开放)。适用场景包括商业决策、行业权威建设及公共知识服务,帮助品牌在AI时代占据信息主导权。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1405

环境声音识别AI数据集ESC-50深度解析

ESC-50是一个专门用于环境声音分类任务的高质量开源数据集,包含50个不同环境类别,总计5000个5秒长的音频样本,采样率为44.1kHz。该数据集为机器学习和人工智能在声音识别领域的研究提供了宝贵资源,特别适合快速原型设计和实验验证。 ## 数据集技术架构 ESC-50数据集采用精心设计的结构化组织方式,每个音频样本都包含详细的元数据标注。数据集的主要技术特点包括: - **标准化音频格

gitblog_00334的博客 754

华为OD机考双机位C卷 - 构成正方形的数量 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 成正方形的数量 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 5939

ESC-50环境声音分类数据集安装与配置指南

ESC-50是一个标记好的环境声音录音集合,适用于环境声音分类的基准测试。该数据集包含2000个5秒钟长的录音,分为50个语义类别,这些类别大致分为五个主要类别:动物、自然声音景观和水声、人类非言语声音、室内/家庭声音以及室外/城市噪声。 该项目主要使用的编程语言是Python。 ## 2. 关键技术和框架 - **音频处理**:项目使用了一些常见的音频处理技术,如MFCC(Mel频率倒谱系...

gitblog_00268的博客 545

Git救援:如何从误操作中恢复未提交的更改

摘要:本文探讨了误操作git reset --hard导致未提交更改丢失后的恢复方法。首先分析git reflog的局限性,随后介绍利用IDE本地历史记录(如IntelliJ IDEA和VS Code)进行文件恢复的具体步骤。最后建议使用文件系统恢复工具(如Linux的extundelete或Windows的Recuva)作为备选方案。文章强调定期提交的重要性,同时提供了意外发生时可行的恢复策略,帮助开发者尽可能挽回丢失的工作内容。(149字)

2501_90323865的博客 131

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。

机器人控制与仿真应用 3377

基于Tensorflow实现声音分类

环境准备 主要介绍libsora,PyAudio,pydub的安装,其他的依赖包根据需要自行安装。 安装libsora 最简单的方式就是使用pip命令安装,如下: pip install pytest-runner pip install librosa 如果pip命令安装不成功,那就使用源码安装,下载源码:https://github.com/librosa/librosa/releases/...

夜雨飘零 1万+

1553B总线介绍及其硬件方案设计

军用1553B总线 1.简介 简单介绍可参考(https://blog.youkuaiyun.com/ScilogyHunter/article/details/108444231)博主写的很详细。 1553B总线是MIL-STD-1553总线的简称,其中B就是BUS,MIL-STD-1553B总线是飞机内部时分制命令/响应式多路复用数据总线。1553B数据总线标准是20世纪70年代由美国公布的一种串行多路数据总线标准。1553B总线能挂31个远置终端,1553B总线采用指令/响应型通信协议,它有三种终端类型: BC:

小幽余生不加糖 1万+

探秘 ESC-50:一款高效的声音场景分类数据集

探秘 ESC-50:一款高效的声音场景分类数据集 ESC-50 项目地址: https://gitcode.com/gh_mirrors/esc/ESC-50 是一个开源的数据集,专门用于环境声音分类任务,...

gitblog_00061的博客 1374

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度学习语音降噪方法对比_语音识别 AI 挑战赛上线:用深度学习三种结构,对 50 种环境声音分类...

雷锋网 AI 源创评论按:此前,AI 研习社(https://god.yanxishe.com)陆续推出了医疗、美食、安全等多个领域的图像识别挑战赛以及 NLP 方向的挑战赛 30 余场。在这过程中,各位 AI 大神在各个挑战赛中不仅进一步提升了自己的编程实力,也为更多开发者留下了令人印象深刻、受益匪浅的作品。据一些大神选手反馈,可以肯定的是比赛主题选取都很新颖且有实际意义,只是现在的他们已经不再...

weixin_39964590的博客 601

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 【人工智能项目】深度学习实现白葡萄酒品质预测
下一篇: 【人工智能项目】深度学习实现知乎文本摘要
mind_programmonkey
mind_programmonkey 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄9年 4435粉丝 1111原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值