(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024151760
(43)【公開日】2024-10-25
(54)【発明の名称】3Dデータ符号化装置および3Dデータ復号装置
(51)【国際特許分類】
H04N 19/597 20140101AFI20241018BHJP
H04N 19/70 20140101ALI20241018BHJP
H04N 19/82 20140101ALI20241018BHJP
【FI】
H04N19/597
H04N19/70
H04N19/82
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2023065409
(22)【出願日】2023-04-13
【国等の委託研究の成果に係る記載事項】(出願人による申告)令和4年度、総務省、「戦略的情報通信研究開発推進事業(国際標準獲得型(5G高度化))/3次元空間データの無線伝送に向けた高能率圧縮技術の研究開発」、産業技術力強化法第17条の適用を受ける特許出願
(71)【出願人】
【識別番号】000005049
【氏名又は名称】シャープ株式会社
(74)【代理人】
【識別番号】100161207
【弁理士】
【氏名又は名称】西澤 和純
(74)【代理人】
【識別番号】100129115
【弁理士】
【氏名又は名称】三木 雅夫
(74)【代理人】
【識別番号】100133569
【弁理士】
【氏名又は名称】野村 進
(74)【代理人】
【識別番号】100131473
【弁理士】
【氏名又は名称】覚田 功二
(72)【発明者】
【氏名】高田 圭一郎
(72)【発明者】
【氏名】徳毛 靖昭
(72)【発明者】
【氏名】猪飼 知宏
(72)【発明者】
【氏名】中條 健
(72)【発明者】
【氏名】青野 友子
【テーマコード(参考)】
5C159
【Fターム(参考)】
5C159MA31
5C159PP03
5C159PP13
5C159RC12
5C159TA69
5C159TD17
5C159UA02
5C159UA05
5C159UA16
(57)【要約】
【課題】異なる特性を有する3次元データに対して異なるフィルタを適用できない。
【解決手段】符号化データを復号しアトリビュート情報を含む3Dデータを復号する3Dデータ復号装置において、ポストフィルタの特性情報とポストフィルタのアクティブ化情報を復号するヘッダ復号部と、アトリビュート画像もしくはジオメトリ画像のポストフィルタ処理を行うフレーム画像フィルタ部を備え、ヘッダ復号部は、ポストフィルタの特性情報およびアクティブ化情報として、線形フィルタあるいはニューラルネットワークフィルタのいずれかの特性情報およびアクティブ化情報を復号する。
【選択図】
図18
【特許請求の範囲】
【請求項1】
符号化データを復号しアトリビュート情報を含む3Dデータを復号する3Dデータ復号装置において、
上記符号化データからポストフィルタの特性情報とポストフィルタのアクティブ化情報を復号するヘッダ復号部と、
上記符号化データからジオメトリ画像を復号するジオメトリ画像復号部と、
上記符号化データからアトリビュート画像を復号するアトリビュート画像復号部と、
上記アトリビュート画像もしくはジオメトリ画像のポストフィルタ処理を行うフレーム画像フィルタ部を備え、
上記ヘッダ復号部は、V3C unit headerからアトラスの識別子、上記アクティブ化情報からマップ数、上記ポストフィルタの特性情報の識別子、キャンセルフラグ、持続性情報を復号することを特徴とする3Dデータ復号装置。
【請求項2】
上記ヘッダ復号部は、上記ポストフィルタの特性情報およびアクティブ化情報として、線形フィルタの特性情報およびアクティブ化情報を復号することを特徴とする請求項1に記載の3Dデータ復号装置。
【請求項3】
上記ヘッダ復号部は、上記ポストフィルタの特性情報およびアクティブ化情報として、線形フィルタの特性情報およびアクティブ化情報、あるいは、ニューラルネットワークフィルタの特性情報およびアクティブ化情報のいずれかを復号することを特徴とする請求項1に記載の3Dデータ復号装置。
【請求項4】
上記ヘッダ復号部は、上記ポストフィルタのアクティブ化情報として、線形フィルタのフィルタパラメータを復号することを特徴とする請求項1に記載の3Dデータ復号装置。
【請求項5】
上記ヘッダ復号部は、線形フィルタのアクティブ化情報として、対象ピクチャに適用するフィルタが直前に使用したフィルタと同じであるか否かを示すパラメータを復号することを特徴とする請求項1に記載の3Dデータ復号装置。
【請求項6】
符号化データを符号化しアトリビュート情報を含む3Dデータを符号化する3Dデータ符号化装置において、
ポストフィルタの特性情報とニューラルネットワークポストフィルタのアクティブ化情報を符号化するヘッダ符号化部と、
ジオメトリ画像を符号化するジオメトリ画像符号化部と、
アトリビュート画像を符号化するアトリビュート画像符号化部と、
上記アトリビュート画像もしくはジオメトリ画像のポストフィルタ処理を行うフレーム画像フィルタ部を備え、
上記ヘッダ符号化部は、V3C unit headerとしてアトラスの識別子、上記アクティブ化情報としてマップ数、上記ポストフィルタの特性情報の識別子、キャンセルフラグ、持続性情報を符号化することを特徴とする3Dデータ符号化装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、3Dデータ符号化装置および3Dデータ復号装置に関する。
【背景技術】
【0002】
3Dデータを効率的に伝送または記録するために、3Dデータを2次元画像に変換し動画像符号化方式で符号化して符号化データを生成する3Dデータ符号化装置、および、当該符号化データから2次元画像を復号して、再構成し、3Dデータを生成する3Dデータ復号装置がある。また、2次元画像に深層学習ポストフィルタの補助拡張情報を用いてフィルタ処理する技術がある。
【0003】
具体的な3Dデータ符号化方式としては、例えば、MPEG-IのISO/IEC 23090-5 V3C (Volumetric Video-based Coding) and V-PCC (Video-based Point Cloud Compression)が挙げられる。V3Cは、点の位置と属性(アトリビュート)情報から構成されるポイントクラウドの符号化、復号に利用される。さらに、ISO/IEC 23090-12 (MPEG Immersive Video、MIV)及び標準化中のISO/IEC 23090-29 (Video-based Dynamic Mesh Coding、V-DMC)により、多視点映像、メッシュ映像の符号化、復号にも利用される。また、非特許文献1のニューラルネットワークポストフィルタの補助拡張情報では、ニューラルネットワークのモデル情報を特性SEIで伝送し、適用SEIで指定したフレームに対して呼び出すことにより、点群データに対して適応的なフィルタ処理を可能にすることができる。
【先行技術文献】
【非特許文献】
【0004】
【非特許文献1】K.Takada, Y.Tokumo, T.Chujoh. T.Ikai,“[V-PCC][EE2.8] V3C neural-network post-filter SEI messages,” ISO/IEC JTC 1/SC 29/WG7, m61805, Jan. 2023
【発明の概要】
【発明が解決しようとする課題】
【0005】
非特許文献1では、異なる特性を有する3次元データに対してフィルタ処理を行う場合には不適当な場合が存在する。具体的にはNearとFarの異なるMapに対して異なるフィルタを適用できないという課題がある。また、ジオメトリとアトリビュートに対して異なるフィルタを適用することができないという課題があった。
【0006】
本発明は、動画像符号化方式を用いた3Dデータの符号化・復号において、上記課題を解決し、ポストフィルタの補助情報を用いてさらに符号化歪を低減し、3Dデータを高品質に符号化・復号することを目的とする。
【課題を解決するための手段】
【0007】
上記の課題を解決するために、本発明の一態様に係る3Dデータ復号装置は、符号化データを復号しアトリビュート情報を含む3Dデータを復号する3Dデータ復号装置であって、上記符号化データからポストフィルタの特性情報とポストフィルタのアクティブ化情報を復号するヘッダ復号部と、上記符号化データからジオメトリ画像を復号するジオメトリ画像復号部と、上記符号化データからアトリビュート画像を復号するアトリビュート画像復号部と、上記アトリビュート画像もしくはジオメトリ画像のポストフィルタ処理を行うフレーム画像フィルタ部を備え、上記ヘッダ復号部は、V3C unit headerからアトラスの識別子atlasID、上記アクティブ化情報からマップ数、上記ポストフィルタの特性情報の識別子、キャンセルフラグ、持続性情報を復号することを特徴とする。
【0008】
本発明の一態様に係る3Dデータ復号装置のヘッダ復号部は、上記ポストフィルタの特性情報およびアクティブ化情報として、線形フィルタの特性情報およびアクティブ化情報を復号することを特徴とする。
【発明の効果】
【0009】
本発明の一態様によれば、カラー画像の符号化による歪を低減し、3Dデータを高品質に符号化・復号することができる。
【図面の簡単な説明】
【0010】
【
図1】本実施形態に係る3Dデータ伝送システムの構成を示す概略図である。
【
図2】符号化ストリームのデータの階層構造を示す図である。
【
図3】3Dデータ、オキュパンシマップ、ジオメトリ画像、アトリビュート画像を説明するための図である。
【
図4】ジオメトリ画像及びアトリビュート画像のレイヤ構造を説明するための図である。
【
図5】本発明の実施形態に係る特性SEIと適用SEIの関係を示す図である。
【
図6】本発明の実施形態に係る3Dデータ復号装置31の概略構成を示す機能ブロック図である。
【
図7】フレーム画像フィルタ部308の構成を示す機能ブロック図である。
【
図8】フレーム画像フィルタ部308の構成を示す機能ブロック図である。
【
図9】本発明の実施形態に係る3Dデータ符号化装置11の概略構成を示す機能ブロック図である。
【
図10】SEIの復号処理を示したフローチャートである。
【
図11】ニューラルネットワークポストフィルタ特性SEIメッセージのシンタックスの例である。
【
図12】マップ単位構成のポストフィルタ適用SEIメッセージのシンタックスの例である。
【
図13】本発明の実施形態に係る3Dデータ符号化装置、3Dデータ復号装置とSEIメッセージの関係を示す図である。
【
図14】マップ単位構成のポストフィルタ適用SEIメッセージのシンタックスの例である。
【
図15】アトリビュートおよびマップ単位構成のポストフィルタ適用SEIメッセージのシンタックスの例である。
【
図16】ジオメトリのポストフィルタ適用SEIメッセージのシンタックスの例である。
【
図17】線形フィルタの特性SEIメッセージのシンタックスの例である。
【
図18】NNフィルタおよび線形フィルタ共通の特性SEIメッセージのシンタックスの例である。
【
図19】線形の特性SEIメッセージ、適用SEIメッセージのシンタックスの例である。
【
図20】線形の適用SEIメッセージのシンタックスの例である。
【
図21】フィルタパラメータのシンタックスの例である。
【
図22】効率的なポストフィルタ適用SEIメッセージのシンタックスの例である。
【
図23】効率的なポストフィルタ適用SEIメッセージのシンタックスの例である。
【
図24】NNフィルタと線形フィルタを切り替える適用SEIメッセージのシンタックスの例である。
【
図25】ニューラルネットワークポストフィルタ適用SEIメッセージのシンタックスの例である。
【発明を実施するための形態】
【0011】
以下、図面を参照しながら本発明の実施形態について説明する。
【0012】
図1は、本実施形態に係る3Dデータ伝送システム1の構成を示す概略図である。
【0013】
3Dデータ伝送システム1は、符号化対象3Dデータを符号化した符号化ストリームを伝送し、伝送された符号化ストリームを復号し3Dデータを表示するシステムである。3Dデータ伝送システム1は、3Dデータ符号化装置11、ネットワーク21、3Dデータ復号装置31、及び3Dデータ表示装置41を含んで構成される。
【0014】
3Dデータ符号化装置11には3DデータTが入力される。
【0015】
ネットワーク21は、3Dデータ符号化装置11が生成した符号化ストリームTeを3Dデータ復号装置31に伝送する。ネットワーク21は、インターネット(Internet)、広域ネットワーク(WAN:Wide Area Network)、小規模ネットワーク(LAN:Local Area Network)またはこれらの組み合わせである。ネットワーク21は、必ずしも双方向の通信網に限らず、地上デジタル放送、衛星放送等の放送波を伝送する一方向の通信網であっても良い。また、ネットワーク21は、DVD(Digital Versatile Disc:登録商標)、BD(Blu-ray Disc:登録商標)等の符号化ストリームTeを記録した記憶媒体で代替されても良い。
【0016】
3Dデータ復号装置31は、ネットワーク21が伝送した符号化ストリームTeのそれぞれを復号し、復号した1または複数の復号3DデータTdを生成する。
【0017】
3Dデータ表示装置41は、3Dデータ復号装置31が生成した1または複数の復号3DデータTdの全部または一部を表示する。3Dデータ表示装置41は、例えば、液晶ディスプレイ、有機EL(Electro-luminescence)ディスプレイ等の表示デバイスを備える。ディスプレイの形態としては、据え置き、モバイル、HMD等が挙げられる。また、3Dデータ復号装置31が高い処理能力を有する場合には、画質の高い画像を表示し、より低い処理能力しか有しない場合には、高い処理能力、表示能力を必要としない画像を表示する。
【0018】
<演算子>
本明細書で用いる演算子を以下に記載する。
【0019】
>>は右ビットシフト、<<は左ビットシフト、&はビットワイズAND、|はビットワイズOR、|=はOR代入演算子であり、||は論理和を示す。
【0020】
x?y:zは、xが真(0以外)の場合にy、xが偽(0)の場合にzをとる3項演算子である
y..zは、yからzの整数のセットを示す。
【0021】
Floor(a)はa以下の最大の整数を返す関数である。
【0022】
<符号化ストリームTeの構造>
3Dデータ符号化装置11によって生成され、3Dデータ復号装置31によって復号される符号化ストリームTeのデータ構造について説明する。
【0023】
図2は、符号化ストリームTeにおけるデータの階層構造を示す図である。符号化ストリームTeは、V3C sample stream、V3C unit streamの何れかのデータ構造を有する。V3C sample streamは、sample stream headerとV3C unitを含むが、V3C unit stream はV3C unitを含む。
【0024】
V3C unitはV3C unit headerとV3C unit payloadを含む。V3C unitの先頭(=V3C unit header)はV3C unitの種類を示すIDであるUnit Typeであり、V3C_VPS、V3C_AD、V3C_AVD、V3C_GVD、V3C_OVDなどのラベルで示す値をとる。
【0025】
Unit TypeがV3C_VPS (Video Parameter Set)の場合には、V3C unit payloadはV3C parameter setを含む。
【0026】
Unit TypeがV3C_AD (Atlas Data、Atlasデータ)の場合には、V3C unit payloadはVPS ID、atlasID、sample stream nal headerと複数のNAL unitを含む。IDはIdenficationの略であり0以上の整数値をとる。このatlasIDは、適用SEIの要素として利用してもよい。
【0027】
NAL unitはNALUnitTypeとlayerIDとTemporalIDとRBSP (Raw byte sequence payload)を含む。
【0028】
NAL unitはNALUnitTypeにより識別され、ASPS (Atlas Sequence Parameter Set)、AAPS (Atlas Adaptation Parameter Set)、ATL (Atlas Tile layer)、SEI (Supplemental Enhancement Information)などを含む。
【0029】
ATLは、ATL headerとATL data unitを含み、ATL data unitは、patch information dataなどのパッチの位置、サイズなどの情報を含む。
【0030】
SEIは、SEIの種類を示すpayloadType、SEIのサイズ(バイト数)を示すpayloadSize、SEIのデータのsei_payloadを含む。
【0031】
UnitTypeがV3C_AVD (Attribute Video Data、アトリビュートデータ)の場合には、VPS ID、atlasID、アトリビュート画像のIDのattrIdx、パーティションIDのpartIdx、マップIDのmapIdx、Auxiliaryデータか否かを示すフラグauxFlag、video streamを含む。video streamはHEVCやVVCなどのデータを示す。
【0032】
UnitTypeがV3C_GVD (Geometory Video Data、ジオメトリデータ)の場合には、VPS ID、atlasID、mapIdx、auxFlag、video streamを含む。
【0033】
UnitTypeがV3C_OVD (Occumancy Video Data、オキュパンシデータ)の場合には、VPS ID、atlasID、video streamを含む。
【0034】
(3次元立体情報のデータ構造)
本明細書の3次元立体情報(3Dデータ)は、3次元空間上の位置情報(x, y, z)と属性(アトリビュート)情報の集合である。例えば3Dデータは、3次元空間上の位置情報とアトリビュート情報の点群であるポイントクラウド、三角形の頂点と面からなるメッシュ(もしくはポリゴン)形式で表現される。
【0035】
図3は、3Dデータ、オキュパンシマップ、ジオメトリ画像(位置情報)、アトリビュート画像を説明するための図である。3Dデータを構成するポイントクラウド及びメッシュは、3Dデータ符号化装置11によって、複数の部分(領域)に分割され、各部分に含まれる点群は3D空間上に設定された3Dバウンディングボックス(
図3(a))のいずれかの平面に投影される。3Dデータ符号化装置11は投影した点群から複数のパッチを生成する。3Dバウンディングボックスに関する情報(座標、サイズなど)、投影面へのマッピングに関する情報(各パッチの投影面、座標、サイズ、回転有無など)をアトラス情報と呼ぶ。オキュパンシマップは、各パッチの有効領域(ポイントクラウド、メッシュが存在する領域)を2Dバイナリ画像(例えば有効領域を1、無効領域を0)として示した画像である(
図3(b))。なお有効領域、無効領域の値は255と0など、0、1以外の値を用いてもよい。ジオメトリ画像は、各パッチの投影面に対するデプス値(距離)を示す画像である(
図3(c))。デプス値と画素値の関係は線形であってもよいし、ルックアップテーブルや数式、または、値による分岐の組み合わせによる関係式により、画素値から距離を導出してもよい。アトリビュート画像は、ポイントのアトリビュート(例えばRGBの色)を示す画像である。なお、これらオキュパンシマップ画像、ジオメトリ画像、アトリビュート画像、アトラス情報は、異なる投影面からの部分画像(パッチ)をある2次元画像上にマッピングした(パッキングした)画像であってもよい。アトラス情報は、パッチの数やパッチに対応する投影面の情報を含む。3Dデータ復号装置12は、アトラス情報、オキュパンシマップ、ジオメトリ画像、アトリビュート画像から、点群もしくはメッシュの座標とアトリビュート情報を再構成する。ここではポイントとは、ポイントクラウドの各点もしくはメッシュの頂点である。なお、オキュパンシマップ画像、ジオメトリ画像の代わりに、メッシュの頂点を示すメッシュ情報(位置情報)を符号化、復号、伝送してもよい。またメッシュ情報は、メッシュの部分集合である基本メッシュを構成するベースメッシュと、基本メッシュ以外のメッシュを示すための、ベースメッシュからの変位を示すメッシュ変位に分割して符号化、復号、伝送してもよい。
【0036】
図4は、ジオメトリ画像及びアトリビュート画像のレイヤ構造を説明するための図である。ジオメトリ画像やアトリビュート画像は各々複数の画像(レイヤ、マップ)から構成されてもよい。例えばNearレイヤとFarレイヤを備えてもよい。ここで、NearレイヤとFarレイヤは各々、ある投影面からみたデプスが互いに異なるジオメトリ、アトリビュートを構成する映像である。Nearレイヤとは、投影面の各画素に対してデプスが最小となるポイントの集合であってもよい。Farレイヤとは、投影面の各画素に対して所定の範囲(例えばNearレイヤから距離dの範囲)内においてデプスが最大となるポイントの集合であってもよい。また、NearレイヤをmapIdx=0、FarレイヤをmapIdx=1のように、mapIdxを用いて識別できるように符号化してもよい。また、マップは0, 1に限定されず、さらに多くのマップを用いてもよい。また図に示すように、ジオメトリ画像符号化部106は、Nearレイヤの画像(
図4の画像0,2,4,…,2N)を画面内ピクチャ(Iピクチャ)、Farレイヤのジオメトリ画像(
図4の画像1,3,5,…,2N+1)を画面間ピクチャ(PピクチャもしくはBピクチャ)として符号化してもよい。
【0037】
(特性SEIと適用SEIの概要)
図5(a)は本発明の実施形態に係るポストフィルタ特性SEI(以下特性SEI、NNFPC_SEI、特性情報)とポストフィルタ適用SEI(以下適用SEI、NNFPA_SEI、アクティブ化SEI、アクティブ化情報)の関係を示す図である。NNC復号部は、特性SEIで伝送される圧縮されたNN(ニューラルネットワーク)モデルを復号し、NNモデルを導出する。NNモデルの符号化、復号には、MPEG Neural Network Coding (ISO/IEC 15938-19)を用いてもよい。NNフィルタ部611は、導出されたNNモデルを用いたアトリビュート画像にフィルタ処理を行う。NNフィルタ部611の詳細は後述する。フィルタ処理に用いる特性SEIは適用SEIが備えるシンタックス要素、例えば、ポストフィルタの特性情報の識別子nnpfa_target_idによって指定される。適用SEIは、シンタックス要素を用いて持続性情報を伝送し、持続性情報で指定される持続期間においてアトリビュート画像にフィルタ処理を行うことを指定する。なお、NNフィルタ部611は、NNC復号部を備えてもよい。適用SEI(アクティブ化情報)は、
図2のSEIに限定されず、NAL unitや、アトラスデータを含むデータであってもよい。
【0038】
図5(b)は本発明の実施形態に係るポストフィルタ特性SEI(以下特性SEI、特性情報)とポストフィルタ適用SEI(以下適用SEI、アクティブ化SEI、アクティブ化情報)の関係を示す図である。フィルタパラメータ復号部は、特性SEIで伝送されるフィルタパラメータのシンタックスを復号し、線形モデルを導出する。線形ポストフィルタは、例えばAdaptive Loop Filter(ALF)であってもよい。ALFと記載するが、ループフィルタに限定されず、ポストフィルタであってもよい。また、線形と記載するが簡単なクリップや2乗成分などの非線形要素を含んでいてもよい。ALF部610は、導出された線形モデルを用いたアトリビュート画像あるいはジオメトリ画像にフィルタ処理を行う。フィルタ処理に用いる特性SEIは適用SEIが備えるシンタックス要素、例えば、ポストフィルタの特性情報の識別子lmpfa_target_idによって指定される。適用SEIは、シンタックス要素を用いて持続性情報を伝送し、持続性情報で指定される持続期間において、アトリビュート画像あるいはジオメトリ画像にフィルタ処理を行うことを指定する。
【0039】
なお、特性SEIと適用SEIは、フィルタがニューラルネットワークであっても線形であってもよく、以下の説明では、シンタックス要素名の最初の"nn"やSEI名のNNはニューラルネットワークに限定されない。ただし、線形専用の特性SEIや適用SEI、あるいは、ニューラルネットワーク専用の特性SEIや適用SEIを用いてもよい。"lm"は線形モデル専用であることを表す。
【0040】
(3Dデータ復号装置の構成)
図6は、本発明の実施形態に係る3Dデータ復号装置31の概略構成を示す機能ブロック図である。
【0041】
3Dデータ復号装置31は、ヘッダ復号部301、アトラス情報復号部302、オキュパンシマップ復号部303、ジオメトリ画像復号部304、ジオメトリ再構成部306、アトリビュート画像復号部307、フレーム画像フィルタ部308、アトリビュート再構成部309、3Dデータ再構成部310から構成される。フレーム画像フィルタ部308の処理はポストフィルタであってもよい。
【0042】
ヘッダ復号部301は、バイトストリームフォーマット、ISOBMFF(ISO Base Media File Format)などで多重化された符号化データ(ビットストリーム)を入力し、逆多重化して、アトラス情報符号化ストリーム、オキュパンシマップ符号化ストリーム(V3C_OVDのvideo stream)、ジオメトリ画像符号化ストリーム(V3C_GVDのvideo stream)、アトリビュート画像符号化ストリーム(V3C_AVDのvideo stream)、フィルタパラメータを出力する。
【0043】
ヘッダ復号部301は、符号化データから、ポストフィルタ処理の特性を示す特性SEIを復号する。さらに、ヘッダ復号部301は、符号化データから、適用SEIを復号する。例えば、ヘッダ復号部301は、特性SEIからnnpfc_id, nnpfc_purposeを復号し、適用SEIからnnpfa_atlas_id, nnpfa_attribute_count、nnpfa_cancel_flagを復号する。nnpfc_idはポストフィルタを同定するために使用する識別子である。また、ヘッダ復号部301は、アトリビュート画像単位もしくはマップ単位、アトリビュート画像かつマップ単位でnnpfa_target_id, nnpfa_weight_block_size_idx, nnpfa_weight_map_width_minus1, nnpfa_weight_map_height_minus1, nnpfa_weight_map, nnpfa_strength_block_size_idx, nnpfa_strength_map_width_minus1, nnpfa_strength_map_height_minus1, nnpfa_strength_mapを復号してもよい。
【0044】
図25は、適用SEIのnn_post_filter_activationのシンタックス構成例を示す。iは図示しないatlasIDの示す対象アトラスに含まれるアトリビュート画像を識別するための値でありi=attrIdx、jはマップを識別するための値でありmapIdx=jである。
【0045】
nnpfa_enabled_flag[i][j]が0のとき、attrIdx=i、mapIdx=jの画像に対してポストフィルタによる処理を行わない。nnpfa_enabled_flag[i][j]が1のとき、attrIdx=i、mapIdx=jの画像におけるnnpfa_target_id[i][j]、ポストフィルタの重みを示す値nnpfa_weight_map[i][j][yIdx][xIdx]を復号する。
【0046】
nnpfa_weight_block_size_idx[i][j]は、attrIdx=i、mapIdx=jの画像のフィルタの重み係数を示す2次元マップのサイズを示す。サイズは((1<<weightSizeShift) x (1<<weightSizeShift))と等しい。なおweightSizeShift==0の場合には、画像を画面内で分割せず全画面を1単位で処理することを示す。
【0047】
weightSizeShift[i]==nnpfa_weight_block_size_idx==0 ? 0 : nnpfa_weight_block_size_idx[i]+5
nnpfa_weight_map_width_minus1[i][j]は、フィルタの重み係数を示す2次元マップの幅-1を示す。符号化データのシンタックスに現れない場合にはnnpfa_weight_map_width_minus1=0と推定する。
【0048】
nnpfa_weight_map_height_minus1[i][j]は、フィルタの重み係数を示す2次元マップの高さ-1を示す。符号化データのシンタックスに現れない場合にはnnpfa_weight_map_height_minus1=0と推定する。
【0049】
nnpfa_weight_map[i][j][yIdx][xIdx]は、attrIdx=i、mapIdx=jの画像の(xIdx, yIdx)ブロックにおけるフィルタ処理の重み係数を示す2次元の重み係数マップの値を示す。
nnFilterMap[i][partIdx][j][frameIdx][yIdx][xIdx] = nnpfa_weight_map[i][j][yIdx][xIdx]==0 ? 0 : nnpfa_weight_map[i][j][yIdx][xIdx]+1
ここでyIdx = 0..nnpfa_weight_map_height_minus1[i][j]、xIdx = nnpfa_weight_map_width_minus1[i][j]-1。
【0050】
nnpfa_strength_present_flag[i][j]は、attrIdx=i、mapIdx=jの画像に対する強度係数が存在するか否かを示す。
【0051】
nnpfa_strength[i][j]は、nnpfa_strength_present_flag[i][j]がtrueの場合に存在し、attrIdx=i、mapIdx=jの画像のフィルタ処理の入力テンソルに用いる強度係数である。符号化データに現れない場合にはnnpfa_strength[i][j]=0と推定する。
nnStrengthVal[i][partIdx][j][frameIdx] = nnpfa_strength[i][j]
上記ではattrIdx=i、mapIdx=jのアトリビュート画像に適用する例を説明したが、ジオメトリ画像に適用する場合等には、シンタックスのループ変数をi, jからjとして、シンタックス要素を[i][j]を[j]とした符号化データを復号して、mapIdx=jの画像に対して適用してもよい
nnFilterMap[j][frameIdx][yIdx][xIdx] = nnpfa_weight_map[j][yIdx][xIdx]==0 ? 0 : nnpfa_weight_map[j][yIdx][xIdx]+1
nnStrengthVal[j][frameIdx] = nnpfa_strength[j]
アトラス情報復号部302は、アトラス情報符号化ストリームを入力し、アトラス情報を復号する。
【0052】
オキュパンシマップ復号部303は、VVCやHEVCなどで符号化されたオキュパンシマップ符号化ストリームを復号し、オキュパンシマップを出力する。
【0053】
ジオメトリ画像復号部304は、VVCやHEVCなどで符号化されたジオメトリ画像符号化ストリームを復号し、ジオメトリ画像を出力する。
【0054】
ジオメトリ再構成部306は、アトラス情報、オキュパンシマップ、ジオメトリ画像を入力し、3D空間におけるジオメトリ(デプス情報、位置情報)を再構成する。
【0055】
アトリビュート画像復号部307は、VVCやHEVCなどで符号化された符号化ストリームの復号し、アトリビュート符号化ストリームを入力し、アトリビュート画像を出力する。
【0056】
フレーム画像フィルタ部308は、アトリビュート画像もしくはジオメトリ画像と指定された画像に対するフィルタパラメータを入力する。フレーム画像フィルタ部308はNNフィルタ部611を備え、フレーム画像とフィルタパラメータに基づきフィルタ処理を行い、アトリビュート画像はフィルタ処理画像をアトリビュート再構成部309に出力する。また、ジオメトリ画像はフィルタ処理画像をジオメトリ再構成部306に出力する。
【0057】
アトリビュート再構成部309は、アトラス情報、オキュパンシマップ、アトリビュート画像を入力し、3D空間におけるアトリビュート(カラー情報)を再構成する。
【0058】
3Dデータ再構成部310は、再構成されたジオメトリ情報及びアトリビュート情報に基づき、3Dデータのポイントクラウドデータもしくはメッシュデータを再構成する。
【0059】
(フレーム画像フィルタ部308)
図7は、フレーム画像フィルタ部308の構成を示す機能ブロック図である。ヘッダ復号部301はnn_post_filter_activation SEI(適用SEI)の符号化データからポストフィルタの適用対象を示す対象アトラス情報を示す識別子nnpfa_atlas_idを復号する。nnpfa_atlas_idは、アトリビュート画像の各パッチを識別するために使用する識別番号である。nnpfa_atlas_idはatlasID(アトラスID)にセットされる。
【0060】
なお、対象アトラス情報を示す識別子は
図2のV3C unitのatlasIDを用いることも可能である。UnitTypeがV3C_AVD(アトリビュートデータ)、V3C_GVD(ジオメトリデータ)、V3C_OVD(オキュパンシデータ)の場合、vuh_atlas_idがシグナルされる。このvuh_atlas_idをatlasIDにセットしてもよい。
【0061】
フレーム画像フィルタ部308はNNフィルタ部611(もしくはALF部610)を用いて、アトリビュート画像復号部307もしくはジオメトリ画像復号部304で復号された画像の高画質化を行う。フレーム画像フィルタ部308は、各atlasIDで特定されるアトラス情報に複数のアトリビュート画像がある場合に、フレーム画像単位で特性SEI等を切り替えてフィルタ処理を行う。
【0062】
より具体的には、nnpfa_enabled_flag[j]が1のとき、mapIdx=jで識別されるジオメトリ画像jに対して、画像jに適用する特性SEIのid TargetId[j]の示す特性SEIに基づいたフィルタ処理を行ってもよい。0の場合には処理を行わない。
【0063】
別の構成としてnnpfa_enabled_flag[i]が1のとき、attrIdx=iで識別されるアトリビュート画像iに対して、TargetId[i]の示す特性SEIに基づいたフィルタ処理を行ってもよい。0の場合には処理を行わない。
【0064】
別の構成としてnnpfa_enabled_flag[i][j]が1のとき、attrIdx=i、mapIdx=jで識別されるアトリビュート画像に対して、TargetId[i][j]の示す特性SEIに基づいたフィルタ処理を行ってもよい。0の場合には処理を行わない。
【0065】
フレーム画像フィルタ部308は、DecAttrChromaFormatに応じて以下の変数を導出する。DecAttrChromaFormatはアトリビュート画像の色差フォーマットである。
SW=SubWidthC = 1, SH=SubHeghtC = 1 (DecAttrChromaFormat == 0)
SW=SubWidthC = 2, SH=SubHeghtC = 2 (DecAttrChromaFormat == 1)
SW=SubWidthC = 2, SH=SubHeghtC = 1 (DecAttrChromaFormat == 2)
SW=SubWidthC = 1, SH=SubHeghtC = 1 (DecAttrChromaFormat == 3)
ここでSW=SubWidthC、SH=SubHeightCは輝度コンポーネントに対する色コンポーネントのサブサンプリング比を示す。
【0066】
フレーム画像フィルタ部308には、ジオメトリ画像にフィルタする場合はmapIdx、frameIdxごとにDecGeoFrames[mapIdx][frameIdx][cIdx][y][x]を入力し、FilteredFrame[cIdx][y][x]が出力される。出力をDecGeoFrames[mapIdx][frameIdx][cIdx][y][x]に格納する。
ここで、cIdx=0, x=0..DecGeoWidth-1, y=0..DecGeoHeight-1である。
【0067】
以下の設定を行い後述のNNフィルタ部611(ALF部610)でフィルタ処理を行ってもよい。
PicHeight=DecGeoHeight
PicWidth=DecGeoWidth
DecPic[frameIdx][0] = DecGeoFrames[mapIdx][frameIdx][0]
DecPic[frameIdx][1] = DecGeoFrames[mapIdx][frameIdx][1]
DecPic[frameIdx][2] = DecGeoFrames[mapIdx][frameIdx][2]
BitDepthY = BitDepthC = DecGeoBitDepth
ChromaFormatIdc = DecGeoChromaFormat
DecGeoBitDepthはジオメトリ画像のビットデプスである。
nnFilterWeight[yIdx][xIdx] = nnFilterMap[mapIdx][frameIdx][yIdx][xIdx]
StrengthControlVal = nnStrengthVal[mapIdx][frameIdx]
フレーム画像フィルタ部308には、アトリビュート画像にフィルタする場合はattrIdx、partIdx、mapIdx、frameIdxごとにDecAttrFrames[attrIdx][partIdx][mapIdx][frameIdx][cIdx][y][x]を入力し、FilteredFrame[cIdx][y][x]が出力される。出力をフレーム画像フィルタ部308は出力をDecAttrFrames[attrIdx][partIdx][mapIdx][frameIdx][cIdx][y][x]に格納する。
【0068】
以下の設定を行い後述のNNフィルタ部611(ALF部610)でフィルタ処理を行ってもよい。
PicHeight=DecAttrHeight
PicWidth=DecAttrWidth
DecPic[i][0] = DecAttrFrames[attrIdx][partIdx][mapIdx][frameIdx-i][0]
DecPic[i][1] = DecAttrFrames[attrIdx][partIdx][mapIdx][frameIdx-i][1]
DecPic[i][2] = DecAttrFrames[attrIdx][partIdx][mapIdx][frameIdx-i][2]
ここでi=0..numInputPics-1。
DecFrame=DecPic[0] // 現在フレーム(frameIdxのフレーム)
BitDepthY = BitDepthC = DecAttrBitDepth
ChromaFormatIdc = DecAttrChromaFormat[attrIdx][partIdx][mapIdx][frameIdx]
nnFilterWeight[yIdx][xIdx] = nnFilterMap[attrIdx][partIdx][mapIdx][frameIdx][yIdx][xIdx]
StrengthControlVal = nnStrengthVal[attrIdx][partIdx][mapIdx][frameIdx]
DecGeoFrames[mapIdx][frameIdx][cIdx][y][x]:デコード後のジオメトリ画像を示す7次元配列。各配列の値は、コンポーネントcIdx、位置(x, y)における画素値を示す。ここで、cIdx=0..DecAttrNumComp-1, x=0..DecGeoWidth-1, y=0..DecGeoHeight-1である。
【0069】
DecGeoHeight[mapIdx][frameIdx]:ジオメトリ画像の高さ。
【0070】
DecGeoWidth[mapIdx][frameIdx]:ジオメトリ画像の幅。
【0071】
DecAttrFrames[attrIdx][partIdx][mapIdx][frameIdx][cIdx][y][x]:デコード後のアトリビュート画像を示す7次元配列。各配列の値は、コンポーネントcIdx、位置(x, y)における画素値を示す。ここで、cIdx=0..DecAttrNumComp-1, x=0..DecAttrWidth-1, y=0..DecAttrHeight-1である。
【0072】
DecAttrHeight[attrIdx][partIdx][mapIdx][frameIdx]:アトリビュート画像の高さ。
【0073】
DecAttrWidth[attrIdx][partIdx][mapIdx][frameIdx]:アトリビュート画像の幅。
【0074】
DecAttrNumComp[attrIdx][partIdx][mapIdx][frameIdx]:アトリビュート画像のコンポーネント数。
【0075】
DecAttrChromaFormat[attrIdx][partIdx][mapIdx][frameIdx]:アトリビュート画像の色差フォーマット。ここで、DecAttrChromaFormatは、アトリビュート画像のChromaFormatIdcを示す。例えば1(YUV4:2:0)もしくは3(YUV4:4:4)であってもよい。
【0076】
nnFilterMap[attrIdx][partIdx][mapIdx][frameIdx]はフィルタ処理後の画像とフィルタ前の画像の重みを格納する配列である。上述のように適用SEIを復号した値を用いてもよい。
【0077】
nnStrengthVal[attrIdx][partIdx][mapIdx][frameIdx]はNNフィルタで使用する強度係数である。この値は、上述のように適用SEIを復号した値であってもよい。また、例えば映像符号化データのスライスQPの値であってもよい。
【0078】
上記構成によれば、フレームに対して個別に、適用するネットワークモデル(フィルタの特性)を特性SEIで指定するため画質が向上する効果を奏する。
【0079】
(NNフィルタ部611)
ニューラルネットワークモデルには、例えば、コンボリューションの数や層の数、カーネルサイズ、接続関係などのトポロジーがある。
【0080】
ここで、ニューラルネットワークモデル(以下、NNモデル)とは、ニューラルネットワークの要素および結合関係(トポロジー)と、ニューラルネットワークのパラメータ(重み、バイアス)を意味する。なお、NNフィルタ部611は、トポロジーを固定して、フィルタ対象画像に応じてパラメータのみを切り替えても良い。
【0081】
フレーム画像フィルタ部308は入力画像FrameからNNフィルタ部611への入力InputTensorを導出し、NNフィルタ部611はinputTensorを用いて、ニューラルネットワークモデルによるフィルタ処理を行う。使用するニューラルネットワークモデルは、nnpfa_target_idに対応するモデルである。入力画像は、コンポーネントごとの画像であってもよいし、複数コンポーネントをそれぞれチャネルとして持つ画像であってもよい。
【0082】
(スケール強度入力値strengthControlScaledValの導出)
さらに、NNフィルタ部611は、nnpfc_inp_format_idcに応じて、適応SEIの符号化データで伝送された整数のStrengthControlValを入力テンソルに用いるstrengthControlScaledValを導出する。nnpfc_inp_format_idcは入力テンソルが不動小数点数(実数)であるか整数であるかを示す変数である。ここでは値の範囲が浮動小数点数の場合(nnpfc_inp_format_idc==0)に0..1になるように正規化する。正規化されたstrengthControlScaledValは入力テンソルに入力される。
if(nnpfc_inp_format_idc==0) {
strengthControlScaledVal = Floor(StrengthControlVal * ((1 << inpTensorBitDepthY) - 1))
} else {
strengthControlScaledVal = StrengthControlVal / ((1 << inpTensorBitDepthY) - 1)
}
なお、適応SEIの符号化データで伝送された整数のStrengthControlValを0..1の浮動小数点数のStrengthControlValに変換し、変換した浮動小数点数から再度、以下の式でnnpfc_inp_format_idcに応じた値に変換してもよい。
【0083】
StrengthControlVal = nnStrengthVal[attrIdx][partIdx][mapIdx][frameIdx]
StrengthControlVal = Floor(StrengthControlVal/ ((1 << inpTensorBitDepthY) - 1))
実数からnnpfc_inp_format_idcに応じた変換処理は以下の通り。
if(nnpfc_inp_format_idc==1) {
strengthControlScaledVal = Floor(StrengthControlVal * ((1 << inpTensorBitDepthY) - 1))
} else {
strengthControlScaledVal = StrengthControlVal
}
上記の構成によれば、ポストフィルタを行うニューラルネットワークモデルの入力が実数であっても整数であっても入力テンソル形式情報に応じた変換を行うため、モデルの形式を自由に選択することができる。
【0084】
なお、符号化ストリームに対する映像符号化データから実数のStrengthControlValを導出して、実数からnnpfc_inp_format_idcに応じた変換処理を行いstrengthControlScaledValを導出してもよい。特にアトリビュート画像にフィルタ処理を行う場合には、アトリビュート符号化ストリーム(V3C_AVD)に対する映像符号化データから実数のStrengthControlValを導出してもよい。ジオメトリ画像にフィルタ処理を行う場合には、ジオメトリ符号化ストリーム(V3C_AVD)に対する映像符号化データから実数のStrengthControlValを導出してもよい。またStrengthControlValは、VVC復号部でスライスヘッダ中の輝度量子化パラメータの値sliceQPYなどから導出してもよい。
【0085】
StrengthControlVal = sliceQPY ÷ 63
上記構成では、VVCの符号化データの量子化パラメータなどから導出される強度値StrengthControlValを用いて、入力テンソルには実数もしくは整数に変換したstrengthControlScaledValを用いる。従って、伝送されたアトリビュート符号化ストリーム、ジオメトリ符号化ストリーム符号化データの画像に調整されたフィルタ処理を行うことができる。
【0086】
NNフィルタ部611は、以下の処理を繰り返し適用してもよい。
【0087】
NNフィルタ部611は、層の数だけinputTensorとカーネルk[m][n][yy][xx]を畳み込み演算(conv,convolution)し、biasを加算した出力画像outputTensorを生成する。
ここで、mはinputTensorのチャネル数、nはoutputTensorのチャネル数、yyはカーネルkの高さ、xxはカーネルkの幅を示す。
【0088】
各層では、inputTensorからoutputTensorを生成する。
【0089】
outputTensor[nn][yy][xx]=ΣΣΣ(k[mm][nn][i][j]*inputTensor[mm][yy+j-of][xx+i-of]+bias[nn])
ここで、nn=0..n-1、mm=0..m-1、yy=0..height-1、xx=0..width-1、i=0..yy-1、j=0..xx-1である。widthはinputTensorとoutputTensorの幅、heightはinputTensorとoutputTensorの高さである。Σは各々mm=0..m-1、i=0..yy-1、j=0..xx-1の総和である。ofは、outputTensorを生成するために、inputTensorの周囲に必要な領域の幅あるいは高さである。
【0090】
1x1 Convの場合、Σは、各々mm=0..m-1、i=0、j=0の総和を表す。このとき、of=0を設定する。3x3 Convの場合、Σは各々mm=0..m-1、i=0..2、j=0..2の総和を表す。このとき、of=1を設定する。
yy+j-ofの値が0未満またはheight以上のとき、あるいは、xx+i-ofの値が0未満またはwidth以上のとき、inputTensor[mm][yy+j-of][xx+i-of]の値を0としてもよい。あるいは、inputTensor[mm][yy+j-of][xx+i-of]の値をinputTensor[mm][yclip][xclip]としてもよい。ここで、yclipはmax(0, min(yy+j-of, height-1)), xclipは(0, min(xx+i-of, width-1))である。
【0091】
次の層では得られたoutputTensorを新たなinputTensorとして、同様の処理を層の数だけ繰り返す。層と層の間には、activation層を設けてもよい。また、pooling層やスキップ結合を用いてもよい。最後に得られたoutputTensorからOutAttrFrameを導出する。
【0092】
また、カーネルk[n][yy][xx]を用いて、Depth wise Convと呼ばれる以下の式で示す処理を行ってもよい。ここで、nn=0..n-1、xx=0..width-1、yy=0..height-1である。
【0093】
outputTensor[nn][yy][xx]=ΣΣ(k[nn][i][j]*inputTensor[nn][yy+j-of][xx+i-of]+bias[nn])
またActivateと呼ばれる非線形処理、たとえばReLUを用いてもよい。
ReLU(x) = x >= 0 ? x : 0
また以下の式に示すleakyReLUを用いてもよい。
【0094】
leakyReLU(x) = x >= 0 ? x : a*x
ここでaは1未満の所定の値、例えば0.1や0.125である。また整数演算を行うために上記の全てのk、bias、aの値を整数として、convの後に右シフトを行ってoutputTensorを生成してもよい。
【0095】
ReLUでは0未満の値に対しては常に0、それ以上の値に対しては入力値がそのまま出力される。一方、leakyReLUでは、0未満の値に対して、aで設定された勾配で線形処理が行われる。ReLUでは0未満の値に対する勾配が消失するため、学習が進みにくくなる場合がある。leakyReLUでは0未満の値に対する勾配が残され、上記問題が起こりにくくなる。また、上記leakyReLU(x)のうち、aの値をパラメータ化して用いるPReLUを用いてもよい。
【0096】
(NNフィルタ部611のフィルタ処理)
NNフィルタ部611は、nnpfc_inp_order_idcに応じて、入力画像DecPicに基づき、NNフィルタ部611への入力データinputTensor[][][]を導出する。さらに、上述のstrengthControlScaledValを入力してもよい。
for(i = 0; i < numInputPics; i++) {
if(nnpfc_inp_order_idc == 0)
for(yP = -overlapSize; yP < inpPatchHeight+overlapSize; yP++)
for(xP = -overlapSize; xP < inpPatchWidth+overlapSize; xP++) {
xIdx = (strengthSizeShift == 0) ? 0 : xP >> strengthSizeShift
yIdx = (strengthSizeShift == 0) ? 0 : yP >> strengthSizeShift
inpVal = InpY(InpSampleVal(cTop+yP, cLef+xP, PicHeight, PicWidth, DecPic[i][0]))
if(!nnpfc_component_last_flag)
inputTensor[0][i][0][yP+overlapSize][xP+overlapSize] = inpVal
else
inputTensor[0][i][yP+overlapSize][xP+overlapSize][0] = inpVal
if(nnpfc_auxiliary_inp_idc == 1)
if(!nnpfc_component_last_flag)
inputTensor[0][i][1][yP+overlapSize][xP+overlapSize] = StrengthControlVal[yIdx][xIdx]
else
inputTensor[0][i][yP+overlapSize][xP+overlapSize][1] = StrengthControlVal[yIdx][xIdx]
}
else if(nnpfc_inp_order_idc == 1)
for(yP = -overlapSize; yP < inpPatchHeight+overlapSize; yP++)
for(xP = -overlapSize; xP < inpPatchWidth+overlapSize; xP++) {
inpCbVal = InpC(InpSampleVal(cTop+yP, cLeft+xP, PicHeight/SubHeightC, PicWidth/SubWidthC, DecPic[i][1]))
inpCrVal = InpC(InpSampleVal(cTop+yP, cLeft + xP, PicHeight/SubHeightC, PicWidth/SubWidthC, DecPic[i][2]))
if(!nnpfc_component_last_flag) {
inputTensor[0][i][0][yP+overlapSize][xP+overlapSize] = inpCbVal
inputTensor[0][i][1][yP+overlapSize][xP+overlapSize] = inpCrVal
} else {
inputTensor[0][i][yP+overlapSize][xP+overlapSize][0] = inpCbVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][1] = inpCrVal
}
if(nnpfc_auxiliary_inp_idc == 1)
if(!nnpfc_component_last_flag)
inputTensor[0][i][2][yP+overlapSize][xP+overlapSize] = strengthControlScaledVal
else
inputTensor[0][i][yP+overlapSize][xP+overlapSize][2] = strengthControlScaledVal
}
else if(nnpfc_inp_order_idc == 2)
for(yP = -overlapSize; yP < inpPatchHeight+overlapSize; yP++)
for(xP = -overlapSize; xP < inpPatchWidth+overlapSize; xP++) {
yY = cTop + yP
xY = cLeft + xP
yC = yY / SubHeightC
xC = xY / SubWidthC
inpYVal = InpY(InpSampleVal(yY, xY, PicHeight, PicWidth, DecPic[i][0]))
inpCbVal = InpC(InpSampleVal(yC, xC, PicHeight/SubHeightC, PicWidth/SubWidthC, DecPic[i][1]))
inpCrVal = InpC(InpSampleVal(yC, xC, PicHeight/SubHeightC, PicWidth/SubWidthC, DecPic[i][2]))
if(!nnpfc_component_last_flag) {
inputTensor[0][i][0][yP+overlapSize][xP+overlapSize] = inpYVal
inputTensor[0][i][1][yP+overlapSize][xP+overlapSize] = inpCbVal
inputTensor[0][i][2][yP+overlapSize][xP+overlapSize] = inpCrVal
} else {
inputTensor[0][i][yP+overlapSize][xP+overlapSize][0] = inpYVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][1] = inpCbVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][2] = inpCrVal
}
if(nnpfc_auxiliary_inp_idc == 1)
if(!nnpfc_component_last_flag)
inputTensor[0][i][3][yP+overlapSize][xP+overlapSize] = StrengthControlVal[yIdx][xIdx]
else
inputTensor[0][i][yP+overlapSize][xP+overlapSize][3] = StrengthControlVal[yIdx][xIdx]
}
else if(nnpfc_inp_order_idc == 3)
for(yP = -overlapSize; yP < inpPatchHeight+overlapSize; yP++)
for(xP = -overlapSize; xP < inpPatchWidth+overlapSize; xP++) {
yTL = cTop + yP*2
xTL = cLeft + xP*2
yBR = yTL + 1
xBR = xTL + 1
yC = cTop / 2 + yP
xC = cLeft / 2 + xP
inpTLVal = InpY(InpSampleVal(yTL, xTL, PicHeight, PicWidth, DecPic[i][0]))
inpTRVal = InpY(InpSampleVal(yTL, xBR, PicHeight, PicWidth, DecPic[i][0]))
inpBLVal = InpY(InpSampleVal(yBR, xTL, PicHeight, PicWidth, DecPic[i][0]))
inpBRVal = InpY(InpSampleVal(yBR, xBR, PicHeight, PicWidth, DecPic[i][0]))
inpCbVal = InpC(InpSampleVal(yC, xC, PicHeight / 2, PicWidth / 2, DecPic[i][1]))
inpCrVal = InpC(InpSampleVal(yC, xC, PicHeight / 2, PicWidth / 2, DecPic[i][2]))
if(!nnpfc_component_last_flag) {
inputTensor[0][i][0][yP+overlapSize][xP+overlapSize] = inpTLVal
inputTensor[0][i][1][yP+overlapSize][xP+overlapSize] = inpTRVal
inputTensor[0][i][2][yP+overlapSize][xP+overlapSize] = inpBLVal
inputTensor[0][i][3][yP+overlapSize][xP+overlapSize] = inpBRVal
inputTensor[0][i][4][yP+overlapSize][xP+overlapSize] = inpCbVal
inputTensor[0][i][5][yP+overlapSize][xP+overlapSize] = inpCrVal
} else {
inputTensor[0][i][yP+overlapSize][xP+overlapSize][0] = inpTLVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][1] = inpTRVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][2] = inpBLVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][3] = inpBRVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][4] = inpCbVal
inputTensor[0][i][yP+overlapSize][xP+overlapSize][5] = inpCrVal
}
if(nnpfc_auxiliary_inp_idc == 1)
if(!nnpfc_component_last_flag)
inputTensor[0][i][6][yP+overlapSize][xP+overlapSize] = StrengthControlVal[yIdx][xIdx]
else
inputTensor[0][i][yP+overlapSize][xP+overlapSize][6] = StrengthControlVal[yIdx][xIdx]
}
}
なお、関数Reflect(x,y)、Wrap(x,y)は以下で定義される。、
Reflect(x, y)
= Min (-y, x) (if y < 0)
= Min (x-(y-x), x) (if y > x)
= y (それ以外)
Wrap(x, y)
= Max (0, x+y+1) (if y < 0)
= Min (x, y-x-1) (if y > x)
= y (それ以外)
NNフィルタ部611は、NNフィルタ処理を行い、inputTensorからoutputTensorを導出する。下記のようにパッチサイズ(inpPatchWidth x inpPatchHeight)単位で、PostProcessingFilter()で示すフィルタ処理を行ってもよい。
【0097】
nnpfc_out_order_idcの値に応じて、以下のように、復号画像をポストフィルタ処理PostProcessingFilter()でフィルタ処理し、Y、Cb、およびCrの画素配列FilteredPic[0]、FilteredPic[1]、及びFilteredPic[2]を生成する。
【0098】
復号画像のポストフィルタ処理PostProcessingFilter()は以下のとおりである。
【0099】
if(nnpfc_inp_order_idc==0)
for(cTop=0;cTop<InpPicHeightInLumaSamples;cTop+=inpPatchHeight)
for(cLeft=0;cLeft<InpPicWidthInLumaSamples;cLeft+=inpPatchWidth){
DeriveInputTensors()
outputTensor=PostProcessingFilter(inputTensor)
StoreOutputTensors()
}
else if(nnpfc_inp_order_idc==1)
for(cTop=0;cTop<InpPicHeightInLumaSamples/SubHeightC;
cTop+=inpPatchHeight)
for(cLeft=0;cLeft<InpPicWidthInLumaSamples/SubWidthC;
cLeft+=inpPatchWidth){
DeriveInputTensors()
outputTensor=PostProcessingFilter(inputTensor)
StoreOutputTensors()
}
else if(nnpfc_inp_order_idc==2)
for(cTop=0;cTop<InpPicHeightInLumaSamples;cTop+=inpPatchHeight)
for(cLeft=0;cLeft<InpPicWidthInLumaSamples;cLeft+=inpPatchWidth){
DeriveInputTensors()
outputTensor=PostProcessingFilter(inputTensor)
StoreOutputTensors()
}
else if(nnpfc_inp_order_idc==3)
for(cTop=0;cTop<InpPicHeightInLumaSamples;cTop+=inpPatchHeight*2)
for(cLeft=0;cLeft<InpPicWidthInLumaSamples;cLeft+=inpPatchWidth*2){
DeriveInputTensors()
outputTensor=PostProcessingFilter(inputTensor)
StoreOutputTensors()
}
ここで、DeriveInputTensors( )は入力データ設定、StoreOutputTensors( )は出力データ格納を示す関数である。InpWidth,InpHeightは入力データのサイズであり、DecAttrWidth、DecAttrHeight、あるいはDecGeoWidth、DecGeoHeightであってもよい。inpPatchWeight、inpPatchHeightはパッチの幅、高さである。
for(i=0; i<numOutputPics; i++) {
if(nnpfc_out_order_idc==0)
for(yP=0; yP<outPatchHeight; yP++)
for(xP=0; xP<outPatchWidth; xP++) {
yY = cTop * outPatchHeight / inpPatchHeight + yP
xY = cLeft * outPatchWidth / inpPatchWidth + xP
if (yY<nnpfc_pic_height_in_luma_samples && xY<nnpfc_pic_width_in_luma_samples)
if(!nnpfc_component_last_flag)
FilteredPic[i][0][yY][xY] = outputTensor[0][i][0][yP][xP]
else
FilteredPic[i][0][yY][xY]= outputTensor[0][i][yP][xP][0]
}
else if(nnpfc_out_order_idc==1)
for(yP=0; yP<outPatchCHeight; yP++)
for(xP=0; xP<outPatchCWidth; xP++) {
xSrc = cLeft * horCScaling + xP
ySrc = cTop * verCScaling + yP
if (ySrc<nnpfc_pic_height_in_luma_samples / outSubHeightC && xSrc<nnpfc_pic_width_in_luma_samples / outSubWidthC)
if(!nnpfc_component_last_flag) {
FilteredPic[i][1][ySrc][xSrc] = outputTensor[0][i][0][yP][xP]
FilteredPic[i][2][ySrc][xSrc] = outputTensor[0][i][1][yP][xP]
} else {
FilteredPic[i][1][ySrc][xSrc] = outputTensor[0][i][yP][xP][0]
FilteredPic[i][2][ySrc][xSrc] = outputTensor[0][i][yP][xP][1]
}
} else if(nnpfc_out_order_idc==2)
for(yP=0; yP<outPatchHeight; yP++)
for(xP=0; xP<outPatchWidth; xP++) {
yY = cTop*outPatchHeight / inpPatchHeight + yP
xY = cLeft*outPatchWidth / inpPatchWidth + xP
yC = yY / outSubHeightC
xC = xY / outSubWidthC
yPc = (yP/outSubHeightC)*outSubHeightC
xPc = (xP/outSubWidthC)*outSubWidthC
if (yY<nnpfc_pic_height_in_luma_samples && xY<nnpfc_pic_width_in_luma_samples)
if(nnpfc_component_last_flag==0) {
FilteredPic[i][0][yY][xY] = OutY(outputTensor[i][0][0][yP][xP])
FilteredPic[i][1][yC][xC] = OutC(outputTensor[i][0][1][yPc][xPc])
FilteredPic[i][2][yC][xC] = OutC(outputTensor[i][0][2][yPc][xPc])
} else {
FilteredPic[i][0][yY][xY][yY][xY] = OutY( outputTensor[i][0][yP][xP][0])
FilteredPic[i][1][yC][xC] = OutC(outputTensor[i][0][yPc][xPc][1])
FilteredPic[i][2][yC][xC] = OutC(outputTensor[i][0][yPc][xPc][2])
}
}
else if(nnpfc_out_order_idc==3)
for(yP=0; yP<outPatchHeight; yP++)
for(xP = 0; xP < outPatchWidth; xP++) {
ySrc = cTop / 2*outPatchHeight / inpPatchHeight + yP
xSrc = cLeft / 2*outPatchWidth / inpPatchWidth + xP
if (ySrc<nnpfc_pic_height_in_luma_samples/2 && xSrc<nnpfc_pic_width_in_luma_samples/2)
if(nnpfc_component_last_flag==0) {
FilteredPic[i][0][xSrc*2][ySrc*2] = OutY(outputTensor[i][0][0][yP][xP])
FilteredPic[i][0][xSrc*2+1][ySrc*2] = OutY(outputTensor[i][0][1][yP][xP])
FilteredPic[i][0][xSrc*2][ySrc*2+1] = OutY(outputTensor[i][0][2][yP][xP])
FilteredPic[i][0][xSrc*2+1][ySrc*2+1] = OutY(outputTensor[i][0][3][yP][xP])
FilteredPic[i][1][xSrc][ySrc] = OutC(outputTensor[i][0][4][yP][xP])
FilteredPic[i][2][xSrc][ySrc] = OutC(outputTensor[i][0][5][yP][xP])
} else {
FilteredPic[i][0][xSrc**2][ySrc*2] = OutY(outputTensor[i][0][yP][xP][0])
FilteredPic[i][0][xSrc*2+1][ySrc*2] = OutY(outputTensor[i][0][yP][xP][1])
FilteredPic[i][0][xSrc*2][ySrc*2+1] = OutY(outputTensor[i][0][yP][xP][2])
FilteredPic[i][0][xSrc*2+1][ySrc*2+1] = OutY(outputTensor[i][0][yP][xP][3])
FilteredPic[i][1][xSrc][ySrc] = OutC(outputTensor[i][0][yP][xP][4])
FilteredPic[i][2][xSrc][ySrc] = OutC(outputTensor[i][0][yP][xP][5])
}
}
}
OutFrame = FilteredPic[0
【0100】
(ALF部610)
なお、NNPFA SEIで持続性情報、特性SEIの識別子で指定されるポストフィルタは線形モデルを利用したフィルタ(Wiener Filter)を用いて行ってもよい。線形フィルタはALF部610でフィルタ処理をしてもよい。具体的には、フィルタ対象画像DecFrameを一定のサイズ(例えば4x4、1x1)の小領域(x=xSb..xSb+bSW-1, y=xSb..xSb+bSH-1、(xSb,ySb)は小領域の左上座標、bSW,bSHは小領域の幅と高さ)に分割する。そして、小領域単位で、フィルタ処理を行う。選択したフィルタ係数coeff[]を用いてDecFrameから導出する。
【0101】
outframe[cIdx][y][x] = Σ(coeff[i] * DecFrame[cIdx][y+ofy][x+ofx] + offset) >> shift
ここでofx, ofyはフィルタ位置iに応じて定まる参照位置のオフセット。offset=1<<(shift-1)。shiftはフィルタ係数の精度に対応し6、7、8などの定数。
【0102】
なお、小領域単位で画像を分類し、導出された小領域のclassId(=classId[y][x])に応じてフィルタ係数coeff[classId][]を選択してフィルタ処理を行ってもよい。
【0103】
outframe[cIdx][y][x] = (Σ(coeff[classId][i] * DecFrame[cIdx][y+ofy][x+ofx] + offset) >> shift
なおclassIdは、ブロック(1x1の場合画素)の活性度や方向性を用いて導出してもよい。例えば以下の差分絶対値和などから導出する活性度Actを用いて導出してもよい。
【0104】
classId=Act
なおActは以下で導出してもよい。
【0105】
Act=Σ|x-xi|
ただしi=0..7でxiは対象画素xの隣接画素を示す。隣接画素の方向はi=0..7に対する上下左右に、斜め45度の4方向を加えた8方向でもよい。また、
Act=Σ|-xl+2*x-xr|+Σ|-ya+2*x-yb|を用いてもよい。なお、l, r, a, bは各々left, right, above, belowの逆で、xの左右上下の画素を示す。なお、
Act=Min(Num-1, Act>>shift)
のようにshift値によって量子化した上で、NumA-1となるようにクリップしてもよい。
さらに方向性Dを用いて以下の式でclassIdを導出してもよい。
【0106】
classId=Act+D*NumA
ここで例えば、Act=0..NumA-1、D=0..4など。
【0107】
フィルタ画像合成部612を適用しない場合、NNフィルタ部611(ALF部610)で得られるOutFrameをそのままFilteredFrameとして出力する。
【0108】
(合成部を備える構成)
図8は、フレーム画像フィルタ部308の別の構成を示す機能ブロック図である。ここでは、nnFilterWeightによりフィルタ処理後の画像OutFrameと、フィルタ前の画像DecFrameの重みづけ平均を求めることで、さらに適応的なフィルタ処理を可能とする。
図7で説明済みの手段の説明は省略する。
【0109】
フィルタ画像合成部612は、適用SEIの符号化データから復号したnnFilterWeightの値に基づいてDecFrame、OutFrameを合成し、FilteredFrameを出力する。
【0110】
FilteredFrameの各画素は、以下のように導出される。
【0111】
FilteredFrame[cIdx][y][x] = (nnFilterWeight[yIdx][xIdx] * OutFrame[cIdx][y][x] + ((1<<shift) - nnFilterWeight[yIdx][xIdx])*DecFrame[cIdx][y][x]) + offset) >> shift
ここで、cIdx=0..DecNumComp-1、x=0..DecWidth-1、y=0..DecHeight-1である。また以下の設定であってもよい。
xIdx = (weightSizeShift==0) ? 0 : (x>>weightSizeShift)
yIdx = (weightSizeShift==0) ? 0 : (y>>weightSizeShift)
shift=6
offset=1<<(shift-1)
weightSizeShiftは、フィルタの重み係数を示す2次元マップのサイズを示すパラメータである。
【0112】
なお、nnFilterWeightは0と1などのバイナリ値のみをとってもよい。つまり、フレーム画像フィルタ部308は、以下のようにnnFilterWeightが0のときにフィルタを適用せず、1のときにフィルタを適用するといった、フィルタ適用の有無の切替を行ってもよい。
【0113】
FilteredFrame[cIdx][y][x] = nnFilterWeight[yIdx][xIdx] * OutFrame[cIdx][y][x] + (1 - nnFilterWeight[yIdx][xIdx]) * DecFrame[cIdx][y][x]
フレームフィルタ部308は、ジオメトリ画像のフィルタ処理の場合DecFrame=DecGeoFrames[mapIdx][frameIdx]、DecNumComp=0、DecWidth=DecGeoWidth、DecHeight=DecGeoHeightに設定し、アトリビュート画像のフィルタ処理の場合にはDecFrame=DecAttrFrames[attrIdx][partIdx][mapIdx][frameIdx]、DecNumComp=DecAttrNumComp、DecWidth=DecAttrWidth、DecHeight=DecAttrHeightに設定する。
【0114】
上記構成によれば、アトリビュート画像iに対して、個別に適応SEI、及び、フレームの特徴に応じて特性SEI及びNNモデルの適用度合いを変えることで画質が向上する効果を奏する。
【0115】
(適用SEIの復号とフィルタ適用)
図10は、3Dデータ復号装置の処理のフローチャートを示す図である。3Dデータ復号装置は、適用SEIメッセージの復号を含む以下の処理を行う。
【0116】
S6001:へッダ復号部301は適用SEIからcancel_flagを復号する。cancel_flagはnnpfc_cancel_flagであってもよい。あるいは後述のlmpfa_cancel_flagであってもよい。
【0117】
S6002:cancel_flagが1の場合にはcancel_flagの対象となるフレームに対して処理を終了する。cancel_flagが0の場合にはS6003へ進む。
【0118】
S6003:へッダ復号部301は適用SEIからフレームiに対するnnpfa_persistence_flagを復号する。
【0119】
S6004:へッダ復号部301は適用SEIからフレームiに対するnnpfa_target_idを復号する。
【0120】
S6005:nnpfa_target_idと同じnnpfc_idを有する特性SEIを特定し、特性SEIからNNモデルのパラメータを導出する。
【0121】
S6006:導出されたNNモデルのパラメータを用いてNNフィルタ部611でフィルタ処理を実行する。
cancel_flagがlmpfa_cancel_flagの場合、nnpfa_persistence_flag、nnpfa_target_id、nnpfc_idは後述のlmpfa_persistence_flag、lmpfa_target_id、lmpfc_idであってもよい。
【0122】
<シンタックスの構成例
【0123】
(ニューラルネットワークポストフィルタ特性SEI)
図11は、nn_post_filter_characteristics(payloadSize)(特性SEI)のシンタクスの一部を示している。引数のpayloadSizeは、このSEIメッセージのバイト数を表している。
【0124】
特性SEIを適用する持続期間(Persistence scope)はCAS(Coded Atlas Sequence)である。つまり、CAS単位で適用されるSEIである。なお、CASは符号化アトラス列(coded atlas sequence)の略であり、復号順の符号化アトラスアクセスユニット(coded atlas access unit)の列である。より具体的には、NoOutputBeforeRecoveryFlag==1のIRAP符号化アトラスアクセスユニットから開始し、NoOutputBeforeRecoveryFlag==1の符号化アトラスアクセスユニットではない符号化アトラスアクセスユニットが後続する列である。なおIRAP符号化アトラスアクセスユニットは、IDR(instantaneous decoding refresh)符号化アクセスユニット、BLA(broken link access)符号化アクセスユニット、CRA(clean random access)符号化アクセスユニットであってもよい。
【0125】
この特性SEIでは、以下のシンタックス要素が符号化・符号化・伝送される。
【0126】
復号画像の幅と高さは、輝度画素の単位で、ここではそれぞれInpPicWidthInLumaSamples及びInpPicHeightInLumaSamplesで示される。
【0127】
InpPicWidthInLumaSamples = pps_pic_width_in_luma_samples - SubWidthC * (pps_conf_win_left_offset + pps_conf_win_right_offset)
InpPicHeightInLumaSamples = pps_pic_height_in_luma_samples - SubHeightC * (pps_conf_win_top_offset + pps_conf_win_bottom_offset)
ポストフィルタの入力画像は、垂直座標yおよび水平座標xの輝度画素の2次元配列DecFrame[0][y][x]及び、色差画素の2次元配列DecFrame[1][y][x]及びDecFrame[2][y][x]とする。ここで、画素配列の左上隅の座標yが0、xが0とする。
【0128】
復号画像の輝度の画素ビット長BitDepthYとする。復号画像の色差の画素ビット長BitDepthCとする。なお、BitDepthYとBitDepthCはどちらもBitDepthに等しく設定される。
【0129】
変数SubWidthCは、復号画像の水平方向の輝度に対する色差サブサンプリング比とし、変数SubHeightCは、復号画像の水平方向の輝度に対する色差サブサンプリング比とする。なお、SubWidthCは符号化データの変数SubWidthCと等しく設定される。SubHeightCは符号化データの変数SubHeightCに等しく設定される。
【0130】
変数SliceQPYは、符号化データのスライスレベルで更新される量子化パラメータSliceQpYに等しく設定される。
【0131】
nnpfc_out_sub_c_flagを使用して、変数outSubWidthCと変数outSubHeightCをそれぞれ導出する。nnpfc_out_sub_c_flagが1ならば、outSubWidthC=1、かつ、outSubHeightC=1を示す。nnpfc_out_sub_c_flagが0ならばoutSubWidthC=2、かつ、outSubHeightC=1を示す。nnpfc_out_sub_c_flagが存在しない場合、outSubWidthC=SubWidthC、かつ、outSubHeightC=SubHeightCと推定する。outSubWidthC、outSubHeightCは輝度成分に対する色差成分のサブサンプリング比である。
【0132】
if (nnpfc_out_sub_c_flagが存在しない) {
outSubWidthC= SubWidthC
outSubHeightC= SubWidthC
} else if (nnpfc_out_sub_c_flag == 1) {
outSubWidthC= 1
outSubHeightC= 1
} else {
outSubWidthC= 2
outSubHeightC= 1
}
シンタクス要素nnpfc_component_last_flagの値が0の場合は、入力テンソルinputTensorの2番目の次元がポストフィルタ処理に、およびポストフィルタ処理から生じる出力テンソルoutputTensorがチャネルに使用されることを指定する。
【0133】
nnpfc_component_last_flagの値が1の場合は、入力テンソルの最後の次元がポストフィルタ処理に、および、ポストフィルタ処理から生じる出力テンソルoutputTensorがチャネルに使用されることを指定する。
【0134】
シンタクス要素nnpfc_inp_format_idc(入力テンソル形式情報)は、復号画像の画素値をポストフィルタ処理への入力値に変換する方法を示す。nnpfc_inp_format_idcの値が0の場合は、ポストフィルタ処理(特に入力テンソル)への入力値は、それぞれ、IEEE754で指定されている実数(浮動小数点値形式)であり、関数InpYおよびInpCは次のように指定される。入力テンソルの値の範囲は0..1である。
【0135】
InpY(x)=x÷((1<<BitDepthY)-1)
InpC(x)=x÷((1<<BitDepthC)-1)
nnpfc_inp_format_idcの値が1の場合、ポストフィルタ処理への入力値は符号なしの整数で、関数InpYおよびInpCは次のように指定される。入力テンソルの値の範囲は0..1<<( inpTensorBitDepthY)-1である。
【0136】
shift=BitDepthY-inpTensorBitDepth
if(inpTensorBitDepth>=BitDepthY)
InpY(x)=x<<(inpTensorBitDepthY-BitDepthY)
else
InpY(x)=Clip3(0,(1<<inpTensorBitDepthY)-1,(x+(1<<(shift-1)))>>shift)
shift=BitDepthC-inpTensorBitDepthC
if(inpTensorBitDepth>=BitDepthC)
InpC(x)=x<<(inpTensorBitDepthC-BitDepthC)
else
InpC(x)=Clip3(0,(1<<inpTensorBitDepthC)-1,(x+(1<<(shift-1)))>>shift)
シンタクス要素nnpfc_inp_tensor_bitdepth_luma_minus8の値に8を加算した値は、入力整数テンソルの輝度画素値の画素ビット長を示す。変数inpTensorBitDepthY、inpTensorBitDepthCの値は、シンタクス要素nnpfc_inp_tensor_bitdepth_luma_minus8、nnpfc_inp_tensor_bitdepth_chroma_minus8から次のように導出される。
【0137】
inpTensorBitDepthY=nnpfc_inp_tensor_bitdepth_luma_minus8+8
inpTensorBitDepthC=nnpfc_inp_tensor_bitdepth_chroma_minus8+8
シンタクス要素nnpfc_inp_order_idcは、復号画像の画素配列をポストフィルタ処理への入力として順序付けする方法を示す。0以上3以下の範囲のnnpfc_inp_order_idcのセマンティクスは、nnpfc_inp_order_idcの値毎の入力テンソルinputTensorを導出するプロセスを指定する。また、垂直画素座標cTopと水平画素座標cLeftから、入力テンソルに含まれる画素のパッチの左上の画素位置を指定する。
【0138】
パッチとは、画像のコンポーネント(輝度と色差コンポーネントなど)からの画素の長方形の配列である。
【0139】
シンタクス要素nnpfc_constant_patch_size_flagが0の時、ポストフィルタ処理がnnpfc_patch_width_minus1、nnpfc_patch_height_minus1で示されるパッチサイズの正の整数倍であるパッチサイズを入力として受け入れることを示す。nnpfc_patch_width_minus1が1の場合は、ポストフィルタ処理がnnpfc_patch_height_minus1で示されるパッチサイズを入力として受け入れることを示す。
【0140】
シンタクス要素nnpfc_patch_width_minus1の値に1を加算した値は、nnpfc_constant_patch_size_flagの値が1の場合、ポストフィルタ処理への入力に必要なパッチサイズの水平画素数を示す。nnpfc_constant_patch_size_flagの値が0の場合、(nnpfc_patch_width_minus1+1)の任意の正の整数倍を、ポストフィルタ処理への入力に使用されるパッチサイズの水平画素数として使用できる。
【0141】
シンタクス要素nnpfc_patch_height_minus1に1を加算した値は、nnpfc_constant_patch_size_flagの値が1の場合、ポストフィルタ処理への入力に必要なパッチサイズの垂直画素数を示す。nnpfc_constant_patch_size_flagの値が0の場合、(nnpfc_patch_height_minus1+1)の任意の正の整数倍を、ポストフィルタ処理への入力に使用されるパッチサイズの垂直画素数として使用できる。
【0142】
シンタクス要素nnpfc_overlapは、隣り合う入力テンソルをオーバーラップさせる水平画素数と垂直画素数を指定する。nnpfc_overlapの値は、0以上16383以下の値でなければならない。
【0143】
変数inpPatchWidth、inpPatchHeight、outPatchWidth、outPatchHeight、horCScaling、verCScaling、outPatchCWidth、outPatchCHeight、およびoverlapSizeは、次のように導出する。
【0144】
inpPatchWidth=nnpfc_patch_width_minus1+1
inpPatchHeight=nnpfc_patch_height_minus1+1
outPatchWidth=(nnpfc_pic_width_in_luma_samples*inpPatchWidth)
/InpPicWidthInLumaSamples
outPatchHeight=(nnpfc_pic_height_in_luma_samples*inpPatchHeight)
/InpPicHeightInLumaSamples
horCScaling=SubWidthC/outSubWidthC
verCScaling=SubHeightC/outSubHeightC
outPatchCWidth=outPatchWidth*horCScaling
outPatchCHeight=outPatchHeight*verCScaling
overlapSize=nnpfc_overlap
nnpfc_pic_width_in_luma_samplesとnnpfc_pic_height_in_luma_samplesは各々nnpfc_idで特定されるポストフィルタを適応した輝度画像の幅と高さである。
【0145】
シンタクス要素nnpfc_padding_typeは、復号画像の境界外の画素位置を参照するときのパディングのプロセスを指定する。
【0146】
nnpfc_padding_typeの値は、0以上15以下の値でなければならない。
【0147】
nnpfc_padding_typeの値が0の場合、復号画像の境界外の画素位置の値を0とする。
【0148】
nnpfc_padding_typeの値が1の場合、復号画像の境界外の画素位置の値を境界値の値とする。
【0149】
nnpfc_padding_typeの値が2の場合、復号画像の境界外の画素位置の値を、境界値を境に鏡面反射させた値とする。より、厳密に値を定義するために、関数InpSampleValを定義する。関数InpSampleVal(y,x,picHeight,picWidth,Pic)は、入力が垂直画素位置y、水平画素位置x、画像の高さpicHeight、画像幅picWidth、および画素配列Picで、次のように導出されたsampleValの値を返す。
InpSampleVal(y, x, picHeight, picWidth, Pic) {
if(nnpfc_padding_type==0)
if(y<0 || x<0 || y>=picHeight || x>=picWidth)
sampleVal = 0
else
sampleVal = Pic[y][x]
else if(nnpfc_padding_type==1)
sampleVal = Pic[Clip3(0, picHeight-1, y)][Clip3(0, picWidth-1, x)]
else /*nnpfc_padding_type==2*/
sampleVal = Pic[Reflect(picHeight-1, y)][Reflect(picWidth-1, x)]
return sampleVal
}
シンタクス要素nnpfc_auxiliary_inp_idcはinputTensorに対して追加データがあるか否かを示す。0の場合、追加データがなく、0より大きい場合にはinputTensorに対して追加データを入力する。
【0150】
シンタクス要素nnpfc_out_format_idcは、0の場合、ポストフィルタ処理によって出力される画素値が、IEEE754-2019で指定されている浮動小数点値であることを示す。後処理によって出力される輝度画素値と色差画素値を、それぞれ画素ビット長の整数値に変換する関数OutYとOutCは、それぞれ画素ビット長BitDepthYとBitDepthCを用いて次のように指定される。
【0151】
OutY(x)=Clip3(0,(1<<BitDepthY)-1,Round(x*((1<<BitDepthY)-1)))
OutC(x)=Clip3(0,(1<<BitDepthC)-1,Round(x*((1<<BitDepthC)-1)))
nnpfc_out_format_idcの値が1の場合、ポストフィルタ処理によって出力される画素値が符号なし整数であることを示す。関数OutYと関数OutCは次のように指定される。
【0152】
shift=outTensorBitDepth-BitDepthY
if(outTensorBitDepth>=BitDepthY)
OutY(x)=Clip3(0,(1<<BitDepthY)-1,(x+(1<<(shift-1)))>>shift)
else
OutY(x)=x<<(BitDepthY-outTensorBitDepthY)
shift=outTensorBitDepthC-BitDepthC
if(outTensorBitDepthC>=BitDepthC)
OutC(x)=Clip3(0,(1<<BitDepthC)-1,(x+(1<<(shift-1)))>>shift)
else
OutC(x)=x<<(BitDepthC-outTensorBitDepthC)
nnpfc_out_tensor_bitdepth_luma_minus8+8は、出力整数テンソルの画素値の画素ビット長を指定する。outTensorBitDepthY、outTensorBitDepthCの値は、シンタクス要素nnpfc_out_tensor_luma_bitdepth_minus8、nnpfc_out_tensor_bitdepth_chroma_minus8から次のように導出される。
【0153】
outTensorBitDepthY=nnpfc_out_tensor_bitdepth_luma_minus8+8
outTensorBitDepthC=nnpfc_out_tensor_bitdepth_chroma_minus8+8
nnpfc_out_order_idcは、ポストフィルタ処理から得られた画素の出力順序を規定する。0以上3以下の値のnnpfc_out_order_idcのセマンティクスが規定されている。
【0154】
シンタクス要素nnpfc_reserved_zero_bit_bは0に等しくなければならない。
【0155】
シンタクス要素nnpfc_payload_byte[i]には、ISO/IEC15938-17に準拠するビットストリームのi番目のバイトが含まれる。nnpfc_payload_byte[i]は、すべてISO/IEC15938-17に完全に準拠するビットストリームでなければならない。
【0156】
(ニューラルネットワークポストフィルタ適用SEI
【0157】
(マップ単位の例)
図12は、適用SEIのシンタックス構成例を示す。
【0158】
この適用SEIに対して、ヘッダ復号部301、アトラス情報符号化部102は、以下のシンタックス要素をマップ単位で復号、符号化する。
【0159】
nnpfa_atlas_idは、適用SEIの適用対象となるアトラスの識別番号(ID)である。atlasIDにセットされる。なお、V3C unitのvuh_atlas_idをatlasIDにセットする場合、nnpfa_atlas_idは冗長である。従って、
図12以降の適用SEIのシンタックスにおいて、nnpfa_atlas_idをシグナルしない構成であってもよい。
【0160】
nnpfa_map_count_minus1は、フィルタ情報を伝送するマップ数-1を示す。符号化データに含まれる複数のジオメトリ画像は、番号mapIdx(図中はj)で識別される。ここでマップとは同じ時刻におけるデータを識別するために使われる。例えば、マップはNearとFarの2つの投影されたパッチが存在する場合などに利用してもよい。なお、マップ数を表すシンタックス要素としては、マップ数から-1された値のnnpfa_map_count_minus1ではなくシンタックス要素nnpfa_map_countを符号化、復号してもよい。
【0161】
nnpfa_enabled_flag[j]は、mapIdx=jの画像に特性SEIが示すポストフィルタを行うか否かを示す。値が1の場合は、ポストフィルタを行い、値が0の場合は行わない。
【0162】
nnpfa_target_id[j]は、マップj(mapIdx=j)の画像に適用する特性SEIのID(ポストフィルタの特性情報の識別子、識別情報)を示す。nnpfc_idがnnpfa_target_idと等しいnnpfa_idを有する特性SEIによって指定されたポストフィルタ処理を、mapIdx=jの画像に適用する。
【0163】
nnpfa_cancel_flag[i]はキャンセルフラグである。nnpfa_cancel_flag[j]が1であるとは、既に復号したNNPFA SEIで、mapIdx=jの画像に対して設定されたポストフィルタの維持をキャンセルすることを示す。nnpfa_cancel_flag[j]が0であるとは後続のシンタックス要素(nnpfa_persistence_flag[j])が伝送・符号化・復号されることを示す。
【0164】
nnpfa_persistence_flag[j]は、対象のポストフィルタの持続性情報を示す。nnpfa_persistence_flag[j]が0である場合には、対象のポストフィルタがatlasIDの示すピクチャのみに適用されることを示す。nnpfa_persistence_flag[j]が1である場合は、nnpfa_target_id[j]で示される対象のポストフィルタが以下のいずれかの条件を満たすまで現在のピクチャと後続の全てのピクチャに適用されることを示す。
・新しいCASが開始される。
・ビットストリームが終了する。
・nnpfa_cancel_flag[j]=1を有するNNPFA SEIメッセージが、出力順で現ピクチャに続いて出力される。つまり、nnpfa_cancel_flag[j]=1によってキャンセルされる。
また、以下でもよい。
・現在のSEIメッセージと同じnnpfa_target_idを有しかつnnpfa_cancel_flag[j]=1を有するNNPFA SEIメッセージが、出力順で現ピクチャに続いて出力される。つまり、nnpfa_cancel_flag[j]=1によってキャンセルされる。
【0165】
ヘッダ復号部301は、nnpfa_atlas_idを復号し、nnpfa_atlas_idに対するnnpfa_map_count_minus1を復号し、j=0からnnpfa_map_count_minus1のループを用いて、mapIdx=jの画像に対するnnpfa_enabled_flag[j]を復号する。ヘッダ復号部301は、nnpfa_enabled_flag[j]が1の場合に、mapIdx=jの画像に対するnnpfa_target_id[j]とnnpfa_cancel_flag[j]を復号する。さらにヘッダ復号部301は、nnpfa_cancel_flag[j]が0の場合に、mapIdx=jの画像に対するnnpfa_persistence_flag[j]を復号する。
【0166】
この構成では、符号化データを復号しアトリビュート情報を含む3Dデータを復号する3Dデータ復号装置において、符号化データからポストフィルタの特性情報とポストフィルタのアクティブ化情報を復号するヘッダ復号部と、符号化データからジオメトリ画像を復号するジオメトリ画像復号部と、符号化データからアトリビュート画像を復号するアトリビュート画像復号部と、アトリビュート画像もしくはジオメトリ画像のポストフィルタ処理を行うフレーム画像フィルタ部を備え、ヘッダ復号部は、上記アクティブ化情報から、アトラスの識別子、マップ数、特性情報の識別子、キャンセルフラグ、持続性情報を復号する。
【0167】
さらに、ヘッダ復号部31は、マップ数を復号し、0からマップ数-1までの各画像jに対する上記ポストフィルタの特性情報を復号してもよい。
【0168】
さらに、ヘッダ復号部31は、マップ数を復号し、0からマップ数-1までの各画像jに対するキャンセルフラグと、各画像jに対する上記ポストフィルタの特性情報の識別子と各画像jに対する上記持続性情報を復号してもよい、
上記により、マップ単位でポストフィルタ処理のキャンセル及び持続期間を設定しながら、同じ単位でポストフィルタ処理の特性情報を指定できるという効果を奏する。
【0169】
さらに、符号化アクセスユニットに備える全てのマップ(全てのmapIdx)に対して、特性情報及び持続性情報などのシンタックス要素を復号せず、一部のシンタックス要素は3Dデータ復号装置31(復号装置のヘッダ復号部301)で導出してもよい。具体的には、nnpfa_target_id[j]のシンタックス要素がビットストリームにあらわれない場合に以下のように導出してもよい。
【0170】
nnpfa_target_id[j] = nnpfa_target_id[0]
さらにnnpfa_cancel_flag[j]、nnpfa_persistence_flag[j]があらわれない場合には以下を適用してもよい。
【0171】
nnpfa_cancel_flag[j] = nnpfa_cancel_flag[0]
nnpfa_persistence_flag[j] = nnpfa_persistence_flag[0]
つまり、ヘッダ復号部301は、マップjに対する特性情報の識別子が現れない場合には、特性情報の識別子としてマップ0に対する特性情報の識別子を用いてもよい。
この構成によれば、mapIdx>0の画像に適用するポストフィルタの特性情報および持続性情報を伝送することなく、mapIdx=0の画像と同じ処理を適用することができるため、符号量を削減する効果を奏する。
【0172】
また、nnpfa_target_id[j]があらわれない場合には以下を適用してもよい。
【0173】
nnpfa_target_id[j] = nnpfa_target_id[j-1]
さらにnnpfa_cancel_flag[j]、nnpfa_persistence_flag[j]があらわれない場合には以下を適用してもよい。
【0174】
nnpfa_cancel_flag[j] = nnpfa_cancel_flag[j-1]
nnpfa_persistence_flag[j] = nnpfa_persistence_flag[j-1]
つまり、ヘッダ復号部301は、マップjに対する特性情報の識別子が現れない場合には、特性情報の識別子としてマップj-1に対する特性情報の識別子を用いてもよい。
この構成によれば、mapIdx=jの画像に適用するポストフィルタの特性情報および持続性情報を伝送することなく、直前のmapIdx=j-1の画像と同じ処理を適用することができるため、符号量を削減する効果を奏する。mapIdx>nnpfa_map_count_minus1の特性情報及び持続性情報を伝送することなく、mapIdx=nnpfa_map_count_minus1の画像と同じ処理を適用することができる。
【0175】
(適用SEIの他の例1)
図14、
図15は、適用SEIの別のシンタックス構成例を示す。ここでは、キャンセルフラグと持続性情報をアトリビュート画像iやマップjごとに伝送せず、共通とする。
【0176】
より具体的には、ヘッダ復号部301、アトラス情報符号化部102は以下の意味を有するシンタックス要素を復号、符号化する。他のシンタックス要素についてはすでに説明したとおりである。
【0177】
nnpfa_cancel_flagが1であるとは、atlasIDがnnpfa_atlas_idに等しい画像(nnpfa_atlas_idで示される画像)に対して以前に設定されたニューラルネットワークによるポストフィルタの維持をキャンセルすることを示す。nnpfa_cancel_flagが0であるとは、後続のシンタックス要素が伝送・符号化・復号されることを示す。
【0178】
nnpfa_persistence_flagは、nnpfa_atlas_idで示される画像に対するポストフィルタの持続性情報を示す。nnpfa_persistence_flagが0である場合には、対象のポストフィルタがnnpfa_atlas_idの示すピクチャのみに適用されることを示す。nnpfa_persistence_flagが1である場合は、以下のいずれかの条件を満たすまで現在のピクチャと後続の全てのピクチャに適用されることを示す。
・新しいCASが開始される。
・ビットストリームが終了する。
・同じatlasIDを有しかつnnpfa_cancel_flag=1を有するNNPFA SEIメッセージが、出力順で現ピクチャに続いて出力される。つまり、nnpfa_cancel_flag=1によってキャンセルされる。
【0179】
図14の構成によれば、マップによらずポストフィルタ処理のキャンセル及び持続期間を設定しながら、マップ単位でポストフィルタ処理のオンオフを指定できるという効果を奏する。
【0180】
図15の構成によれば、アトリビュート画像およびマップによらずポストフィルタ処理のキャンセル及び持続期間を設定しながら、アトリビュート画像およびマップ単位でポストフィルタ処理のオンオフ指定できるという効果を奏する。
【0181】
(ジオメトリ画像の適用SEI)
ジオメトリ画像にフィルタ処理をする場合において、ジオメトリ画像専用の適応SEIを伝送してもよい。より具体的には、
図12,
図14に示すように、マップ単位で、特性SEIのidを示すnnpfa_target_idを復号・符号化もしくは伝送する。
【0182】
図16は、ジオメトリ画像にフィルタを適用する場合における適応SEIのシンタックスの例である。nn_post_filter_activationをnn_geometory_post_filter_activationと名称を変え、SEIのpayloadTypeの値でジオメトリ画像用の適用SEIを区別する。payloadTypeはSEIのヘッダ部のシンタックスであるsm_payload_type_byteで符号化、復号もしくは伝送される。
【0183】
この構成では、ヘッダ復号部は、0からマップ数-1までの各画像jに対するジオメトリ画像に対する上記ポストフィルタの特性情報を復号し、さらに上記ヘッダ復号部は、アトリビュート数を復号し、0からアトリビュート数-1までの各アトリビュート画像iに対する上記ポストフィルタの特性情報の識別子を復号する。
【0184】
上記の実施形態の適用SEIにおける、線形フィルタを使用する場合の特性SEI、適用SEIの例について以下、詳細を説明する。
【0185】
以下の実施例においても、ヘッダ復号部301、あるいは、アトラス情報符号化部102は、シンタックス要素を符号化データから復号、あるいは、シンタックス要素を符号化データに符号化する。
【0186】
(線形ポストフィルタ特性SEI)
図17(a)は、ポストフィルタが線形フィルタである場合のフィルタ情報のシンタックス、nn_post_filter_characteristics(payloadSize)(特性SEI)の一部を示す。引数のpayloadSizeは、このSEIメッセージのバイト数を表している。
【0187】
特性SEIを適用する持続期間(persistence scope)はニューラルネットワーク特性SEIと同様、CASであり、説明は省略する。
【0188】
nnpfc_idはポストフィルタを同定するために使用する識別子である。
【0189】
filter_param()は線形フィルタの係数情報であり、3Dデータ符号化装置11はフィルタ係数情報を符号化、シグナルし、3Dデータ復号装置31が復号する(以下、符号化、復号することは省略し単にシグナルすると記載する)。具体的なシンタックス要素の例は
図17(b)で示される。
【0190】
num_filters_signalled_minus1プラス1はnnpfc_idで特定される線形フィルタの数である。線形フィルタの数は画面を分割して得られる領域のクラス数であってもよい。各クラスは(ALF部610)で説明されたclassIdに対応する。classIdで示される線形フィルタに対しNcoeff個のflt_coeff_absとflt_coeff_signを各々ue(v)、u(1)のバイナリゼーションでシグナルする。Ncoeffは符号化するフィルタ係数の数でありフィルタの長さ(タップ数)であってもよい。フィルタ係数が対象画素に対して対称性を持つ場合には、Ncoeffはフィルタ長の1/2に1を加えた値であってもよい。つまり、3x3フィルタのタップ数は通常9個であるが、対称性を有する場合には、中心の1個を除くフィルタ係数4個と別のフィルタ係数4個は同じ値であるので5個(9/2+1)だけのシグナルでよい。なお、絶対値と符号に分割せずcoeffを直接se(v)バイナリゼーションを用いてシグナルしてもよい。
【0191】
flt_coeff_abs[i][j]はclassId=iで示されるフィルタのj番目の係数の絶対値を表わす。flt_coeff_abs[i][j]がシグナルされない場合、0にセットする。
【0192】
flt_coeff_sign[i][j]はclassId=iで示されるフィルタのj番目の係数の符号(正もしくは負)を表わす。lmpf_coeff_sign[i][j]=0の場合、係数は正値であり、lmpf_coeff_sign[i][j]=1の場合、係数は負値である。lmpf_coeff_sign[i][j]がシグナルされない場合、0にセットする。(ALF部610)で説明したフィルタ係数coeff[classId][]は下式で導出される。
【0193】
coeff[classId][j] = flt_coeff_abs[i][j] * (1 - 2 * flt_coeff_sign[i][j])
classId=0..num_filters_signalled_minus1、j=0..Ncoeff-1である。
【0194】
上記構成では、適用SEIで指定されるnnpfa_target_idに等しいnnpfa_idを持つ特性SEIがNNモデルを有する場合にNNフィルタを適用する。そうではなく、フィルタ係数filter_paramを有する場合には線形フィルタを適用する。
【0195】
(NNフィルタと線形フィルタで共通のSEIの例)
図18は、NNフィルタおよび線形フィルタに共通の特性SEIであるnn_post_filter_characteristics(payloadSize)のシンタックスの一例を示す。
【0196】
nnpfc_idはポストフィルタを同定するために使用する識別子である。SEIメッセージは現在のCLVSに対し特定のnnpfc_idを持つ。
【0197】
nnpfc_mode_idc=100は、本特性SEIで適用するポストフィルタが線形フィルタであることを示す。nnpfc_mode_idc=100の場合、filter_param()がシグナルされる。filter_param()の一例は
図17(b)に示される。nnpfc_mode_idc!=100は、nnpfc_idが関連する基本となるポストフィルタがNNフィルタであることを示す。nnpfc_mode_idc!=100の場合、
図11で示されるNNフィルタと同じシンタックス要素がシグナルされる。
【0198】
上記構成では、NNフィルタおよび線形フィルタ毎に個別の特性SEIをシグナルするのではなく、共通のSEIをシグナルし、NNモデルのシンタックスをシグナルするか、フィルタ係数filter_paramのシンタックスをシグナルするかを切り替えることにより、符号化側での選択が容易になるという効果を奏する。
【0199】
(線形ポストフィルタ適用SEI)
<線形フィルタとNNフィルタを区別する構成>
図19(a)は、ポストフィルタが線形フィルタである場合の特性SEIメッセージのシンタックス、(b)、(c)はポストフィルタが線形フィルタである場合の適用SEIメッセージのシンタックスを示す。引数のpayloadSizeは、このSEIメッセージのバイト数を表している。シンタックス要素に関し、(a)は
図17、(b)は
図14、(c)は
図15で説明したとおりである。"nnpfa_"を"lmpfa_"に置き換えている点以外は、シンタックス構成も同じである。本構成でも、特性SEIにおいてフィルタパラメータを伝送し、適用SEIで持続性情報および特性SEIのIDを伝送する点は同じである。本構成では、線形フィルタの適用SEIは線形フィルタの特性SEIを指定し、NNフィルタの適用SEIはNNフィルタの特性SEIを指定する。
【0200】
この適用SEIに対して、ヘッダ復号部301、アトラス情報符号化部102は、以下のシンタックス要素をマップ単位、アトリビュート画像単位で復号、符号化する。
【0201】
lmpfa_atlas_idは、適用SEIの適用対象となるアトラスの識別番号(ID)である。
【0202】
lmpfa_map_count_minus1は、フィルタ情報を伝送するマップ数-1を示す。lmpfa_attribute_count_minus1は、フィルタ情報を伝送するアトリビュート画像数-1を示す。マップ、アトリビュート画像は(ニューラルネットワークポストフィルタ適用SEI)の記載と同じであり、説明を省略する。また、lmpfa_enabled_flag、lmpfa_target_id、lmpfa_cancel_flag、lmpfa_persistence_flagは、特に記載がない限り、(ニューラルネットワークポストフィルタ適用SEI)に記載されたnnpfa_enabled_flag、nnpfa_target_id、nnpfa_cancel_flag、nnpfa_persistence_flagと同じ定義であり、説明を省略する。
【0203】
図19(b)は適用SEIのシンタックスの一例である。(b)では、本適用SEIで共通のlmpfa_atlas_id、lmpfa_cancel_flagがシグナルされる。lmpfa_cancel_flagが0の場合、lmpfa_persistence_flag、lmpfa_map_count_minus1がシグナルされる。さらに、マップ単位でlmpfa_enabled_flag[j]がシグナルされる。lmpfa_enabled_flag[j]が1の場合、lmpfa_target_id[j]がシグナルされる。シグナルされなかったシンタックス要素は0にセットされる。
【0204】
図19(c)は適用SEIのシンタックスの別の例である。(b)ではlmpfa_enabled_flag、lmpfa_target_id[j]がマップ単位でシグナルされたが、(c)ではマップ単位、アトリビュート画像単位でシグナルされる。具体的には、lmpfa_cancel_flagが0の場合、lmpfa_persistence_flag、lmpfa_attribute_count_minus1、lmpfa_map_count_minus1がシグナルされる。さらに、マップ単位、アトリビュート画像単位でlmpfa_enabled_flag[i][j]がシグナルされる。lmpfa_enabled_flag[i][j]が1の場合、lmpfa_target_id[i][j]と [i][j]がシグナルされる。シグナルされなかったシンタックス要素は0にセットされる。
【0205】
適用SEIでシグナルされたlmpfa_target_id[i][j]と同じ値を持つlmpfc_idを有する線形フィルタの特性SEI(lm_)によって指定されたポストフィルタ処理を、mapIdx=j、attrIdx=iの画像に適用する。
【0206】
以上により、様々なマップ、アトリビュート画像に適したフィルタ係数をビットストリームに付加してシグナルするため画質が向上する。
【0207】
(線形ポストフィルタSEIの例)
本実施例では、特性SEIと適用SEIを区別せず、ポストフィルタSEIで直接、持続性情報とフィルタ係数をシグナルする方法を説明する。
【0208】
図20は、ポストフィルタSEIにおいて直接フィルタパラメータを伝送する場合の例である。ここではフィルタ特性を識別する識別子lmpfa_target_idをシグナルする代わりに、フィルタ特性であるフィルタ係数filter_param()をシグナルする。filter_param(j)のシンタックスを
図21(a)に示す。
【0209】
図21(a)はマップ単位でフィルタ係数をシグナルする例である。mapIdx単位でlmpf_coeff_abs[mapIdx][i][j]、lmpf_coeff_sign[mapIdx][i][j]がシグナルされる。それ以外は、filter_param()の説明と同じであり、説明を省略する。
【0210】
本実施例においても、様々なマップに適したフィルタ係数をビットストリームに付加してシグナルするため画質が向上する。
【0211】
(線形ポストフィルタSEIの例2)
本実施例では、特性SEIと適用SEIを区別せず、ポストフィルタSEIで直接、持続性情報とフィルタ係数をシグナルする別の方法を説明する。
【0212】
図20(b)は、マップ単位、アトリビュート単位でフィルタ係数をシグナルする例である。filter_param(i,j)のシンタックスを
図21(b)に示す。
【0213】
図11(b)はマップ単位、アトリビュート単位でフィルタ係数flter_coeff(attrIdx, mapIdx)をシグナルする。mapIdx単位、attrIdx単位でlmpf_coeff_abs[attrIdx][mapIdx][i][j]、lmpf_coeff_sign[attrIdx][mapIdx][i][j]がシグナルされる。それ以外は、filter_param()の説明と同じであり、説明を省略する。
【0214】
本実施例においても、様々なマップ、アトリビュート画像に適したフィルタ係数をビットストリームに付加してシグナルするため画質が向上する。
【0215】
さらに本実施例では、適用SEIで直接フィルタ係数をシグナルする。従って、特性SEIでフィルタ係数を別途シグナルする必要はなく、適用SEIのみでポストフィルタに利用するフィルタをシグナルすることができる。
【0216】
(直前に使用したポストフィルタを指定するSEIの例1)
図22は、
図19に対しnnpfa_prev_flt_flagを追加してシグナルする例である。nnpfa_prev_flt_flagは直前に使用したフィルタと同一であるか否かを示すフラグである。nnpfa_prev_flt_flag=1の場合、直前に使用したフィルタを使用することを示す。従って、nnpfa_target_idはシグナルせず、直前の値をコピーする。nnpfa_prev_flt_flag=0の場合、直前に使用したフィルタ以外のフィルタを使用することを示す。従って、nnpfa_prev_flt_flag=0の場合にはnnpfa_target_idをシグナルする。
図22(a)はマップ単位でnnpfa_prev_flt_flag[j]をシグナルする例でありシグナルされたフィルタをジオメトリ画像に適用してもよい。一方、
図22(b)はマップ単位、アトリビュート画像単位でnnpfa_prev_flt_flag[i][j]をシグナルする例でありシグナルされたフィルタをアトリビュート画像に適用してもよい。
【0217】
(直前に使用したポストフィルタを指定するSEIの例2)
図23は、
図20に対しnnpfa_prev_flt_flagを追加してシグナルする例である。nnpfa_prev_flt_flagは直前に使用したフィルタと同一であるか否かを示すフラグである。nnpfa_prev_flt_flag=1の場合、直前に使用したフィルタを使用することを示す。従って、nnpfa_target_idはシグナルせず、直前の値をコピーする。nnpfa_prev_flt_flag=0の場合、直前に使用したフィルタ以外のフィルタを使用することを示す。従って、nnpfa_prev_flt_flag=0の場合にはfilter_param()をシグナルする。
図23(a)はマップ単位でnnpfa_prev_flt_flag[j]をシグナルする例でありシグナルされたフィルタをジオメトリ画像に適用してもよい。一方、
図23(b)はマップ単位、アトリビュート画像単位でnnpfa_prev_flt_flag[i][j]をシグナルする例でありシグナルされたフィルタをアトリビュート画像に適用してもよい。
【0218】
(NNフィルタと線形フィルタで共通のSEIの例1)
NNフィルタおよび線形フィルタ毎に個別の適用SEIを設定するのではなく、共通のSEIを設定してもよい。
【0219】
本実施形態ではNNフィルタおよび線形フィルタに共通の適用SEIと、NNフィルタ用の特性SEIおよび線形フィルタ用の特性SEIの組み合わせを説明する。
【0220】
図24はNNフィルタおよび線形フィルタに共通の適用SEIのシンタックスの一例である。
図24(a)では、
図16のシンタックスに対し、nnpfa_filter_typeを追加でシグナルする。nnpfa_filter_typeはポストフィルタが線形フィルタか、NNフィルタかを示すパラメータである。
【0221】
nnpfa_filter_type=0ならば、ポストフィルタは線形フィルタであり、lmpfa_target_id[j]をシグナルする。そしてマップ単位で、lmpfc_post_filter_characteristicsのlmpfc_idの中から、lmpfa_target_id[j]と同じlmpfc_idが示すfilter_param()を復号し、線形フィルタのフィルタ係数を導出する。filter_param()の一例を
図17(b)に示す。
【0222】
nnpfa_filter_type=1ならば、ポストフィルタはNNフィルタであり、nnpfa_target_id[j]をシグナルする。そして、nnpfc_post_filter_characteristicsのnnpfc_idの中から、nnpfa_target_id[j]と同じnnpfc_idが示すフィルタパラメータを復号し、NNフィルタのフィルタ係数を導出する。nnpfc_idが示すフィルタパラメータの一例を
図11に示す。
図24(b)では、
図15のシンタックスに対し、nnpfa_filter_typeを追加でシグナルする。(a)はマップ単位でlmpfa_target_id[j]をシグナルしたが、(b)ではマップ単位、アトリビュート画像単位でlmpfa_target_id[i][j]をシグナルする。それ以外の構成は同じである。
【0223】
以上のように、本実施形態ではNNフィルタおよび線形フィルタに共通の適用SEIと、NNフィルタ用の特性SEIおよび線形フィルタ用の特性SEIの組み合わせにより、シンタックスを簡略化することができる。
【0224】
(3Dデータ符号化装置の構成)
図9は、本発明の実施形態に係る3Dデータ符号化装置11の概略構成を示す機能ブロック図である。
【0225】
3Dデータ符号化装置11は、パッチ生成部101、アトラス情報符号化部102、オキュパンシマップ生成部103、オキュパンシマップ符号化部104、ジオメトリ画像生成部105、ジオメトリ画像符号化部106、アトリビュート画像生成部108、アトリビュート画像符号化部109、フレーム画像フィルタパラメータ導出部110、多重化部111から構成される。3Dデータ符号化装置11は、3Dデータとしてポイントクラウドもしくはメッシュを入力して、符号化データを出力する。
【0226】
パッチ生成部101は、3Dデータを入力し、パッチ(ここでは矩形の画像)の集合を生成し、出力する。具体的には、3Dデータは、複数の領域に分割され、各領域は3D空間上に設定された3Dバウンディングボックスのいずれかの平面に投影され、複数のパッチを生成する。パッチ生成部101は、3Dバウンディングボックスに関する情報(座標、サイズなど)、投影面へのマッピングに関する情報(各パッチの投影面、座標、サイズ、回転有無など)をアトラス情報として出力する。
【0227】
アトラス情報符号化部102は、パッチ生成部101から出力されるアトラス情報を符号化しアトラス情報符号化ストリームを出力する。アトラス情報符号化部102は、上記SEIを適用するatlasIDの値をnnpfa_atlas_idに設定する。
【0228】
オキュパンシマップ生成部103は、パッチ生成部101から出力されるパッチの集合を入力し、各パッチの有効領域(3Dデータが存在する領域)を2Dバイナリ画像(例えば有効領域を1、無効領域を0)として示したオキュパンシマップを生成する。なお有効領域、無効領域の値は255と0など別の値を用いてもよい。
【0229】
オキュパンシマップ符号化部104は、オキュパンシマップ生成部103から出力されるオキュパンシマップを入力し、オキュパンシマップ符号化ストリーム、及び符号化オキュパンシマップを出力する。符号化方式としては、VVCやHEVCなどを用いる。
【0230】
ジオメトリ画像生成部105は、3Dデータ、オキュパンシマップ、符号化オキュパンシマップ、及びアトラス情報に基づき、各パッチの投影面に対するデプス値を格納したジオメトリ画像を生成する。ジオメトリ画像生成部105は、画素g(x,y)に投影されるポイントのうち投影面に対するデプスが最小のポイントをp_min(x,y,z)として導出する。また、画素g(x,y)に投影されp_min(x,y,z)から所定の距離dにあるポイントのうちデプスが最大のポイントをp_max(x,y,z)として導出する。投影面のすべての画素に対してp_min(x,y,z)を投影したジオメトリ画像をNearレイヤのジオメトリ画像に設定する。投影面のすべての画素に対してp_max(x,y,z)を投影したジオメトリ画像をFarレイヤのジオメトリ画像に設定する。
【0231】
ジオメトリ画像符号化部106は、ジオメトリ画像を入力し、ジオメトリ画像符号化ストリーム、及び符号化ジオメトリ画像を出力する。符号化方式としては、VVCやHEVCなどを用いる。
【0232】
アトリビュート画像生成部108は、3Dデータ、符号化オキュパンシマップ、符号化ジオメトリ画像及びアトラス情報に基づき、各パッチの投影面に対するカラー情報(例えば、YUV値、RGB値など)を格納したアトリビュート画像を生成する。アトリビュート画像生成部108は、ジオメトリ画像生成部106によって算出されたデプスが最小のポイントp_min(x,y,z)に対応するアトリビュートの値を求め、その値を投影したアトリビュート画像をNearレイヤのアトリビュート画像に設定する。p_max(x,y,z)に対しても同様に求めたアトリビュート画像をFarレイヤのアトリビュート画像に設定する。
【0233】
アトリビュート画像符号化部109は、アトリビュート画像を入力し、アトリビュート画像符号化ストリーム、及び符号化アトリビュート画像を出力する。符号化方式としては、VVCやHEVCなどを用いる。
【0234】
フレーム画像フィルタパラメータ導出部110は、符号化アトリビュート画像とオリジナルのアトリビュート画像、あるいは、符号化ジオメトリ画像とオリジナルのジオメトリ画像を入力し、NNフィルタ処理において最適なフィルタパラメータを選択もしくは導出し、出力する。
【0235】
フレーム画像フィルタパラメータ導出部110は、上記SEIに、nnpfa_enabled_flag, nnpfa_target_id, nnpfa_cancel_flag, nnpfa_persistance_flag, nnpfa_weight_block_size_idx, nnpfa_weight_map_width_minus1, nnpfa_weight_map_height_minus1, nnpfa_weight_mapの値を設定する。さらにnnpfa_strength_block_size_idx, nnpfa_strength_map_width_minus1, nnpfa_strength_map_height_minus1, nnpfa_strength_mapの値を設定してもよい。
【0236】
多重化部111は、フレーム画像フィルタパラメータ導出部110から出力されるフィルタパラメータを入力し、所定のフォーマットで出力する。所定のフォーマットとは、例えば、映像データの補助拡張情報であるSEI、V3C規格におけるデータ構造の指定情報であるASPS、AFPS、メディアファイルフォーマット規格であるISOBMFFなどである。多重化部111は、また、アトラス情報符号化ストリーム、オキュパンシマップ符号化ストリーム、ジオメトリ画像符号化ストリーム、アトリビュート画像符号化ストリーム、および、上記フィルタパラメータを多重化して符号化データとして出力する。多重化方式としては、バイトストリームフォーマット、ISOBMFFなどを用いる。
【0237】
図13は、本発明の実施形態に係る3Dデータ符号化装置11、3Dデータ復号装置31とSEIメッセージの関係を示すブロック図である。
【0238】
3Dデータ符号化装置11は、VVC符号化部とSEI符号化部から構成される。VVC符号化部は
図9の構成では、オキュパンシマップ符号化部104、ジオメトリ画像符号化部106、アトリビュート画像符号化部109に対応する。SEI符号化部は
図9の構成では、アトラス情報符号化部102に対応する。
【0239】
3Dデータ復号装置31は、VVC復号部、SEI復号部、スイッチとポストフィルタ部から構成される。VVC復号部は
図6の構成では、オキュパンシマップ復号部303、ジオメトリ画像復号部304、アトリビュート画像復号部307に対応する。SEI復号部は
図6の構成ではヘッダ復号部301に対応する。ポストフィルタ部は
図6の構成ではフレーム画像フィルタ部308に対応する。フレーム画像フィルタ部308はNNフィルタ部611あるいはALF部610のいずれか、あるいは両方を含んでもよい。
【0240】
3Dデータから生成されたオキュパンシマップ、ジオメトリ画像、アトリビュート画像はVVC符号化部で符号化される。符号化データはVVC復号部で復号され、復号画像が再構成される。SEI符号化部は3Dデータから特性SEIおよび適用SEIを生成する。SEI復号部はこれらのSEIメッセージを復号する。適用SEIはポストフィルタ処理する画像を指定するためスイッチに入力され、ポストフィルタ処理する画像だけがポストフィルタ部に入力される。特性SEIはポストフィルタ部に入力され、復号画像に適用するポストフィルタを指定する。ポストフィルタ処理された画像、あるいは、復号画像は3Dデータ表示部41(
図1)で表示される。
【0241】
以上、図面を参照してこの発明の一実施形態について詳しく説明してきたが、具体的な構成は上述のものに限られることはなく、この発明の要旨を逸脱しない範囲内において様々な設計変更等をすることが可能である。
【0242】
本発明の実施形態は上述した実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能である。すなわち、請求項に示した範囲で適宜変更した技術的手段を組み合わせて得られる実施形態についても本発明の技術的範囲に含まれる。
【産業上の利用可能性】
【0243】
本発明の実施形態は、3Dデータが符号化された符号化データを復号する3Dデータ復号装置、および、3Dデータが符号化された符号化データを生成する3Dデータ符号化装置に好適に適用することができる。また、3Dデータ符号化装置によって生成され、3Dデータ復号装置によって参照される符号化データのデータ構造に好適に適用することができる。
【符号の説明】
【0244】
11 3Dデータ符号化装置
101 パッチ生成部
102 アトラス情報符号化部
103 オキュパンシマップ生成部
104 オキュパンシマップ符号化部
105 ジオメトリ画像生成部
106 ジオメトリ画像符号化部
108 アトリビュート画像生成部
109 アトリビュート画像符号化部
110 フレーム画像フィルタパラメータ導出部
111 多重化部
21 ネットワーク
31 3Dデータ復号装置
301 ヘッダ復号部
302 アトラス情報復号部
303 オキュパンシマップ復号部
304 ジオメトリ画像復号部
306 ジオメトリ再構成部
307 アトリビュート画像復号部
308 フレーム画像フィルタ部
309 アトリビュート再構成部
310 3Dデータ再構成部
41 3Dデータ表示装置