本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于AI传感器的实时烟雾检测系统

发布时间:2022-08-16
分享到:

基于AI传感器的实时烟雾检测系统

发布时间:2022-08-16
分享到:

这个项目只是一个 DIY 项目,并没有取代经过认证的烟雾探测器。该项目开发的传感器系统只是一个补充,实施传感器融合以检测烟雾并减少误报。

背景
烟雾探测器挽救了很多生命。例如,从 1982 年到 2012 年,法国的火灾受害者人数下降了 48% 以上,从 1982 年到 2013 年,英国的火灾受害者人数下降了 56% 以上。这些减少很大程度上与消防安全法规和烟雾探测器的增加有关。在美国,96% 的家庭配备了烟雾报警器,大约 20% 的配备烟雾报警器的家庭配备了无法使用的烟雾报警器。据估计,如果每个家庭都有工作的烟雾报警器,美国住宅火灾死亡人数可能下降 36%,每年可挽救近 1100 人的生命。随着烟雾探测器数量的增加,误报成为一个问题。火灾误报的数量不断增加,这对消防员来说是一个严峻的问题。

介绍
该项目介绍了一种基于人工智能传感器融合的烟雾探测器来确定火灾警报与否。该系统基于 Arduino Pro Nicla Sense ME 板。出于安全原因,大多数传感器都是冗余的,以确保即使一个传感器发生故障也能正常工作。该项目侧重于四个不同的要求:

  • 基于人工智能传感器融合减少误报
  • 检测传感器错误或故障
  • 所有流程和人工智能任务都在 Arduino 板上计算
  • 通过蓝牙发送火警

工作原理
传统的烟雾探测器采用以下两种检测原理之一。

光电

光电烟雾探测器以光电传感器和光路为源工作。发生火灾时,烟雾会通过开口通风口进入设备。在这个通风口里面是一个光学室。当烟雾进入这个光学室时,它会撞击光路,从而导致光发生散射。这种散射光落在光电二极管上。当光线照射到光电二极管光接收器时,会产生一个信号,从而引发警报。

电离

电离烟雾探测器与连接到电池的两个电极一起工作。通常没有电流流动,因为电路是开路的(电极之间只有空气)。但是,如果空气被 Americium-21(放射性物质)电离,电路就会关闭。因为电离的空气允许电流流动。发生火灾时,烟雾会进入探测器。它扰乱电离过程,电路断开,并产生警报。

误报情况

两种工作原理都受以下影响:

  • 煮过头的食物
  • 蒸汽或高湿度
  • 讨厌的昆虫
  • 灰尘堆积
  • 附近有强烈的化学物质

所有这些外部触发器都可能导致误报。

项目概况
以下内容描述了设备上使用的硬件、数据集收集以及 AI 模型训练和 AI 模型推理。

概述

感烟探测器的主要测量原理是通过 Sensirion SPS30 实现的。该传感器用于测量空气中的颗粒物。SPS30 的工作方式与光电烟雾探测器相同。SPS30 测量空气中的气溶胶浓度并返回颗粒数量及其大小。换言之,SPS30 是一款先进的烟雾探测器。SPS 的数据输出是特殊物质 (PM):PM1.0 / PM2.5 和数字浓度 (NC):NC 0.5 / NC1.0 / NC2.5。在 SPS30 周围,不同的传感器用于测量粒子周围的“元”数据,以对环境进行分类。为了使系统更可靠,大多数传感器都是冗余的,以确保检测到错误的读数。

冗余传感器

  • 湿度/温度:BME688 和 SHT31
  • 气压:BMP390 和 BMP388
  • 气体 (VOC):SPG30 和 BME688

由于内部测量方法和校准,SPG30 和 BME688 的气体传感器读数不是 100% 可比的。所以我决定使用计算出的 VOC 并检查读数差异是否大于 10%。

由于 SPS30“烟雾传感器”没有回退,传感器读数必须是唯一的。否则,必须产生传感器错误。

传感器:

Arduino Nicla Sense ME

  • 博世 BHI260AP:6 轴 IMU(3 轴加速度计 + 3 轴陀螺仪)+ MCU
  • 博世 BMP390:压力传感器
  • 博世 BMM150:磁力计
  • 博世 BME688:湿度、温度和气体传感器 (VOC)

外部传感器

  • 博世 BMP388:压力传感器
  • Sensirion SPS30:特殊物质传感器(烟雾探测器)
  • Sensirion SHT31:湿度和温度传感器
  • Sensirion SPG30:气体传感器 (VOC)
  • GPS:用于传感器读数的时间同步

传感器融合
传感器融合是一个非常通用的术语。

“传感器融合是结合传感器数据或来自不同来源的数据的过程,这样得到的信息比单独使用这些来源时的不确定性要小。”

将传感器融合放在该项目的背景下,旨在使用来自不同传感器的不同环境信息,以改进火灾检测。传感器融合算法可以通过不同的方式实现:

  • (Non)-线性函数,例如 x^2 + y
  • 阈值,例如:if (x > 10)
  • 线性回归,类似于 AI 模型

对于这个特殊问题,最好的情况是使用基于线性回归的传感器融合。因为最终的输出取决于大量不同相关性的传感器读数,人类不容易看到。

数据采集
为这个系统收集训练数据并不像看起来那么容易。必须对许多不同的环境和火源进行采样,以确保获得良好的训练数据集。捕获的不同场景的简短列表:

  • 普通室内
  • 普通户外
  • 室内木火、消防员训练区
  • 室内燃气火灾、消防员培训区
  • 户外木材、煤炭和燃气烧烤炉
  • 室外高湿度

数据集的长度接近 60.000 个读数。所有传感器的采样率为 1Hz。为了跟踪数据,每个传感器读数都会添加一个 UTC 时间戳。

举例:

数据集
数据以 CSV 格式保存,默认标题如下所示。

CSV 数据标题

Temperature[C],Humidity[%],TVOC[ppb],eCO2[ppm],Raw H2,Raw Ethanol,Pressure[hPa],PM1.0,PM2.5,Fire Alarm,CNT,UTC,NC0.5,NC1.0,NC2.5

数据集的详细特征:

  • 气温
  • 空气湿度
  • TVOC:总挥发性有机化合物;以十亿分之几为单位
  • eCO2:二氧化碳当量浓度;根据 TVCO 等不同的值计算
  • 原料H2:原料分子氢;未补偿(偏置、温度等)
  • 原料乙醇:原料乙醇气体
  • 空气压力
  • PM 1.0 和 PM 2.5:颗粒物尺寸 < 1.0 µm (PM1.0)。1.0 µm < 2.5 µm (PM2.5)
  • 火灾警报:如果发生火灾,地面实况为“1”
  • CNT:样本计数器
  • UTC:时间戳UTC秒
  • NC0.5/NC1.0和NC2.5:颗粒物数量浓度。这与 PM 不同,因为 NC 给出了空气中颗粒的实际数量。未加工的 NC 也按粒径分类:< 0.5 µm (NC0.5);0.5 µm < 1.0 µm (NC1.0);1.0 µm < 2.5 µm (NC2.5);

CSV 数据

20.75,30.27,0,400,13434,19806,931.138,1.92,2.47,0,0,0,1654463338,12.04,2.633,0.508
20.66,30.42,0,400,13452,19840,931.135,1.91,2.43,0,0,1,1654463339,11.98,2.585,0.485
20.61,30.44,0,400,13454,19866,931.134,1.85,2.36,0,0,2,1654463340,11.62,2.506,0.469
20.61,30.64,0,400,13461,19894,931.131,1.83,2.33,0,0,3,1654463341,11.48,2.476,0.463
20.6,30.68,0,400,13455,19906,931.132,1.78,2.26,0,0,4,1654463342,11.27,2.397,0.435
20.54,30.78,0,400,13455,19926,931.141,1.76,2.23,0,0,5,1654463343,11.15,2.368,0.427
20.5,30.86,0,445,13335,19952,931.137,1.7,2.14,0,0,6,1654463344,10.78,2.273,0.403
20.48,31.12,0,1340,12875,19919,931.144,1.68,2.12,0,0,7,1654463345,10.67,2.247,0.397

完整的数据集包含超过 50.000 个样本。

训练
我们有一个复杂的传感器融合问题需要解决。我选择Neuton作为训练模型并在微控制器上免费运行的解决方案。要训​​练您的数据集,您需要一个 Google 帐户和一个激活的 Neuton 零重力计划。

本节介绍如何使用自定义数据集训练模型。只需选择一个 CSV 文件并将其上传到 Neuton 平台就非常简单。

要设置新的训练模型,请使用“我的解决方案”选项卡并按照说明进行操作。预加载的数据集可以在“从存储中选择数据集”中找到。

选择数据集后,Neuton 会分析您的数据并检查一切是否适合训练。然后,Neuton 打开一个新对话框来选择模型应该预测的目标变量。对于这个项目,选择了“火警”。

我在数据集中添加了一个计数器变量来检查是否有任何数据丢失。此计数器变量无助于训练模型,并且不用于应用程序本身,因此禁用“cnt”变量进行训练。此功能可帮助您为各种额外的“元数据”保持干净的流程。

本项目中使用的数据集未拆分为训练和验证,因此禁用了“Holdout Validation”。

下一步是详细配置训练和模型配置。有许多选项和配置适合您的应用。

首先,选择数据类型,在本例中为:Float 32 bit。此外,TinyML 已激活,因为模型应该在 Arduino 板上运行。我们选择准确度是因为应尽可能准确地预测火警。对于这种问题,“精度”也可以。

第二部分是关于如何生成输入数据向量。大多数系统使用固定的采样率。该速率定义了新输入数据可用并“馈入”模型的频率。该项目使用 1 Hz 的固定采样率,这意味着每秒都有新的传感器值可用并输入到模型中。所以不需要特殊的数字信号处理。

最后一步是设置模型,由于 Arduino Pro Nicla Sense ME MCU 是具有浮点扩展的 32 位 MCU,模型可以设置为 32 位和浮点数。

接下来只需让项目开始,开始训练,让 Neuton 为您构建模型。

参数详情
在训练过程中,Neuton 会更新模型的详细信息和模型的重要参数。这次火灾探测的培训需要四到五个小时,所以我使用了 Neuton 的 SMS 服务,它会在培训过程完成后向我发送 SMS。训练后,可以对模型进行详细探索。这对于了解模型的性能以及如何更好地了解最终结果非常有帮助。

模型概览显示了在 MCU 上运行模型所需的模型性能和 RAM/Flash 消耗。在左侧,雷达图显示了有关模型的不同指标。在这里,我们发现“准确性”突出显示,因为我们选择它作为目标指标。但是该图显示了所有其他指标。这对于了解模型是否正常工作非常有用。在这种情况下,该模型有一个提升指标的缺口。Lift measurer 单个模型预测与数据集中具有相同输出的所有预测之间的比率。这可能与不平衡的数据集有关,这将在稍后讨论。自动生成的c库可以直接下载使用。RAM/闪存占用空间可帮助您精确定义系统要求。

让我们深入了解我们的模型和数据集,Neuton 可以很容易地深入了解预测的工作原理和正在发生的事情。“探索性数据分析”部分在培训后可用。本文档中仅显示了一些有趣的部分。请随意使用数据集并进行自己的实验。

下面显示了三个最重要的图。

  • 数据集概述,数据集的详细视图
  • 目标变量分布:我们的火灾探测器的数据集是不平衡的,理想的数据集具有所有目标状态的 50% 分布。
  • 相关热图:在这里我们看到不同的输入值是如何相互关联的。空气湿度与目标的相关性最高,而 eCO2 值的相关性最低。简而言之,湿度的变化对火警警报很重要,而 eCO2 气体的变化并不重要。

所有这些信息都有助于了解数据如何影响模型的输出和预测性能。使用 Neuton,很容易获得结构化且有用的数据概览。

模型定制
由于我们的烟雾探测器是依靠电池功耗运行的,因此考虑如何在保持模型精度高的同时减少模型的计算时间和复杂度是有意义的。这个过程可能很难满足所有要求。Neuton 允许训练具有不同位深度和设置的模型。为了比较不同的设置,模型使用三种不同的设置进行训练:

  • 32 位浮点数
  • 16 位定点数
  • 8 位定点数

比较三个模型的准确率,从 0.996113(32 位浮点)下降到 0.989032(8 位固定),准确率下降了 0.7%。8 位模型显着降低了 FLASH 内存消耗,在 8 位 MCU 架构上具有更好的性能。

模型定制第 2 部分(特征消除)
对于烟雾探测器,使用了 8 位模型,因为这样可以减少功耗和计算时间,从而延长电池寿命。下一步是删除模型使用的输入值。

上图可以在 Neuton 的“探索性数据分析”部分找到,它显示了最相关的值。PM1.0和NC0.5值高度相关,这与SPS30传感器的测量原理有关,PM1.0值是根据SPS30内部的NC0.5值计算得出的。所以 Neuton 给了我们注意这些值的提示。为了进一步定制,PM1.0 值和 eCO2 将被删除以用于模型输入,因为这些信息是多余的或无用的。所以这应该有助于改善模型大小和内存使用。

具有减少输入向量的定制 32 位和 8 位模型在准确性和内存使用方面优于原始 32 位模型。

特征重要性矩阵详细概述了每个特征如何与模型输出相关联。在这种情况下,可能会在实际应用程序中删除前 10 个功能中的一些。

最终模型在 Arduino Nical Sense ME 上只需要 101 字节的 RAM 和 958 字节的闪存。推理时间约为 360 us。

Arduino编程
随着 Neuton 社区的快速发展,许多 Arduino 推理示例存在official-git-repo和hackster.io 。我使用官方 repo 中的arduino-example进行模型推理。

添加蓝牙
Arduino Pro Nicla Sense ME 能够通过蓝牙向任何类型的设备发送消息,使用 Arduino 编程蓝牙很简单。出于测试目的,BlueSee MacOs X 工具用于通过蓝牙从 Arduino 读取值。

BLEService fire_service("fff0");
BLEIntCharacteristic fire_characteristic("fff1", BLERead | BLEBroadcast);

基本功能是围绕 BLe 服务“fff0”构建的,该服务具有每次模型生成新输出时都会更新的特性。新值广播到每个连接的蓝牙设备。这是通过蓝牙发送通知和状态事件的常用方法。

使用 BlueSee,您可以连接到 BLE 设备并读取当前的服务信息。首先,您必须连接到设备。BlueSee 允许连接到 BLE 设备。第二步,可以从设备中读取Service数据

读取服务“火警”,有效载荷大小为 32 位,但我们只使用 MSB。

如果出现“火警”,MSB 设置为 1 并发送信息。

最后,在测试 BLE 服务时,由于系统的高功率负载,存在很多传感器读取错误。一种解决方案是升级配电。

未来可能的工作
由于 Arduino Pro Nicla Sense ME 使用传感器融合芯片来控制传感器读数,因此网络可以直接在博世 BHI260AP 芯片上实现。BHI260AP 内置的 CPU 能够运行自定义代码。在这种情况下,主 CPU 将完全自由地运行主应用程序代码,从而显着降低功耗和电池寿命。

结论
该项目表明,传感器融合是解决复杂问题的好方法,只需使用额外的元数据。向“烟雾传感器”添加元数据有助于减少误报。这种低成本的传感器系统可以挽救生命,因为可以对系统进行训练以检测导致昏厥的火灾气体。构建微型神经网络的过程可以如此简单和自动化,这真的非常实用。

本文中所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Stefan Blattmann,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论