最近のARのオクルージョン処理、あるいはバーチャル背景の実装の裏側には、Image Segmentationの技術が使われているようだ。こういう機能には、カメラの深度センサーを使うものだろうと思っていたが、2D映像からの解析で十分なスピードと精度が出るとは意外だった。
調べていたところ、Google Colabで学習済みのMask R-CNNのモデルを使ってImage Segmentationを動かすための記事があったので、これを元にImage Segmentationを試してみた。
記事内で参照されているプロジェクトはTensorflow 1.x系で作られているが、2020年現在Google Colabで標準で選択されるTensorflowのバージョンは2.x系となっているためそのままでは動作しない。%tensorflow version magicを使って、明示的に1.x系を使うように指定をすると無事動作した。
%tensorflow_version 1.x
Noteの先頭にこの一行を追加してやれば良い。
Google Driveにアップロードした自前の画像でもImage Segmentationを試してみる
一通りNoteを実行し、サンプル画像でImage Segmentationがちゃんと動いているのを確認した後、自前の画像でImage Segmentationを試してみることにした。
from google.colab import drive
drive.mount('/gdrive')
Google ColabのNote上にファイルを読み込む方法はいくつかあるが、今回は複数の画像を試したかったのでGoogle Driveから読み込む方法を選んだ。Noteの先頭でGoogle Driveを/gdriveというパスで参照できるようにマウントしておく。
# IMAGE_DIR = os.path.join(ROOT_DIR, "images")
IMAGE_DIR = os.path.join("/gdrive", "My Drive", "mask-rcnn", "images") # My Drive/mask-rcnn/images/*.jpeg
その上で、解析する画像が含まれるディレクトリを指定しているIMAGE_DIRの参照先をGoogle Driveのフォルダに書き換える。なお、画像はサイズが大きいと処理に膨大な時間がかかってしまうため、640×480ピクセルに縮小した。
適当に選んだ画像だったが、どれも比較的しっかりとセグメンテーションが行われた。