今回扱ったのはOMRONのHVC-P2という画像センサになります。 カメラと画像認識を実装した基盤がセットになっているため認識結果だけを取得できるという未来的なものです。
検出できるものは以下です。
- 人体検出, 手検出, 顔検出, 顔向き, 年齢, 性別, 視線, 目つむり, 表情, 顔認証
しかしインタフェース仕様のドキュメントはあるものの公式のSDKなどはなくサンプルコードはCだけ。 実際に使った人の事例を検索してみてもコードが出て来なかったので自前で書くことにしました。 (公式のGitHubはあるようですがHVC-P2のものはまだないみたいです)
USB接続してみる
HVC-P2はUSBとUARTのどちらかのインタフェースで接続することができます。 今回はUSB接続を用いてMacにつないでみました。
$ ioreg -p IOUSB
+-o Root <class IORegistryEntry, id 0x100000100, retain 24>
+-o Root Hub Simulation Simulation@14000000 <class AppleUSBRootHubDevice, id 0x100000338, registered, matched, active, busy 0 (0 ms), retain 14>
...
+-o OMRON HVC-P2@14100000 <class AppleUSBDevice, id 0x100000a72, registered, matched, active, busy 0 (4 ms), retain 16>
ターミナルからコマンドを叩くとデバイスが認識されていることを確認できました。
Pythonから操作してみる
pyusbというライブラリを用いてUSBデバイスと通信を行うことができます。 libusbに依存しているため一緒にインストールします。Macの場合は以下のコマンドです。 (virtualenvが必要な方は作成してください/2系でも3系でもOKです)
brew install libusb
pip install pyusb
色々試行錯誤した結果、以下のコードでコマンドを実行できました。
import usb.core
import usb.util
# USBデバイスの情報を渡して画像センサのデバイスを取得
dev = usb.core.find(idVendor=0x0590, idProduct=0x00ca)
if not dev:
raise ValueError('Device not found!')
cfg = dev.get_active_configuration()
dev.set_configuration(cfg)
# コマンドを実行する
# HVC-P2のINPUTエンドポイントのアドレスは 0x01
# 第2引数はバージョン情報を取得するコマンド
resp = dev.write(0x1, bytes([0xFE, 0x00, 0x00, 0x00])
# 結果を読み出す
# HVC-P2のOUTPUTエンドポイントのアドレスは 0x82
# 第2引数はバッファのサイズ、タイムアウトは任意で指定可能
result = dev.read(0x82, 100, timeout=1000)
# readの結果はbyte配列のため16進数の文字列に変換する
print(''.join('{:02x}'.format(x) for x in result))
まとめ
最終的に思ったよりもシンプルなコードになって驚きました。 結果を解析するコードを書いてちょっと使いやすくしたらPython版のSDKとして公開したいと思います。
余談ですが、何度も画像センサで検出実行を行なっても顔認識しないなーと思ったらカメラの向きが違いました。 OMRONの文字がある方が上に来るように顔を写さないと認識してくれないようです。(ドキュメントによると顔検出は±30°以内)
また「カメラ取付方向設定」というコマンドもあり検出する向きを設定することもできるようなので、 ハードウェアに組み込む場合は設置しやすい方向に設定を変更しておくことで上記の問題は回避できるようです。
松木佑徒