ESP32-CAMで作るAI顔認識ドアロックシステム:ローカル処理でプライバシー保護
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| ESP32-CAM開発ボード(OV2640カメラ内蔵) | 1 | Wi-Fi/Bluetooth内蔵、AI推論可能 |
| 電磁ロック(DC 12V、フェイルセーフ/フェイルセキュア選択可) | 1 | ドア制御用 |
| リレーモジュール(5V駆動、1回路) | 1 | ロック駆動用 |
| DC-DC昇圧コンバータ(5V→12V) | 1 | USB給電からロック電圧生成 |
| マイクロSDカード(32GB以下) | 1 | 顔データベース・ログ保存用 |
| 赤外線LEDアレイ(夜間撮影用) | 1 | オプション |
| タクトスイッチ(登録/リセット用) | 2 | ユーザー登録・全削除 |
| ステータスLED(緑/赤) | 各1 | 認証結果表示 |
| ブザー | 1 | 音声フィードバック |
| 筐体(防水・防塵、壁面取付可能) | 1 | 屋外設置対応 |
使用ライブラリ・ツール
- ESP32 Arduino Core(最新版)
esp-faceライブラリ(Espressif公式、顔検出・認識)FS.h/SD_MMC.h(SDカードアクセス)WiFi.h/WebServer.h(設定Web UI用)- Arduino IDE / PlatformIO / ESP-IDF
プロジェクト概要
ESP32-CAMの内蔵カメラとCPUリソースのみで、クラウド不要・完全ローカル処理の顔認識ドアロックを構築します。顔画像・特徴量データはマイクロSDカードに暗号化保存され、ネットワークには一切送出されません。プライバシーとセキュリティを最優先した、エッジAIの実用例です。
主な機能
- 顔登録モード:タクトスイッチ長押し→緑LED点滅→カメラ前で顔登録(複数角度・表情で5-10枚自動撮影)
- 顔認証モード:常時監視、顔検出→特徴量抽出→登録データベースと照合(閾値調整可)→ 一致なら電磁ロック解錠(設定時間保持)
- ライブビュー/設定Web UI:同一Wi-Fiネットワークからブラウザアクセスで、カメラ映像確認、閾値調整、ユーザー管理、アクセスログ閲覧
- 不正アクセス検知:連続認証失敗でブザー警報、ロックアウト期間設定
- 夜間対応:赤外線LEDで暗所でも認識可能(オプション)
- 電源断対策:SDカードにデータ永続化、起動時自動ロード
ハードウェア接続
ピン割り当て(ESP32-CAM標準ピンアウト準拠)
| 機能 | GPIO | 備考 |
|---|---|---|
| カメラ(内蔵) | 複数専用ピン | ライブラリが自動管理 |
| SDカード(SPIモード) | CLK:14, CMD:15, D0:2, D1:4, D2:12, D3:13 | 1-bitモードならD0のみ |
| リレー制御 | GPIO 13 (SD D3と共用注意) または GPIO 2 | SD使用時はGPIO 2推奨 |
| 登録ボタン | GPIO 0 | ブートモード兼用、起動時はHigh必須 |
| リセットボタン | GPIO 16 | U2RXD、内部プルアップ |
| 緑LED(成功) | GPIO 4 (SD D1と共用注意) | SD 1-bitモードなら使用可 |
| 赤LED(失敗) | GPIO 2 | 内蔵LEDと共用可 |
| ブザー | GPIO 12 (SD D2と共用注意) | SD 1-bitモードなら使用可 |
| IR LED制御 | GPIO 14 (SD CLKと共用) | SD使用時は別GPIO必須 |
注意: ESP32-CAMはピンが限られるため、SDカードを1-bitモード(D0のみ)で運用し、GPIO 2, 4, 12, 13, 14, 15, 16を周辺機器に割り当てるのが現実的です。SDカード検出スイッチ(CD)ピンをGPIO 13に接続し、カード挿入時のみSDマウントする設計も推奨。
電源設計
- 全体をUSB 5V(2A以上推奨)で給電
- 昇圧コンバータで12V生成→電磁ロックへ
- リレーでロック電源ON/OFF制御
- ESP32-CAMの3.3Vレギュレータは電流容量が小さいため、カメラ+Wi-Fi+SD同時動作時は外部3.3Vレギュレータ(AMS1117-3.3等)追加推奨
ソフトウェアアーキテクチャ
コア処理フロー
setup():
1. シリアル/ピン初期化
2. SDカードマウント(失敗時は内蔵フラッシュフォールバック)
3. 顔データベース読み込み(/faces/ディレクトリから特徴量ベクトル復元)
4. カメラ初期化(フレームサイズ: QVGA 320x240 / HQVGA 240x176 推奨)
5. esp-faceライブラリ初期化(検出モデル: Human Face Detect、認識モデル: MobileFaceNet)
6. Wi-Fi接続(STAモード、固定IP推奨)
7. Webサーバー起動(/stream, /config, /api/* エンドポイント)
8. メインループ開始
loop():
1. ボタン状態チェック(登録/リセット長押し検出)
2. カメラフレーム取得(fb = esp_camera_fb_get())
3. 顔検出実行(face_detect(fb))
4. 検出時: 顔領域切り出し→特徴量抽出(face_recognize())
5. 登録DBとコサイン類似度比較(閾値デフォルト 0.75)
6. 一致時: 緑LED点灯、ブザー短音、リレーON(ロック解錠)、アクセスログ記録
7. 不一致時: 赤LED点灯、ブザー長音、失敗カウントインクリメント
8. 失敗閾値超過時: ロックアウト(設定時間認証受付停止)、管理者メール通知(Wi-Fi経由)
9. フレームバッファ解放(esp_camera_fb_return())
10. Webサーバー処理(client.handle())
11. 定期タスク(NTP時刻同期、ウォッチドッグリセット、ヒープ監視)
esp-faceライブラリの活用ポイント
face_id_init():認識エンジン初期化、登録ユーザー数上限設定(デフォルト50人)face_id_enroll():新規顔登録(複数フレームから特徴量平均化、ID自動採番)face_id_recognize():認証実行、一致IDと類似度スコア返却face_id_delete():指定ID削除、face_id_clear():全削除- 特徴量ベクトル(192次元 float)をSDカードのバイナリファイル(
/faces/face_)に保存.dat
Web UIエンドポイント設計
| パス | メソッド | 機能 |
|---|---|---|
| / | GET | メインダッシュボード(ライブ映像、ステータス、クイック操作) |
| /stream | GET | MJPEGストリーム配信(ブラウザで直接 |
| /api/status | GET | JSON: システム状態、登録ユーザー数、メモリ/ヒープ、アップタイム |
| /api/users | GET | JSON: 登録ユーザー一覧(ID, 名前, 登録日時, サンプル数) |
| /api/enroll | POST | 顔登録開始({name: "user_name"})、完了までポーリング |
| /api/delete | POST | ユーザー削除({id: 3}) |
| /api/config | GET/POST | 設定取得/更新(閾値、解錠時間、ロックアウト時間、Wi-Fi設定等) |
| /api/logs | GET | アクセスログ取得(ページング、フィルタ対応) |
セキュリティ・プライバシー設計
- 完全ローカル処理:顔画像・特徴量はデバイス外に出ない。クラウドAPI不使用。
- データ暗号化:SDカード上の特徴量ファイルをAES-256暗号化(鍵はデバイス固有IDから導出)
- Web UI認証:Basic認証またはトークンベース認証(HTTPS化推奨、自己署名証明書可)
- 物理セキュリティ:筐体ネジ隠し、SDカードスロット内部配置、リセットボタン長押しで全データワイプ機能
- ファームウェア検証:Secure Boot + Flash Encryption(ESP32標準機能)有効化推奨
実装上の課題と対策
| 課題 | 対策 |
|---|---|
| メモリ不足(PSRAMなしモデル) | フレームサイズをHQVGA(240x176)に制限、JPEG品質下げ、タスク優先度調整 |
| 認識精度(照明変化、角度、経年変化) | 登録時多角度撮影、閾値チューニング(0.7-0.85)、定期的な再登録推奨 |
| 誤検知(写真、動画、マスク) | 生体検知(まばたき検出、深度情報なしで擬似的実装)、複数フレーム連続一致要求 |
| 応答遅延(検出〜解錠まで) | フレームレート5-10fps、検出間隔制限(200ms以上空けない)、非同期処理 |
| Wi-Fi切断時の動作継続 | 認証ロジックはWi-Fi非依存、Web UIのみ制限、再接続タスク別スレッド |
拡張アイデア
- ICカード/NFCリーダー併用(二要素認証)
- MQTT/Home Assistant連携(状態公開、遠隔解錠コマンド受信)
- 複数ドアのセントラル管理(ESP-NOWでメッシュ構築)
- 音声ガイダンス(DFPlayer Mini + スピーカー)
- 温度測定センサ併設(非接触体温チェック)
- バッテリーバックアップ(UPS HAT)で停電時も動作
まとめ
ESP32-CAM単体で実用レベルの顔認識アクセス制御が実現できることは、エッジAIの進歩を象徴しています。クラウド依存ゼロ、データ主権完全確保、低コスト(約3,000-5,000円)、省電力(平均1-2W)という特長は、個人宅・小規模オフィス・研究室などのプライバシー重視環境に最適です。esp-faceライブラリの成熟度も高く、MobileFaceNetベースの認識精度はホビーユースなら十分実用的です。今後、ESP32-S3(AIアクセラレータ内蔵、PSRAM標準搭載)への移行で、より高精度・高速・大容量DB対応が容易になるでしょう。
製造プロセス
- Web制御DMX照明システム:Arduino Megaマスターコントローラー
- NeoPixelリングとArduinoで作るインタラクティブジャイロスコープLEDディスプレイ
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- Unopad: Ableton Live連携シームレスなArduino MIDIコントローラー
- Pixie: Arduino Pro Miniで作るNeoPixel腕時計 - アナログとデジタル融合のDIY光る時計
- FirmataとXbox OneコントローラーでArduinoローバーをシームレス操作
- Arduinoベースの蛍光表示管(VFD)コントローラーキット
- Arduino Dueでマスターする音声認識と音声合成
- Alexa対応Arduinoホームコントローラー:音声でスマートホーム自動化
- 携帯型リモート監視カメラロボット - Raspberry PiとArduinoで構築
- スマート手話グローブ:ジェスチャーをテキスト/音声に変換