UnitV2で顔認識結果の処理

登録した顔画像のマッチング結果をシリアルでM5stackに送信して、確かさがある一定以上ならばブザーで知らせるという簡単なアプリです。

https://isehara-3lv.sakura.ne.jp/blog/2022/05/24/unitv2-aiカメラとm5stackをgroveコネクタで接続して認識結果を/

のアップデートの形になります。

<シリアルのデータ形式>

顔認証でシリアルから流れるデータは、

{“num”:1,”face”:[{“x”:92.80541992,”y”:0,”w”:366.1600952,”h”:478,”prob”:0.995221317,”match_prob”:0.659739733,”name”:”face_1″,”mark”:[{“x”:194,”y”:178},{“x”:358,”y”:158},{“x”:292,”y”:246},{“x”:228,”y”:356},{“x”:368,”y”:338}]}],”running”:”Face Recognition”}

こんな感じで、JSONで階層構造と配列を使っています。マッチング閾値(match_prob)へのアクセスは["face"][0]["match_prob"]となります。

#include <M5Stack.h>
#include <arduinojson.h>
#include <softwareserial.h>

SoftwareSerial Grove(22, 21);     // define rx/tx connecting to the UnitV2 camera
                                  // SoftwareSerial(rxPin, txPin, inverse_logic)

float x;
int y;
long k;
char data[1000];

void setup() {
  M5.begin();
  M5.Lcd.setCursor(20, 40);
  M5.Lcd.setTextSize(2);
  M5.Speaker.begin(); 
  Serial.begin(115200);
  Grove.begin(115200);
  M5.Lcd.print("--initialized--");      // display M5 Lcd message
  M5.Lcd.setCursor(20, 70);
  M5.Lcd.print("Face recongition");
}


void loop_(){

  if(Grove.available()) {
    String recvStr = Grove.readStringUntil('\n');
    if(recvStr[0] == '{'){
      Serial.print(recvStr);
    }
  }
}

void readJSON(void){
  String recvStr = Grove.readStringUntil('\n');
  StaticJsonDocument<1024> doc;
  DeserializationError error = deserializeJson(doc, recvStr);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  x = doc["face"][0]["match_prob"];
}

void loop(){
  M5.Speaker.mute();
  if(Grove.available()) {
    readJSON();
    Serial.println(x);
    if (x > 0.7f)
    {
      M5.Speaker.setVolume(3);
      M5.Speaker.beep();
      delay(200);     
    }
  }
}

データのバイト数が結構大きく(800バイト以上)なるので、char data[1000]とStaticJsonDocument<1024>を大きめのサイズにしています。これをしないとM5stackがリブート繰り返しました。

ドキュメント(以下のリンク)によれば、StaticJsonDocumentは1KB以下の小さめのJSONファイルで使えとあります。それほど多くないスタックエリアを使うので、StaticJsonDocumentでの設定値が小さくてスタックオーバーフローを起こしたと思われ、M5stackがリブートを繰り返してました。

https://arduinojson.org/v6/api/staticjsondocument/

 

認識の閾値は流れるデータからmatch_probを0.7以上で判断しています。

M5.Speaker.tone()は動作しなかったのでbeepを使って音出ししています。

 

P.S. @2022/6/16

細かな体裁(UnitV2のAP立ち上がり検知、認識結果の顔IDプリントアウト)を整えました。ソースはこちらに、

https://github.com/chateight/UnitV2_camera/tree/master/src

 

admin