ZHDA192 June 2026 MSPM0G5187
本部分为使用 TI 的 Edge AI 工具开发和部署电弧故障检测 ML 模型提供了指南。
图 6-1 模型开发工作流程. 从数据收集到部署的端到端模型开发工作流程在受控条件下收集每个类别的数据。每种负载类型包含 20000+ 半周期捕获的最小值(在正常配置和电弧配置中大约平均分配三分钟)。
| 负载类型 | 说明 | 捕获 |
|---|---|---|
| 电感 | 交流继电器、压缩机电机、真空、车间工具 | 10000+ |
| LED | 卤素照明、600W — 1000W、带调光器 | 10000+ |
| SMPS | 600W AC/DC | 10000+ |
| 混合 | 5A 电阻负载下的上述组合 | 10000+ |
| 电弧类型 | 说明 | 捕获 |
|---|---|---|
| 配置 A | 加载串联的电弧发生器 | 10000+ |
| 配置 B | 使用串联和并联的 5A 电阻负载的电弧发生器负载 | 10000+ |
| 配置 C | 使用电弧发生器将负载与 5A 电阻负载并联 | 10000+ |
| 配置 D | 均使用电弧发生器的负载和 5A 电阻负载 | 10000+ |
捕获的数据标记为两个类。标记工具提供两种可配置的模式,用于从原始波形 CSV 生成 ARC 数据和 NORMAL 训练数据:帧模式和窗口模式。这两种模式都使用基于电弧电压的启发法来确定地端实况标签,并且独立于任何机器学习模型。虽然支持这两种模式以适应不同的数据集和前端架构,但对于大多数应用而言,帧模式是推荐的默认模式,因为它能够更好地保持事件连续性并产生更清晰的类边界。
用途:帧模式旨在捕获自然的电弧事件持续时间,并产生可变长度的 ARC 和可紧密反映实际电气行为的 NORMAL 段。它特别适用于基于 LOG300 的数据集和保持时间连续性很重要的场景。
工作原理:
输出特征
使用场合:
用途:窗口模式使用滑动窗口方法生成固定长度的训练样本。当需要统一的输入大小或为需要恒定长度特性的架构构建数据集时,这很有用。
工作原理:
输出特征:
这两种模式受到完全支持,并共用基于电压的相同接地真值逻辑。但是,建议将帧模式用作默认模式,因为它:- 更好地保持现实世界的电弧事件连续性 — 通过时间平滑减少噪声引起的假标签,并且 — 通过明确排除电弧相邻区域产生更清洁的 NORMAL 样本。当固定大小输入或快速数据集标准化是主要要求时,窗口模式仍然很有用。
有关更多信息,请参阅 Tinyml-modelzoo->examples->ac_arc_fault->readme.md
拟合优度 (GOF) 图解用作早期评估,用于在模型训练之前评估数据集中的特性分离性。这些图帮助比较不同预处理组合中的 ARC 和 NORMAL 样本的分布,包括 FFT、小波变换、缩放、PCA 和 t-SNE。GOF 图中的强分级分离表明,所选的信号链和特性提取方法适用于分级,而类别之间的重叠表明可能需要进一步调优。
对于带通滤波电流数据集,GOF 图显示明显的 ARC/NORMAL 重叠,尤其是基于 FFT 的预处理,表明一些与电弧相关的特征被屏蔽。相比之下,基于 LOG300 的数据集产生了更清晰的类群集,这表明功能可分离性得到改善,并且更适合下游模型训练。有关数据集时基故障良率、特性提取质量、GOF 图和文件级分类摘要的更多详细信息,请参阅高级特性下的 TI Tiny ML Tensorlab 用户指南。

而第 4.4 节中提到的电弧故障模型是交流电弧故障检测的推荐模型选择。还可使用多种通用时间序列模型进行分类。
TI Edge AI Studio (GUI) 和 TensorLab (CLI) 均提供通用时间序列模型模板,可快速开发和评估嵌入式 ML 应用。这些模板提供即用型 NPU 兼容架构,这些架构可以用非常少的配置工作就进行自定义数据集训练。
其中一种参考架构是 CLS_6K_NPU 模型,这是一种轻量级可分离卷积神经网络。此模型以及一系列其他参考分类架构可以在 TI Edge AI Studio (GUI) 和通过 CLI 工具提供的 Model Zoo 中获取。
import torch
import torch.nn as nn
import torch.nn.functional as F
class CLS_6K_NPU(nn.Module):
def __init__(self, input_features=512, variables=1, num_classes=2):
super(CLS_6K_NPU, self).__init__()
self.bn0 = nn.BatchNorm2d(variables)
self.conv1 = nn.Conv2d(variables, 16, kernel_size=(3, 1), stride=(4, 1), padding=0, bias=False)
self.bn1 = nn.BatchNorm2d(16)
self.pool1 = nn.MaxPool2d(kernel_size=(3, 1), stride=(2, 1))self.dw3 = nn.Conv2d(16, 16, kernel_size=(3, 1), stride=(1, 1), padding=0,
groups=16, bias=False)
self.bn3a = nn.BatchNorm2d(16)
self.pw3 = nn.Conv2d(16, 32, kernel_size=(1, 1), stride=(1, 1), padding=0, bias=False)
self.bn3b = nn.BatchNorm2d(32)
self.pool2 = nn.MaxPool2d(kernel_size=(3, 1), stride=(2, 1))
self.dw5 = nn.Conv2d(32, 32, kernel_size=(3, 1), stride=(1, 1), padding=0,
groups=32, bias=False)
self.bn5a = nn.BatchNorm2d(32)
self.pw5 = nn.Conv2d(32, 48, kernel_size=(1, 1), stride=(1, 1), padding=0, bias=False)
self.bn5b = nn.BatchNorm2d(48)
self.conv6 = nn.Conv2d(48, 16, kernel_size=(5, 1), stride=(1, 1), padding=0, bias=False)
self.bn6 = nn.BatchNorm2d(16)
self.gap = nn.AdaptiveAvgPool2d(output_size=(4, 1))
self.fc = nn.Linear(64, num_classes)
def forward(self, x):
x = self.bn0(x)
x = self.conv1(x)
x = F.relu(self.bn1(x))
x = self.pool1(x)
x = self.dw3(x)
x = F.relu(self.bn3a(x))
x = self.pw3(x)
x = F.relu(self.bn3b(x))
x = self.pool2(x)
x = self.dw5(x)
x = F.relu(self.bn5a(x))
x = self.pw5(x)
x = F.relu(self.bn5b(x))
x = self.conv6(x)
x = F.relu(self.bn6(x))
x = self.gap(x) # (B, 16, 4, 1)
x = x.view(x.size(0), -1) # (B, 64)
x = self.fc(x) # (B, num_classes)
return x
| 参数 | 值 |
|---|---|
| Batch size | 50 |
| Learning rate | 0.04 |
| Optimizer | SGD |
| Weight decay | 1e-5 |
| Dataset split | 60% 训练、30% 间隔、10% 测试 |
GUI:使用 CCStudio™ Edge AI Studio GUI 进行指导型训练工作流程
CLI:使用 tinyml-tensorlab 进行命令行训练
启用定量感知训练 (QAT),以获得最佳的 INT8 精度。Tinyml-tensorlab 和 Edge AI Studio 内置对 8 位 NPU 感知量化的支持。
为什么要进行 INT8 量化?
MSPM0G5187 Cortex-M0+ 没有硬件浮点单元:
QAT 在训练期间模拟量化,以实现出色的精度保持(通常下降 <1%):
import torch.quantization as quant
# Prepare model for QAT
model.qconfig = quant.get_default_qat_qconfig('fbgemm')
quant.prepare_qat(model, inplace=True)
# Train with simulated quantization
for epoch in range(num_epochs):
train_one_epoch(model, train_loader)
# Convert to fully quantized model
model_int8 = quant.convert(model, inplace=False)
归一化参数特定于模型,并由 TI-NNC 生成:
// From user_input_config.h - [MODEL_SPECIFIC]
#define FE_NORM_BIAS [MODEL_SPECIFIC] // Generated by TI-NNC
#define FE_NORM_SCALE [MODEL_SPECIFIC] // Generated by TI-NNC
#define FE_NORM_SHIFT [MODEL_SPECIFIC] // Generated by TI-NNC
TI 神经网络编译器 (TI-NNC) 对经过训练的“onnx”INT8 模型进行转换,以便于 MSPM0 NPU 执行。
编译生成:
集成到 CCS 工程:
有关安装、CLI 语法和详细编译说明,请参阅 TI-NNC 用户指南。