zoomバーチャル背景の画像認識の限界を探してみた

この記事はエイチーム引越し侍 / エイチームコネクトの社員による、[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect) 7日目の記事です。
7日目の今日は、エンジニアから企画・マネジメントにジョブチェンして久しい@nakagawa_shotaがお送りします。
最近は弊社がリリースしたばかりの国産初バトロワゲームである[FINAL FANTASY VII THE FIRST SOLDIER](https://www.ffviifs.com/ja/)にはまってます。

#はじめに
さて。コロナでリモートワークが加速してしばらく経ちますが、zoom他リモート会議システムで今や当たり前に使われている「バーチャル背景」の技術、あれ改めて凄いですよね。
弊社もリモートワークを機にzoomを導入しましたが、導入当初はみんなころころ背景を変えては遊んでいました笑

思い出してみてほしいのですが、ほんの数年前まで、<strong>動画の背景をリアルタイムで切り抜く処理って、ここまで一般的でしたっけ...?</strong>
ゲーム実況の配信者のようにグリーンバックを使って背景を消して合成するのがあたり前だった気が。

しかも、zoomに搭載されている人の識別ってかなり優秀だと思います。
たまにはうまく抜けないこともありますが、ほとんどの会議十分な精度が出ているのでは。

というわけで、zoomのバーチャル背景はどこまで優秀なのか、この機会に徹底検証してみます。

#実験環境
## ソフトウェア
- zoom：5.8.9(記事執筆時点の最新版)
- OBS Studio：21.1.3(記事執筆時点の最新版)
    - カメラの代わりとして使用
    - 「仮想カメラ」機能で老若男女、部屋などを差し替えます
- OS：MacOS

## 素材
こちらのサイトの有料プランを契約し、ダウンロードしました。
商用・編集可能ということなので、zoomでバーチャル背景に切り替わった画像を公開しても問題ないはず
https://www.photo-ac.com/

今回実験に参加していただく皆さんはこちら笑

|Aさん|Bさん|Cさん|Dさん|
|---|---|---|---|
|![5042279_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/1359a6b4-70c9-2c6d-f58c-82855472c8c0.jpeg)|![B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/b0a8aea3-6aae-c12e-e173-b4b69d8b327f.png)|![4193198_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/a8659b40-3a6e-9a98-18ad-85a1fd5e533d.jpeg)|![22782414_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/484faf5d-96b9-a0d6-b671-e0a83da04e4c.jpeg)|

## 実験方法
- OBS Studioで、実際のカメラに模した様々な映像をzoomに送ります
- zoom側では、みなさんご存知、謎センスのデフォルト画像達のうち、「かなり”寄り”の草」を設定してあります
    - <img width="300" alt="草" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/9967918b-aff5-1af4-fd17-180cfb5d2e51.png">
    - 今回は画像認識の精度を実験したいので「グリーンスクリーンがあります」にはチェックを入れません
- 見事画像認識に成功すると、「切り抜かれた人」が「草」の前に出現します




# いざ実験！
## 【実験１】静止画に対応しているか
簡単なバーチャル背景の実装方法としてまず思いつくのが<strong>「時間軸で差分のないところ＝背景」としてしまうのがラク説</strong>。
精度の高い画像処理をしなくてもいけそうですよね。

なのでまず、完全な静止画をZoomに見せて正しくバーチャル背景がつくのか検証します。

### 結果

| 人 | 結果 | 判定 |
|:-:|:-:|:-:|
|Aさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/2a59cd60-ad4d-3e4c-d309-2e61700647d2.png)|OK|
|Bさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/bb28cf32-0f25-8e2c-b435-a70a770bff59.png)|OK|
|Cさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/fd18f487-3c2e-541a-637b-2da06b1f397a.png)|OK|
|Dさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/65a384dd-7e04-f2e2-817b-dd19b1b90b68.png)|OK|

素晴らしいですね。
4人ともほぼ問題なく切り取りができています。
強いて言えばAさんの「オッケー」の手が若干切れています。
このあたりはみなさんもご経験あるところかと思います。
動画ではなく静止画でも、いつものzoomクオリティで切り抜きしてくれることがわかりました。

### 考察
どうやらzoomは、「時間軸の差分があるところ＝人」という方法では、画像認識をしていないようです。
（AIのパラメータの中に含まれている可能性はありますが）
会社内で歩きながらバーチャル背景を起動しても問題なさそうです。

## 【実験２】顔が見切れるとどうなる？
人を切り抜く、それも用途がビデオ会議システムとなれば、人の顔に着目するのは自然かと思います。
顔が見えない状況下では認識精度はどう変わるでしょうか





### 結果

| 人 | 結果 | 判定 |
|:-:|:-:|:-:|
|Aさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/53310354-1ee9-f793-34f3-35ae8914013e.png)|OK|
|Bさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/61cc3efe-460b-c0b6-114e-4c8371e37030.png)|OK|
|Cさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/865c54cd-b1fd-c2c2-d813-056d250a97e9.png)|OK|
|Dさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/0bee57df-a476-8136-e769-45a51e5a65ba.png)|OK|

全く問題なく識別できています。

### 考察
人の顔という、一番重要そうな要素を削っても、全く問題ありませんでした。
もう少し意地悪してみましょう。




## 【実験3】どこまで見切れても認識できるのか？
実験2では顔がなくても問題なく認識できることがわかりました。
それなら、どこまで下に見切れていっても認識できるか、境界線を探ります。


### 結果

| 人 | 境界 | 結果 |
|:-:|:-:|:-:|
|Aさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/d4654ad2-ecbe-3ad9-d7c4-cd3c7ac88eb1.png)|首の肌が見えなくなるまで|
|Bさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/cb26d9e1-1ae2-8ba1-d45e-aad8b2b2634c.png)|首の肌が見えなくなるまで|
|Cさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/1aaea4c4-0bab-d667-6e3f-2e6256d06798.png)|肩の下辺り|
|Dさん   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/92c5489f-2eec-bb51-4e4c-dd1b283024bd.png)|肩|

あまり上に移動しすぎると、画像の端が来てしまい、黒い背景になってしまうので
あまり良い実験とは言えませんが、上記のような結果を得ました。

### 考察
顔に加えて首が見えなくなると、「人がそこに居ること」のジャッジが難しくなるようです。
ただ、胴体のほとんどが消えても手と、服の袖が見えていることから、肌は人の認識に重要な要素なのかもしれません。

## 【実験4】仮に肌が重要というなら・・・
| 項目 | 結果 | 判定 |
|:-:|:-:|:-:|
|忍者   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/2797c115-abfd-bec0-6f2c-07ccb9ad3f71.png)|余裕|
|忍者の限界  |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/1456d6f5-72eb-b06c-b732-40b246c01c45.png)|指が見えるときまで識別可能|
|忍者の限界   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/eac390ae-e2d9-2a9d-4986-9ffcd6920fa2.png)|指が見えないとどろん|
|水着の男性   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/590d39a1-b7c7-9b6c-00ce-15ae434be49f.png)|もちろんOK|
|水着の男性の限界   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/c1ec7343-85f2-ee40-2739-94b9e48f946c.png)|お腹でも行けた！|
|服だけ   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/51f416b0-a781-65f4-c0d3-f932c4c3d621.png)|OK|
|服だけ(別ver)   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/1ab0b357-1d7f-0a65-8a96-435de94e530d.png)|OK|

### 考察
まず、肌を隠している忍者。
全部隠れていれば違ったかもしれませんが、指が見えている限り、認識されてしまいました。
続いて露出の多い、男性の水着。
なんとお腹の一部でも人と認識されています。
最後に、服だけ。
これは正直どうだろうと思っていましたが、それなりの精度で識別してくれました。
結局AIなので、肌とか服とかではなく、全体的な人っぽさ、ということなんでしょうね。

でもそれではつまらないので、敢えてzoomならではの苦手ポイントを攻めていきたいと思います笑

## 【実験5】zoomが苦手そうなシチュエーション
恐らく、zoomの人識別AIはweb会議をする人間のデータを学習データとして多く採用しているはず！
「このシチュエーションは苦手でしょう」という意地悪をしてみます。

### 回転してみる

| 対象 | 結果 | 判定 |
|:-:|:-:|:-:|
|Aさん180°回転  |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/9f81ed36-543d-be09-7bf4-e467f9d9e10d.png)|首から下が切れてしまった|
|Aさん90°回転   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/93ab1e89-d59a-2992-369f-51e059e1475e.png)|ソファを腕の一部と誤認|
|Cさん180°回転   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/41653d15-5c9b-c37e-8d36-d164459d7d01.png)|身体を識別できない|
|Cさん90°回転   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/b45af5f9-22b7-3e95-4020-744e3fd8209b.png)|机を身体と誤認？|

### 考察
これは面白い結果に。
web会議（というか日常生活）ではありえない角度で人が生えていると全く同じ画像でも認識が変わってきます。
特に上から２番目のAさん90°回転では、ソファの一部を無理やりAさんの腕と解釈したような切り取りになっており、
ちょうどCさんのように、身体の前で腕を曲げている学習データに引っ張られていそうです。

### 複数人

| 人 | 結果 | 判定 |
|:-:|:-:|:-:|
|2人   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/f34a7bdb-8483-8ab4-b04c-edcd2fe5e4ae.png)|女性の身体が認識できていない|
|2人   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/f4b7fca0-5c50-6b55-587d-52e94fb175c0.png)|こちらも女性が若干怪しい|
|2人   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/f40138c6-948b-8d69-5462-55de6a575321.png)|問題なし|
|3人   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/6de1f3a3-2bac-7e72-4169-daa2e19acd34.png)|厳しい|
|3人   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/91f9da2b-6fbd-d0ee-348f-4f1dd3732fd4.png)|厳しい|
### 考察
この状態は経験ある人多いかもしれません。
やはり１人を前提として最適化していると思われます。



## 【実験6】zoomの最適化を逆手に取って...
実験5までで、zoomのバーチャル背景切り抜きの得意・不得意がわかってきたので、
これらの特徴を踏まえてzoomを混乱させにいきます。

### 結果

| 人 | 結果 | 判定 |
|:-:|:-:|:-:|
|ペットボトル   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/345e5d84-0fce-41d9-e682-f1feb9701373.png)|人扱い！|
|熊のぬいぐるみ  |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/ed7fd7e7-73ea-53e7-1f87-05c5301c50a8.png)|広めに取りすぎている。ちゃんと騙せてはいない？|
|トイレのマーク   |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/3f29b555-6a94-1047-b392-475d913d903c.png)|それなり|
|引越し侍くん|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/26462a07-453b-5761-cdd4-cf99d9c41388.png)|それなり|

#まとめ
- zoomのバーチャル背景の切り抜き処理は、<strong>身体が起きている一人</strong>であればかなりの精度
- 部屋を絶対に見せたくないときはできる限り首を見せ、手を画角内に置くと良い
- 横や上から顔を出したり、複数人などWEB会議での利用で想定されないシチュエーションでは、顔と体がはっきり画角に入っていても識別精度が大きく下がる

TikTokなどでもグリーンバックを使わない背景合成が流行ってますし、
そのうち、グリーンバックなんて要らなくなるかもしれませんね！

#明日
[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect) 7日目の記事は、いかがでしたでか。
明日は @sugoto911 が「SREの実践、SLI/SLO策定までの道のり」について書きます。
お楽しみに！