教你如何運用神經網路及物體偵測來製作口罩配戴辨識範例

在這次流程說明中,我們會教您如何訓練威盛 Pixetto 識別有無配戴口罩,並將威盛 Pixetto 與 Arduino 開發板連結,於偵測到未戴口罩的人時發出警報聲。

本次的說明總共包含了兩個部分:如何訓練威盛 Pixetto以及如何控制Arduino開發板。

步驟 1

開始訓練威盛Pixetto 之前,我們需要準備大眾戴上口罩以及未戴口罩的照片當作訓練資料庫。請分別找 50~60 張有戴上口罩以及未戴口罩的照片,各別壓縮成壓縮資料夾,取名為 “mask” 以及 “no_mask” 。

為了避免造成機器學習偏差 (bias),資料夾內應包含不同性別、年紀、戴眼鏡、以及不同角度的照片。準備好照片後,便可以開始訓練囉。

首先,進入機器學習加速器平台,登入帳號,並點擊 “機器學習”。

點擊 “Upload Image”,並上傳已準備好的 “mask” 以及 “no_mask” 壓縮資料夾。最後,將 “Model Name” 取名為 “mask”。

步驟 2

接下來,我們要建構一個神經網路。您可以測試不同網路架構的訓練結果。這裡我們直接提供您一個具備不錯表現的網路。

在這次的實作中,我們需要分類 “戴口罩” 以及 “未戴口罩” 兩種類別。因此,在最後的 “Output Layer” 中,請將類別 ( Class ) 的數量設為 2。

完成後點擊右上角的 “Start” 開始訓練,系統會同時生成神經網路的 Python 程式碼。在這次實作,我們會需要直接修改 Python 程式碼來調整參數。

步驟 3

回到主頁,點擊 “Python” ,您會看到 “mask.py” 檔案,裡面存著前一步驟的神經網路程式碼。我們會依照這個網路的架構,修改一些參數,再做一次訓練。

將程式碼複製後,回到上一頁,建立一份 “notebook” 檔案,並將程式碼貼上。

您可以在這個頁面上修改神經網路的參數。由於我們準備的訓練資料量並不多,請將 “batch_size” 降低,並提高 “epochs”。

最後,點擊上方工具列中的 “Run” 開始訓練您的神經網路。

步驟 4

訓練完成後,程式會將結果以 “tflite” 檔案儲存。

將其下載至您的電腦後,利用 “Pixetto Utility” 上傳至 威盛Pixetto 視覺感測器。

對於人臉口罩辨識這項應用,我們可以使用兩種合適的物件偵測演算法,分別是“Central” 和 “Face Detection”。您可以測試這兩種演算法,會發現不同的演算法可以達到不一樣的效果。在這次的實作,我們會需要 “Face Detection” 演算法來追蹤人臉。

若是辨識精準度不理想,可以回到前一步驟調整參數並重新訓練。

現在利用威盛Pixetto就能輕易辨識您有沒有好好配戴口罩了!

步驟 5

接下來,我們要控制 Arduino 開發板,在偵測到未戴口罩的人時發出警報,以及在戴上口罩後亮起綠燈。

我們需要的設備有 Arduino 開發板,擴充板,LED 燈,以及 Piezo Buzzer。首先,將 Arduino 開發板與擴充板結合。

Piezo Buzzer 是一個能發出不同頻率嗶嗶聲的零件。請將 Piezo Buzzer 與擴充板的 D4 插槽結合。

將威盛 Pixetto 與 “UART” 插槽連結。

將 LED 燈插入 Digital 的 13 以及 GND 接孔。

步驟 6

在本次的教程中,我們會直接編寫 Arduino C 來控制開發板。請將 Pixetto Junior 開啟並點擊 “手工編輯”。

現在我們可以編輯程式了。首先,引入 SmartSensor 函式庫。

#include<SmartSensor.h>

指定腳管 0 和 1 將 Arduino 開發板與威盛 Pixetto 連接,並在 “setup()” 裡面將其初始化。接著,指定 “pin 13” 控制 LED 燈, “pin 4” 控制 “Piezo Buzzer”。

SmartSensor ss(0,1);

void setup()
{
    ss.begin();

    pinMode(13, OUTPUT);
    pinMode(4, OUTPUT);
}

在 “loop()” 裡面,我們需要先確認威盛Pixetto可偵測到人臉,才能進行之後的步驟。

void loop()
{
    if (ss.isDetected())
    {
      ……
    }
}

每當威盛Pixetto偵測到戴口罩的人時,就將連結到 PIN 13 的 LED 燈亮起。

if (ss.getTypeID() == 0)
{
    digitalWrite(13, HIGH);
}

若是偵測到未戴口罩的人,則發出頻率為 4000 Hz,持續 0.1 秒的聲音,並將LED 熄滅。

else if (ss.getTypeID() == 1)
{
    tone(4, 4000, 100);
    digitalWrite(13, LOW);
}

以下是完整的程式碼。

#include <SmartSensor.h>

SmartSensor ss(0,1);

void setup()
{
    ss.begin();

    pinMode(13, OUTPUT);
    pinMode(4, OUTPUT);
}

void loop()
{
    if (ss.isDetected()) {
        if (ss.getTypeID() == 0) {
            digitalWrite(13, HIGH);
        }
        else if (ss.getTypeID() == 1) {
            tone(4, 4000, 100);
            digitalWrite(13, LOW);
        }
    }
}

在上方工具列中指定您的硬體設備,並上傳程式。

注意:若上傳時出現錯誤,可嘗試將威盛Pixetto從擴充板上移除,重新上傳程式碼後,再連接威盛Pixetto。

恭喜您完成了!

祝您玩得愉快,別忘了分享自己的創作至社群上並標註 #VIAPixetto!

分享貼文!

Share on linkedin
Share on twitter
Share on facebook

This Post Has 3 Comments

  1. Billy

    哈喽 可以麻烦将【mask.zip】和【no_mask.zip】数据集发送至我的邮箱吗?谢谢啦!

    按照流程操作之后,对【戴口罩的人脸】总是识别不出来,有些沮丧……

    1. C.C.

      Hello,
      煩請稍候一下;我們會請相關人員查看並解決此問題,謝謝你!

  2. Billy

    哈喽 麻烦可以将mask.zip和no_mask.zip这两个图片训练集发送至我的邮箱吗?谢谢啦!

    由于不是很懂Python代码,所以batch_size和epochs这两个参数也不太会设置……
    我按照流程操作完之后,对【戴口罩的人脸】总是识别不出来,有点沮丧……

Leave a Reply