P2P IPカメラ × 仮想Wi-Fiルータ × Coral USB:安全な顔検知環境の構築手順
はじめに
市販のP2P(Plug and Play)IPカメラは、スマホアプリから簡単に映像を確認できる便利なデバイスですが、技術的にはブラックボックス化されており、セキュリティ面での懸念も多く報告されています。
特に、2019年にZDNetが報じたように、iLnkP2Pなどのライブラリに設計上の欠陥があり、 当時既に 200万台以上のIoTデバイスが外部からアクセス可能な状態にあると指摘されています。
“The flaws allow attackers to discover and connect to vulnerable devices using their UID, without needing to know the device's IP address.”
— Catalin Cimpanu, ZDNet, April 2019
出典元記事

Image credit: ZDNet / Catalin Cimpanu (2019)
こうした背景から、個人的には、P2Pカメラは持っていても使わずにいたのですが、近年入手した防犯カメラはクラウドサービスを前提に設計されていて、映像の保存・通知・設定変更すべてがクラウド経由で、有料サービスに接続しなければ機能しないという個人利用にはやや経済的負担が大きいものでした。
そこで、主に経済的な観点で、古いP2Pカメラの技術的脆弱性を逆に利用して少しでも安全に使いつつ、技術的な実験を行えるような環境を構築してみたのでご紹介します。
※本記事は個人的な検証記録です。構成や設定は環境により異なる場合があります。
※再現・運用は自己責任でお願いいたします
構成概要
本記事では、以下の構成でP2Pカメラを仮想Wi-Fiルータに接続し、Coral USB Acceleratorで顔検知を行う実験までを紹介します。
- Raspberry Pi 3Bを仮想 WIFI AP化し、P2Pカメラをローカル接続
- DHCPでIPを固定し、RTSPストリームを取得
- OpenCVで顔検知 → Coral USBで推論強化
- インターネット遮断によりクラウド接続を防止
- Coral USB Accelerator
P2P IP Camera 仕様
- gFSTロゴ付きのOEMと思われるP2P対応IPカメラ(デザインは、スマ見えCAM Robo GS-SMC021と同一。)
- SumaCAM(スマホアプリ)から操作可能です。2025年10月現在、Apple App Store で利用可能ですが、Google Play ストアでは該当のアプリが見当たらず、私は古いiPad mini にインストールしました。
1. Raspberry Pi 3Bでの仮想Wi-Fiルータ構築
使用機材等
- Raspberry Pi Model 3B
環境
- Google AIY Maker Kit 2022-05-18 Maker Kit release (Raspbian Buster)
- 動作の重いコンパイルなどは、Raspberry Pi 4 に SDカードを入れ替えての構築準備作業もできました。
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
$ uname -a
Linux roombutler2 5.10.17-v7+ #1414 SMP Fri Apr 30 13:18:35 BST 2021 armv7l GNU/Linux
$ lsusb
Bus 001 Device 006: ID 18d1:9302 Google Inc.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
構成ファイル例
/etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=myAP
hw_mode=g
channel=6
wmm_enabled=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=myAPpassphrase
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
/etc/dnsmasq.conf
interface=wlan0
dhcp-range=192.168.101.10,192.168.101.100,12h
dhcp-host=00:0e:00:07:29:e3,192.168.101.72 # 例:gFSTカメラのMACアドレスとIPアドレス
/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.101.1/24
nohook wpa_supplicant
※この手順の後、NAT無効化をするとeth0も無効化されたので設定は解除。
起動
sudo systemctl enable hostapd
sudo systemctl enable dnsmasq
sudo systemctl start hostapd
sudo systemctl start dnsmasq
2. IPカメラの接続確認
- gFSTカメラを起動し、Raspberry PiのAPに接続
- cat /var/lib/misc/dnsmasq.leases でIP確認
- ping 192.168.101.72 で応答確認
3. OpenCVによる顔検知(初期構成)
使用モデル
- Haar Cascade(haarcascade_frontalface_default.xml)
実装例(Python)
import cv2
cap = cv2.VideoCapture("rtsp://192.168.101.72:554/12")
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
参考図書:「OpenCVではじめよう ディープラーニングによる画像認識」吉村 康弘著(技術評論社 2023/9)
- 第7章「dnn モジュール基礎」7.2 顔検出
結果と課題
- フレームレートが低く、リアルタイム性に欠ける
- CPU負荷が高く、Pi 3Bでも遅延が発生
4. Coral USBで顔検知
Coral USB Acceleratorによる顔検知テスト(暗所対応前)
本記事では、Raspberry Pi 3BにCoral USB Acceleratorを接続し、Edge TPUを用いた顔検知を行う初期テストスクリプト coral_face_detect_test.py の要所を解説します。
この構成は、暗所対応(ガンマ補正・ヒストグラム均等化)を導入する前の素の推論環境であり、推論速度と基本的な検出精度の確認を目的としています。
使用モデルとライブラリ
- モデル:
mobilenet_ssd_v2_face_quant_postprocess_edgetpu.tflite - ライブラリ:
pycoral(Edge TPU用推論ライブラリ) - 入力:RTSPストリーム(例:
rtsp://192.168.101.72:554/12)
モデル準備
wget https://coral.ai/models/ssd_mobilenet_v2_face_quant_postprocess_edgetpu.tflite
スクリプトの要所
① Edge TPUインタプリタの初期化
from pycoral.utils.edgetpu import make_interpreter
interpreter = make_interpreter('model_edgetpu.tflite')
interpreter.allocate_tensors()
- Coral USBを初期化し、TFLiteモデルをロード
- allocate_tensors() により推論準備完了
② RTSPストリームの取得とフレーム処理
cap = cv2.VideoCapture("rtsp://192.168.101.72:554/stream1")
ret, frame = cap.read()
- OpenCVでRTSPストリームを受信
- 解像度はカメラ側に依存 (640x352 px)
$ ffprobe "rtsp://admin:admin@192.168.101.72:554/12"
...
Input #0, rtsp, from 'rtsp://admin:admin@192.168.101.72:554/12':
Metadata:
title : 11
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuv420p(progressive), 640x352, 25 tbr, 90k tbn, 180k tbc
Stream #0:1: Audio: pcm_alaw, 8000 Hz, 1 channels, s16, 64 kb/s
③ 画像の前処理と推論実行
from pycoral.adapters import common, detect
# 画像をリサイズしてインプットテンソルにセット
resized = cv2.resize(frame, (320, 320))
common.set_input(interpreter, resized)
# 推論実行
interpreter.invoke()
objs = detect.get_objects(interpreter, score_threshold=0.6)
- .tflite モデル
mobilenet_ssd_v2_face_quant_postprocess_edgetpu.tfliteが 320×320版だったため、入力画像をモデルサイズ(320×320)にリサイズ - score_threshold で検出信頼度を制限
④ 検出結果の描画
for obj in objs:
bbox = obj.bbox
cv2.rectangle(frame, (bbox.xmin, bbox.ymin), (bbox.xmax, bbox.ymax), (0, 255, 0), 2)
- 検出された顔領域に矩形を描画
結果と課題
- 検知処理の速度が向上し、リアルタイム処理での遅延が実用レベルに近づいた
- 横顔の検知率が向上したが、顔が下を向くと検知率が著しく低下
- 暗所では顔のコントラストが低く、検出率が著しく低下
- Coral USBの推論自体は高速だが、入力画像の品質が検出精度に直結している可能性が大きい
- 複数検出にも対応しているはずだが、テスト環境が揃わない(友達、いない)
まとめ
OpenCVによる顔検出の応用範囲は広く、2000円前後で入手可能なジャンクIPカメラでも十分に楽しめる環境を構築できます。今回の構成では、仮想Wi-Fiルータを用いてP2Pカメラをローカルに隔離した上で、Coral USB Acceleratorで推論を高速化し、セキュリティと実用性の両立を目指しました。
今後は、さらなる検知精度の向上や、顔認識(人物特定)への応用、ペネトレーションテスト用ラボでの活用など、幅広い展開が期待されます。また、このIPカメラには赤外線モードへの自動切替機構があり、パン・チルト機構のRTSP対応も確認済みです。顔検出結果を活用した人物の追跡・録画や、赤外線映像による暗所対応など、さらなる発展的な実験も視野に入れています。