話題わだい(?)の ESP-EYE でかお認識にんしきしてみた

更新こうしん

Purchased an ESP-EYE (ESP32 MCU + 2 MP camera) board and tried face recognition by it.

先日せんじつ日記にっきいた TensorFlow Lite のほうは現在げんざい勉強べんきょうちゅうですが、そちらのほうはお客様きゃくさまへの報告ほうこく義務ぎむがあったりするので、わりに ESP-EYE というガジェットをためした報告ほうこくをさせていただきます。最近さいきんおなじく話題わだいSipeed M1 のほうは報告ほうこくがたくさんがっているのですが、なぜか ESP-EYE のほうはすくないようです。

じつは、わたし最初さいしょつけたのは ESP-WHO にかんする記事きじだったのですが、ESP-WHO は現状げんじょう、Espressif の IDF(IoT Development Framework)とばれるツールのインストールが必要ひつようで、Arduino で簡単かんたんあそんでみることはできません。

いえ、じつは ESP-WHO のドキュメントをんで実験じっけんしてみたのですが、まだうまくうごかせておらず、なにはともあれ ESP-EYE ボードそのものがまさしくうごいているか確認かくにんしたかったので、まずは Arduino 環境かんきょううごくサンプルコードをためしてみた、というのが実際じっさいなところです。

ちょっとキーワードがたくさんてきたので整理せいりします。

  • ESP-WHO: これは世界せかい保健ほけん機関きかんとは関係かんけいなくて、どうやら WHO は「だれ(who)」の意味いみのようです。ESP32 マイコンで有名ゆうめいな Espressif しゃ開発かいはつしている、ESP32 マイコンのためのかお検出けんしゅつ + かお認識にんしきのためのライブラリです。詳細しょうさいここ参照さんしょうください。現状げんじょうは Arduino ではうごかず上述じょうじゅつの IDF で C, C++ コンパイラを使つかって開発かいはつする必要ひつようがあるようです。
  • ESP-EYE: こちらは、マイコンボードの名称めいしょうです。ESP32 マイコンボードのうえに、8Mバイト の PSRAM 、4Mバイトのフラッシュ ROM、それにくわえて 2メガピクセルのカメラ OmniVision OV2640 を搭載とうさいしています。価格かかくは US$ 19.90 です。じつは、以前いぜんから Ai-Thinker しゃの ESP32-CAM というものがあったのですが、Espressif しゃ発売はつばいした同等どうとう製品せいひんが ESP-EYE らしく、機能きのうちますが、おそらく回路かいろべつです。(互換ごかんせいなし?) ちなみに、ESP32-CAM には USB コネクタがいそうですが、ESP-EYE には USB コネクタがあるので、Arduino から簡単かんたんにプログラムをフラッシュみできます。
    余談よだん: ところで、ESP32-CAM には外部がいぶにいくつかピンがているので工作こうさく容易たやすそうなのですが、ESP-EYE では SPI しか外部がいぶていません。おまけにテストパッドのかたちになっていて、工作こうさくはちょっと面倒めんどうそうこちらの写真しゃしんみぎ参照さんしょう)です。(なみだ

ESP-EYE お披露目ひろめ

さて、ESP-EYE とはこんなものです。

みぎは、サイズ比較ひかくのための iPhone 6 Plus です。

その、いくつか写真しゃしんです。

   

ESP-WHO は(簡単かんたんには)うごかなかった

さて、お約束やくそく(?)ですがマニュアルは付属ふぞくしていないので、ネットで情報じょうほうさがします。前述ぜんじゅつのように、最初さいしょは ESP-WHO をためしたのですが、わたしためしたバージョン(https://github.com/espressif/esp-who.git: 258751b の examples/single_chip/recognition_solution)がくなかったのか、GCC 5.2.0 でビルドはできたものの、動作どうさ確認かくにんできませんでした。ボードをこすのに中国ちゅうごくはなしかけないといけないというのが最初さいしょ難関なんかんわたしがいくらはなしかけても反応はんのうせず(泣)なき、やむを当該とうがい部分ぶぶんはなしかけたらつぎ動作どうさうつる)をコメントアウトしてみたものの、うまくウェブサーバーとおはなしできませんでした。

Arduino のサンプルプログラムをため

というわけで、まずはべつのサンプルプログラムをためします。ESP32 Arduino 1.0.1 にふくまれる CameraWebServer というものです。

こちら参考さんこうに ESP32 ようの Arduino をインストールしますが、そのさい最新さいしんの 1.0.2 ではなく、1.0.1 をインストールしましょう。(Arduino では、複数ふくすうことなるバージョン「1.0.1」,「1.0.2」をスイッチすることはむずかしくないので、安心あんしんください。) ちなみに、なぜ 1.0.2 ではダメかというと、こんな記事きじつけたから(?)です。将来しょうらいのバージョンでは解決かいけつするかもれませんが、若干じゃっかんひとがつまえ情報じょうほうなので、おとなしくこれにしたがいます。

Arduino IDE でサンプルプログラムをビルドするときの注意ちゅういてんをいくつかまとめます。

  • ターゲットボードの種類しゅるいとしては ESP32 Wrover Module をえらびます。
  • ただしい COM ポートをえらびます。(わたしの Mac OS では、/dev/tty.SLAB_USBtoUART)
  • Partition Scheme には Huge APP (3MB No OTA) をえらびます。これは、今回こんかいのサンプルプログラムが非常ひじょうおおきな ROM を使つかうためです。

つぎにフラッシュをさい注意ちゅういですが、Adafruit の HUZZAH32 – ESP32 Feather とうとはちがって、フラッシュみするさいに BOOT ボタンを必要ひつようがあります。タイミングがからない場合ばあいのヒントをしめします。

1. とりあえず、サンプルプログラムをビルド(コンパイル)しておきます。

2. シリアルターミナル(わたし場合ばあいscreen /dev/tty.SLAB_USBtoUART 115200)を起動きどうし、ボードじょうの BOOT ボタンをしながらリセット(RST)ボタンをします。すると

rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download

のような表示ひょうじますので、シリアルターミナルをクローズ(終了しゅうりょう)し、Arduino のメニューから Sketch → Upload します。

たぶんこれで、まさしくアップロードできるはずです。なんかいためすと、BOOT ボタンをすタイミングが摑めるはずです。

サンプルプログラムの修正しゅうせい

あ、順序じゅんじょぎゃくになりましたが、1.0.1はんのサンプルプログラムはそのままでは ESP-EYE でうごかないので、修正しゅうせい必要ひつようです。くわしくはこちら参考さんこうにしていただきたいとおもいますが、変更へんこうてん簡単かんたんにまとめておきます。

1. どのボードを使つかうかという define ぶんなおします。ESP32 Arduino の 1.0.1 はんのサンプルコードは、そのままでは ESP-EYE に対応たいおうしていないので、先頭せんとう付近ふきんつぎのように修正しゅうせいします。

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_AI_THINKER
#define CAMERA_MODEL_ESP_EYE

2. つづいて、

#else
#error "Camera model not selected"
#endif

直前ちょくぜんに、

#elif defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    4
#define SIOD_GPIO_NUM    18
#define SIOC_GPIO_NUM    23

#define Y9_GPIO_NUM      36
#define Y8_GPIO_NUM      37
#define Y7_GPIO_NUM      38
#define Y6_GPIO_NUM      39
#define Y5_GPIO_NUM      35
#define Y4_GPIO_NUM      14
#define Y3_GPIO_NUM      13
#define Y2_GPIO_NUM      34
#define VSYNC_GPIO_NUM   5
#define HREF_GPIO_NUM    27
#define PCLK_GPIO_NUM    25

追加ついかします。

3. void setup() { というくだり直後ちょくご

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

追加ついかします。

4. これまたプログラムの先頭せんとう付近ふきんもどり、

const char* ssid = "あなたの Wi-Fi AP の SSID";
const char* password = "あなたの Wi-Fi のパスフレーズ";

というように修正しゅうせいします。

実際じっさいうごかしてみる

再度さいどシリアルコンソールを接続せつぞくし、ボードの RST ボタンをすと、つぎのような表示ひょうじるはずです。

WiFi connected
Starting web server on port: '80'
Starting stream server on port: '81'
Camera Ready! Use 'http://192.168.100.200' to connect

改行かいぎょうみだれるかもれませんが(ターミナルソフトの仕様しようによる)にせず、パソコンのウェブブラウザで上記じょうき URL(http://192.168.100.200)をひらきます。この IP アドレスは、環境かんきょうによってことなるので、自分じぶん表示ひょうじ確認かくにんしてください。

Start Stream ボタンをして、こんな画面がめんれば、すくなくともカメラはうごいています。

かお認識にんしき識別しきべつをしてみよう

まずはかお認識にんしきをしてみましょう。

まず最初さいしょに、上記じょうき画面がめんのメニューで、Face Detection と Face Recognition をオン(スイッチをみぎにスライド)します。そして、カメラをある程度ていどかおからはなしてのぞむと、かおまわりに黄色きいろ四角よつかど表示ひょうじされます。

実際じっさいには、あまり認識にんしき精度せいどくないので、最初さいしょはうまくいかないかもれません。ひとのヒントは、部屋へや照明しょうめいあかるくすることです。ふたは、かおすこしカメラからはなすことです。(なにかのドキュメントによると、30センチ以上いじょうはなすといようです。)

れると認識にんしきできるようになります、、、というか、本当ほんとうはもうすこたか認識にんしき精度せいどしいところですね。Espressif しゃ今後こんご改良かいりょう期待きたいです。

ちなみにこれは、わたしの Facebook にある写真しゃしんです。「あ、増毛ましけえきだ!」とか、あまりにしないでくださいw

つぎかお識別しきべつです。そのためには、画面がめんの Enroll Face というボタンをします。そして、カメラをながめていると、画像がぞううえほうなんか、ID[なんばん] Sample[なんまい] という表示ひょうじかえし、かおおぼえてくれます。

そのは、カメラをのぞくとなんばんかお認識にんしきしたか、という結果けっか表示ひょうじしてくれるようになります。

これはあくまでサンプルプログラムなので、実際じっさいにはもうすこ工夫くふうして、おな人物じんぶつことなる写真しゃしんをたくさん用意よういし、学習がくしゅうさせてあげたいところです。

今日きょう結論けつろん

わずか 2,000えんきょうのマイコンで、かお認識にんしき結果けっかを Wi-Fi 経由けいゆ出力しゅつりょくできるとは、はっきりっておどろきです。最近さいきん深層しんそうニューラルネットワークは、すで研究けんきゅう段階だんかいを「卒業そつぎょう」して、われわれが身近みぢかなマイコンアプリのなかむことができるようになっているわけですね。もちろん、いままでもスマートフォンを使つかえばかお認識にんしきはできましたが、これを安価あんかなマイコンで実現じつげんし、さらに容易よういにカスタマイズして応用おうよう製品せいひん設計せっけいできる、というところがポイントではないでしょうか。

もうひとつの結論けつろん

かお認識にんしきのデモやブログをくときは、ちゃんと無精ぶしょうひげくらいっておかないとカッコわるいですね。

というわけで、今日きょうはここまで。

わせはお気軽きがるに!

わせをいただいたのち継続けいぞくして営業えいぎょう活動かつどうをしたり、ニュースレターとうをおおくりしたりすることはございません。
返答へんとうは 24時間じかん以内いない営業えいぎょう時間じかんちゅう)とさせていただいております。もし返答へんとうとどかない場合ばあいなんらかの事情じじょうでメールがたちとなっている可能かのうせいがございます。大変たいへん手数てすうですが、べつのメールアドレスとう督促とくそくいただけますとさいわいです。