Files
petshy/research_notes.md
2025-10-08 20:39:09 +08:00

169 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# YAMNet深度学习猫咪翻译器研究笔记
## YAMNet模型架构与特点
### 基本架构
- YAMNet是一个预训练的深度神经网络基于MobileNetV1深度可分离卷积架构
- 能够预测来自AudioSet语料库的521种不同音频事件
- 适合在移动设备上运行的轻量级模型
### 输入输出规格
- 输入任意长度的单声道16kHz音频波形范围为[-1.0, +1.0]的1D浮点张量
- 输出:
1. 类别得分521个AudioSet类别的预测概率
2. 嵌入向量1024维的特征向量用于迁移学习
3. 对数梅尔频谱图:音频的时频表示
### 内部处理流程
- 将音频信号分割为"帧"每帧0.96秒长
- 每0.48秒提取一个帧帧之间有50%重叠)
- 将原始音频转换为对数梅尔频谱图
- 通过MobileNetV1网络提取特征
- 输出类别预测和嵌入向量
## 迁移学习策略
### 基本原理
- 利用YAMNet作为高级特征提取器
- 使用YAMNet的1024维嵌入向量作为新模型的输入
- 添加新的分类层,专门用于猫叫声意图识别
- 只需训练新添加的分类层,无需重新训练整个网络
### 实现方法
1. 加载预训练的YAMNet模型
2. 移除YAMNet的最后一层分类层
3. 添加新的Dense层用于猫叫声意图分类
4. 使用少量标记数据训练新的分类层
### 代码示例
```python
# 加载预训练的YAMNet模型
yamnet_model = hub.load('https://tfhub.dev/google/yamnet/1')
# 创建新的分类模型
class CatIntentModel(tf.keras.Model):
def __init__(self, num_classes):
super(CatIntentModel, self).__init__()
self.dense1 = tf.keras.layers.Dense(512, activation='relu')
self.dropout = tf.keras.layers.Dropout(0.3)
self.dense2 = tf.keras.layers.Dense(num_classes, activation='softmax')
def call(self, inputs):
x = self.dense1(inputs)
x = self.dropout(x)
return self.dense2(x)
```
## 双层模型架构设计
### 第一层:猫叫声检测模型
- 目标:从环境音频中识别出猫的叫声
- 输入:原始音频波形
- 处理使用YAMNet提取特征并进行二分类猫叫声 vs 非猫叫声)
- 输出:猫叫声检测结果和置信度
### 第二层:意图分类模型
- 目标:分析猫叫声并识别其意图和情绪
- 输入:被第一层识别为猫叫声的音频片段
- 处理使用YAMNet提取特征然后通过自定义分类层进行意图分类
- 输出:意图类别(如"开心"、"生气"、"饥饿"等)和置信度
### 模型流程
1. 音频输入 → 预处理 → 分段
2. 对每个音频段使用第一层模型检测是否为猫叫声
3. 对检测为猫叫声的段使用第二层模型进行意图分类
4. 汇总结果并输出最终预测
## 对数梅尔频谱图特征提取
### 基本原理
- 对数梅尔频谱图是一种时频表示,模拟人类听觉系统对声音的感知
- 相比MFCC保留了更多的时频细节适合深度学习模型
### 提取步骤
1. 对音频信号进行分帧和加窗
2. 计算每帧的短时傅里叶变换(STFT)
3. 将线性频谱映射到梅尔刻度
4. 取对数转换,增强低能量区域的表示
### 代码示例
```python
def extract_log_mel_spectrogram(audio_data, sample_rate=16000, n_mels=128):
# 计算梅尔频谱图
mel_spec = librosa.feature.melspectrogram(
y=audio_data,
sr=sample_rate,
n_fft=1024,
hop_length=512,
n_mels=n_mels
)
# 转换为对数刻度
log_mel_spec = librosa.power_to_db(mel_spec, ref=np.max)
return log_mel_spec
```
## 持续学习与用户反馈机制
### 基本原理
- 每只猫都有独特的声音特征,没有通用的"猫语言"
- 通过用户反馈不断改进特定猫咪的模型
- 随着数据积累,模型准确度不断提高
### 实现方法
1. 用户为自己猫咪的叫声添加标签
2. 当应用无法准确识别时,用户可以纠正翻译
3. 使用新标记的数据增量训练模型
4. 定期重新训练模型,整合新的用户反馈
### 数据管理
- 为每只猫建立独立的数据集和模型
- 存储用户标记的音频特征和标签
- 实现数据导入导出功能,便于备份和恢复
## TensorFlow Lite移动端部署
### 转换流程
1. 训练完成TensorFlow模型
2. 使用TFLite转换器将模型转换为TFLite格式
3. 优化模型大小和推理速度
4. 部署到移动设备
### 代码示例
```python
def convert_to_tflite(model_path, output_path):
# 加载模型
model = tf.keras.models.load_model(model_path)
# 转换为TFLite
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
# 保存TFLite模型
with open(output_path, 'wb') as f:
f.write(tflite_model)
```
## 技术挑战与解决方案
### 1. 训练数据不足
- 解决方案:使用迁移学习,只需要少量标记数据
- 实现数据增强技术,如添加噪声、时间拉伸、音高变化等
### 2. 实时处理延迟
- 解决方案:优化音频缓冲区大小
- 实现并行处理管道
- 使用TFLite优化推理速度
### 3. 个性化与通用性平衡
- 解决方案:双层模型架构,第一层通用猫叫声检测,第二层个性化意图识别
- 允许用户选择使用通用模型或个性化模型
## 参考资料
1. TensorFlow YAMNet官方教程: https://www.tensorflow.org/tutorials/audio/transfer_learning_audio
2. YAMNet TensorFlow Hub模型: https://tfhub.dev/google/yamnet/1
3. AudioSet数据集: https://research.google.com/audioset/
4. MobileNetV1论文: https://arxiv.org/abs/1704.04861
5. TensorFlow Lite音频分类: https://ai.google.dev/edge/litert/libraries/modify/audio_classification