本開示はニューラル・ネットワーク・モデル圧縮に関連する。より具体的には、本願で説明される方法及び装置は、ニューラル・ネットワーク・モデル圧縮のための3Dツリー・コーディングに関連する。
スキャン順序
マルチメディア・コンテンツの記述及び解析のためのニューラル・ネットワークの圧縮において、ウェイト・テンソルの次元が(畳み込み層のように)2より大きい場合、このウェイト・テンソルは2次元(2D)テンソルにリシェイプされる。ウェイト・テンソルの次元が(全結合層又はバイアス層のように)2より大きくない場合、リシェイプは実行されない。
符号化方法は、ウェイト係数を、左から右に向かって行優先でスキャンし、行(複数)を上から下に向かってスキャンする。
表1
量子化
マルチメディア・コンテンツ記述及び分析のためのニューラル・ネットワークの圧縮において、ウェイト・マトリクスの各ウェイト係数に対して一様な方法で最近傍量子化が適用される。固定されたステップ・サイズが適用される。復号化されるマトリクスにおける再構成された値は、ステップ・サイズの整数倍である。ステップ・サイズは32ビット浮動小数点数として定められる。
表2
“step_size”は、量子化ステップ・サイズである。
エントロピー・コーディング
マルチメディア・コンテンツ記述及び分析のためのニューラル・ネットワークの圧縮において、各々の量子化されたウェイト・レベルは、整数パラメータmaxNumNoRemを用いて以下の手順に従って符号化される:
第1ステップにおいて、量子化されたウェイト・レベルに対してバイナリ・シンタックス要素sig_flagが符号化され、これは対応するレベルが0に等しいかどうかを指定する。sig_flagが1に等しい場合、更なるバイナリ・シンタックス要素sign_flagが符号化される。ビンは、現在のウェイト・レベルが正であるか又は負であるかを示す。次いで、ビンのユーナリ・シーケンスが符号化され、次のように固定長シーケンスが続く:
変数kは0で初期化され、Xは1<<kで初期化される。シンタックス要素abs_level_greater_Xが符号化され、これは、量子化されたウェイト・レベルの絶対値がXより大きいことを示す。abs_level_greater_Xが1に等しく、且つXがmaxNumNoRemより大きい場合、変数kは1だけ増やされる。その後、1<< kがXに追加され、別のabs_level_greater_Xが符号化される。この手順は、abs_level_greater_Xが0に等しくなるまで続けられる。ここで、Xは(X,X-1,・・・X-(1<<k)+1)という値のうちの1つでなければならない。長さkのコードは符号化され、これは絶対量子化ウェイト・レベルであるリストの値を指す。
コンテキスト・モデリングは、sig_flag,sign_flag,及びabs_level_greater_Xという3つのタイプのフラグを、コンテキスト・モデルに関連付けることに対応する。このようにして、同様な統計的挙動を有するフラグは同じコンテキスト・モデルに関連付けられることが可能であり、その結果、確率推定器(コンテキスト・モデルの内部)は、基礎となる統計量に適応することが可能である。
提案されるアプローチのコンテキスト・モデリングは以下のとおりである:
左側の隣接する量子化ウェイト・レベルが0であるか、0より小さいか、又は0より大きいかどうかに応じて、sig_flagに対して3つのコンテキスト・モデルが区別される。
左側の隣接する量子化ウェイト・レベルが0であるか、0より小さいか、又は0より大きいかどうかに応じて、sign_flagに対して他の3つのコンテキスト・モデルが区別される。
abs_level_greater_Xフラグの場合、各々のXは1つ又は2つの別個のコンテキスト・モデルを使用する。X<=maxNumNoRemである場合、2つのコンテキスト・モデルは、sign_flagに応じて区別される。X>maxNumNoRemである場合、唯1つのコンテキスト・モデルが使用される。
表3
“sig_flag”は、量子化されたウェイトQuantWeight[i]が非ゼロであるかどうかを指定する。0に等しいsig_flagは、QuantWeight[i]が0であることを示す。
“sign_flag”は、量子化されたウェイトQuantWeight[i]が正又は負であるかどうかを指定する。1に等しいsign_flagは、QuantWeight[i]が負であることを示す。
“abs_level_greater_x[j]”は、QuantWeight[i]の絶対値レベルがj+1より大きいかどうかを示す。
“abs_level_greater_x2[j]”は、指数ゴロム剰余のユーナリ・パートを含む。
“abs_remainder”は、固定長剰余を示す。
ディープ・ラーニング・システムの推論演算は、マトリクス乗算を集中的に使用するので、ハイパフォーマンスなマトリクス乗算ライブラリ(GEMM)は推論演算にとって鍵となる。左側(lhs)マトリクスと右側(rhs)マトリクスのサイズに応じて、2つのGEMMルーチン(GEPP/GEBP、GEPM/GEBP)が、過去10年間にわたって、最適なGEMMソリューションとして業界で認識されている。図1に示すように、両方の方法は、最新の計算プラットフォームにおいてオフ・チップ・メモリ(例えば、ダブル・データ・レート(DDR))及びオン・チップ・メモリ(例えば、マルチ・レベル・キャッシュ)の異なる特性を最大限に活用するために、lhsマトリクスとrhsマトリクスを再帰的に区分けし、lhsマトリクスは、通常、最適なメモリ・アクセス・パターンを達成するためにカラム・メジャー・オーダーで格納される。lhsマトリクスは、通常、最適なメモリ・アクセス・パターンを達成するために転置される。幾つかの新しいGEMMルーチン(QNNPACKなど)は、モバイル及びエッジ・デバイス用に設計されたニューラル・ネットワークに対して最適化され、GEPPルーチン又はGEPMルーチンのいずれかのバリエーションであり、同様なマトリクス・ブロッキング/パーティショニング方法に従う。
NNRにおけるマトリクス・スキャン順序は、行優先方式として、左から右へ、そして行を上から下へ定義する。このスキャン順序は、推論演算が演算を開始する前に過剰なサイズのウェイト係数をバッファリングしなければならないので、推論演算によって必要とされるスキャン順序とは一致しない。例えば、推論演算がVGG16の最初の全結合層に対して実行される場合、この層のマトリクスサイズが25088x4096であったとすると、Nx25088個の係数を格納できるバッファが、GEMMルーチンを実行するために確保されなければならない。通常のGEMM演算に対するN=64の場合、たとえ係数が32ビット浮動小数点ではなく8ビット整数で表現されたとしても、バッファ・サイズは1.5MBになるであろう;しかし、このようなバッファ・サイズは、特にモバイル及びエッジ・デバイスにとっては大きすぎる。
更に、NNRにおけるエントロピー・コーディングは、量子化ウェイト係数に対して直接的に実行される。ウェイト・テンソルが、重複しない2D/3Dコーディング・ツリー・ユニット(CTU)/3Dコーディング・ツリー・ユニット(CTU3D)にパーティショニングされた後、NNRは局所的な分布を考慮していなかった。ほとんどのウェイト係数は、スパース/プルーン操作の後、ゼロになる。
図2は、本願で説明される方法、装置、及びシステムを実施することが可能な実施形態による環境200の図である。図2に示すように、環境200は、ユーザー・デバイス210、プラットフォーム220、及びネットワーク230を含んでもよい。環境200のデバイスは、有線接続、無線接続、又は有線及び無線接続の組み合わせを介して相互接続することができる。
ユーザー・デバイス210は、プラットフォーム220に関連する情報を受信、生成、記憶、処理、及び/又は提供することが可能な1つ以上のデバイスを含む。例えば、ユーザー・デバイス210は、コンピューティング・デバイス(例えば、デスクトップ・コンピュータ、ラップトップ・コンピュータ、タブレット・コンピュータ、ハンドヘルド・コンピュータ、スマート・スピーカ、サーバー等)、モバイル・フォン(例えば、スマート・フォン、無線電話など)、ウェアラブル・デバイス(例えば、一対のスマート・グラス又はスマート・ウオッチ)、又は同様なデバイスを含んでもよい。幾つかの実装において、ユーザー・デバイス210は、プラットフォーム220から情報を受信し及び/又はそこに情報を送信することができる。
プラットフォーム220は、本願の他の箇所で説明されているように、1つ以上のデバイスを含む。幾つかの実装では、プラットフォーム220は、クラウド・サーバー又はクラウド・サーバーのグループを含んでもよい。幾つかの実装において、プラットフォーム220は、ソフトウェア構成要素がスワップ・イン又はスワップ・アウトされ得るようにモジュール化されるように設計することができる。そのように、プラットフォーム220は、様々な用途のために容易に及び/又は迅速に再構成されることが可能である。
一部の実装では、図示のように、プラットフォーム220はクラウド・コンピューティング環境222でホストされてもよい。特に、本願で説明される実装は、プラットフォーム220を、クラウド・コンピューティング環境222でホストされるものとして説明しているが、幾つかの実装において、プラットフォーム220は、クラウド・ベースでなくてもよいし(即ち、クラウド・コンピューティング環境の外で実装されてもよい)、又は部分的にクラウド・ベースであってもよい。
クラウド・コンピューティング環境222は、プラットフォーム220をホストする環境を含む。クラウド・コンピューティング環境222は、プラットフォーム220をホストするシステム及び/又はデバイスの物理的な位置及び構成についてのエンド・ユーザー(例えば、ユーザー・デバイス210)の知識を必要としない、計算、ソフトウェア、データ・アクセス、ストレージ等のサービスを提供することができる。図示のように、クラウド・コンピューティング環境222は、コンピューティング・リソース224のグループ(まとめて「コンピューティング・リソース224」として、及び個々に「コンピューティング・リソース224」として言及される)を含んでもよい。
コンピューティング・リソース224は、1つ以上のパーソナル・コンピュータ、ワークステーション・コンピュータ、サーバー・デバイス、又はその他の種類の計算及び/又は通信デバイスを含む。幾つかの実装において、コンピューティング・リソース224は、プラットフォーム220をホストすることができる。クラウド・リソースは、コンピューティング・リソース224において実行される計算インスタンス、コンピューティング・リソース224において提供される記憶デバイス、コンピューティング・リソース224によって提供されるデータ転送デバイス等を含んでもよい。幾つかの実装において、コンピューシング・リソース224は、有線接続、無線接続、又は有線及び無線接続の組み合わせを介して、他のコンピューティング・リソース224と通信してもよい。
図2に更に示すように、コンピューティング・リソース224は、1つ以上のアプリケーション(「APP」)224-1、1つ以上の仮想マシン(「VM」)224-2、仮想化されたストレージ (「VS」)224-3、1つ以上のハイパーバイザ(「HYP」)224-4などのクラウド・リソースのグループを含む。
アプリケーション224-1は、ユーザー・デバイス210及び/又はプラットフォーム220に提供される又はそれによりアクセスすることが可能な1つ以上のソフトウェア・アプリケーションを含む。アプリケーション224-1は、ユーザー・デバイス210上でソフトウェア・アプリケーションをインストールして実行する必要性を排除することができる。例えば、アプリケーション224-1は、プラットフォーム220に関連付けられたソフトウェア、及び/又はクラウド・コンピューティング環境222を介して提供されることが可能な他の任意のソフトウェアを含んでもよい。幾つかの実装において、1つのアプリケーション224-1は、仮想マシン224-2を介して、1つ以上の他のアプリケーション224-1へ/そこから情報を送信/受信することができる。
仮想マシン224-2は、物理マシンのようなプログラムを実行するマシン(例えば、コンピュータ)のソフトウェア実装を含む。仮想マシン224-2は、仮想マシン224-2による何らかのリアル・マシンに対する対応の程度及び用途に応じて、システム仮想マシン又はプロセス仮想マシンのいずれかであってもよい。システム仮想マシンは、完全なオペレーティング・システム(「OS」)の実行をサポートする完全なシステム・プラット・フォームを提供することができる。プロセス仮想マシンは、単一のプログラムを実行することが可能であり、単一のプロセスをサポートすることが可能である。幾つかの実装では、仮想マシン224-2は、ユーザー(例えば、ユーザー・デバイス210)に代わって実行することが可能であり、データ管理、同期化、又は長時間データ転送のようなクラウド・コンピューティング環境222のインフラストラクチャを管理することができる。
仮想化されたストレージ224-3は、コンピューティング・リソース224のストレージ・システム又はデバイス内で仮想化技術を使用する1つ以上のストレージ・システム及び/又は1つ以上のデバイスを含む。幾つかの実装において、ストレージ・システムの状況において、仮想化のタイプは、ブロック仮想化及びファイル仮想化を含んでもよい。ブロック仮想化は、物理ストレージ又はヘテロジニアス構造に関係なく、ストレージ・システムがアクセスされ得るように、物理ストレージから論理ストレージの抽象化(又はセパレーション)を参照してもよい。セパレーションは、ストレージ・システムの管理者に、エンド・ユーザーのストレージを管理者がどのように管理するかについて柔軟性を持たせることができる。ファイル仮想化は、ファイル・レベルでアクセスされるデータと、ファイルが物理的に格納される場所との間の依存性を排除することができる。これは、ストレージの使用、サーバーの統合、及び/又は非破壊的なファイル移行のパフォーマンスの最適化を可能にすることができる。
ハイパーバイザ224-4は、複数のオペレーティング・システム(例えば、「ゲスト・オペレーティング・システム」)が、コンピュータ・リソース224のようなホスト・コンピュータ上で同時に実行することを可能にするハードウェア仮想化技術を提供することができる。ハイパーバイザ224-4は、ゲスト・オペレーティング・システムに対して仮想オペレーティング・プラットフォームを提示し、ゲスト・オペレーティング・システムの実行を管理することができる。様々なオペレーティング・システムの複数のインスタンスは、仮想化されたハードウェア・リソースを共有する可能性がある。
ネットワーク230は、1つ以上の有線及び/又は無線ネットワークを含む。例えば、ネットワーク230は、セルラー・ネットワーク(例えば、第5世代(5G)ネットワーク、ロング・ターム・エボリューション(LTE)ネットワーク、第3世代(3G)ネットワーク、符号分割多元接続(CDMA)ネットワーク等)、公衆陸上移動通信網(PLMN)、ローカル・エリア・ネットワーク(LAN)、ワイド・エリア・ネットワーク(WAN)、メトロポリタン・エリア・ネットワーク(MAN)、電話網(例えば、公衆交換電話網(PSTN))、プライベート・ネットワーク、アドホック・ネットワーク、イントラネット、インターネット、光ファイバ・ベースのネットワーク等、及び/又はこれら又は他のタイプのネットワークの組み合わせを含んでもよい。
図2に示すデバイス及びネットワークの数及び配置は一例として与えられている。実際には、図2に示されるものに対して、追加のデバイス及び/又はネットワーク、より少ないデバイス及び/又はネットワーク、異なるデバイス及び/又はネットワーク、又は異なる配置のデバイス及び/又はネットワークが存在し得る。更に、図2に示す2つ以上のデバイスは、単一のデバイス内に実装されてもよいし、又は図2に示す単一のデバイスは、複数の分散されたデバイスとして実装されてもよい。追加的又は代替的に、環境200のデバイスのセット(例えば、1つ又は複数のデバイス)は、環境200のデバイスの別のセットによって実行されるように説明される1つ又は複数の機能を実行してもよい。
図3は、図2の1つ以上のデバイスの例示的な構成要素のブロック図である。デバイス300は、ユーザー・デバイス210及び/又はプラットフォーム220に対応する可能性がある。図3に示すように、デバイス300は、バス310、プロセッサ320、メモリ330、ストレージ構成要素340、入力構成要素350、出力構成要素360、及び通信インターフェース370を含んでもよい。
バス310は、デバイス300の構成要素間の通信を可能にする構成要素を含む。プロセッサ320は、ハードウェア、ファームウェア、又はハードウェアとソフトウェアの組み合わせで実装される。プロセッサ320は、中央処理ユニット(CPU)、グラフィックス処理ユニット(GPU)、加速処理ユニット(APU)、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ(DSP)、フィールド・プログラマブル・ゲート・アレイ(FPGA)、特定用途向け集積回路(ASIC)、又は別のタイプの処理構成要素である。幾つかの実装では、プロセッサ320は、機能を実行するようにプログラムすることが可能な1つ以上のプロセッサを含む。メモリ330は、ランダム・アクセス・メモリ(RAM)、リード・オンリー・メモリ(ROM)、及び/又は、プロセッサ320による使用のための情報及び/又は命令を記憶する別のタイプのダイナミック又はスタティック記憶デバイス(例えば、フラッシュ・メモリ、磁気メモリ、及び/又は、光メモリ)を含む。
ストレージ構成要素340は、デバイス300の動作及び用途に関連する情報及び/又はソフトウェアを記憶する。例えば、ストレージ構成要素340は、ハード・ディスク(例えば、磁気ディスク、光ディスク、光磁気ディスク、及び/又はソリッド・ステート・ディスク)、コンパクト・ディスク(CD)、デジタル多用途ディスク(DVD)、フロッピーディスク、カートリッジ、磁気テープ、及び/又は他のタイプの非一時的なコンピュータ読み取り可能な媒体を、対応するドライブと共に含んでもよい。
入力コンポーネント350は、ユーザー入力のような情報をデバイス300が受けることを可能にする構成要素(例えば、タッチ・スクリーン・ディスプレイ、キーボード、キーパッド、マウス、ボタン、スイッチ、及び/又はマイクロホン)を含む。追加的又は代替的に、入力構成要素350は、情報を感知するためのセンサ(例えば、グローバル・ポジショニング・システム(GPS)システム構成要素、加速度計、ジャイロスコープ、及び/又はアクチュエータ)を含んでもよい。出力構成要素360は、デバイス300からの出力情報を提供する構成要素(例えば、ディスプレイ、スピーカ、及び/又は1つ以上の発光ダイオード(LED))を含む。
通信インターフェース370は、デバイス300が、例えば有線接続、無線接続、又は有線及び無線接続の組み合わせを介して、他のデバイスと通信することを可能にするトランシーバのような構成要素(例えば、トランシーバ及び/又は別個の受信機及び送信機)を含む。通信インターフェース370は、デバイス300が他のデバイスから情報を受信し、及び/又は他のデバイスに情報を提供することを可能にすることができる。例えば、通信インターフェース370は、イーサーネット・インターフェース、光インターフェース、同軸インターフェース、赤外線インターフェース、無線周波数(RF)インターフェース、ユニバーサル・シリアル・バス(USB)インターフェース、Wi-Fiインターフェース、セルラー・ネットワーク・インターフェース等を含んでもよい。
デバイス300は、本願で説明される1つ以上のプロセスを実行することができる。デバイス300は、メモリ330及び/又はストレージ構成要素340のような非時的なコンピュータ読み取り可能な媒体によって記憶されたソフトウェア命令を実行するプロセッサ320に応答して、これらのプロセスを実行することができる。コンピュータ読み取り可能な媒体は、本願では、非一時的なメモリ・デバイスとして定められる。メモリ・デバイスは、単一の物理ストレージ・デバイス内のメモリ・スペース、又は複数の物理ストレージ・デバイスに分散されたメモリ・スペースを含む。
ソフトウェア命令は、別のコンピュータ読み取り可能な媒体から、又は通信インターフェース370を介して別のデバイスから、メモリ330及び/又はストレージ構成要素340へ読み込まれてもよい。実行されると、メモリ330及び/又はストレージ構成要素340に記憶されたソフトウェア命令は、プロセッサ320に、本願で説明される1つ以上のプロセスを実行させることができる。追加的又は代替的に、ハードワイヤード回路が、本願で説明される1つ以上のプロセスを実行するために、ソフトウェア命令の代わりに、又はそれと組み合わせて使用されることが可能である。従って、本願で説明される実装は、ハードウェア回路とソフトウェアの何らかの特定の組み合わせには限定されない。
図3に示す構成要素の数及び配置は一例として与えられている。実際には、デバイス300は、図3に示すものに対して追加の構成要素、より少ない構成要素、異なる構成要素、又は異なる配置の構成要素を含むことができる。追加的又は代替的に、デバイス300の構成要素のセット(例えば、1つ以上の構成要素)は、デバイス300の構成要素の別のセットによって実行されるものとして説明される1つ以上の機能を実行してもよい。
図4は、実施形態によるニューラル・ネットワーク・モデル圧縮のためのシステム400の機能ブロック図である。
図4に示すように、システム400は、パラメータ削減モジュール405、パラメータ近似モジュール410、再構成モジュール415、エンコーダ420、及びデコーダ425を含む。
パラメータ削減モジュール405は、出力ニューラル・ネットワークを得るために、入力ニューラル・ネットワークの一群のパラメータを減らす。ニューラル・ネットワークは、ディープ・ラーニング・フレームワークによって指定されるパラメータ及びアーキテクチャを含むことが可能である。
例えば、パラメータ削減モジュール405は、ニューラル・ネットワークのコネクションをスパース化する(ウェイトをゼロに設定する)及び/又はプルーニングする(刈り取る)ことが可能である。別の例では、パラメータ削減モジュール405は、ニューラル・ネットワークのパラメータ・テンソルに関して、より小さなパラメータ・テンソルのセットへの行列分解を実行することができる。パラメータ削減モジュール405はこれらの方法を段階的に実行してくもよく、例えば最初にウェイトをスパース化し、次いで、結果のマトリクスを分解してもよい。
パラメータ近似モジュール410は、パラメータ削減モジュール405から得られる出力ニューラル・ネットワークから取り出されるパラメータ・テンソルに対してパラメータ近似技術を適用する。例えば、この技術は、量子化、変換及び予測の任意の1つ又は任意の組み合わせを含んでもよい。パラメータ近似モジュール410は、パラメータ近似モジュール410によって修正されない第1パラメータ・テンソルと、パラメータ近似モジュール410によって修正又は近似された第2パラメータ・テンソルと、修正された第2パラメータ・テンソルから、パラメータ近似モジュール410によって修正されていないオリジナルのパラメータ・テンソルを再構成するために使用されるそれぞれのメタデータとを出力する。
再構成モジュール415は、パラメータ近似モジュール410及び/又はデコーダ425から得られるそれぞれのメタデータを用いて、パラメータ近似モジュール410及び/又はデコーダ425から得られる修正された第2パラメータ・テンソルから、元のパラメータ・テンソルを再構成する。再構成モジュール415は、再構成された元のパラメータ・テンソル及び第1パラメータ・テンソルを使用して、出力ニューラル・ネットワークを再構成することができる。
エンコーダ420は、パラメータ近似モジュール410から得られる第1パラメータ・テンソル、第2パラメータ・テンソル、及びそれぞれのメタデータに対してエントロピー符号化を実行することができる。この情報は、デコーダ425へのビットストリームに符号化されることが可能である。
デコーダ425は、エンコーダ420から得られたビットストリームを復号化して、第1パラメータ・テンソル、第2パラメータ・テンソル、及びそれぞれのメタデータを得ることができる。
システム400は、プラットフォーム220内に実装されてもよく、図4の1つ以上のモジュールは、ユーザー・デバイス210のようなプラットフォーム220から分離された、又はそれを含むデバイス又はデバイスのグループによって実行されてもよい。
以下、ニューラル・ネットワーク・モデル圧縮のための3Dツリー・コーディングのための方法及び装置を詳細に説明する。
CTU3Dパーティション
lhsテンソルが列-優先順で又は行-優先テンソルの転置の後に格納される場合、ウェイト・テンソルの次元は、通常、[R][S][C][K]のレイアウトを有する畳み込み層について4、[C][K]のレイアウトを有する全結合層について2、バイアス及びバッチ正規化層について1である。R/Sは畳み込みカーネル・サイズであり、Cは入力特徴サイズであり、Kは出力特徴サイズである。
畳み込み層の実施形態では、4次元(4D)テンソル[R][S][C][K]が3Dテンソル[RS][C][K]にリシェイプされるように、2D [R][S]次元が1D [RS]次元にリシェイプされる。全結合層は、R=S=1による3Dテンソルの特殊なケースとして取り扱われる。
カーネル・サイズRSは通常C/Kよりはるかに小さいので、3Dテンソル[RS][C][K]は重複しない小さなブロック(CTU3D)で[C][K]平面に沿って分割される。各々のCTU3Dは、[RS][ctu3d_height][ctu3d_width]の形状を有し、ここで、ctu3d_height=max_ctu3d_height,ctu3d_width=max_ctu3d_width,及び max_ctu3d_height/max_ctu3d_widthは、モデル・ヘッダにおいて符号化される。テンソルの右及び/又は下に位置するCTU3Dの場合、ctu3d_heightはC/max_ctu3d_heightの剰余であり、ctu3d_widthはK/max_ctu3d_widthの剰余である。
図5に示すように、テンソルの右及び/又は下にあるCTU3D505の場合、所与の深さにある親CU3Dノード510は、4つの子ノードすべてを有していない可能性がある。テンソルの右及び/又は下に位置するCTU3D510の場合、cu3d_heightはmax_ctu3d_height/max_cu3d_heightの剰余であり、cu3d_widthはmax_ctu3d_width/max_cu3d_widthの剰余である。
更なる実施形態において、max_ctu3d_height= max_ctu3d_widthであるように、正方形パーティションが使用され、変数max_ctu3d_sizeはmax_ctu3d_height及び max_ctu3d_widthの双方を表現するために使用される。max_ctu3d_sizeは2**Nとして定義され、Nの値は8,16,32,64である。
推論演算におけるオン・チップ・メモリ要求を容易にするために、実施形態では、様々なカーネル・サイズを有する層に対するトータルCTU3Dサイズに制限があるかどうかを示すためにフラグが定義される。0に等しいフラグは、カーネル・サイズによらず、ctu3d_height/ctu3d_widthは変更されずに維持されることを示し、この場合、畳み込み層のCTU3Dのサイズは、全結合層に対するCTU3DのサイズよりもRS倍大きい。1に等しいフラグは、カーネル・サイズに基づいて、ctu3d_height/ctu3d_widthがスケーリングされることを示す。例えば、 ctu3d_height=ctu3d_width=int(ctu3d_height*ctu3d_width/R/S)である。
任意のスキャン順序を用いて3Dテンソル内のCTU3Dをスキャン及び処理することが可能であるが、実施形態では、それらは水平方向(SCAN_CK)又は垂直方向(SCAN_KC)の何れかでラスタ・スキャン順序を用いてスキャン及び処理される。
対応するシンタックス・テーブルの例を、以下の表4-6に示す:
表4
表5
0である“enable_max_ctu3d_size”は、カーネル・サイズによらず、ctu3d_height/ctu3d_widthが変更されずに維持されることを示し、1である“enable_max_ctu3d_size”は、カーネル・サイズに基づいて、ctu3d_height/ctu3d_widthがスケーリングされることを示す。
“max_ctu3d_idx”は、以下の式におけるものである:max_ctu_3d_size=(max_ctu3d_idx==0)?64:(max_ctu3d_idx==1)?32:(max_ctu3d_idx==2)?16:8 (1)
表6
0である“layer_scan_order”は、水平方向におけるラスタ・スキャン順序を示し、1である“layer_scan_order”は、垂直方向におけるラスタ・スキャン順序を示す。
適応CU3Dパーティション
実施形態では、ビデオ・コーディング規格で使用されるCTU/CU適応パーティショニング方法が使用される。
簡略化されたブロッキング構造を使用され、CTU3D/CU3Dは、最大再帰深度に達するまで、四分木構造を用いて再帰的に、より小さなCU3Dに区分けされる。CTU3Dノードから始まり、CU3Dのこの四分木は、深さ優先の四分木スキャン順序を用いてスキャンされ、処理される。同じ親ノードの下にある子ノードは、水平方向又は垂直方向の何れかでラスタ・スキャン順序を用いてスキャンされ、処理される。
所与の四分木深度におけるCU3Dに関し、これらのCU3Dのmax_cu3d_height/max_cu3d_widthは、以下の式(2)及び(3)を用いて計算され、max_cu3d_height及びmax_cu3d_widthの双方が所定の閾値以下になると、最大再帰深度に到達している。この閾値は、明示的にビットストリームに含まれることが可能であり、あるいは予め決定された数(例えば、8)であるとすることが可能であり、その場合、暗黙的にデコーダにより推測されることが可能である。
max_cu3d_height=max_ctu3d_height>>depth (2)
max_cu3d_width=max_ctu3d_width>>depth (3)
更なる実施形態では、max_ctu3d_height= max_ctu3d_widthであるように、正方形パーティションが使用される。所与の四分木深度におけるCU3Dに関し、これらのCU3Dのmax_cu3d_sizeは、以下の式(4)を用いて計算され、max_cu3d_sizeが所定の閾値以下になると、最大再帰深度に到達している。この閾値は、明示的にビットストリームに含まれることが可能であり、あるいは予め決定された数(例えば、8)であるとすることが可能であり、その場合、暗黙的にデコーダにより推測されることが可能である。
max_cu3d_size=max_ctu3d_size>>depth (4)
図5に示すように、テンソルの右及び/又は下にあるCTU3D505の場合、所与の深さにある親CU3Dノード510は、4つの子ノードすべてを有していない可能性がある。テンソルの右及び/又は下に位置するCTU3D510の場合、cu3d_heightはmax_ctu3d_height/max_cu3d_heightの剰余であり、cu3d_widthはmax_ctu3d_width/max_cu3d_widthの剰余である。
更なる実施形態では、レート歪(Rate-Distortion,RD)ベースの符号化アルゴリズムを使用して、親CU3Dが複数のより小さな子CU3Dに分割されるかどうかを決定する。親CU3Dは、これらの小さな子CU3Dの合計RDが親CU3DからのRDより小さい場合、複数の更に小さな子CU3Dに分割される。そうではない場合、親CU3Dは分割されない。分割フラグは、この分割決定を記録するために定められる。
対応するシンタックス・テーブルの例を、以下の表7及び表8に示す:
表7
表8
“split_flag”は、親CU3Dが、より小さな子CU3Dに分割されるかどうかを示すためのフラグである。
カーネル平面リオーダー
上述したように、簡略化されたブロッキング構造が使用され、CTU3D/CU3Dは、最大再帰的深さに達するまで、四分木構造を用いて再帰的に、より小さなCU3Dに区分けされる。
更なる実施形態では、より良好な圧縮動作を促すために、CU3D又はCTU3D内のRS数の2D平面は、[RS]軸に沿って並べ替えることが可能である。リオーダー・インデックスは、各CU3Dが独自のリオーダー・インデックスを有するように、CU3Dヘッダにおいて符号化されるか、又はこのCTU3D内のすべてのCU3Dが同じリオーダー・インデックスを共有するように、CTU3Dヘッダにおいて符号化される。フラグは、リオーダー動作が許可されるかどうかを示すために定められる。このフラグはモデル・ヘッダ又はレイヤ・ヘッダの何れかで符号化される。
A zdep_array[RS]は、RS数の2D平面のリオーダリングされたインデックスを記憶するために定められる。zdep_array[n]は、リオーダリングされた2D平面のインデックスnが、元の2D平面のインデックスzdep_array[n]からのものであることを示す。最初の2D平面は別の場所に並べ替える必要はないので、zdep_arrya[0]は常に0である。
リオーダリング動作は常に閉じた形式で実行されるので、zdep_arrayはnext_idx=first_idxから始まるスキャンを行うことが可能であり、next_idx=zdep_array[next_idx]が反復的に指定される。zdep_array[next_idx]=first_idxにおいてループが見出されるであろう。zdep_arrayのすべてのインデックスがこのループに含まれていない場合、zdep_arrayは、すべての以前のループに含まれていない第1インデックスから連続的にスキャンされることが可能であり、next_idx=zdep_array[next_idx]が反復的に指定される。
前述のzdep_arrayスキャニング方法を使用して、next_idxのシーケンスを格納するために、キューが定められる。キュー生成の擬似コードを以下に列挙する:
if (zdep_arry[++idx] != -1) {
first_idx = idx;
while (zdep_arry[idx] != first_idx) {
next_idx = zdep_arry[idx];
queue.push_back(next_idx);
zdep_arry[idx] = -1;
idx = next_idx;
}
queue.push_back(-1);
zdep_arry[idx] = -1;
idx = first_idx;
}
リオーダリング方法に基づいて、このキューの最初と最後の位置の内容を推測することが可能であり、所与の任意のループの最後の位置の内容も推測することが可能である。
対応するシンタックス・テーブルの例を、以下の表9-11に示す:
表9
0に等しい“enable_zdep_reorder”は、zdep_arrayのリオーダーが許容されていないことを示し、1に等しい“enable_zdep_reorder”は、zdep_arrayのリオーダーが許容されていることを示す。
表10
表11
0である“reorder_flag”は、zdep_arrayが並べ替えられないことを示し、1である“reorder_flag”は、zdep_arrayが並べ替えられることを示す。
0である“signalled_flag”は、キューのロケーションnの内容が推測されることを示し、1である“signalled_flag”は、キューのロケーションnの内容がシグナリングされることを示す。
“qval_minus_one”は、キューのロケーションnの内容は、qval_minus_one + 1であることを示す。
更なる実施形態において、3Dオクトツリー(3D-Octree)構造、3Dタグツリー(3D-Tagtree)構造、3Dユニツリー(3D-Unitree)構造及び対応する符号化方法が、CU3Dを符号化するために使用されてもよい。
3Dオクトツリー・コーディング
図6に示すように、オクトツリー(八分木)605は、各々の内部ノード610が正確に8つの子ノード615を有するツリー・データ構造である。3Dオクトツリーは、それをz,y,x軸に従って8つのオクタント625に再帰的に分割することによって、3次元テンソル620を区分けするために使用される。
実施形態において、3Dオクトツリー構造は、CU3D内の係数の有意な(ゼロでない)状態を表すために使用されることが可能である。
CU3Dに対する3Dオクトツリーは、次のようにして構成される。最終深度における3Dオクトツリー・ロケーションに対するノード値1は、対応するCU3Dにおけるコードブック・インデックス(コードブック・コーディング方法が使用される場合)又は係数(ダイレクト量子化コーディング方法が使用される場合)が、ゼロ以外であることを示す。ボトム深度における3Dオクトツリー・ロケーションに対するノード値0は、対応するCU3Dにおけるコードブック・インデックス又は係数が、ゼロであることを示す。別の深度における3Dオクトツリー・ロケーションに対するノード値は、8つの子ノードの最大値又は最小値として定められる。
3Dオクトツリーが構築された後、各ノード値を符号化するために、所定のスキャン順序を使用して、すべてのノードがスキャンされる。
一実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、深度優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
別の実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、幅優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
ビットストリームのコンパクトな表現を得るために、幾つかのノード・スキップ方法が導入される。
別の深度における3Dオクトツリー・ロケーションに対するノード値が、8つの子ノードの最大値として定められる場合において、親ノードの値が0である場合、その子ノード(及びそれらの子ノード)のスキャン及び符号化は、それらの値は常に0であるはずであるのでスキップされる。親ノードの値が1であり、最後の子ノード以外のすべての値がすべて0である場合、最後の子ノードはそれでもスキャンされるが、その値の符号化は、それが常に1であるはずであるのでスキップされる。
別の深度における3Dオクトツリー・ロケーションに対するノード値が、8つの子ノードの最小値として定められる場合において、親ノードの値が1である場合、その子ノード(及びそれらの子ノード)のスキャン及び符号化は、それらの値が常に1であるはずであるのでスキップされる。親ノードの値が0であり、最後の子ノード以外のすべての値がすべて1である場合、最後の子ノードはそれでもスキャンされるが、その値の符号化は、それが常に0であるはずであるのでスキップされる。
encoding_start_depthは、符号化プロセスに関与する第1深度を示すために定められる。すべてのノードが所定のスキャン順序を使用してスキャンされる場合、現在のノード値の符号化は、このノードの深度がencoding_start_depthより上にあるならばスキップされる。
ボトム深度におけるノードの値が1である場合、対応する非ゼロ・コードブック・インデックスは、コードブック・コーディング方法が使用される場合に符号化される。ダイレクト量子化コーディング方法が使用される場合、対応する非ゼロ係数の符号ビットが符号化され、その後に非ゼロ係数の絶対値が続く。
異なる深度/高さ/幅を有する幾つかのCU3Dに関し、すべての親ノードが8つの子ノードすべてを利用可能にする完全な3Dオクトツリーを構築するのに十分な係数は存在しない。親ノードが8個すべての子ノードを有しない場合、これらの不存在の子ノードのスキャン及び符号化はスキップされる。
対応するシンタックス・テーブルの例を、以下の表12に示す:
表12
“nzflag” インデックスの非ゼロ・フラグ
“index” インデックス値
“sign” 量子化された係数の符号ビット
“abs_q” 量子化された係数の絶対値
3Dタグツリー・コーディング
実施形態では、CU3Dにおける係数の絶対値を表すために、3Dタグツリー構造が使用されてもよい。
CU3Dに対する3Dタグツリーは、次のようにして構成される。最終深度における3Dタグツリー・ロケーションに対するノード値は、対応するCU3Dにおけるコードブック・インデックスの絶対値(コードブック・コーディング方法が使用される場合)又は絶対係数(ダイレクト量子化コーディング方法が使用される場合)が、ゼロ以外であることを示す。別の深度における3Dタグツリー・ロケーションに対するノード値は、8つの子ノードの最大値又は最小値として定められる。
3Dタグツリーが構築された後、各ノード値を符号化するために、所定のスキャン順序を用いて、すべてのノードがスキャンされる。
一実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、深度優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
別の実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、幅優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
ノード値は、対応するノードが、親ノードを有しないトップ・ノードである場合に符号化される。任意の子ノードについて、親ノードと子ノードとの間の差分が符号化される。ビットストリームのコンパクトな表現を得るために、幾つかのノード・スキップ方法が導入される。
別の深度における3Dタグツリー・ロケーションに対するノード値が、8つの子ノードの最大値として定められる場合において、親ノードの値が0である場合、その子ノード(及びそれらの子ノード)のスキャン及び符号化は、それらの値は常に0であるはずであるのでスキップされる。親ノードの値がXであり、最後の子ノード以外のすべての値がXより小さい場合、最後の子ノードはそれでもスキャンされるが、その値の符号化は、それが常にXであるはずであるのでスキップされる。
別の深度における3Dタグツリー・ロケーションに対するノード値が、8つの子ノードの最小値として定められる場合において、親ノードの値がXであり、最後の子ノード以外のすべて値がXより大きい場合、最後の子ノードはそれでもスキャンされるが、その値の符号化は、それが常にXであるはずであるのでスキップされる。
encoding_start_depthは、符号化プロセスに関与する第1深度を示すために定められる。すべてのノードが所定のスキャン順序を使用してスキャンされる場合、現在のノード値の符号化は、このノードの深度がencoding_start_depthより上にあるならばスキップされる。このノードの深度がencoding_start_depthに等しい場合、親ノードとこの現在のノードとの間の差分の代わりに、実際の値が符号化される。
ボトム深度におけるノードの値が0ではなく、ダイレクト量子化コーディング方法が使用される場合、対応する非ゼロ係数の符号ビットが符号化される。
異なる深度/高さ/幅を有する幾つかのCU3Dに関し、すべての親ノードが8つの子ノードすべてを利用可能にする完全な3Dオクトツリーを構築するのに十分な係数は存在しない。親ノードが8個すべての子ノードを有しない場合、これらの不存在の子ノードのスキャン及び符号化はスキップされる。
対応するシンタックス・テーブルの例を、以下の表13に示す:
表13
“nzflag_index” インデックスの非ゼロ・フラグ
“index” インデックス値
“delta_index” index value = 親ノード・インデックス値 + delta_index
“nzflag_q” 量子化された係数の非ゼロ・フラグ
“abs_q” 量子化された係数の絶対値
“delta_abs_q” 量子化された係数の絶対値 = 親ノード値 + delta_abs_q
“sign_q” 量子化された係数の符号ビット
エスケープ・コーディング
コードブック・コーディング方法において、エスケープ・インデックスは、エスケープ・インデックスにより表される係数が、様々な量子化係数値を有することが可能であるという特殊なインデックスである。すべてのエスケープ・インデックスに対する量子化係数値は、ビットストリームで明示的に符号化されることを必要とする。
3Dオクトツリー又は3Dタグツリー・コーディングが完了した後に、エスケープ・コーディング・プロシジャは、コードブック・コーディング方法が使用される場合に開始される。すべてのコードブック・インデックスがスキャンされ、エスケープ・インデックスが発見された場合、対応する量子化係数値の非ゼロ・フラグは符号化される。係数値がゼロでない場合、符号ビットに続く量子化された係数値の絶対値が符号化される。
対応するシンタックス・テーブルの例を、以下の表14に示す:
表14
“nzflag” 非ゼロ・フラグ
“sign” 符号ビット
“abs_q” 量子化された係数q=(sign?-int(abs_q):abs_q)
CTU3Dヘッダ
符号化アルゴリズムは、3Dオクトツリー法と3Dタグツリー法の両方に使用するために適用され、より良いRDを有する1つのモードが勝者として選ばれる。モード決定が記録され、このCTU3D内のすべてのCU3Dが同じmap_modeを共有するかどうかを示すために、ctu3d_map_mode_flagが定められる。enable_start_depthは、CU3D符号化がボトム深度以外の深度から開始できるかどうかを示すためにも定められる。
対応するシンタックス・テーブルの例を、表15及び表16に示す:
表15
表16
0である“ctu3d_map_mode_flag”は、各cu3dが独自のmap_modeを使用することを示し、1である“ctu3d_map_mode_flag”は、すべてのcu3dが1つのmap_modeを共有することを示す。
0である“map_mode”は、3Dオクトツリー・コーディング方法が選択されることを示し、1である“map_mode”は、3Dタグツリー法が選択されることを示す。
0である“enable_start_depth” は、cu3d符号化がボトム深度で常に始まることを示し、1である“enable_start_depth” は、cu3d符号化がボトム深度以外の深度から始まる可能性があることを示す。
モード判定
符号化アルゴリズムは、3Dオクトツリー法と3Dタグツリー法の両方に使用するために適用され、より良いRDを有する1つのモードが勝者として選ばれる。モード判定は、CU3Dシンタックス・セクションにおいて記録される。encoding_start_depthは、CU3Dシンタックス・セクションでも記録される。
対応するシンタックス・テーブルの例を、表17に示す:
表17
0である“map_mode” は、3Dオクトツリー法が選択されることを示し、1である“map_mode” は、3Dタグツリー法が選択されることを示す。
“start_depth_delta”は、start_depth=total_depth-1-start_depth_deltaにおけるものである。
3Dユニツリー・コーディング
別の深度における3Dオクトツリー・ロケーションに対するノード値が、その8つの子ノードの最大値として定められる場合、ゼロに等しいノード値は、そのすべての子ノード(及びそれらの子ノード(最終深度におけるノードを含む))が、0である同一の値を有することを示す。最終深度におけるノードの0という値は、対応するコードブック・インデックス又は係数も0であることを示す。
実施形態では、上記の要件は緩和され、その結果、前述の同一値は0だけでなく任意の値となり得る。
CU3Dのための3Dユニツリーは、次のようにして構成される。最終深度以外の深度における3Dユニツリー・ロケーションに対するノード値1は、その子ノード(及びそれらの子ノード(最終深度におけるノードを含む))が、統一されていない(異なる)値を有することを示す。最終深度以外の深度における3Dユニツリー・ロケーションに対するノード値0は、その子ノード(及びそれらの子ノード(最終深度におけるノードを含む))が、統一された(同じ)値を有することを示す。
同一の親ノードを有する最終深度におけるノードに関し、これらのノードに1の値が割り当てられるのは、対応するCU3Dにおけるコードブック・インデックス(コードブック・コーディング方法が使用される場合)又は係数の絶対値(ダイレクト量子化コーディング方法が使用される場合)が、統一されていない場合である。これらのノードに0の値が割り当てられるのは、対応するCU3Dにおけるコードブック・インデックス(コードブック・コーディング方法が使用される場合)又は係数の絶対値(ダイレクト量子化コーディング方法が使用される場合)が、0を含む何らかの値のうちの統一された値を有する場合である。
3Dユニツリーが構築された後、各ノード値を符号化するために、措定のスキャン順序を使用して、すべてのノードがスキャンされる。
一実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、深度優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は、任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
別の実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、幅優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は、任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
所与のノードの値が符号化された後、ビットストリームのコンパクトな表現を持つために、対応する統一された値もノード値が0であるならば符号化されるが、その子ノード(及びそれらの子ノード)のスキャン及び符号化は、それらの値が常に統一値に等しいはずであるのでスキップされる。
encoding_start_depthは、符号化プロセスに関与する第1深度を示すために定められる。すべてのノードが所定のスキャン順序を使用してスキャンされる場合、現在のノード値の符号化は、このノードの深度がencoding_start_depthより上にあるならばスキップされる。
最終深度のノードに到達した場合において、encoding_start_depthが最終深度であるか、又はその親ノード値が0でない場合、対応するコードブック・インデックス又は係数はビットストリームに符号化される。そうでない場合において、ダイレクト量子化コーディング方法が使用され、その対応する統一値が0でない場合、係数の符号ビットがビットストリームに符号化される。
異なる深度/高さ/幅を有する幾つかのCU3Dに関し、すべての親ノードが8つの子ノードすべてを利用可能にする完全な3Dオクトツリーを構築するのに十分な係数は存在しない。親ノードが8個すべての子ノードを有しない場合、これらの不存在の子ノードのスキャン及び符号化はスキップされる。
対応するシンタックス・テーブルの例を、表18に示す:
表18
“nzflag” ユーツリー(utree)ノード値
“map_nzflag” 統一された値の非ゼロフラグ
“cmap_val” 統一された値のインデックス値
“qmap_val” 統一された量子化された係数の絶対値
“index” インデックス値
“sign” 量子化された係数の符号ビット
“abs_q” 量子化された係数の絶対値
“map_sign” 統一された量子化された係数の符号ビット
CTU3Dヘッダ
符号化アルゴリズムは、3Dオクトツリー法と3Dタグツリー法の両方に使用するために適用され、3Dユニツリー法は3Dオクトツリー法を使用する場合にも適用される。より良いRDを有する1つのモードが勝者として選ばれる。モード判定は記録され、このCTU3DにおけるすべてのCU3Dが同じmap_modeを共有するか否かを示すために、ctu3d_map_mode_flagが定められる。enable_start_depthは、CU3D符号化がボトム深度以外の深度から開始できるかどうかを示すためにも定められる。
モード判定
符号化アルゴリズムは、3Dオクトツリー法と3Dタグツリー法の両方に使用するために適用され、3Dユニツリー法は3Dオクトツリー法を使用する場合にも適用される。より良いRDを有する1つのモードが勝者として選ばれる。モード判定は、CU3Dシンタックス・セクションにおいて記録される。
対応するシンタックス・テーブルの例を、以下の表19に示す:
表19
0である“map_mode”は、3Dオクトツリー法が選択されることを示し、1である“map_mode”は、3Dタグツリー法が選択されることを示す。
“start_depth_delta”は、start_depth=total_depth-1-start_depth_deltaにおけるものである。
0である“uni_mode”は、3Dオクトツリー法が選択されることを示し、1である“uni_mode”は、3Dユニツリー法が選択されることを示す。
3Dツリー・コーディング方法の修正
原開示において、ツリー[z][y][x]は、3Dツリー(3Dオクトツリー、3Dユニツリー、3Dタグツリー)の最終深度におけるロケーション[z][y][x]にアクセスするために使用され、map[z][y][x]は、CU3Dのインデックス・マップにアクセスするために使用される。
zdep_array[n]は、カーネル平面のリオーダー操作前の元のn番目の2D平面を表現するので、カーネル平面のリオーダー操作は、z軸が、nではなくzdep_array[n]によってインデックスされることを必要とする。
実施形態において、符号化方法に関するz軸アクセスは、ツリー[zdep_array[z]][y][x]が、3Dツリー(3Dオクトツリー、3Dユニツリー又は3Dタグツリー)の最終深度におけるロケーション[z][y][x]にアクセスするために使用され、map[zdep_array[z]][y][x]が、CU3Dのインデックス・マップにアクセスするために使用されるように修正される。
対応するシンタックス・テーブル修正例を、以下の表20及び表21に示す:
表20:元のシンタックス・テーブル
最終深度における2D平面をアドレス指定するために、変数zs_idxが新しいz_idxとして定められる。
表21:修正されたシンタックス・テーブル
更なる実施形態では、追加の3Dタグツリー・モード、対応するフラグ、及び対応する符号化方法が、CU3Dを符号化するために使用される。
3Dタグツリー・モード判定
前述したように、3Dタグツリーの1つのバージョンでは、3Dタグツリー・ロケーションに対するノード値は、8つの子ノードの最大値(tagtree3d)として定められる。3Dタグツリーの別のバージョンでは、3Dタグツリー・ロケーションに対するノード値は、8つの子ノードの最小値(tagtree3dm)として定められる。3Dタグツリーの2つのバージョンのうちの1つは、CU3Dを符号化するために使用される。
代替的な実施形態において、3Dタグツリーの双方のバージョンが、CU3Dを符号化するために使用され、最良のRDを有する候補が勝者として選ばれる。
詳細に言えば、符号化アルゴリズムは、3Dオクトツリー法と3Dタグツリー法の両方を用いることができる。3Dユニツリー法は、3Dオクトツリー法が使用される場合に適用され、3Dタグツリー法が使用される場合に、3Dタグツリー法の双方のバージョンが適用される。より良いRDを有するモードが勝者として選ばれ、モード判定はcu3dシンタックス・セクションに記録される。
タグツリー3dモード判定のための対応するシンタックス・テーブルの例を、表22に示す:
表22
0である“map_mode”は、オクトツリー法が選択されることを示し、1である“map_mode”は、タグツリー3d法が選択されることを示す。
“start_depth_delta”は、start_depth=total_depth-1-start_depth_deltaにおけるものである。
0である“uni_mode”は、オクトツリー法が選択されることを示し、1である“uni_mode”は、ユニツリー3d法が選択されることを示す。
0である“tgt_mode”は、タグツリー3d法が選択されることを示し、1である“tgt_mode”は、タグツリー3d法バージョン2が選択されることを示す。
タグツリー3dコーディング方法1の対応するシンタックス・テーブルの例を、表23に示す:
表23
“nzflag_index” インデックスの非ゼロ・フラグ
“index” インデックス値
“delta_index” インデックス値 = 親ノード・インデックス値 - delta_index
“nzflag_q” 量子化された係数の非ゼロ・フラグ
“abs_q” 量子化された係数の絶対値
“delta_abs_q” 量子化された係数の絶対値 = 親ノード値 - delta_abs_q
“sign_q” 量子化された係数の符号ビット
タグツリー3dコーディング方法2の対応するシンタックス・テーブルの例を、表24に示す:
表24
“nzflag_index” インデックスの非ゼロ・フラグ
“index” インデックス値
“delta_index” インデックス値 = 親ノード・インデックス値 + delta_index
“nzflag_q” 量子化された係数の非ゼロ・フラグ
“abs_q” 量子化された係数の絶対値
“delta_abs_q” 量子化された係数の絶対値 = 親ノード値 + delta_abs_q
“sign_q” 量子化された係数の符号ビット
更なる実施形態では、追加の3Dタグツリー・モード、対応するフラグ、及び対応する符号化方法が、CU3Dを符号化するために使用される。
コンバインされた3Dユニツリー及びタグツリー・コーディング
統一された係数と統一されていない係数は、1つのCU3Dにおいて共存することが可能であり、そのため3Dユニツリー・コーディング方法と3Dタグツリー・コーディング方法とを組み合わせて、そのようなCU3Dを符号化することができる。
3Dタグツリーと3Dユニツリーの両方が、3Dタグツリーと3Dユニツリーの構築法を用いて構成される。3Dタグツリーと3Dユニツリーが構築された後、各ノード値を符号化するために、所定のスキャン順序を使用して、すべてのノードがスキャンされる。
一実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、深度優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は、任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
別の実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために、幅優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は、任意に決定されることが可能であり、例えば、(0,0,0)-> (0,0,1)-> (0,1,0)-> (0,1,1)-> (1,0,0)-> (1,0,1)-> (1,1,0)-> (1,1,1)である。
ビットストリームのコンパクトな表現を有するために、3Dユニツリーからの所与のノードの値が最初に符号化される。3Dユニツリー・ノード値がゼロである場合、対応する統一された値は符号化され、その子ノード(及びそれらの子ノード)のスキャニング及び符号化は、それらの値が常に統一値に等しいはずであるのでスキャンされる。3Dユニツリー・ノード値がゼロでない場合、ノードが親ノードを有しないトップ・ノードであるならば3Dタグツリー値、あるいは親ノードと子ノードとの間の3Dタグツリー値の差分の何れかを符号化するために、3Dタグツリー・コーディング方法が使用される。上記のタグツリー・コーディング・セクションで導入されるノード・スキップ方法も採用される。
encoding_start_depthは、符号化プロセスに関与する第1深度を示すために定められる。すべてのノードが所定のスキャン順序を使用してスキャンされる場合、このノードの深度がencoding_start_depthより上にあるならば、現在のノード値の符号化はスキップされる。
最終深度のノードに到達した場合において、ボトム深度におけるノードの値が0ではなく、ダイレクト量子化コーディング方法が使用される場合、対応する非ゼロ係数の符号ビットが符号化される。
異なる深度/高さ/幅を有する幾つかのCU3Dに関し、すべての親ノードが8つの子ノードすべてを利用可能にする完全な3Dオクトツリーを構築するのに十分な係数は存在しない。親ノードが8個すべての子ノードを有しない場合、これらの不存在の子ノードのスキャニング及び符号化はスキップされる。
コンバインされた2Dユニツリー及びタグツリー・コーディング
実施形態において、前述のコンバインされた3Dユニツリー及びタグツリー・コーディングはCU3Dを符号化するために使用される。更なる実施形態において、3Dオクトツリー構造を使用する代わりに、2D平面のシーケンスが独立して符号化され、各々の独立した2D平面に対して、四分木構造が、2Dユニツリー及び2Dタグツリーを構築するために使用される。
オクトツリー構造は、3Dタグツリー及び3Dユニツリーを表すために使用される。これらの実施形態では、四分木構造が、2Dタグツリー及び2Dユニツリーを表すために使用される。2Dタグツリー及び2Dユニツリーは、3Dタグツリー及び3Dユニツリーと同じ原理を用いて構築される。
2Dタグツリー及び2Dユニツリーが構築された後、すべてのノードは、所定のスキャン順序を用いて各ノード値を符号化するためにスキャンされる。
一実施形態では、トップ・ノードから開始して、すべての子ノードを通過するために深度優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は、(0,0)-> (0,1)-> (1,0)-> (1,1)のように任意に定めることが可能である。
他の実施形態では、トップ・ノードから開始して、すべての子ノードをスキャンするために幅優先探索が使用される。同じ親ノードを共有する子ノードに対するスキャン順序は、(0,0)-> (0,1)-> (1,0)-> (1,1)のように任意に定めることが可能である。
ビットストリームのコンパクトな表現を有するために、ユニツリーからの最初の所与のノードの値が最初に符号化される。ユニツリー・ノード値がゼロである場合、対応する統一された値は符号化され、その子ノード(及びそれらの子ノード)のスキャニング及び符号化は、それらの値が常に統一された値に等しいはずであるのでスキップされる。ユニツリー・ノード値がゼロでない場合、ノードが親ノードを有しないトップ・ノードであるならばタグツリー値、あるいは、親ノードとこの子ノードとの間のタグツリー値の差分のいずれかを符号化するために、タグツリー・コーディング方法が使用される。上記のタグツリー・コーディング・セクションで導入されるノード・スキップ方法も採用される。
encoding_start_depthは、符号化プロセスに関与する第1深度を示すために定められる。すべてのノードが所定のスキャン順序を使用してスキャンされる場合に、このノードの深度がencoding_start_depthよりも上であるならば、現在のノード値の符号化はスキップされる。
最終深度のノードに到達した場合において、ボトム深度におけるノードの値が0ではなく、ダイレクト量子化コーディング方法が使用される場合、対応する非ゼロ係数の符号ビットが符号化される。
1つの2D平面の符号化が完了した後に、次の2D平面は符号化され始める。このプロセスは、最後の2D平面が符号化されるまで繰り返される。
異なる高さ/幅を有する幾つかのCU3Dに関し、すべての親ノードが4つの子ノードすべてを利用可能にする完全な2D四分木を構築するのに十分な係数が存在しない。親ノードが4つの子ノードすべてを有しない場合、これらの不存在の子ノードのスキャニング及び符号化はスキップされる。
モード判定
他のコーディング方法と共に、コンバインされたユニツリー及びタグツリー・コーディング方法は、CU3Dを符号化するために使用されることが可能であり、コーディング方法の中で最良のRDを有する候補が勝者として選ばれる。
詳細に言えば、符号化アルゴリズムは、3Dオクトツリー法と3Dタグツリー法との両方を使用する。3Dオクトツリー法が使用される場合には3Dユニツリー法が適用され、3Dタグツリー法が使用される場合にはコンバインされたユニツリー・タグツリー法が適用される。3Dオクトツリー法及び3Dタグツリー法の中でより良いRDを有するモードが勝者として選ばれ、モード決定がcu3dシンタックス・セクションに記録される。
タグツリー3dモード決定に対する対応するシンタックス・テーブルの例を、以下の表25に示す:
表25
0である“map_mode”は、オクトツリー法が選択されることを示し、1である“map_mode”は、タグツリー3d法が選択されることを示す。
“start_depth_delta”は、start_depth=total_depth-1-start_depth_deltaにおけるものである。
0である“cbook_esc_mode”は、エスケープが並べ替えられないことを示し、1である“cbook_esc_mode”は、エスケープが並べ替えられることを示す。
0である“uni_mode”は、オクトツリー法が選択されることを示し、1である“uni_mode”は、ユニツリー3d法が選択されることを示す。
0である“tgt_mode”は、uni_tgtree3d法が選択されることを示し、1である“tgt_mode”は、タグツリー3d法が選択されることを示す。
uni_tagtree3dコーディング法に対する対応するシンタックス・テーブルの例を、以下の表26に示す:
表26
“nzflag_uni” ユーツリー・ノード値
“nzflag_index” インデックスの非ゼロ・フラグ
“index” インデックス値
“delta_index” インデックス値 = 親ノード・インデックス値 + delta_index
“nzflag_q” 量子化された係数の非ゼロ・フラグ
“abs_q” 量子化された係数の絶対値
“delta_abs_q” 量子化された係数の絶対値 = 親ノード値 + delta_abs_q
“sign_q” 量子化された係数の符号
図7は、実施形態によるニューラル・ネットワーク・モデル圧縮のための適応ブロック・パーティショニング方法700のフローチャートである。幾つかの実装において、図7の1つ以上のプロセス・ブロックは、プラットフォーム220によって実行されてもよい。幾つかの実装において、図7の1つ以上のプロセス・ブロックは、ユーザー・デバイス210のような、プラットフォーム220から分離されるか又はそれを含む、別のデバイス又はデバイス群によって実行されてもよい。
図7に示すように、オペレーション710において、方法700は、ニューラル・ネットワークの4次元(4D)パラメータ・テンソルを、ニューラル・ネットワークの3Dパラメータ・テンソルにリシェイプすることを含み、3Dパラメータ・テンソルは、畳み込みカーネル・サイズ、入力特徴サイズ、及び出力特徴サイズを含む。
オペレーション720において、方法700は、入力特徴サイズ及び出力特徴サイズにより形成される平面に従って3Dパラメータ・テンソルを、3Dコーディング・ツリー・ユニット(CTU3D)にパーティショニングすることを含む。
オペレーション730において、方法700は、CTU3Dの各々を、四分木を用いて最大深度まで再帰的に、複数の3Dコーディング・ユニット(CU3D)にパーティショニングすることを含む。最大深度は0になることが可能であり、それはCTU3DのCU3Dへのパーティションが必要とされないことを示すことに留意を要する。
オペレーション740において、方法700は、複数のCU3Dの各々について3Dツリーを構成することを含む。
オペレーション750において、方法700は、3Dツリーの複数のノードの複数の値の各々をエントロピー符号化することを含む。
3Dツリーは3Dオクトツリーであってもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスに基づいて、3Dオクトツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスに基づいて、3Dオクトツリーの最終深度に含まれるノードの値は0であってもよい。3Dオクトツリーの別の深度における親ノードの値は、親ノードに属する子ノードの最大値又は最小値であってもよい。
3Dツリーは3Dタグツリーであってもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は0であってもよい。3Dタグツリーの別の深度における親ノードの値は、親ノードに属する子ノードの最大値であってもよい。
方法700は、複数のCU3Dの各々について別の3Dタグツリーを構成することを含んでもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、別の3Dタグツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、別の3Dタグツリーの最終深度に含まれるノードの値は0であってもよい。別の3Dタグツリーの別の深度における親ノードの値は、別の3Dタグツリーの親ノードに属する子ノードの最小値であってもよい。方法700は、別の3Dタグツリーの複数のノードの複数の値の各々をエントロピー符号化するステップと、3Dタグツリー及び別の3Dタグツリーのうちより高いレート歪を有する方の複数のノードのエントロピー符号化された複数の値を選択するステップとを更に含んでもよい。
3Dツリーは3Dユニツリーであってもよい。異なる値を有する3Dユニツリーの最終深度以外の深度に含まれる親ノードに属する子ノードに基づいて、親ノードの値は1であってもよい。同じ値を有する親ノードに属する子ノードに基づいて、親ノードの値は0であってもよい。異なる値を有する複数のCU3Dの各々の係数の絶対値又はコードブック・インデックスに基づいて、最終深度に含まれるノードの値は1であってもよい。 同じ値を有する複数のCU3Dの各々の係数の絶対値又はコードブック・インデックスに基づいて、最終深度に含まれるノードの値は0であってもよい。
方法700は、複数のCU3Dの各々について3Dタグツリーを構成することを更に含んでもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は0であってもよい。3Dタグツリーの別の深度における親ノードの値は、3Dタグツリーの親ノードに属する子ノードの最小値であってもよい。3Dツリーの複数のノードの複数の値の各々をエントロピー符号化するステップは、3Dユニツリーの現在のノードの値をエントロピー符号化するステップと、0である3Dユニツリーの現在のノードのエントロピー符号化された値に基づいて、3Dユニツリーの現在のノードの子ノードの値をエントロピー符号化することをスキップするステップと、トップ・ノードである3Dユニツリーの現在のノード、及び0ではない3Dユニツリーの現在のノードのエントロピー符号化された値に基づいて、3Dユニツリーの現在のノードに対応する3Dタグツリーの現在のノードの値をエントロピー符号化するステップと、トップ・ノードではない3Dユニツリーの現在のノード、及び0ではない3Dユニツリーの現在のノードのエントロピー符号化された値に基づいて、3Dタグツリーの現在のノードの値と3Dタグツリーの現在のノードの親ノードの値との間の差分をエントロピー符号化するステップとを含んでもよい。
方法700は、CTU3D及び複数のCU3Dのうちの少なくとも1つにおいて、畳み込みカーネル・サイズにより形成される軸に沿って2次元(2D)平面をリオーダリングし、2D平面の順序にそれぞれ対応するリオーダー・インデックスを生成するステップと、CTU3D及び複数のCU3Dのうちの少なくとも1つのヘッダにおいてリオーダー・インデックスを符号化するステップとを更に含んでもよい。
図7は方法700の例示的なブロックを示しているが、幾つかの実装において方法700は、図7に示されているものに対して、追加のブロック、より少ないブロック、異なるブロック、又は別様に並べられたブロックを含んでもよい。追加的又は代替的に、方法700の2つ以上のブロックは、並行して実行されてもよい。
図8は、ニューラル・ネットワーク・モデル圧縮のための適応ブロック・パーティショニングのための実施形態による装置800の図である。図8に示されるように、装置800は、リシェイプ・コード810と、第1パーティショニング・コード820と、第2パーティショニング・コード830と、第1構成コード840と、第1エントロピー符号化コード850とを含む。
リシェイプ・コード810は、ニューラル・ネットワークの4次元(4D)パラメータ・テンソルを、ニューラル・ネットワークの3Dパラメータ・テンソルにリシェイプするステップを、装置800の少なくとも1つのプロセッサに実行させるように構成され、3Dパラメータ・テンソルは、畳み込みカーネル・サイズ、入力特徴サイズ、及び出力特徴サイズを含む。
第1パーティショニング・コード820は、入力特徴サイズ及び出力特徴サイズにより形成される平面に従って3Dパラメータ・テンソルを、3Dコーディング・ツリー・ユニット(CTU3D)にパーティショニングするステップを、少なくとも1つのプロセッサに実行させるように構成される。
第2パーティショニング・コード830は、CTU3Dの各々を、四分木を用いて最大深度まで再帰的に、複数の3Dコーディング・ユニット(CU3D)にパーティショニングするステップを、少なくとも1つのプロセッサに実行させるように構成される。
第1構成コード840は、複数のCU3Dの各々について3Dツリーを構成するステップを、少なくとも1つのプロセッサに実行させるように構成される。
第1エントロピー符号化コード850は、3Dツリーの複数のノードの複数の値の各々をエントロピー符号化するステップを、少なくとも1つのプロセッサに実行させるように構成される。
3Dツリーは3Dオクトツリーであってもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスに基づいて、3Dオクトツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスに基づいて、3Dオクトツリーの最終深度に含まれるノードの値は0であってもよい。3Dオクトツリーの別の深度における親ノードの値は、親ノードに属する子ノードの最大値又は最小値であってもよい。
3Dツリーは3Dタグツリーであってもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は0であってもよい。3Dタグツリーの別の深度における親ノードの値は、親ノードに属する子ノードの最大値であってもよい。
装置800は、複数のCU3Dの各々について別の3Dタグツリーを構成するステップを、少なくとも1つのプロセッサに実行させるように構成された第2構成コード860を更に含んでもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、別の3Dタグツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、別の3Dタグツリーの最終深度に含まれるノードの値は0であってもよい。別の3Dタグツリーの別の深度における親ノードの値は、別の3Dタグツリーの親ノードに属する子ノードの最小値であってもよい。装置800は、別の3Dタグツリーの複数のノードの複数の値の各々をエントロピー符号化するステップを、少なくとも1つのプロセッサに実行させるように構成された第2エントロピー符号化コード870と、3Dタグツリー及び別の3Dタグツリーのうちより高いレート歪を有する方の複数のノードのエントロピー符号化された複数の値を選択するステップを、少なくとも1つのプロセッサに実行させるように構成された選択コード880とを更に含んでもよい。
3Dツリーは3Dユニツリーであってもよい。異なる値を有する3Dユニツリーの最終深度以外の深度に含まれる親ノードに属する子ノードに基づいて、親ノードの値は1であってもよい。同じ値を有する親ノードに属する子ノードに基づいて、親ノードの値は0であってもよい。異なる値を有する複数のCU3Dの各々の係数の絶対値又はコードブック・インデックスに基づいて、最終深度に含まれるノードの値は1であってもよい。 同じ値を有する複数のCU3Dの各々の係数の絶対値又はコードブック・インデックスに基づいて、最終深度に含まれるノードの値は0であってもよい。
第2構成コード860は、複数のCU3Dの各々について3Dタグツリーを構成するステップを、少なくとも1つのプロセッサに実行させるように更に構成されてもよい。0ではない複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は1であってもよい。0である複数のCU3Dの各々の係数又はコードブック・インデックスの絶対値に基づいて、3Dタグツリーの最終深度に含まれるノードの値は0であってもよい。3Dタグツリーの別の深度における親ノードの値は、3Dタグツリーの親ノードに属する子ノードの最小値であってもよい。第1エントロピー符号化コード850は、3Dユニツリーの現在のノードの値をエントロピー符号化するステップと、0である3Dユニツリーの現在のノードのエントロピー符号化された値に基づいて、3Dユニツリーの現在のノードの子ノードの値をエントロピー符号化することをスキップするステップと、トップ・ノードである3Dユニツリーの現在のノード、及び0ではない3Dユニツリーの現在のノードのエントロピー符号化された値に基づいて、3Dユニツリーの現在のノードに対応する3Dタグツリーの現在のノードの値をエントロピー符号化するステップと、トップ・ノードではない3Dユニツリーの現在のノード、及び0ではない3Dユニツリーの現在のノードのエントロピー符号化された値に基づいて、3Dタグツリーの現在のノードの値と3Dタグツリーの現在のノードの親ノードの値との間の差分をエントロピー符号化するステップとを、少なくとも1つのプロセッサに実行させるように更に構成されてもよい。
装置800は、CTU3D及び複数のCU3Dのうちの少なくとも1つにおいて、畳み込みカーネル・サイズにより形成される軸に沿って2次元(2D)平面をリオーダリングし、2D平面の順序にそれぞれ対応するリオーダー・インデックスを生成するステップを、少なくとも1つのプロセッサに実行させるように構成されたリオーダリング・コード890と、CTU3D及び複数のCU3Dのうちの少なくとも1つのヘッダにおいてリオーダー・インデックスを符号化するステップを、少なくとも1つのプロセッサに実行させるように構成された符号化コード900とを更に含んでもよい。
前述の開示は、図示及び説明を提供しているが、網羅的であるようには、あるいは開示された正確な形態に実装を限定するようには意図されていない。修正及び変形が、上記の開示に照らして可能であり、あるいは実装の慣例から把握されることが可能である。
本願で使用されるように、構成要素という用語は、ハードウェア、ファームウェア、又はハードウェアとソフトウェアの組み合わせとして広く解釈されるように意図されている。
本願で説明されるシステム及び/又は方法は、ハードウェア、ファームウェア、又はハードウェアとソフトウェアの組み合わせの様々な形態で実装されてもよいことは明らかであろう。これらのシステム及び/又は方法を実現するために使用される実際の特化された制御ハードウェア又はソフトウェア・コードは、実施を制限するものではない。従って、システム及び/又は方法の動作及び挙動は、特定のソフトウェア・コードを参照することなく本願で説明されており、ソフトウェア及びハードウェアは、本願における説明に基づいてシステム及び/又は方法を実現するように設計されてもよいことが理解される。
特徴の組み合わせが特許請求の範囲に記載され、及び/又は明細書に開示されていたとしても、これらの組み合わせは、可能な実装の開示を限定するようには意図されていない。実際、これらの特徴の多くは、特許請求の範囲に具体的に記載されていない、及び/又は明細書に開示されていない方法で、組み合わせられることが可能である。以下に列挙される各従属クレームは、1のクレームのみに直接依存するかもしれないが、可能な実装の開示は、各従属クレームを、一群のクレームにおける他の全てのクレームとの組み合わせで含んでいる。
本願で使用される要素、動作、又は命令は、明示的に記述されていない限り、クリティカル又はエッセンシャルとして解釈されてもよい。また、本願で使用されるように「ある(“a” and “an”)」という不定冠詞的な語は、1つ以上のアイテムを含むように意図されており、「1つ以上」と可換に使用されてもよい。更に、本願で使用されるように「セット」という用語は、1つ以上のアイテム(例えば、関連するアイテム、非関連アイテム、関連するアイテムと非関連アイテムとの組み合わせ等)を含むように意図されており、「1つ以上」と可換に使用されてもよい。1つのアイテムのみが意図される場合、用語「1つ」又は類似の言語が使用される。また、本願で使用されるように、用語「有する」、「有している」又は類似の用語は、オープン・エンドの用語であるように意図されている。更に、「~に基づいて」という用語は、明示的に言及しない限り、「~に少なくとも部分的に基づいて」を意味するように意図されている。