【AI防疫DIY】臉部辨識+口罩偵測+紅外線測溫

作者:曾成訓(CH.Tseng)

最近在 Facebook 上看到一個影片,是一群員工魚貫地走入廠房,透過一旁的 AI 系統和感測器即時辨識員工是否有戴口罩並直接上班打卡,甚至遠距量測溫度。

這個稱為「獵豹移動」的最新防疫機器人系統,是由中國的獵豹移動所研發(該公司總部位於中國北京,成立於 2010 年 10 月),董事長兼 CEO 就是那位以 「360 安全衛士」免費防毒而成名的傅盛。

下面我們就來做一個可同時進行辨識、偵測戴口罩以及遠距量測體溫的系統吧!雖然這邊所使用的紅外線測溫模組無法達到與影片相同的效果(須改用昂貴的熱顯像儀才能辦得到),但整體而言也有類似的模擬效果。

紅外線測溫模組

由於新冠病毒的影響,最近市面上的口罩、酒精、溫度計等日常醫療用品大缺貨,連帶的一些電子零件相關的測溫模組也缺貨,必須要以預訂的方式慢慢等貨,像是目前每一家廠商的 MLX90614 系列紅外線測溫模組都沒有現貨。

紅外線測溫原理

紅外線(Infrared,簡稱 IR)是波長介於微波與可見光之間的電磁波,其波長在 760 奈米(nm)至 1 毫米(mm)之間,算是波長比紅光長的非可見光,對應頻率大約在 430 THz 到 300 GHz 的範圍內,室溫下物體所發出的熱輻射大多都在此波段(此段敘述來自維基百科)。

大自然中任何一個大於絕對零度(-273 度 C)的熱源皆會持續向外界發出熱輻射,而這熱輻射的波長就介於 430 THz 到 300 GHz,也正是非可見光紅外線的波長範圍。

(圖片來源:曾成訓提供)

那如何透過量測紅外線探知熱源的溫度呢?這原理來自於 Stefan-Boltzmann(史蒂芬-波茲曼)定律,Stefan-Boltzmann 發現物體表面所釋放出的總幅射量,與其溫度的四次方成正比,所以我們可以透過測量總輻射能量來計算物體溫度。

MLX90614

MLX90614 是目前市面上大部份非接觸式紅外線測溫模組所使用的感測器,由比利時公司 Melexis(邁來芯)所推出,該公司的產品領域極廣,涵蓋汽車應用、運輸、智能家電應用、智能樓宇應用、工業應用、醫療應用等。

(圖片來源:曾成訓提供)

MLX90614 衍生的型號很多,主要差異在於偵測的溫度範圍、適用領域(標準或醫療)、工作電壓、鏡頭尺寸(偵測遠近及角度)及輸出介面上(I2C、PWM 或 SMBus)的不同,本文使用的 CJMCU-MLX90614ESF-DCI,應該是下面這款:

(圖片來源:曾成訓提供)

該款的特性如下:

  • 可偵測的物體溫度範圍為 -70~380 度 C
  • 工作溫度限於 -40~85 度 C
  • 醫療等級的準確度
  • 使用電壓:2.6~3.6 V
  • 電流耗用: 工作時小於 2 mA,休眠時小於 2 uA
  • 尺寸:20.2 mm x 9.1 mm
  • 視角:5度(鏡筒較長,量測的距離較遠)

MLX90614函式庫

您可以使用下列幾種針對 MLX90614 的 python library,執行結果都差不多,我使用的是第一個 Adafruit版。

口罩偵測

我們需要訓練一個模型來偵測使用者是否有戴口罩,資料庫可以從這裡下載,這是由伊甸基金會所屬的數位資料處理庇護工場所標記、免費開源釋出的,該資料庫的資訊如下:

  • 標記格式:PASCAL VOC
  • 圖片總張數:682 張
  • 標記種類三種:good(有正確戴好口罩)、none(臉部露出鼻孔沒有戴好口罩)、bad(臉部沒有戴上口罩)
  • 各類別的標記數目:good(有正確戴好口罩)3,129 個、none(臉部露出鼻孔沒有戴好口罩)126 個、bad(臉部沒有戴上口罩)667 個

該資料庫算是目前針對人臉口罩標記最為完整也最詳細的,使用這個資料庫便能訓練出一個偵測臉部是否有戴(好)口罩且算是準確率相當高的模型了。

(圖片來源:曾成訓提供)

(圖片來源:曾成訓提供)

臉部辨識

針對臉部辨識部份,我們使用 OpenVINO Model Zoo 提供的三種模型來完成辨識:

這三個模型搭配使用便能完成下面的工作,達到臉部辨識的目的:

  1. 臉孔偵測
  2. 取臉部 landmarks
  3. 對齊臉孔
  4. 取得 Facial embedded features
  5. 比對最接近的人臉

臉部辨識+口罩偵測+溫度感測

  • 硬體

使用樹莓派(3B+ 或 4 皆可)結合 NCS2,接著將 I2C 介面的 SDA、SCL、3.3 V、GND 四個接腳分別接到 MLX90614。

(圖片來源:曾成訓提供)

將 MLX90614 與攝影鏡頭固定在一起。這邊要注意一下,離鏡頭愈遠,投射於臉部的紅外線圓形面積會愈大,有很大的機會是會包含溫度低的非皮膚部份(如頭髮、眼鏡、口罩、背後空氣等),因此量測出來的溫度會比實際值低很多。

  • 軟體

下方我們使用 OpenCV 及 Python 撰寫一個模擬的打卡系統,上下班時員工手動按鈕打卡,成功後系統將辨識該員工姓名、是否戴好口罩以及體溫是否超過設定值,並將結果顯示出來。

(圖片來源:曾成訓提供)

關於MLX90614的溫度感測

最近很多新聞及影片描述員工/學校進出的場景,一具攝影機監控著走道上的人流,只要有人的溫度超過標準便立刻警示,像這類的應用:

(圖片來源:曾成訓提供)

使用本文介紹的 MLX90614 模組能夠作到嗎?

沒有辦法,首先 MLX90614 利用投射紅外線來探知熱源溫度,雖然加入了鏡頭套筒能讓它能發射得更遠,但是距離愈遠投射的紅外線在物體表面的面積便會愈大,使得基於物體表面積及總幅射量所計算出來的數值會隨著距離愈長造成投射面積更大,而使得精確度下降,此外我們也無法在人員移動的動態環境中,準確定位紅外線投射區域的位置及大小。

簡單的一句話:紅外線測溫器所測量的是「紅外線圓形投射區的物體表面積平均溫度」,要得到正確的量測值,在被測物上的量測點面積需不大於被測物的表面積,否則會得到錯誤的數值。

(圖片來源:曾成訓提供)

遠距的紅外線測溫模型使用限制及注意:

  1. 需確定紅外線投射的範圍在目標物體之內
  2. 距離遠時,投射在物體表面(如人臉)可能會包含溫度較低的眼鏡、頭髮、眉毛、鼻頭等部份,這會使得量測出的溫度偏低(例如本文中我所示範的影片)
  3. 容易受環境中的蒸氣、塵土、煙霧而影響測溫精確度
  4. 發光物體的表面反射光會影響測溫效果
  5. 不同的材料、材質及顏色,有不同的紅外線發射能量,必須調整紅外線發射率來減少測量誤差(目前市面的紅外測溫模組如 MLX90614,其發射率都固定為 1,代表物體放射率值不會隨著該材料的溫度或所量測溫度的紅外線波長改變不同而變化)

因此 MLX90614 的部份型號雖然號稱可遠距的量測,但這功能是讓我們做出的測溫槍可以以較遠的距離來量測人體(例如人的額頭)溫度(前提是人物必須靜止站立不能移動),如果真的想要像影片中裝在走道進行動態溫度量測,那就要考慮使用更貴的熱顯像儀(熱感測儀)了。

(本文經作者同意轉載自 CH.Tseng 部落格原文連結;責任編輯:賴佩萱)

曾 成訓

Author: 曾 成訓

人到中年就像沒對準的描圖紙,一點一點的錯開,我只能當個Maker來使它復位。

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *