ビデオ会議でのwebカメラのオン・オフユースケース(姿勢推定編)

OpenVINOを実際に使用したユースケースを想定し、プログラムを作成しているシリーズ。

前回は顔認識を使用して、自分以外の顔が写り込む、または、退席した時(誰も居なくなった)場合に、ビデオ会議のカメラをオフにするという内容でした。今回も引き続きビデオ会議を取り上げてみます。

きっかけ・ゴール

テレビ会議が一気に普及し、自宅仕事が増えてる状況ですね。暑くなってきましたし、上だけフォーマルな人も増えているのは分かります。自分も今は短パンです。YouTubeで「Luke Ming Flanagan underwear speech」とか「Reporter Caught With No Pants Live on Air」とかで検索すると、ウッカリさんが面白ニュースとしていじられていますね。気持ちは分かりますよ。暑いですもん。

このようなウッカリさんの事故を防ぐためには、「ビデオ会議にはちゃんとした格好で出ましょう」みたいなルールを作るのも良いかもしれませんが、それではつまらないルールが増えていくばかり。失敗学でも言われているように個人に依存せず、システム的に防止する事が必要だなあ。と思っていたら、作っている方がいらっしゃいました。

https://www.hackster.io/nickbild/safe-meeting-b66324

記事を読んでいると、「Safe Meeting prevents embarrassing and unprofessional situations by stopping your video stream if certain attire that’s inappropriate for business is detected.」だそうです。”ビジネスに相応しくない”というところが気になりますね。いろんなパンツとかどうやって検出しているんでしょう。謎です。セクスウィなパンツや、逆に派手なスーツやドレスもちゃんと判定してくれるのでしょうか。

という訳で、今回のユースケースではもっと単純化して「姿勢推定で腰より下が映ったら、ビデオ会議側のカメラをオフにする」というゴールにしたいと思います。

環境について

本ユースケースの実行環境はWindows10(以降、Win10)です。
  • Windows 10
  • Logicool c270 x 2台
  • ELECOM U3H-A408SBK
  • Jitsiはクラウドサービスを利用(https://meet.jit.si)
  • モデル:human-pose-estimation-001
  • 言語 :c++, powershell, bat
  • webカメラは2台使います。1台はビデオ会議用、1台は顔認識用です。今回はc270を使いました。webカメラも価格が高騰しているようですね。Win10で使えればお手元のカメラで問題無いと思います。

    Webカメラ2台、キーボード、マウスをWin10に挿すと、ハードにもよりますが、バスパワーが不足する状況になるかもしれません。そこで、セルフパワーのUSBハブの出番です。未だお持ちでない方はぜひ購入ください。USB3.0対応の方が良いですね。(Amazonの手先ではありません)

    今回利用したビデオ会議システムはオープンソースのjitsi(https://meet.jit.si)です。jitsiはもっと普及しても良いと思うOSSです。なお、理論上は他のビデオ会議でも本記事は使用可能です。

    姿勢推定について

    姿勢推定はOpenVINOに含まれている、human_pose_estimation_demo(c++)を流用しました。モデルはhuman-pose-estimation-001となります。まず、OpenVINOのドキュメントを確認しました。

    https://docs.openvinotoolkit.org/latest/_models_intel_human_pose_estimation_0001_description_human_pose_estimation_0001.html

    This is a multi-person 2D pose estimation network (based on the OpenPose approach) with tuned MobileNet v1 as a feature extractor. For every person in an image, the network detects a human pose: a body skeleton consisting of keypoints and connections between them. The pose may contain up to 18 keypoints: ears, eyes, nose, neck, shoulders, elbows, wrists, hips, knees, and ankles.

    とあります。キーポイントとして18箇所を判定するんですね。腰は何番だろうと思ったら、8番と11番でした。つまり、姿勢推定の結果、8番と11番に値が存在すると、腰が写っちゃっているという事になりますね。

    WebカメラのOnOffについて

    上記のとおり、姿勢推定の結果、腰が写った場合(8番と11番に値がある)にWebカメラをオフにすると良さそうだ。という事が分かりました。

    ”カメラをオフ”を手動で行う方法は、[コンピュータの管理]-[デバイスマネージャー]-[イメージングデバイス]から対象のカメラを右クリックして「デバイスを無効にする」という手順になります。これをDevConかPowerShellのどちらかで行います。

    DevCon

    https://docs.microsoft.com/ja-jp/windows-hardware/drivers/devtest/devcon-exampleshttps://docs.microsoft.com/ja-jp/windows-hardware/drivers/devtest/devcon-examples?fbclid=IwAR3tbimojRY0lercRto08y6QfQPQLMKoPAc52Y2tua1w3KA4TsVj8aJYWxo#ddk_example_30_disable_devices_by_an_id_pattern_tools

    PowerShell

    https://docs.microsoft.com/en-us/powershell/module/pnpdevice/enable-pnpdevice?view=win10-ps

    ここで注意なのは、どちらも管理者権限で実行する必要があるという事です。管理者権限で呼び出す方法は以下のページが参考になりそうですが、ここでは面倒だったので時間優先でUACを無効にしてダイアログが出るのを回避しました。正式に物を作る際は綺麗なお作法でお願いします。

    https://qiita.com/zetamatta/items/d41552c383605b24a8c2

    実行のようす

    最後に

    前回はRasPi4/Python/顔認証で、今回はWin10/C++/姿勢推定で、ビデオ会議のカメラの制御を実装しました。実現したい事やエンジニアが使える言語に応じて、モデルや言語を変えて貰えば良いと思います。OpenVINOでいろいろ挑戦してみてください。