主要内容

Acoustics-Based机器故障识别代码生成树莓π

这个例子演示了代码生成Acoustics-Based机器故障识别使用很长一段短期记忆(LSTM)网络和光谱描述符。这个示例使用MATLAB®编码器™,深度学习MATLAB编码器接口,MATLAB支持包树莓π™硬件生成一个独立的可执行文件(金宝app.elf覆盆子π)文件,利用手臂®的性能计算库。输入数据包括声学时序记录错误或健康的空气压缩机和输出是机械的状态机LSTM预测的网络。这个独立的可执行的覆盆子π流分类器运行在从MATLAB和发送接收到的输入数据为每个标签MATLAB计算分数。互动MATLAB脚本和可执行文件在你的树莓π处理使用用户数据报协议(UDP)。为更多的细节在音频预处理和网络培训,明白了Acoustics-Based机器故障识别

例子要求

  • 深度学习的MATLAB编码器接口支持包金宝app

  • ARM处理器,支持霓虹灯扩展金宝app

  • 臂计算库版本20.02.1(目标ARM硬件)

  • 环境变量的编译器和库

为支持版金宝app本的库和设置环境变量信息,明白了先决条件与MATLAB编码器深度学习(MATLAB编码器)

准备输入数据集

指定一个采样率fs16 kHz和windowLength的512个样本,如中定义Acoustics-Based机器故障识别。集numFramesOne hundred.

fs = 16000;windowLength = 512;numFrames = 100;

要运行示例测试信号,生成一个粉红噪声信号。测试系统的性能在一个真实的数据集,数据集下载空气压缩机[1]

downloadDataset =虚假的;如果~ downloadDataset pinkNoiseSignal = pinknoise (windowLength * numFrames);其他的%下载AirCompressorDataset.zip组件=“音频”;文件名=“AirCompressorDataset / AirCompressorDataset.zip”;localfile = matlab.internal.examples.download金宝appSupportFile(组件,文件名);% downloadFolder解压缩下载的zip文件downloadFolder = fileparts (localfile);如果~ (fullfile (downloadFolder,存在“AirCompressorDataset”),“dir”)解压缩(localfile downloadFolder)结束%创建一个audioDatastore对象数据存储、管理数据。数据存储= audioDatastore (downloadFolder,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);%使用countEachLabel每个类别的样本数据集的数量。countEachLabel(数据存储)结束

在MATLAB识别机器故障

在MATLAB运行流分类器,下载并解压缩系统开发的Acoustics-Based机器故障识别

组件=“音频”;文件名=“AcousticsBasedMachineFaultRecognition / AcousticsBasedMachineFaultRecognition.zip”;localfile = matlab.internal.examples.download金宝appSupportFile(组件,文件名);downloadFolder = fullfile (fileparts (localfile),“系统”);如果~存在(downloadFolder“dir”)解压缩(localfile downloadFolder)结束

访问recognizeAirCompressorFault系统的功能,添加downloadFolder搜索路径。

目录(downloadFolder)

创建一个dsp.AsyncBuffer对象音频流的方式和阅读dsp.AsyncBuffer对象积累分数。

audioSource = dsp.AsyncBuffer;scoreBuffer = dsp.AsyncBuffer;

加载pretrained网络,从网络中提取标签。

airCompNet = coder.loadDeepLearningNetwork (“AirCompressorFaultRecognitionModel.mat”);标签=字符串(airCompNet.Layers(结束). class);

初始化signalToBeTestedpinkNoiseSignal或从下拉列表中选择一个信号测试的文件您所选择的数据集。

如果~ downloadDataset signalToBeTested = pinkNoiseSignal;其他的[allFiles ~] = splitEachLabel(数据存储,1);allData = readall (allFiles);signalToBeTested =allData (1);signalToBeTested = cell2mat (signalToBeTested);结束

流一次一个音频帧代表系统部署在一个实时嵌入式系统。使用recognizeAirCompressorFault开发的Acoustics-Based机器故障识别计算音频功能和执行深度学习分类。

写(audioSource signalToBeTested);resetNetworkState = true;audioSource。NumUnreadSamples > = windowLength%得到音频数据的帧x =阅读(audioSource windowLength);%应用流分类器函数分数= recognizeAirCompressorFault (x, resetNetworkState);%存储分数进行分析写(scoreBuffer,得分);resetNetworkState = false;结束

计算分数的承认错误并显示它。

成绩=阅读(scoreBuffer);[~,labelIndex] = max(分数(最终,:),[],2);detectedFault =标签(labelIndex)
detectedFault =“飞轮”

情节的每一帧的每个标签。

情节(分数)传说(”“+标签,“位置”,“西北”)包含(“时间步”)ylabel (“分数”str = sprintf ()“预测成绩随着时间的步骤。\ nPredicted类:% s”,detectedFault);标题(str)

重置缓冲的异步audioSource

重置(audioSource)

MATLAB代码为部署做好准备

下面的例子使用了dsp.UDPSender系统对象发送音频帧上运行的可执行的覆盆子π和dsp.UDPReceiver系统对象获得的得分向量覆盆子π。创建一个dsp.UDPSender系统对象发送音频捕获在MATLAB覆盆子π。设置targetIPAddress你的树莓π的IP地址。设置RemoteIPPort25000年。覆盆子π接收输入音频帧相同的端口使用dsp.UDPReceiver系统对象。

targetIPAddress =“172.31.164.247”;UDPSend = dsp.UDPSender (“RemoteIPPort”,25000,“RemoteIPAddress”,targetIPAddress);

创建一个dsp.UDPReceiver系统对象接收预测分数从你的树莓π。每一个UDP数据包收到分数和覆盆子π是一个向量的每个向量元素是一个得分的空气压缩机。的最大消息长度dsp.UDPReceiver对象是65507个字节。计算缓冲区的大小,以适应UDP数据包的最大数量。

sizeOfDoubleInBytes = 8;numScores = 8;maxUDPMessageLength =地板(65507 / sizeOfDoubleInBytes);numPackets =地板(maxUDPMessageLength / numScores);bufferSize = numPackets * numScores * sizeOfDoubleInBytes;UDPReceive = dsp.UDPReceiver (“LocalIPPort”,21000,“MessageDataType”,“单身”,“MaximumMessageLength”numScores,“下面的”bufferSize);

创建一个支持函数,金宝apprecognizeAirCompressorFaultRaspi,接收音频帧使用dsp.UDPReceiver并应用流分类器和发送预测得分向量MATLAB使用dsp.UDPSender

类型recognizeAirCompressorFaultRaspi
函数recognizeAirCompressorFaultRaspi (hostIPAddress) %这个函数使用dsp接收声波输入。UDPReceiver和运行一个%流分类器通过调用recognizeAirCompressorFault, % Acoustics-Based机故障识别——MATLAB开发的例子。%计算分数被发送到使用dsp.UDPSender MATLAB。% # codegen % 2021年版权MathWorks公司frameLength = 512;%配置UDP发送方系统对象UDPSend = dsp.UDPSender (“RemoteIPAddress”“RemoteIPPort”, 21000年,hostIPAddress);%配置UDP接收机系统对象sizeOfDoubleInBytes = 8;maxUDPMessageLength =地板(65507 / sizeOfDoubleInBytes);numPackets =地板(maxUDPMessageLength / frameLength);bufferSize = numPackets * frameLength * sizeOfDoubleInBytes;UDPReceiveRaspi = dsp。UDPReceiver('LocalIPPort',25000, ... 'MaximumMessageLength',frameLength, ... 'ReceiveBufferSize',bufferSize, ... 'MessageDataType','double'); % Reset network state for first call resetNetworkState = true; while true % Receive audio frame of size frameLength x 1 x = UDPReceiveRaspi(); if(~isempty(x)) x = x(1:frameLength,1); % Apply streaming classifier function scores = recognizeAirCompressorFault(x,resetNetworkState); %Send output to the host machine UDPSend(scores); resetNetworkState = false; end end

生成可执行的覆盆子π

取代hostIPAddress与你的机器的地址。你的树莓π发送预测成绩您所指定的IP地址。

hostIPAddress = coder.Constant (“172.18.230.30”);

创建一个代码生成配置对象生成一个可执行程序。指定目标语言c++。

cfg = coder.config (exe”);cfg。TargetLang =“c++”;

为深度学习创建一个配置对象代码生成的手臂计算图书馆在你的树莓π。指定覆盆子π的架构和深度学习配置对象附加到代码生成配置对象。

dlcfg = coder.DeepLearningConfig (“arm-compute”);dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“20.02.1”;cfg。DeepLearningConfig = dlcfg;

使用的覆盆子π支持包的功能金宝appraspi创建一个连接你的树莓π。在下一个代码块,替换:

  • raspiname覆盆子π的名称

  • π和你的用户名

  • 密码用你的密码

如果(~ (“r”,“var”)r = raspi (“raspiname”,“π”,“密码”);结束

创建一个coder.hardware(MATLAB编码器)对象树莓π和附加的代码生成配置对象。

hw = coder.hardware (“树莓π”);cfg。硬件= hw;

指定构建文件夹树莓π。

buildDir =“~ / remoteBuildDir”;cfg.Hardware。BuildDir = BuildDir;

使用一个自动生成c++主要文件来生成一个独立的可执行文件。

cfg。GenerateExampleMain =“GenerateCodeAndCompile”;

调用codegen(MATLAB编码器)从MATLAB函数编码器生成c++代码和可执行你的树莓π。默认情况下,树莓π可执行文件名称相同的MATLAB函数。你会得到一个警告的代码生成日志你可以无视,因为recognizeAirCompressorFaultRaspi一个无限循环,寻找一个音频帧从MATLAB。

codegen配置cfgrecognizeAirCompressorFaultRaspiarg游戏{hostIPAddress}报告
部署代码。这可能需要几分钟。警告:函数的recognizeAirCompressorFaultRaspi并不因无限循环终止。= = > recognizeAirCompressorFaultRaspi行警告:1列:1代码生成成功(警告):查看报告

使用部署代码执行机器故障识别

创建一个命令来打开recognizeAirCompressorFaultRaspi应用程序在一个覆盆子π。使用系统将命令发送到你的树莓π。

applicationName =“recognizeAirCompressorFaultRaspi”;applicationDirPaths = raspi.utils.getRemoteBuildDirectory (“applicationName”applicationName);targetDirPath = applicationDirPaths {1} .directory;exeName = strcat (applicationName,“.elf”);命令= [“cd”targetDirPath,”;。/”exeName,“& > 1 &”];系统(r,命令);

初始化signalToBeTestedpinkNoiseSignal或从下拉列表中选择一个信号测试的文件您所选择的数据集。

如果~ downloadDataset signalToBeTested = pinkNoiseSignal;其他的[allFiles ~] = splitEachLabel(数据存储,1);allData = readall (allFiles);signalToBeTested =allData (1);signalToBeTested = cell2mat (signalToBeTested);结束

流一次一个音频帧来表示一个系统,因为它将被部署在一个实时嵌入式系统。使用生成的墨西哥人文件recognizeAirCompressorFault_mex计算音频功能和执行深度学习分类。

写(audioSource signalToBeTested);audioSource。NumUnreadSamples > = windowLength x =阅读(audioSource windowLength);UDPSend (x);分数= UDPReceive ();如果~ isempty(分数)写(scoreBuffer,分数”);结束结束

计算分数的承认错误并显示它。

成绩=阅读(scoreBuffer);[~,labelIndex] = max(分数(最终,:),[],2);detectedFault =标签(labelIndex)
detectedFault =“飞轮”

情节的每一帧的每个标签。

情节(分数)传说(”“+标签,“位置”,“西北”)包含(“时间步”)ylabel (“分数”str = sprintf ()“预测成绩随着时间的步骤。\ nPredicted类:% s”,detectedFault);标题(str)

终止独立可执行文件运行在覆盆子π。

stopExecutable (codertarget.raspi.raspberrypi exeName)

评估执行时间使用替代公益诉讼功能的工作流

评估执行时间由独立的可执行文件在覆盆子π,使用一个公益诉讼(processor-in-loop)工作流。执行公益诉讼分析,生成一个公益诉讼功能的支持功能金宝apprecognizeAirCompressorFault

创建一个代码生成配置对象生成公益诉讼的功能。

cfg = coder.config (“自由”,“是”,真正的);cfg。VerificationMode =“公益诉讼”;

设置部门计算库和架构。

dlcfg = coder.DeepLearningConfig (“arm-compute”);cfg。DeepLearningConfig = dlcfg;cfg.DeepLearningConfig。ArmArchitecture =v7的;cfg.DeepLearningConfig。ArmComputeVersion =“20.02.1”;

与你的目标硬件设置连接。

如果(~ (“r”,“var”)r = raspi (“raspiname”,“π”,“密码”);结束hw = coder.hardware (“树莓π”);cfg。硬件= hw;

设置构建目录和目标语言。

buildDir =“~ / remoteBuildDir”;cfg.Hardware。BuildDir = BuildDir;cfg。TargetLang =“c++”;

使分析和生成公益诉讼代码。一个墨西哥人的文件命名recognizeAirCompressorFault_pil是你当前文件夹中生成。

cfg。CodeExecutionProfiling = true;audioFrame = 1 (windowLength, 1);resetNetworkStateFlag = true;codegen配置cfgrecognizeAirCompressorFaultarg游戏{audioFrame, resetNetworkStateFlag}
部署代码。这可能需要几分钟。# # #连接配置功能“recognizeAirCompressorFault”:“树莓π”生成的精灵的位置:/home/pi/remoteBuildDir / MATLAB_ws / R2021b / S / MATLAB / / ExampleManager / sporwal.Bdoc21b例子。j1720794 / deeplearning_shared-ex44063374 codegen / lib / recognizeAirCompressorFault /公益诉讼代码生成成功。

调用生成的公益诉讼函数50倍的平均执行时间。

totalCalls = 50;k = 1: totalCalls x = pinknoise (windowLength, 1);分数= recognizeAirCompressorFault_pil (x, resetNetworkStateFlag);resetNetworkStateFlag = false;结束
# # #开始应用程序:“codegen \ lib \ recognizeAirCompressorFault \ \ recognizeAirCompressorFault趁手。精灵的终止执行:明确recognizeAirCompressorFault_pil # # #启动应用程序recognizeAirCompressorFault.elf……执行分析数据可供浏览。开放的仿真数据检查员。执行分析报告后终止。

公益诉讼执行终止。

清晰的recognizeAirCompressorFault_pil
# # #主机应用程序产生以下标准输出(stdout)和标准错误(stderr)消息:# # #连接配置功能“recognizeAirCompressorFault”:“覆盆子π”执行分析报告:报告(getCoderExecutionProfile (recognizeAirCompressorFault))

生成执行概要报告评估执行时间。

executionProfile = getCoderExecutionProfile (“recognizeAirCompressorFault”);报告(executionProfile,“单位”,“秒”,“ScaleFactor”,“1 e 03”,“NumericFormat”,' % 0.4 f ');

的平均执行时间recognizeAirCompressorFault_pil函数是0.423女士,这是远低于32女士预算的实时性能。第一次调用的recognizeAirCompressorFault_pil消耗在12倍的平均执行时间,因为它包括加载网络和重置的州。然而,在实际部署系统,初始化时间只发生一次。这个例子在这里结束。部署的机器故障识别在台式机上,看到的Acoustics-Based机器故障识别与英特尔MKL-DNN代码生成

引用

[1]Verma Nishchal K。,等。基于“智能状态监测用空气压缩机的声学信号。”IEEE可靠性,卷65,不。1、2016年3月,页291 - 309。DOI.org (Crossref), doi: 10.1109 / TR.2015.2459684。