Hunyuan3D 1.0: A Unified Framework for Text-to-3D and Image-to-3D Generation (2024) 

### Hunyuan3D 1.0: A Unified Framework for Text-to-3D and Image-to-3D Generation (Tenent, 2024) 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/e6be6e19-11c3-47f9-8375-d8c75dc80be1.png)


#### 3行要約

1.  🎮 Hunyuan3D 1.0は、テキストおよび画像からの高品質な3D生成を可能にする統一フレームワークです。
2.  🚀 これは、効率的なマルチビュー拡散による画像生成と、生成された画像からの高速なフィードフォワード再構成という2段階アプローチを採用しています。
3.  🏆 適応的CFGやハイブリッド入力などの革新的な設計により、本手法は既存手法を上回る速度と最先端の品質バランスを実現しました。

#### Q:この論文の概要を教えてください
#### A:

本論文は、高品質な3Dアセットを迅速に生成するための統一フレームワークであるHunyuan3D 1.0を提案する。既存の3D拡散モデルが抱える生成速度の遅さや汎化性能の低さといった課題に対処するため、本手法はText-to-3DおよびImage-to-3D生成の両方に対応するライト版と標準版を含む2段階のアプローチを採用する。

第1段階では、Multi-view Diffusionモデルを用いて、異なる視点からのMulti-view RGB画像を約4秒で効率的に生成する。これは、大規模な2D拡散モデルであるHunyuan-DiT [22] や Latent Diffusion Models [37] をファインチューニングして構築される。生成するMulti-view画像はグリッド状（例：3x2グリッド）に配置される。Reference attention [40] を利用することで、条件画像（入力テキストや画像）と意味内容やテクスチャが類似した画像を生成するようモデルを誘導する。また、生成するビューのカメラポーズをElevation 0度に固定し、Azimuthを {0°, 60°, 120°, 180°, 240°, 300°} とする0-elevation orbitを採用することで、生成されるビュー間の可視領域を最大化している。Multi-view生成におけるMulti-view inconsistencyの問題に対処するため、本手法はAdaptive Classifier-Free Guidance (CFG) を導入する。これは、ビューと時間ステップに応じてCFGスケールを動的に調整する手法である。具体的には、フロントビューでは時間$t$に応じたCFGスケール$w_t$を以下の式で設定する。
$$w_t = 2 + 16 \cdot (t/1000)^5 \quad (1)$$
他のビューでは、フロントビューからのビュー距離に応じてスケール因子$\tau_v \in [0.5, 1]$ を乗算し、$w_{t,v} = w_t \cdot \tau_v$ とする ($ \tau_{\text{front}}=1, \tau_{\text{back}}=0.5$) $[56]$。これにより、フロントビューの細部とバックビューの多様性のバランスを取り、よりコヒーレントなMulti-view画像を生成する。

第2段階では、Sparse-view Reconstructionモデルが、生成されたMulti-view画像を入力として、3Dアセットを約7秒で迅速かつ忠実に再構築する。このモデルはTransformerベースであり、フィードフォワード方式で動作する。ほとんどのSparse-view Reconstructionモデルがビュー情報が既知のRGB画像のみを入力とするのに対し、本手法は生成されたキャリブレーション済みのMulti-view画像に加え、ビューポーズが未知の元の条件画像（ユーザー入力画像）を補助入力として組み込むHybrid Inputsアプローチを採用する。これにより、0-elevation orbitのMulti-view画像では捉えきれない上部や下部などの未見領域の情報を補完する。条件画像は、特別なfull-zero embeddingをカメラembeddingとして使用するView-agnostic branchを通じて統合され、生成画像と区別される。さらに、詳細表現を強化するために、Triplane表現に対する軽量なSuper-resolutionモジュールを導入する。初期段階では64x64のTriplane (1024チャンネル) を生成し、これを線形層を用いて4x4の高解像度Triplaneトークンにデコードすることで、256x256解像度で120チャンネルのTriplane特徴を得る。これにより、計算量の線形性を保ちつつ、より高精細な形状を再構築可能となる。3D表現としては、SDF (Signed Distance Function) [50] を用いてImplicit表現で形状を学習し、Marching Cube [28] アルゴリズムによってExplicitなMeshに変換する。最終出力はUVマップ付きのMeshとなり、実用的なアプリケーションでの利用に適している。

学習は、Objaverse [6, 7] に類似した大規模な社内データセットを用いて、Multi-view DiffusionモデルとSparse-view Reconstructionモデルを個別に実施する。Multi-view Diffusionモデルのライト版はSD-2.1、標準版はSD-XLをバックボーンとする。Sparse-view Reconstructionモデルは、DINOエンコーダーを用いて画像特徴を抽出し、Tri-planeを中間潜在表現とする。評価は、GSO [9] と OmniObject3D [57] の公開データセットを用い、Chamfer Distance (CD) と F-score (FS) によって定量的に行う。Implicit表現をMeshに変換するためにMarching Cubesを使用し、必要に応じてICPによる位置合わせを行う。

実験結果として、Hunyuan3D 1.0はGSOおよびOmniObject3Dデータセットにおいて、既存のフィードフォワードベース手法（OpenLRM [11]、TripoSR [44]、InstantMesh [59]など）を上回るSOTA性能を達成した。特に標準版は、CDとF-scoreの両方で優れたスコアを示した。定性的な比較では、形状とテクスチャの両方において、既存手法よりも高品質な再構築を実現した。ユーザー調査でも、Hunyuan3D 1.0は最高の評価を得ている。生成速度と品質のバランスも優れており、ライト版は約10秒、標準版は約25秒で3D Meshを生成可能である（UV展開とテクスチャベイクは別途約15秒）。Adaptive CFGとHybrid Inputsに関するAblation Studyでは、それぞれの技術がMulti-viewの一貫性と未見領域の再構築精度向上に効果的であることを確認した。

結論として、Hunyuan3D 1.0は、Multi-view拡散モデルとSparse-view Reconstructionモデルを組み合わせた革新的な2段階パイプラインにより、Text-to-3DおよびImage-to-3D生成において、高速かつ高品質な3Dアセット生成を実現する。本手法のAdaptive CFG、Hybrid Inputs、軽量Super-resolutionモジュールといった貢献は、3D生成分野における進歩に大きく寄与するものである。



#### Q: 提案手法の処理の流れを順序だてて説明してください
#### A:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/cee39c5f-083a-49e1-a7e8-3360b274c0e6.png)

この手法は、大きく分けて二つの主要な段階で構成されています。

1.  **複数の視点からの画像を生成する段階:**
    *   まず、ユーザーからの入力として、テキストによる説明か、または一枚の画像を受け取ります。
    *   この入力情報をもとに、特別な画像生成モデルを使って、対象物が複数の異なる方向からどのように見えるかという画像を効率的に生成します。
    *   特に、地面と同じ高さで、ぐるりと周囲を回るような特定の視点からの画像をいくつか作り出します。これは、後の段階で立体形状を復元するための準備となります。
    *   この段階では、生成される画像の質（細かさや形状の一貫性）を調整するための工夫も行われています。

2.  **生成された画像を元に立体形状を復元する段階:**
    *   次に、第一段階で生成された複数の視点からの画像と、最初の入力画像を組み合わせて、立体復元モデルに入力します。
    *   このモデルは、入力された画像群が持つ情報（様々な角度からの見た目など）を解析して、対象物の立体的な形を高速に計算し復元します。
    *   特に、生成された画像だけでは見えにくい部分の形状を補うために、元の入力画像の情報も活用します。
    *   また、復元される立体形状の細部まで鮮明に再現するための仕組みも含まれています。
    *   最終的に、この段階を経て、コンピュータ上で扱える完成された立体モデル（メッシュ形式）が出力されます。

つまり、まず様々な角度からの「見え方」を生成し、次にその「見え方」と元の情報を合わせて「実際の立体形状」を作り出す、という流れになっています。これにより、テキストや一枚の画像から、高速に質の高い立体モデルを生成することが可能になります。

Q: 関連研究とそれらの手法との比較について詳しく説明してください

A:
この論文で言及されている関連研究は、大きく分けて二つの分野に分類されます。一つは**「マルチビュー生成（Multi-view Generation）」**、もう一つは**「スパースビュー再構築（Sparse-view Reconstruction）」**です。Hunyuan3D 1.0は、これら二つの段階を組み合わせることで、従来の課題を克服しようとしています。

**1. マルチビュー生成 (Multi-view Generation) に関する関連研究と比較**

*   **関連研究の概要:**
    *   この分野は、一枚の入力画像やテキストから、オブジェクトの複数の異なる視点からの画像を生成することを目指しています。
    *   近年、2D diffusion model (例えば Stable Diffusion [37] など) の成功を受けて、これを novel-view generation [24, 54] や multi-view generation [26, 41, 48, 49] に応用する研究が盛んに行われています。
    *   主な課題は、生成された複数視点間の「一貫性（consistency）」をいかに高めるか、という点です。これは、その後の3D再構築の品質に直結するため非常に重要です。
    *   これを解決するために、様々な手法が提案されています。
        *   Correspondence-aware attention [43] を用いて、視点間の情報やり取りを考慮しながら並列生成を行う手法。
        *   Multi-view self-attention [27, 41] を設計して一貫性を強化する手法。
        *   複数視点の画像を一枚の大きな画像のようにタイル状に並べて生成する手法 [20, 29, 40]。
        *   Multi-view feature を3D空間に投影し、noise space で3Dアライメントを強制する手法 [26]。
    *   しかし、これらの cross-view attention を用いる手法は、画像サイズに対して計算コストが二次関数的に増加するという課題があります。Epipolar feature [16, 45] を使う手法もありますが、事前の計算が複雑です。Era3D [21] は、生成する画像の elevation を0に固定することで計算量を削減しています。

*   **Hunyuan3D 1.0 のアプローチと比較:**
    *   Hunyuan3D 1.0 も、大規模な2D diffusion model (SD-2.1 や SD-XL を backbone として利用) を fine-tuning してマルチビュー生成を行います。
    *   Zero-1-to-3++ [40] と同様に、複数視点の画像をグリッド状に配置して同時生成し、reference attention を利用して入力画像との類似性を高めます。
    *   **重要な比較点:**
        *   **モデル規模とデータ:** 既存モデルより3倍大きいモデルを使用し、大規模な内部データセットで学習することで、より効率的かつ高品質なマルチビュー生成を実現していると主張しています。
        *   **固定 Elevation:** Target image の elevation を0°に固定しています。これは Era3D [21] と同様のアプローチですが、Hunyuan3D 1.0では、後段の再構築でトップ/ボトム情報が不足する課題を、別の手法（ハイブリッド入力）で補う設計になっています。0° elevation は、生成されたビュー間での可視領域を最大化する効果があるとしています。
        *   **Adaptive Classifier-Free Guidance (CFG):** 既存の CFG [12] は、詳細な texture とジオメトリの品質、さらには異なる視点間でのバランス調整が課題でした [56]。Hunyuan3D 1.0 は、視点と denoising time step に応じて CFG scale を動的に調整する Adaptive CFG を提案しています（貢献の一つ）。これにより、前方の視点では入力画像の詳細をより強く反映させつつ、後方の視点では不自然な繰り返しパターンや影を抑制するなど、よりバランスの取れた一貫性のあるマルチビュー画像を生成できると述べています。

**2. スパースビュー再構築 (Sparse-view Reconstruction) に関する関連研究と比較**

*   **関連研究の概要:**
    *   この分野は、限られた数（2〜10枚程度）の入力画像から3D形状を再構築することに特化しています。これは、従来の Multi-View Stereo (MVS) [2, 3, 8, 10, 14, 17, 18, 30, 34, 36, 39, 46, 47, 62, 64, 67, 68] の極端なケースとも言えます。
    *   古典的な MVS は feature matching や voxel 表現に依存していました。学習ベースの手法では、これらのモジュールを学習可能なネットワークに置き換えています。
    *   最近の neural approach [25, 32, 33, 50, 65, 66] は、NeRF [31] のような implicit representation (MLPs を用いる) を使って3D形状を表現します。
    *   **主な課題:**
        *   これらの手法の多くは、Structure-from-Motion (SfM) [15, 38] のような複雑な calibration 処理によって得られる正確なカメラパラメータに依存しますが、実際のシナリオではパラメータの不正確さがパフォーマンスを低下させる可能性があります。
        *   既存の多くの手法は、カメラパラメータが既知の画像群（posed images）か、あるいは全く未知の画像群（uncalibrated images）のどちらか一方を入力とすることを想定しており、これらを組み合わせた「ハイブリッド入力」のニーズに対応できていません。
        *   Feed-forward な再構築手法 [4, 11, 13, 44, 60] は高速ですが、一般化性能に限界があったり、薄い構造の生成が苦手な場合があります。

*   **Hunyuan3D 1.0 のアプローチと比較:**
    *   Hunyuan3D 1.0 の再構築モデルは、Transformer-based の feed-forward な手法です。これにより、生成されたマルチビュー画像を入力として、約2秒という高速な再構築を実現しています。これは、数分から1時間かかる optimization-based な手法 [31, 50, 58, 63] と比較して圧倒的に高速です。
    *   **重要な比較点:**
        *   **ハイブリッド入力 (Hybrid Inputs):** 既存手法が posed or uncalibrated のどちらかに偏る中、Hunyuan3D 1.0 は、生成されたカメラパラメータ付きのマルチビュー画像（calibrated）と、元の入力画像（uncalibrated）の両方を再構築プロセスに組み込んでいます（貢献の一つ）。生成されたマルチビュー画像だけでは見えにくい部分（0° elevation の場合、真上や真下など）を補うために、入力画像を補助情報として活用します。入力画像には特別な full-zero embedding を与えることで、生成画像と区別しつつ特徴量を効果的に取り込みます。
        *   **Super-resolution:** 
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/7d38e20b-b511-46c2-920d-6f50fd93c8e5.png)
多くの triplane-based な再構築手法 [11, 13, 20] が比較的低解像度の triplane を使用しており、artifact の原因となる aliasing 問題を抱えている点を指摘しています。Hunyuan3D 1.0 は、軽量な upsampling module [55, 69] を用いて triplane の解像度を高めることで、より詳細で高精度なジオメトリを再構築できるようにしています（貢献の一つ）。

        *   **explicit representation 出力:** 多くの neural approach が NeRF や Gaussian Splatting のような implicit representation を最終出力とするのに対し、Hunyuan3D 1.0 は SDF [50] を中間表現として用い、Marching Cube [28] で explicit な mesh 表現に変換して出力します。論文では、implicit 表現だけではアーティストや実際のアプリケーションでの利用が難しいため、explicit な mesh であることが重要であると述べています。

**総括:**

Hunyuan3D 1.0 は、マルチビュー生成とスパースビュー再構築を組み合わせた二段階の unified framework です。

*   **マルチビュー生成**では、大規模なモデルとAdaptive CFG、特定のカメラ設定を用いて、高速かつ一貫性のある複数視点画像を生成します。
*   **スパースビュー再構築**では、feed-forward な手法で高速化を図りつつ、ハイブリッド入力による情報補完、triplane の Super-resolution による詳細表現力の向上、そして最終的な explicit mesh 出力によって、既存手法の課題（低速、一般化の難しさ、詳細の欠如、出力形式の実用性）を克服しようとしています。

論文中の Table 1 および Table 2 の定量評価、Fig. 4 の定性評価からも、主要な feed-forward ベースの先行手法 (OpenLRM [11], TripoSR [44], Wonder3D [27], CRM [53], LGM [42], InstantMesh [59], SyncDreamer [26]) に対して、Hunyuan3D 1.0 が高い性能（CD↓, F-score↑）を示し、Fig. 6 で示されるように、品質と実行速度のバランスにおいても優位性があることを示しています。

このように、Hunyuan3D 1.0 は、関連研究の良い点を取り入れつつ、新たな技術的貢献（Adaptive CFG、ハイブリッド入力、軽量 Super-resolution）を加えることで、高速かつ高品質な3D生成を実現していると言えます。

#### Q: 比較対象としてVAST社が提供しているTropoというサービスがあります．こちらとの比較について言及されていましたか？
#### A: 
TripoSR [44] は、まさにこのHunyuan3D 1.0の論文で主要な比較対象の一つとして挙げられており、その性能が評価されています。

論文中のTripoSRに関する記述や比較結果は以下の通りです。

1.  **TripoSRの概要 (論文中の位置づけ):**
    *   TripoSR [44] は、単一の画像から高速に3Dオブジェクトを再構築するフィードフォワード型のモデルとして紹介されています (論文 P2, P3)。
    *   フィードフォワード型手法は、Score Distillation Sampling (SDS) [35] のような最適化ベースの手法と比べて非常に高速である点が利点です (数秒で生成可能) (論文 P2)。
    *   ただし、論文の導入部では、フィードフォワード型手法の一般的な課題として、未知のオブジェクトに対する汎化性能の低さや、薄い構造の生成が苦手である可能性が指摘されています (論文 P2)。TripoSRは、このカテゴリの代表例として挙げられています。

2.  **Hunyuan3D 1.0 と TripoSR の比較 (論文中の主張):**
    *   Hunyuan3D 1.0 は、TripoSRを含む他のフィードフォワード型手法と比較して、**速度と品質のバランス**が優れていると主張しています (論文 P1, P7, Fig 6)。
    *   Hunyuan3D 1.0は、マルチビュー生成とスパースビュー再構築の二段階アプローチを採用しているのに対し、TripoSRは単一の画像から直接再構築を行う手法と考えられます。

3.  **定量評価 (論文 P5, Table 1, Table 2):**
    *   論文では、GSO [9] および OmniObject3D [57] という公開データセットを用いて、生成された3D形状の精度を Chamfer Distance (CD) と F-score で評価しています。
    *   これらの評価において、Hunyuan3D 1.0 の lite 版および standard 版は、TripoSR を含む他の比較対象手法に対して、**一貫して優れた性能を示しています**。CDはより低く（より正確）、F-scoreはより高く（より良い一致度）なっています。特に standard 版は、TripoSRよりもかなり良いスコアを達成しています。

4.  **定性評価 (論文 P6, Fig 4):**
    *   論文の図4では、入力画像に対するTripoSR、OpenLRM、InstantMesh、そしてHunyuan3Dの生成結果が視覚的に比較されています。
    *   論文の主張によれば、TripoSRは石鹸や箱のような幾何学的な形状の再現に苦労したり、椅子や靴のようなオブジェクトでテクスチャがぼやけたりする傾向が見られます。
    *   対照的に、Hunyuan3D 1.0 は、形状とテクスチャの両方において、より優れた再構築品質を示していると述べています。

5.  **速度 vs. 性能 (論文 P7, Fig 6):**
    *   図6は、各手法の推論時間とF-scoreの平均値をプロットしたものです。
    *   この図を見ると、TripoSRは比較的手前（Runtimeが短い、高速）に位置しており、Hunyuan3D-lite (~10s) や Hunyuan3D-std (~25s) よりも、形状生成のコア部分の速度は速いように見えます（ただし、論文中で言及されているHunyuan3Dの速度には、マルチビュー生成時間と再構築時間の合計が含まれており、これに加えてテクスチャベイク時間~15sが別途かかる場合があることに注意が必要です P7）。
    *   しかし、図6は、Hunyuan3DがTripoSRや他の高速手法よりも**はるかに高いF-score（品質）を達成しつつ、実用的な速度（~10-25秒+α）を実現している**というバランスの良さを示唆しています。論文では「Hunyuan3D 1.0が速度と品質の最適なバランスを達成している」と結論づけています。

**まとめると、論文におけるTripoSRとの比較は：**

*   TripoSRは高速な単一画像3D再構築手法である。
*   Hunyuan3D 1.0は、定量・定性評価の両面でTripoSRよりも優れた**品質**を達成している。
*   速度においては、TripoSRがより高速な場合があるかもしれないが、Hunyuan3D 1.0は**品質を大幅に向上させつつ、実用的な生成速度**を実現しており、論文はその「速度と品質のバランス」が優位であると主張している。

これらの比較は、Hunyuan3D 1.0が、従来の高速なフィードフォワード手法の限界（特に品質や詳細表現）を、マルチビュー生成、ハイブリッド入力、Super-resolutionといった要素で克服し、新しいSOTAを達成したことを示すために行われています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/90e9c20a-1604-4df2-bc79-a2963b8d0f69.png)

#### Q:提案手法の限界と今後の課題はなんですか？
#### A:

論文全体を通して、明示的に「限界」や「今後の課題」として章立てて記述されている箇所はありません。むしろ、論文は提案手法の優位性や新しい技術的貢献（Adaptive CFG、ハイブリッド入力、軽量Super-resolutionなど）を強調し、既存手法の課題（低速、品質、汎化性能、詳細表現、実用的な出力形式など）を克服した点に焦点を当てています。

しかし、論文中の記述や関連研究の文脈、そしてこの分野の一般的な難しさから、いくつかの考えられる限界や今後の課題を推測することができます。

**Hunyuan3D 1.0の考えられる限界（論文から推測されるもの）:**

1.  **マルチビュー生成の視点制限:** マルチビュー生成の段階で、Target image の elevation を0°に固定しています (P4)。これは Era3D [21] と同様に効率化のための設計ですが、この段階だけでは真上や真下といった角度からの情報が不足します。ハイブリッド入力（元の入力画像を補助的に使用）でこの課題を緩和しようとしていますが (P4, P7, Fig 8)、生成されたマルチビュー画像自体にその視点情報が含まれていない点は、再構築の確実性に影響を与える可能性があります。
2.  **トレーニングデータによる制約:** 論文では、内部データセットを使用しており、その際に「複雑なシーン」「意味のあるテクスチャを欠く」「不合理な歪みを示す」3Dデータをフィルタリングしたと述べています (P5)。これは裏を返せば、モデルがトレーニングデータで見たことのないような**複雑なシーン**、**テクスチャがほとんどないオブジェクト**、あるいは**大きく歪んだ形状**に対しては、性能が低下する可能性があることを示唆しています。
3.  **ポストプロセスの時間:** 論文では、ジオメトリ生成自体は高速（Lite: ~10秒, Standard: ~25秒）であると述べていますが、実用的な出力形式である UV マッピングとテクスチャベイクに別途約15秒かかることを明記しています (P7)。このポストプロセスの時間は、全体の所要時間において無視できない部分を占めており、さらなる高速化のためにはこの部分の改善も必要となるかもしれません。
4.  **モデル規模とリソース:** Standard 版は既存モデルや Lite 版の3倍のパラメータを持っており (P1, P3)、より高品質な結果をもたらしますが、それに伴う計算リソースの要求や推論時間は増加します (Lite: ~10s vs Standard: ~25s for core generation)。より大規模なモデルやデータで訓練することで性能向上は期待できますが、それに必要なリソースは大きな課題となります。
5.  **入力画像の多様性への感度:** Target image のレンダリング設定（固定された elevation 0°、特定の FOV、距離、uniform lighting、白背景など P5）は学習時に固定されています。推論時に、入力画像がこれらの設定から大きく外れるようなレンダリング（例えば、非常に低い/高いアングル、狭い/広い FOV、近すぎる/遠すぎる距離、複雑なライティング、背景ありなど）である場合、性能に影響が出る可能性があります。

**今後の課題（研究としてさらに探求すべき方向性）:**

1.  **テクスチャ品質とPBR:** 論文はジオメトリ生成に重点を置いており、テクスチャは UV マッピング後にベイクされるとしていますが、高品質で Physically Based Rendering (PBR) に適したテクスチャを生成することは、3Dアセットの実用性において非常に重要です。引用文献には PBR テクスチャに関する新しい研究 [12, 13] も見られ、これは今後の重要な研究方向の一つと考えられます。
2.  **複雑な形状と薄い構造の再現:** フィードフォワード型手法の一般的な課題として、複雑なトポロジーや紙のように薄い構造の正確な再現が挙げられています (P2)。Hunyuan3D 1.0はこれを改善していると述べられていますが、完璧ではありません（Fig 4のオブジェクトでも細部には改善の余地が見られます）。より複雑な形状をロバストに生成する技術は引き続き重要です。
3.  **汎化性能のさらなる向上:** 大規模データとモデルで学習することで汎化性能は向上していますが、全く新しいカテゴリや、トレーニングデータセットの分布から大きく外れるオブジェクトに対して、どの程度頑健であるかは常に課題です。
4.  **シーン全体の生成と構成:** 論文は単一オブジェクトの生成に焦点を当てています。複数のオブジェクトを含む複雑なシーンを生成したり、ユーザーが指定した配置でオブジェクトを構成したりする能力は、次の大きなステップとなるでしょう。
5.  **より高度な制御性:** テキストや単一画像という入力だけでなく、生成する3Dモデルの特定の部位の形状を変更したり、特定のスタイルを適用したりといった、より詳細でインタラクティブな制御を可能にすることも、応用上重要になります。
6.  **評価指標の改善:** CDやF-scoreは一般的な指標ですが、3Dモデルの品質（例えば、トポロジーの正しさ、表面の滑らかさ、アーティストが利用しやすい形式かなど）を完全に捉えているわけではありません。より網羅的で知覚的な評価指標の開発も、分野全体の課題です。
7.  **多様な入力への対応:** 単一画像やテキストだけでなく、複数の画像、スケッチ、または簡単なラフモデルなど、より多様な形式の入力を受け付けて3D生成を行うことも考えられます。

Hunyuan3D 1.0は、これらの課題に部分的に取り組み、顕著な進歩を遂げた画期的な研究です。しかし、3D生成という分野自体がまだ発展途上にあり、上で述べたような点は、Hunyuan3D 1.0の次に探求すべき、あるいはHunyuan3Dの将来バージョン（例えば引用されているHunyuan3D 2.0 [1]）で取り組まれるであろう重要な研究方向だと考えられます。


#### Q:論文中で言及されていた評価指標について詳しく説明してもらえますか

#### A:
Hunyuan3D 1.0の性能評価には、3D形状の再構築精度を測るための標準的な指標として、以下の二つが用いられています（論文のセクション4.3およびセクション5）。

1.  **Chamfer Distance (CD)**
2.  **F-score (FS)**

これらの指標は、生成された3Dモデル（多くの場合、Marching Cubes [28] で抽出されたメッシュ）が、Ground Truth（正解となる元の3Dモデル）とどれだけ近いかを測るために使用されます。具体的には、まず生成モデルとGround Truthモデルからそれぞれ多数の点（論文では10,000点）をサンプリングし、これらの点群を用いて距離を計算します。必要に応じて、ICP (Iterative Closest Point) のようなアルゴリズムを用いて、生成モデルの点群をGround Truthの点群に位置合わせする前処理が行われます（これは、生成される3Dモデルの向きが元のモデルと同じとは限らないため必要です）。

では、それぞれの指標について詳しく見ていきましょう。

**1. Chamfer Distance (CD)**

*   **何を測るか:** 二つの点群 $A$ と $B$ の間の平均的な距離を測る指標です。一方の点群の各点が、もう一方の点群の最も近い点からどれだけ離れているか、という平均距離の合計を示します。形状全体の類似性や、二つの形状が空間的にどれだけ「ずれているか」を評価するのに使われます。
*   **計算方法（一般的な形式）:** 点群 $A$ から点群 $B$ への有向Chamfer Distance は、点群 $A$ の各点 $x$ に対して、点群 $B$ 内の最も近い点 $y$ までの距離の二乗の平均をとることで計算されます。
    $$ D(A, B) = \frac{1}{|A|} \sum_{x \in A} \min_{y \in B} \|x-y\|^2 $$
    総Chamfer Distanceは、通常この有向距離を両方向（$A$ から $B$ へと $B$ から $A$ へ）で計算し、その合計とします。
    $$ CD(A, B) = D(A, B) + D(B, A) = \frac{1}{|A|} \sum_{x \in A} \min_{y \in B} \|x-y\|^2 + \frac{1}{|B|} \sum_{y \in B} \min_{x \in A} \|x-y\|^2 $$
    論文では、おそらくこの対称的な形式、またはそれに類する方法で計算されています。点群はメッシュの表面からサンプリングされています。
*   **評価:** CD の値が**小さいほど**、生成された形状はGround Truthに近いということになり、性能が良いと判断されます。論文中の表（Table 1, Table 2）でも、CD は「↓」マークが付いており、数値が低いほど良いことを示しています。

**2. F-score (FS)**

*   **何を測るか:** 二つの形状（点群）が、ある特定の距離の許容範囲内でどれだけ互いを「カバー」しているか、つまりどれだけ一致しているかを測る指標です。Precision（精度）と Recall（再現率）という二つの概念を用いて計算されます。
*   **計算方法:** F-score を計算するためには、まず距離の**閾値 $\tau$** を設定します。
    *   **Precision (精度) @ $\tau$:** 生成された点群 $A$ の中の点で、Ground Truth 点群 $B$ のいずれかの点から距離 $\tau$ 以内にある点の割合。これは、「生成された点がどれだけGround Truthの表面上にあるか」を示します。
        $$ \text{Precision}(A, B, \tau) = \frac{|\{ x \in A \mid \min_{y \in B} \|x-y\| \le \tau \}|}{|A|} $$
    *   **Recall (再現率) @ $\tau$:** Ground Truth 点群 $B$ の中の点で、生成された点群 $A$ のいずれかの点から距離 $\tau$ 以内にある点の割合。これは、「Ground Truthの表面がどれだけ生成された点でカバーされているか」を示します。
        $$ \text{Recall}(A, B, \tau) = \frac{|\{ y \in B \mid \min_{x \in A} \|x-y\| \le \tau \}|}{|B|} $$
    *   **F-score @ $\tau$:** Precision と Recall の調和平均です。
        $$ \text{F-score}(A, B, \tau) = 2 \times \frac{\text{Precision}(A, B, \tau) \times \text{Recall}(A, B, \tau)}{\text{Precision}(A, B, \tau) + \text{Recall}(A, B, \tau)} $$
*   **評価:** F-score の値が**大きいほど**、生成された形状とGround Truthの形状の一致度が高いということになり、性能が良いと判断されます。論文中の表（Table 1, Table 2）では、F-score は「↑」マークが付いており、数値が高いほど良いことを示しています。
*   **閾値 $\tau$ の役割:** F-score は閾値 $\tau$ に依存するため、論文では複数の閾値での結果が報告されています。論文では $\tau = 0.1, 0.2, 0.5$ の3つの閾値が使用されています (P5, Table 1, Table 2)。
    *   小さい $\tau$（例えば0.1）でのF-scoreが高いということは、生成された形状がGround Truthに対して非常に**精密に**一致していることを意味します。
    *   大きい $\tau$（例えば0.5）でのF-scoreが高いということは、生成された形状がGround Truthの**全体的な範囲や形状を広く**カバーできていることを意味します。

**まとめ:**

*   **CD:** 形状全体の平均的な距離の差。小さいほど良い。
*   **F-score:** ある許容誤差（閾値 $\tau$）内での形状の一致度（PrecisionとRecallの調和平均）。大きいほど良い。異なる閾値で評価することで、形状の精密さとカバレッジの両面を見ることができます。

これらの指標を用いることで、単に視覚的な印象だけでなく、数値として客観的に3D再構築の精度を比較することが可能になります。論文では、Hunyuan3D 1.0がこれらの標準的な指標においても、既存手法に対して優れた性能を発揮していることを示しています。

#### Q:それぞれの評価指標に関してpythonコードを示してもらえますか

#### A:
論文中で使用されているChamfer Distance (CD) と F-score (FS) を計算するためのPythonコード例を示します。

これらの指標は点群間の距離に基づいて計算されるため、ここでは入力として NumPy 配列や PyTorch Tensor で表現された点群を想定します。

点群処理にはいくつかの便利なライブラリがありますが、ここではPyTorchベースの機械学習プロジェクトでよく利用される**PyTorch3D**ライブラリを使った例と、NumPyとSciPyを使ったより基本的な例の両方を示します。

**必要なライブラリのインストール:**

```bash
# PyTorch3D を使用する場合
# 事前に PyTorch をインストールしておく必要があります
# conda install -c pytorch pytorch torchvision torchaudio cudatoolkit=xx.x (xx.x はCUDAバージョン)
# または pip install torch torchvision torchaudio
pip install pytorch3d

# NumPy と SciPy を使用する場合
pip install numpy scipy
```

---

### 1. Chamfer Distance (CD) の計算

**PyTorch3D を使用した例:**

PyTorch3D には `chamfer_distance` という便利な関数があります。この関数はデフォルトでバッチ入力を想定しているため、単一の点群の場合は形状を `(1, N, 3)` のようにバッチ次元を追加する必要があります。

```python
import torch
from pytorch3d.loss import chamfer_distance

def calculate_chamfer_distance_pytorch3d(pred_points, gt_points):
    """
    Chamfer Distance を計算する (PyTorch3D 使用).

    Args:
        pred_points (torch.Tensor): 生成された点群 (形状: (B, Np, 3))
        gt_points (torch.Tensor): Ground Truth 点群 (形状: (B, Ng, 3))

    Returns:
        tuple: (CD_loss, extra_info). CD_loss は CD 値.
               extra_info は距離などの補助情報を含む辞書.
    """
    # PyTorch3D の chamfer_distance は (B, N, 3) 形式を想定
    # もし入力が (N, 3) の場合はバッチ次元を追加
    if pred_points.ndim == 2:
        pred_points = pred_points.unsqueeze(0)
    if gt_points.ndim == 2:
        gt_points = gt_points.unsqueeze(0)

    # chamfer_distance 関数は reduction='mean' (デフォルト) で
    # バッチ全体での平均 CD を返す. 各バッチの CD を得る場合は reduction='none'
    # 論文の評価は通常、個々のオブジェクトに対する CD を計算し、平均や中央値を報告する.
    # ここではシンプルにバッチ平均を返す例とする.
    cd_loss, extra_info = chamfer_distance(pred_points, gt_points, reduction='mean')

    # extra_info['chamfer_dist'] は各バッチ要素の CD
    # extra_info['pred_to_gt_chamfer'] は pred -> gt の有向距離
    # extra_info['gt_to_pred_chamfer'] は gt -> pred の有向距離
    # extra_info['pred_idx'] は pred の各点に対応する gt の最近傍点のインデックス
    # extra_info['gt_idx'] は gt の各点に対応する pred の最近傍点のインデックス

    return cd_loss, extra_info

# 使用例 (単一の点群の場合)
# ダミーデータ (形状: (N, 3))
num_pred = 10000
num_gt = 10000
pred_points_np = np.random.rand(num_pred, 3)
gt_points_np = np.random.rand(num_gt, 3) + np.array([0.1, 0.1, 0.1]) # 少しずらす

# NumPy -> PyTorch Tensor に変換
pred_points_pt = torch.from_numpy(pred_points_np).float()
gt_points_pt = torch.from_numpy(gt_points_np).float()

# CD 計算
cd_value_pt, extra = calculate_chamfer_distance_pytorch3d(pred_points_pt, gt_points_pt)
print(f"Chamfer Distance (PyTorch3D): {cd_value_pt.item()}")

# extra_info を確認
# print("Extra info:", extra)
# 例えば、各オブジェクトの CD を確認したい場合 (バッチサイズ > 1 の場合)
# print("Chamfer Distance per batch item:", extra['chamfer_dist'])
```

**NumPy + SciPy を使用した例:**

PyTorch3D を使用しない場合、SciPy の `KDTree` を使うと効率的に最近傍点を探索できます。

```python
import numpy as np
from scipy.spatial import KDTree

def calculate_chamfer_distance_numpy(pred_points, gt_points):
    """
    Chamfer Distance を計算する (NumPy + SciPy 使用).

    Args:
        pred_points (numpy.ndarray): 生成された点群 (形状: (N_p, 3))
        gt_points (numpy.ndarray): Ground Truth 点群 (形状: (N_g, 3))

    Returns:
        float: Chamfer Distance 値.
    """
    # GT 点群に対する KDTree を作成
    gt_kdtree = KDTree(gt_points)
    # 生成点群の各点から GT 点群への最近傍点までの距離の二乗を計算
    # KDTree.query(..., k=1) は距離とインデックスを返す
    dist_pred_to_gt, _ = gt_kdtree.query(pred_points, k=1)
    # 平均二乗距離
    mean_dist_sq_pred_to_gt = np.mean(dist_pred_to_gt**2)

    # 生成点群に対する KDTree を作成
    pred_kdtree = KDTree(pred_points)
    # GT 点群の各点から生成点群への最近傍点までの距離の二乗を計算
    dist_gt_to_pred, _ = pred_kdtree.query(gt_points, k=1)
    # 平均二乗距離
    mean_dist_sq_gt_to_pred = np.mean(dist_gt_to_pred**2)

    # 双方向の平均距離の合計が Chamfer Distance
    cd = mean_dist_sq_pred_to_gt + mean_dist_sq_gt_to_pred

    return cd

# 使用例 (NumPy)
# ダミーデータ (形状: (N, 3))
num_pred = 10000
num_gt = 10000
pred_points_np = np.random.rand(num_pred, 3)
gt_points_np = np.random.rand(num_gt, 3) + np.array([0.1, 0.1, 0.1]) # 少しずらす

# CD 計算
cd_value_np = calculate_chamfer_distance_numpy(pred_points_np, gt_points_np)
print(f"Chamfer Distance (NumPy + SciPy): {cd_value_np}")
```

---

### 2. F-score (FS) の計算

F-score は特定の距離閾値 $\tau$ に依存します。Precision と Recall を計算し、その調和平均を取ります。最近傍距離を計算する必要があるため、ここでも KDTree や PyTorch3D を利用します。

**PyTorch3D を使用した例:**

PyTorch3D の `chamfer_distance` は、`pred_to_gt_nn_dists` (形状 `(B, Np)`) と `gt_to_pred_nn_dists` (形状 `(B, Ng)`) として、各点の最近傍距離を返してくれます。これを利用します。

```python
import torch
from pytorch3d.loss import chamfer_distance # CD計算と同じ関数を使用

def calculate_fscore_pytorch3d(pred_points, gt_points, threshold):
    """
    F-score を計算する (PyTorch3D 使用).

    Args:
        pred_points (torch.Tensor): 生成された点群 (形状: (B, Np, 3))
        gt_points (torch.Tensor): Ground Truth 点群 (形状: (B, Ng, 3))
        threshold (float): 距離の閾値 tau.

    Returns:
        tuple: (f_score, precision, recall). precision と recall はバッチ平均.
               f_score は precision と recall から計算した調和平均.
    """
    # PyTorch3D の chamfer_distance は (B, N, 3) 形式を想定
    # もし入力が (N, 3) の場合はバッチ次元を追加
    if pred_points.ndim == 2:
        pred_points = pred_points.unsqueeze(0)
    if gt_points.ndim == 2:
        gt_points = gt_points.unsqueeze(0)

    # reduction='none' でバッチごとの距離を取得
    # extra_info に pred_to_gt_nn_dists と gt_to_pred_nn_dists が含まれる
    _, extra_info = chamfer_distance(pred_points, gt_points, reduction='none')

    # Precision の計算: pred_points の各点が gt_points から threshold 以内にあるか
    # extra_info['pred_to_gt_nn_dists'] は pred の各点から gt への最近傍距離 (形状: (B, Np))
    precision = torch.mean((extra_info['pred_to_gt_nn_dists'] <= threshold).float()) # バッチと Np で平均

    # Recall の計算: gt_points の各点が pred_points から threshold 以内にあるか
    # extra_info['gt_to_pred_nn_dists'] は gt の各点から pred への最近傍距離 (形状: (B, Ng))
    recall = torch.mean((extra_info['gt_to_pred_nn_dists'] <= threshold).float()) # バッチと Ng で平均

    # F-score (Precision と Recall の調和平均)
    # Precision と Recall のいずれかが 0 の場合は F-score も 0
    if precision + recall == 0:
        f_score = torch.tensor(0.0)
    else:
        f_score = 2 * (precision * recall) / (precision + recall)

    # PyTorch のスカラー値を返す
    return f_score.item(), precision.item(), recall.item()

# 使用例 (単一の点群の場合)
# ダミーデータ (Chamfer Distance と同じ点群を使用)
# pred_points_pt, gt_points_pt は上記の CD 計算で使用した PyTorch Tensor

# 論文で使用されている閾値 tau
threshold_01 = 0.1
threshold_02 = 0.2
threshold_05 = 0.5

# F-score 計算
fscore_01, precision_01, recall_01 = calculate_fscore_pytorch3d(pred_points_pt, gt_points_pt, threshold_01)
fscore_02, precision_02, recall_02 = calculate_fscore_pytorch3d(pred_points_pt, gt_points_pt, threshold_02)
fscore_05, precision_05, recall_05 = calculate_fscore_pytorch3d(pred_points_pt, gt_points_pt, threshold_05)

print(f"F-score @ tau=0.1 (PyTorch3D): {fscore_01} (Precision: {precision_01}, Recall: {recall_01})")
print(f"F-score @ tau=0.2 (PyTorch3D): {fscore_02} (Precision: {precision_02}, Recall: {recall_02})")
print(f"F-score @ tau=0.5 (PyTorch3D): {fscore_05} (Precision: {precision_05}, Recall: {recall_05})")
```

**NumPy + SciPy を使用した例:**

CD 計算と同様に KDTree を利用して最近傍距離を計算し、閾値処理を行います。

```python
import numpy as np
from scipy.spatial import KDTree

def calculate_fscore_numpy(pred_points, gt_points, threshold):
    """
    F-score を計算する (NumPy + SciPy 使用).

    Args:
        pred_points (numpy.ndarray): 生成された点群 (形状: (N_p, 3))
        gt_points (numpy.ndarray): Ground Truth 点群 (形状: (N_g, 3))
        threshold (float): 距離の閾値 tau.

    Returns:
        tuple: (f_score, precision, recall).
    """
    # GT 点群に対する KDTree を作成
    gt_kdtree = KDTree(gt_points)
    # 生成点群の各点から GT 点群への最近傍点までの距離を計算
    dist_pred_to_gt, _ = gt_kdtree.query(pred_points, k=1)

    # Precision の計算: pred_points の各点が gt_points から threshold 以内にあるか
    precision = np.mean(dist_pred_to_gt <= threshold)

    # 生成点群に対する KDTree を作成
    pred_kdtree = KDTree(pred_points)
    # GT 点群の各点から生成点群への最近傍点までの距離を計算
    dist_gt_to_pred, _ = pred_kdtree.query(gt_points, k=1)

    # Recall の計算: gt_points の各点が pred_points から threshold 以内にあるか
    recall = np.mean(dist_gt_to_pred <= threshold)

    # F-score (Precision と Recall の調和平均)
    if precision + recall == 0:
        f_score = 0.0
    else:
        f_score = 2 * (precision * recall) / (precision + recall)

    return f_score, precision, recall

# 使用例 (NumPy)
# ダミーデータ (Chamfer Distance と同じ点群を使用)
# pred_points_np, gt_points_np は上記の CD 計算で使用した NumPy 配列

# 論文で使用されている閾値 tau
threshold_01 = 0.1
threshold_02 = 0.2
threshold_05 = 0.5

# F-score 計算
fscore_01_np, precision_01_np, recall_01_np = calculate_fscore_numpy(pred_points_np, gt_points_np, threshold_01)
fscore_02_np, precision_02_np, recall_02_np = calculate_fscore_numpy(pred_points_np, gt_points_np, threshold_02)
fscore_05_np, precision_05_np, recall_05_np = calculate_fscore_numpy(pred_points_np, gt_points_np, threshold_05)

print(f"F-score @ tau=0.1 (NumPy + SciPy): {fscore_01_np} (Precision: {precision_01_np}, Recall: {recall_01_np})")
print(f"F-score @ tau=0.2 (NumPy + SciPy): {fscore_02_np} (Precision: {precision_02_np}, Recall: {recall_02_np})")
print(f"F-score @ tau=0.5 (NumPy + SciPy): {fscore_05_np} (Precision: {precision_05_np}, Recall: {recall_05_np})")
```

---

**補足:**

*   上記のコードは、生成された3DモデルとGround Truthモデルから事前に点群をサンプリングしてあることを前提としています。論文では、Marching Cubes でメッシュを抽出した後に点群サンプリングを行っていると記載されています (P5)。
*   また、論文では必要に応じて ICP による位置合わせを行ってから評価していると述べています (P5)。上記のコード例では位置合わせの処理は含んでいません。実際の論文での評価では、点群をサンプリングする前にGround Truthに合わせて変換するなどの前処理が必要です。
*   PyTorch3D版はGPUを活用できるため、大規模な点群やバッチ処理を行う場合に高速です。NumPy+SciPy版はCPUで動作し、より基本的な実装となります。