ハードウェアからサーバ・アプリまでワンストップで開発

VR動画ストリーミングの帯域節約(公知化情報)

低データ通信量で高品質のストリーミングを実現する方法です

「VR徘徊」を考え始めた頃に考えたことです。

VR徘徊のように、ストリーミングカメラを「散歩」させる時には、なるべく通信帯域は節約したいものです。当然解像度によりますが、一人で一台動かすだけであればWi-Fiがあればだいたい十分です。ところが複数台動かしたいとか、屋外でも使いたいとなると、通信帯域を節約してやらないと実用にはなりません。そのための技術です。

ある程度自明ですし、似たような「視覚hack」はいろいろなところで使われているものなので、既にどこかで特許化されていたり、学会あたりでは公知なのかも知れませんので、その辺は留意して下さい。例によって「公知例」としての公開です。一切の権利を放棄しますが、「公知」です。

背景

動画のストリーミングはデータ量が多くなります。これは解像度やフレームレイトが上がるとより多くなる傾向にあることは、説明するまでもないと思います。

HMDを使う場合、ある程度のフレームレイトがないと違和感を覚えたり「醉う」ような現象が起きたりします。同じように視点を移動した時のレイテンシも同様に、長くなった場合は違和感を覚えたり「醉う」ような現象が起きます。これは視点移動した時に見えるべきと予測している画像がまだ表示されていないということで起きます。つまり、快適な一人称視点ストリーミングを実現するには、解像度もさることながら、フレームレイトやレイテンシは短いことが求められます。

解像度は高い方が綺麗ですから、カメラもディスプレイも解像度を上げたい要求は高いものです。今時のHMDとなると2K + 2Kくらいのものは結構あって、この解像度を生かしたいなと思うのは当然のことと言えます。カメラに至っては4Kや8Kが当たり前みたいな状態になりつつあります。そういった意味では、撮像も表示も十分な解像度になっているとも言えます。

今時はデータ通信速度も上がっています。今時の無線LANであればGbpsのオーダの速度が出せたりします。ちっちゃいマイコン内蔵Wi-Fiモジュールとかでも、150Mbpsくらい出たりします。WANであっても5Gの理論的最高速度は20Gbpsとなっています。現実にはそこまで出せませんが、それでもGbpsのオーダの速度は出せます。いずれも動画ストリーミングで使っても不足はありません。

これらの技術を見ると、一人称視点での動画ストリーミングデバイスを実現することは、十分技術的には可能になっているかのように思います。

しかし、現実にはそうは行きません。

まず、通信が入れば、どうしても遅延が発生してレンテンシは長くなりがちです。5Gはレイテンシが短いと喧伝されていますが、通信品質とかを考えれば常に理想状態にはなりませんし、そもそもデータ処理の時間が入ります。

いくら通信速度が速くなったとは言え、高々有限です。同じチャネルを複数の機器が使う場合、帯域の奪いあいが発生します。台数が増えれば台数分だけの通信が必要になります。「VR徘徊」的なものが実用になって、「講演会に代理で出席させる」ようなことを大勢がやり始めたら、この問題は深刻になるでしょう。

さらに、通信には常に「データ通信料」の問題があります。少なければ少ないほど安くつくわけです。「無線LANならタダだよ」という話もありますが、いろんなコストを積算すれば、安いとは言えデータ通信量に応じたデータ通信料が発生しています。

このように、入出力のデバイスに関しては十分と言える状態にありますが、通信というころが絡むと難しくなってしまいます。

人間の視覚の特性

人間の視覚というのは実にいい加減なものです。

一般に見える範囲(視野角)は200°程度と言われていますが、見えている範囲全部がはっきり見えているかと言えばそうではありません。個人差や年齢による違いがありますが、ごく雑に言えば「中心はちゃんと見えているがそれ以外はそうでもない」と言えます。つまり、固定された解像度が視野いっぱいにあるのではなくて、位置によって解像度は変わるということです。

この動画がこの辺のことを上手く説明してくれています。

さらに、色に関する知覚、動きに関する知覚も、「中心部ははっきりしているが周辺部はそうでもない」ことがわかっています。

要するに、

注視している場所は詳しく見えているが
それ以外は雑

という性質があることがわかります。

提案する方法

人間の視覚は常に高解像度高フレームレイトであるわけではないことがわかりました。

そこで、それを使って、

注視している箇所は高解像度高フレームレイトとし
それ以外の場所は雑に処理する

ことを考えます。基本アイディアはこれだけです。

HMDを使う場合、その人がどこを注視しているかはだいたいわかりますし、観測者が一人ですから一意に決められます。

ですから、「注視している部分」は高解像度で高フレームレイト送ります。前掲のビデオの話をそのまま受け取るなら、人間の目の解像度を角度で表すと0.59′。ちなみに、視力検査で使うランドルド環の隙間の幅が1′ですから(より正確に言えば、1′が認識できる視力が1.0です)、確かにそんなものかなと思います。それが2°ですから、200×200程度の画素になります。ざっと4万画素ですか。本当に少ないですね。動画では「700万」と言っているのですが、これは何かの計算間違いでしょうね。4Kで800万画素ですから。もしかして「20°」なのかな? そうすれば、もう少し近い数字(400万画素)になりますね。まぁ数字の細かいところは別にして、そんなに大きくないことがわかります。

それ以外の箇所については、だんだんに解像度を落としておけば、「画素数」は節約できますね。つまり、データ通信量は減ります。

HMDに表示することを思えば、フレームバッファ(視野全体のメモリ)を用意しておいて、注視している部分については高レートで更新し、それ以外の部分については解像度も速度も落とす、解像度は低くして、画素にはガウス関数か何かでぼかしてやる。注視してない部分は「古い画素」で代替させてもいい。動きを認識できるのも注視している部分だけだからです。

HMDに表示する情報は、視野全体のメモリからHMDに見える範囲だけ切り出して使う。そうすれば、データレートとフレームレイトを別にすることができます。つまり、レイテンシの問題が隠蔽されます。ストリーミングされるデータはあくまでもフレームメモリの更新であって、フレームそのものではないわけです。視点移動した直後は「古い画像」が表示されているわけですが、それでも「視点」にあるものは見えていることになるので、視界の「ゆれ」はなくせます。また、人間は動いているものの解像度は低い性質があります。視線動かした時も同じです。

細かく見れば、JPEG画像のプログレッシブのようになるでしょうが、ガウス関数とかでぼかしてやれば、そこまで違和感もないでしょう。あるいはどうせはっきりとは見えてない領域ですから、わざわざぼかさないでも、そのまま低解像度で拡大してやっても良いのかも知れません。この辺は要研究ですが、原理はこういったものです。

発展

画像の世界には、いわゆる「超解像」という技術があります。手法は様々ですが、元々の解像度よりも高い解像度の画像を生成する技術です。

超解像にはいろいろなアルゴリズムが存在しますが、外部からヒントとなる情報を与えてやることで、より自然な画像にできるものがいくつかあります。

視覚の特性と超解像を組み合わせることで、より少ないデータ通信量で高品質の画像を見ることが可能になるかも知れません。

これは人工知能による画像生成でも同じことですね。ヒントとなる情報はそんなに大きくなくても使えるはずです。

まとめ

人間の視覚をhackすることにより、データ通信量を節約しつつ高解像度高フレームレイトと認識させることが出来て、より現実的にVR画像のストリーミングが出来るようになります。

「VR徘徊」のような機器を実用レベルにする時には必要になる技術だろうと思います。

最近のエントリー

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)

エントリを書くこと