這個項目只是一個 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 將完全自由地運行主應用程序代碼,從而顯著降低功耗和電池壽命。
結論
該項目表明,傳感器融合是解決復雜問題的好方法,只需使用額外的元數據。向“煙霧傳感器”添加元數據有助于減少誤報。這種低成本的傳感器系統可以挽救生命,因為可以對系統進行訓練以檢測導致昏厥的火災氣體。構建微型神經網絡的過程可以如此簡單和自動化,這真的非常實用。
評論