Edge Impulse 卷积神经网络(CNN)与语音识别部署学习笔记


00:06 - 00:39

CNN(卷积神经网络)简介

主要内容

  • 之前学习的是:

    • 全连接神经网络(Dense Neural Network)(善于处理平铺数据,像姿态传感器数据)

    • 用于动作分类

这节开始学习:

CNN(卷积神经网络)

(是像人一样看轮廓看特征,天生适合搞图像)

也叫:

  • ConvNet

  • 卷积网络


CNN 的核心作用

CNN 适合:

  • 图像分类

  • 图像分析

  • 语音特征识别(MFCC)

原因:

  • CNN 会自动寻找输入中的特征和模式

例如:

  • 边缘

  • 圆形

  • 纹理

  • 五官

  • 动物轮廓


00:42 - 01:31

卷积层(Convolution Layer)

CNN 最重要的部分:


卷积层里有什么?

Filter(滤波器)

也叫:

Kernel(卷积核)


卷积核的作用

它会自动学习:

  • 哪些图像特征最重要

  • 哪些纹理最关键

例如:

  • 毛发

  • 木纹

  • 草地

  • 边缘


CNN 的层级特征提取

浅层:

识别简单特征

深层:

识别复杂特征

更深层:

识别完整物体

01:38 - 02:30

CNN 为什么耗内存?

Edge Impulse 默认:

  • 第一层有 8 个滤波器

意味着:

  • 一张输入图像
    → 变成 8 张特征图

下一层如果有:

  • 16 个滤波器

则:

  • 每张图继续生成更多特征图


问题

图像数量会爆炸增长:

1张输入图
↓
8张特征图
↓
128张特征图

因此:

  • 占用大量 RAM

  • 占用计算时间


解决办法

使用:

最大池化(Max Pooling)

作用:

  • 压缩特征图尺寸

  • 减少计算量


02:34 - 03:39

卷积到底怎么计算?


灰度图像

CNN 处理中:

图像本质:

  • 数字矩阵

每个像素:

  • 就是一个数值

通常会:

  • 归一化到 0~1


卷积计算过程

卷积核:

例如:

分别乘以对应的权重再相加即可


工作原理

卷积核(像素合体):

  • 与图像局部区域逐元素相乘

  • 再全部相加

生成:

  • 新像素值

然后:

  • 滑动到下一个区域继续计算(这里的步长为1)

这个过程:

就叫卷积(Convolution)


03:43 - 04:15

CNN 中的重要参数


(1)Kernel Size(卷积核大小)

例如:

  • 3×3

  • 5×5

属于:

超参数(Hyperparameter)

需要自己调试。


(2)卷积核参数

卷积核中的数值(权重):

  • 会自动训练更新

通过:

反向传播(Backpropagation)

学习:

  • 根据答案改权重


(3)ReLU 激活函数

(增加非线性,不加模型只会画直线,这样才能学会更复杂的东西)

CNN 中常用:

ReLU

作用:

含义:将所有小于0的数置为0

  • 小于0 → 直接变0

  • 大于0 → 保留

作用:

  • 强化特征

  • 增加非线性能力


04:18 - 05:56

一维卷积(1D CNN)


为什么使用 1D CNN?

二维卷积:

  • 计算量太大

对于 MFCC(上图就是美尔频率倒谱系数):

其实它只是:

  • 二维数字矩阵

因此:

  • 可以使用 1D 卷积


MFCC 的结构

宽度:

  • 13(频率特征)

长度:        

  • 49(时间帧)


为什么卷积核横向移动?

因为:

要保留时间信息

语音识别中:

  • 时间顺序非常重要


Edge Impulse 默认

卷积核:

  • 宽度 = 13

  • 长度 = 3

即:

覆盖所有频率
只观察短时间变化

05:56 - 08:30

最大池化(Max Pooling)


最大池化作用

作用:

  • 压缩特征图

  • 降低计算量

  • 保留最明显特征


工作原理

例如窗口:

0.1  0.3
0.2  0.38

最大池化输出:

  • 0.38


平均池化

另一种方法:

Average Pooling

取平均值。


Edge Impulse 默认池化参数

窗口:

  • 1×2

步长:

  • 2

因此:

  • 数组长度减半


为什么会补零?

如果数组长度是奇数:

例如:

  • 49

Edge Impulse:

  • 会自动补0

变成:

  • 50

这样池化窗口才能完整移动。


08:30 - 09:39

CNN 最后的分类器

CNN 分两部分:


第一部分

负责:

特征提取

包括:

  • 卷积

  • 池化


第二部分

负责:

分类

通常是:

全连接神经网络(Dense)


Flatten(展平)

卷积输出: 

  • 多维矩阵(多个一维矩阵组成的多维矩阵)

分类器需要:

  • 一维数组

因此:

  • 先展平(Flatten)


Softmax 分类

最终输出:

概率

例如:

hello   0.92
stop    0.03
noise   0.04
unknown 0.01

09:54 - 11:13

Edge Impulse 训练流程

进入:

Neural Network Classifier 页面


可以修改:

  • 卷积层大小

  • 滤波器数量

  • 节点数量

但教程建议:

  • 先保持默认


Dropout(丢弃层)

作用:

防止过拟合

            


工作原理

训练时:

随机忽略:

  • 25% 神经元输出

让模型:

  • 不依赖某些固定节点

增强泛化能力。


11:13 - 12:00

模型测试

训练完成后:

重点观察:


(1)Loss(损失值)

越低越好。


(2)Accuracy(准确率)

越高越好。


(3)Confusion Matrix(混淆矩阵)

查看:

  • 哪些词容易误分类


准确率参考

90%~95%

很好。

85%

演示项目够用。


12:16 - 17:40

超参数调节


(1)Epoch

含义:

完整训练集训练次数


一般规律

Epoch 越多:

  • 模型学习越充分

但:

  • 训练更久


理想 Loss 曲线

快速下降
↓
逐渐稳定
↓
收敛

局部最小值(Local Minimum)

模型可能:

  • 卡在错误最优解

解决办法:

  • 重新随机初始化训练

  • 增加训练时间

过拟合(Overfitting)

表现:

训练集:

  • 很好

验证集:

  • 很差


解决方法

  • Dropout

  • 数据增强

  • Early Stopping

  • 正则化

正则化就像给模型 “定个规矩”,比如在损失函数里加一项 “惩罚”,参数越复杂、值越大,惩罚就越重。这样模型在训练时,就不得不在 “拟合数据” 和 “保持简单” 之间找平衡,最终学到的是数据里通用的规律,而不是那些偶然的噪声,所以在新数据上表现更稳。


学习率(Learning Rate)

控制:

  • 参数更新速度(步长)


学习率过低

问题:

  • 收敛太慢


学习率过高

问题:

  • Loss 来回震荡


Edge Impulse 默认

学习率:

  • 0.005


17:54 - 18:24

数据增强(Data Augmentation)

作用:

增强泛化能力


方法

例如:

  • 添加噪声

  • 随机屏蔽频段

  • 时间拉伸


效果

模型:

  • 更抗干扰

  • 更稳健


18:24 - 22:20

神经网络架构设计


网络结构没有固定答案

机器学习大量工作其实是:

调参数
↓
重新训练
↓
测试效果
↓
继续调参数

宽网络 vs 深网络


宽但浅

特点:

  • 节点多

  • 层少

优点:

  • 记忆能力强

缺点:

  • 容易过拟合


深度网络

特点:

  • 层数多

优点:

  • 泛化能力强

缺点:

  • 计算量大


核心目标

模型尽可能小
但性能足够好

这对嵌入式尤其重要。


23:05 - 23:54

手机部署


Edge Impulse 手机测试流程

进入:

Devices 页面


步骤:

连接手机
↓
扫码
↓
打开浏览器
↓
授权麦克风
↓
实时语音推理

效果

说关键词:

  • hello

  • stop

对应概率会上升。


23:54 - 25:22

Arduino 部署

进入:

Deployment 页面


查看资源占用

包括:

  • Flash

  • RAM

  • 推理时间


关键发现

MFCC 特征提取:

约 212ms

神经网络推理:

约 4ms

说明:

特征提取比AI推理更耗资源

这是 TinyML 里很经典的问题。


25:22 - 29:51

连续关键词识别(Keyword Spotting)


持续监听模式

类似:

  • Siri

  • Alexa


双缓冲区(Double Buffer)

作用:

一个缓冲区采样
↓
另一个缓冲区推理

避免:

  • 数据冲突


滑动窗口 MFCC

每:

  • 1/3 秒

更新一次 MFCC。


工作流程

新音频进入
↓
旧MFCC丢弃
↓
新MFCC加入
↓
重新推理

缓冲区溢出(Buffer Overflow)

如果代码太慢:

会导致:

  • 音频丢失

因为:

  • 新数据来不及处理


MCU 实时语音识别时间

MFCC:

约124ms

推理:

约11ms

总共:
约135ms

每 333ms 完成一次识别。


关键词触发

例如:

if (hello_score > 0.6)
{
    Serial.println("Hello World");
}

本节核心总结

MFCC 提取语音特征
↓
CNN 自动提取高级特征
↓
Dense层负责分类
↓
Softmax输出概率
↓
部署到手机/MCU实时推理
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐