<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Computer Vision on Snow</title>
        <link>https://SymphonyW.github.io/tags/computer-vision/</link>
        <description>Recent content in Computer Vision on Snow</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <copyright>Snow</copyright>
        <lastBuildDate>Thu, 16 Jul 2026 21:46:40 +0800</lastBuildDate><atom:link href="https://SymphonyW.github.io/tags/computer-vision/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>How SfM Works: Recovering 3D Structure from Photos</title>
        <link>https://SymphonyW.github.io/p/sfm-principle/</link>
        <pubDate>Thu, 16 Jul 2026 21:46:40 +0800</pubDate>
        
        <guid>https://SymphonyW.github.io/p/sfm-principle/</guid>
        <description>&lt;img src="https://SymphonyW.github.io/p/sfm-principle/bg.svg" alt="Featured image of post How SfM Works: Recovering 3D Structure from Photos" /&gt;&lt;h1 id=&#34;how-sfm-works-recovering-3d-structure-from-photos&#34;&gt;How SfM Works: Recovering 3D Structure from Photos
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;Structure from Motion answers a deceptively simple question: &lt;strong&gt;given only photos of the same scene from different viewpoints, can we recover both the camera motion and the 3D structure?&lt;/strong&gt;&lt;br&gt;
Yes, but the answer is not magic. It is multi-view geometry stitched into a robust engineering pipeline.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-sfm-solves&#34;&gt;What SfM Solves
&lt;/h2&gt;&lt;p&gt;SfM estimates two things at the same time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structure&lt;/strong&gt;: where the scene points are in 3D.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Motion&lt;/strong&gt;: where each camera was and how it was oriented when the photo was taken.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Meaning in SfM&lt;/th&gt;
&lt;th&gt;Typical output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Images&lt;/td&gt;
&lt;td&gt;Overlapping photos of the same scene&lt;/td&gt;
&lt;td&gt;JPG / PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intrinsics&lt;/td&gt;
&lt;td&gt;Focal length, principal point, distortion&lt;/td&gt;
&lt;td&gt;$K, d$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extrinsics&lt;/td&gt;
&lt;td&gt;Pose of every image&lt;/td&gt;
&lt;td&gt;$R, t$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3D structure&lt;/td&gt;
&lt;td&gt;Points observed by multiple images&lt;/td&gt;
&lt;td&gt;sparse point cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tracks&lt;/td&gt;
&lt;td&gt;Which 2D observations belong to the same 3D point&lt;/td&gt;
&lt;td&gt;feature tracks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The core idea is: &lt;strong&gt;use corresponding image points to infer cameras and 3D points that are geometrically consistent.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-pipeline&#34;&gt;The Pipeline
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/sfm-principle/sfm-pipeline.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/sfm-principle/sfm-pipeline.svg&#34; alt=&#34;SfM pipeline from image input to sparse reconstruction&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A typical SfM system follows this sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Extract features&lt;/strong&gt; in each image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Match features&lt;/strong&gt; between overlapping image pairs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Estimate two-view geometry&lt;/strong&gt; with the fundamental matrix $F$ or essential matrix $E$.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialize&lt;/strong&gt; from a strong image pair and triangulate the first 3D points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Register new cameras&lt;/strong&gt; with PnP and triangulate additional points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run Bundle Adjustment&lt;/strong&gt; to jointly refine cameras and 3D structure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SfM optimizes for geometric consistency first. Its point cloud is usually sparse, but its camera poses are extremely useful for downstream reconstruction and rendering.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;features-and-matches&#34;&gt;Features and Matches
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/sfm-principle/feature-matching.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/sfm-principle/feature-matching.svg&#34; alt=&#34;Feature matching across two images&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Before estimating geometry, SfM must answer a smaller question: &lt;strong&gt;which points in different images are projections of the same 3D point?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Local features provide this bridge. Each feature has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a 2D image location $(u, v)$;&lt;/li&gt;
&lt;li&gt;a descriptor vector that summarizes the local appearance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Classic SfM systems often use SIFT because it is relatively stable under scale, rotation, and illumination changes. Faster systems may use ORB or similar binary descriptors.&lt;/p&gt;
&lt;p&gt;Raw descriptor nearest neighbors are not enough. Practical systems filter matches using:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filter&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ratio test&lt;/td&gt;
&lt;td&gt;Reject ambiguous nearest-neighbor matches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mutual check&lt;/td&gt;
&lt;td&gt;Keep only matches that agree in both directions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RANSAC&lt;/td&gt;
&lt;td&gt;Keep matches that fit the estimated geometry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If the match graph is poor, the rest of the reconstruction will be unstable.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;epipolar-geometry&#34;&gt;Epipolar Geometry
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/sfm-principle/epipolar-geometry.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/sfm-principle/epipolar-geometry.svg&#34; alt=&#34;Epipolar geometry constraint&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;For a matching point pair $x_1$ and $x_2$, the fundamental matrix encodes the epipolar constraint:&lt;/p&gt;
&lt;p&gt;$$
x_2^\top F x_1 = 0
$$&lt;/p&gt;
&lt;p&gt;This says that once a point is chosen in image 1, its match in image 2 cannot be anywhere. It must lie on the corresponding epipolar line.&lt;/p&gt;
&lt;p&gt;If camera intrinsics are known, SfM can use the essential matrix:&lt;/p&gt;
&lt;p&gt;$$
E = K_2^\top F K_1
$$&lt;/p&gt;
&lt;p&gt;Decomposing $E$ gives the relative rotation $R$ and translation direction $t$ between two cameras. The word “direction” matters: monocular SfM cannot recover absolute scale by itself.&lt;/p&gt;
&lt;p&gt;In real images, matches include noise and outliers, so $F$ or $E$ is usually estimated inside RANSAC. This turns visually plausible matches into geometrically plausible matches.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;triangulation&#34;&gt;Triangulation
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/sfm-principle/triangulation.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/sfm-principle/triangulation.svg&#34; alt=&#34;Triangulation recovers a 3D point from two viewing rays&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Once two camera poses and a matching point pair are known, SfM back-projects the two pixels into 3D rays. Ideally, the rays intersect at the true 3D point.&lt;/p&gt;
&lt;p&gt;In practice they almost never intersect exactly, because of feature noise, lens distortion, and imperfect calibration. Triangulation therefore estimates the 3D point that best explains the observed pixels.&lt;/p&gt;
&lt;p&gt;Using a projection matrix $P_i$, a 3D point $X$, and an observed pixel $x_i$:&lt;/p&gt;
&lt;p&gt;$$
x_i \sim P_i X
$$&lt;/p&gt;
&lt;p&gt;After triangulation, SfM checks that points are in front of the cameras, have acceptable reprojection error, and were observed with enough parallax. Small baselines make depth estimates unstable.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;incremental-reconstruction&#34;&gt;Incremental Reconstruction
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/sfm-principle/incremental-sfm.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/sfm-principle/incremental-sfm.svg&#34; alt=&#34;Incremental SfM loop&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Most practical SfM pipelines are incremental:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Key quality signal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Choose seed pair&lt;/td&gt;
&lt;td&gt;Start from a strong image pair&lt;/td&gt;
&lt;td&gt;enough parallax and inliers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Initialize&lt;/td&gt;
&lt;td&gt;Decompose $E$ and triangulate first points&lt;/td&gt;
&lt;td&gt;positive depth points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Register image&lt;/td&gt;
&lt;td&gt;Estimate a new camera with 2D-3D matches&lt;/td&gt;
&lt;td&gt;PnP inlier count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Triangulate points&lt;/td&gt;
&lt;td&gt;Add new points visible in multiple cameras&lt;/td&gt;
&lt;td&gt;parallax and reprojection error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local BA&lt;/td&gt;
&lt;td&gt;Refine recently affected cameras and points&lt;/td&gt;
&lt;td&gt;fast drift correction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global BA&lt;/td&gt;
&lt;td&gt;Refine the full reconstruction&lt;/td&gt;
&lt;td&gt;global consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PnP is what lets a new image join an existing model: given known 3D points and their 2D observations in the new image, estimate that image’s camera pose.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;bundle-adjustment&#34;&gt;Bundle Adjustment
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/sfm-principle/bundle-adjustment.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/sfm-principle/bundle-adjustment.svg&#34; alt=&#34;Bundle Adjustment refines cameras and 3D points together&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Bundle Adjustment is the global correction step. It jointly optimizes camera parameters and 3D point positions to minimize reprojection error:&lt;/p&gt;
&lt;p&gt;$$
\min_{{P_i}, {X_j}} \sum_{i,j} \rho \left(\left|x_{ij} - \pi(P_i, X_j)\right|^2\right)
$$&lt;/p&gt;
&lt;p&gt;Here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$P_i$ is the parameter set for camera $i$;&lt;/li&gt;
&lt;li&gt;$X_j$ is 3D point $j$;&lt;/li&gt;
&lt;li&gt;$x_{ij}$ is the observed 2D feature;&lt;/li&gt;
&lt;li&gt;$\pi(P_i, X_j)$ is the predicted projection;&lt;/li&gt;
&lt;li&gt;$\rho$ is a robust loss that reduces the impact of outliers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;BA can be expensive, but the problem is highly sparse: one observation connects only one camera and one 3D point. Modern solvers exploit this sparsity heavily.&lt;/p&gt;
&lt;p&gt;Without BA, an SfM model may look locally plausible while bending globally. With BA, all observations pull the reconstruction toward one consistent coordinate system.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;scale-failure-cases-and-downstream-use&#34;&gt;Scale, Failure Cases, and Downstream Use
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/sfm-principle/sfm-output.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/sfm-principle/sfm-output.svg&#34; alt=&#34;SfM outputs sparse points and camera poses for downstream workflows&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Monocular SfM has no absolute scale. If all translations and all 3D points are scaled by the same factor, the projected image coordinates remain unchanged. Real scale requires extra information such as known baselines, calibration targets, GPS/IMU data, depth sensors, or manual distance constraints.&lt;/p&gt;
&lt;p&gt;Common failure cases:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scene&lt;/th&gt;
&lt;th&gt;Why it fails&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Low texture&lt;/td&gt;
&lt;td&gt;few stable features&lt;/td&gt;
&lt;td&gt;blank walls or glass fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeated texture&lt;/td&gt;
&lt;td&gt;ambiguous matches&lt;/td&gt;
&lt;td&gt;windows, fences, and tiles create wrong geometry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic objects&lt;/td&gt;
&lt;td&gt;violates static-scene assumption&lt;/td&gt;
&lt;td&gt;floating points on people or vehicles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Very wide viewpoint change&lt;/td&gt;
&lt;td&gt;features look too different&lt;/td&gt;
&lt;td&gt;too few matches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiny baseline&lt;/td&gt;
&lt;td&gt;weak triangulation&lt;/td&gt;
&lt;td&gt;flat or noisy depth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pure rotation&lt;/td&gt;
&lt;td&gt;no translational parallax&lt;/td&gt;
&lt;td&gt;panorama works, 3D structure does not&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SfM is usually not the end of reconstruction. It is the geometric foundation for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MVS&lt;/strong&gt;: dense depth maps, meshes, and textures;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NeRF&lt;/strong&gt;: camera poses for neural radiance field training;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3DGS&lt;/strong&gt;: sparse points as initial Gaussian positions;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;visual SLAM&lt;/strong&gt;: related geometry, but optimized for online operation.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;SfM can be summarized as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;match features across images, estimate camera geometry, triangulate 3D points, and refine everything with Bundle Adjustment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once this pipeline is clear, tools like COLMAP, MVS systems, NeRF preprocessing, and 3D Gaussian Splatting become easier to understand. They are not isolated tricks; they are built on the same multi-view geometry foundation.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>3D Gaussian Splatting Principles:Rebuilding the World with Millions of Gaussians and Its Cost</title>
        <link>https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/</link>
        <pubDate>Tue, 14 Jul 2026 21:43:00 +0800</pubDate>
        
        <guid>https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/</guid>
        <description>&lt;img src="https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/bg.png" alt="Featured image of post 3D Gaussian Splatting Principles:Rebuilding the World with Millions of Gaussians and Its Cost" /&gt;&lt;h1 id=&#34;3dgs-原理详解用百万颗高斯重建世界及其背后的代价&#34;&gt;3DGS 原理详解：用百万颗高斯重建世界，及其背后的代价
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;2023 年 SIGGRAPH 最佳论文 &lt;strong&gt;&amp;ldquo;3D Gaussian Splatting for Real-Time Radiance Field Rendering&amp;rdquo;&lt;/strong&gt; 把&amp;quot;神经辐射场&amp;quot;从「一帧几秒」拉到了「实时 100 FPS」，从此新视角合成（Novel View Synthesis）这条赛道被彻底改写。本文从零讲清楚 3DGS 是怎么工作的、为什么这么快，以及它天生的几道&amp;quot;硬伤&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;目录&#34;&gt;目录
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e4%b8%80%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9c%80%e8%a6%81-3dgs&#34; &gt;一、为什么需要 3DGS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e4%ba%8c%e6%95%b4%e4%bd%93%e6%b5%81%e7%a8%8b%e4%b8%80%e8%a7%88&#34; &gt;二、整体流程一览&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e4%b8%89%e8%a1%a8%e7%a4%ba%e4%b8%80%e4%b8%aa%e9%ab%98%e6%96%af%e9%95%bf%e4%bb%80%e4%b9%88%e6%a0%b7&#34; &gt;三、表示：一个高斯长什么样&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e5%9b%9b%e6%b8%b2%e6%9f%93%e4%bb%8e-3d-%e6%a4%ad%e7%90%83%e5%88%b0%e5%83%8f%e7%b4%a0&#34; &gt;四、渲染：从 3D 椭球到像素&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e4%ba%94%e8%ae%ad%e7%bb%83%e8%87%aa%e9%80%82%e5%ba%94%e5%af%86%e5%ba%a6%e6%8e%a7%e5%88%b6%e6%98%af%e7%81%b5%e9%ad%82&#34; &gt;五、训练：自适应密度控制是灵魂&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e5%85%ad%e4%b8%8e-nerf-%e7%9a%84%e8%8c%83%e5%bc%8f%e5%af%b9%e5%86%b3&#34; &gt;六、与 NeRF 的范式对决&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e4%b8%833dgs-%e7%9a%84%e5%85%ad%e5%a4%a7%e7%bc%ba%e9%99%b7&#34; &gt;七、3DGS 的六大缺陷&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#%e5%85%ab%e6%80%bb%e7%bb%93&#34; &gt;八、总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要-3dgs&#34;&gt;一、为什么需要 3DGS
&lt;/h2&gt;&lt;p&gt;新视角合成的目标是：&lt;strong&gt;给一组同一场景的多视角照片，训练出一个能从任意新视角渲染出照片级图像的模型&lt;/strong&gt;。它的应用横跨 VR/AR、影视特效、数字孪生、自动驾驶仿真、文物数字化等领域。&lt;/p&gt;
&lt;p&gt;这条路上有两个关键节点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;NeRF（2020 ECCV）&lt;/strong&gt;：用一个 MLP 把 &lt;code&gt;(位置, 方向)&lt;/code&gt; 映射到 &lt;code&gt;(颜色, 密度)&lt;/code&gt;，再通过体渲染方程积出像素颜色。质量惊艳，但&lt;strong&gt;每渲染一张图要几秒到几十秒&lt;/strong&gt;——实时化遥不可及。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3DGS（2023 SIGGRAPH）&lt;/strong&gt;：放弃隐式 MLP，改用一组&lt;strong&gt;显式 3D 高斯椭球&lt;/strong&gt;直接表示场景，搭配&lt;strong&gt;定制化可微光栅化器&lt;/strong&gt;，把渲染压到 &lt;strong&gt;100+ FPS&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为什么 3DGS 这么关键？因为它证明了：&lt;strong&gt;高质量新视角合成不一定要走&amp;quot;体渲染积分&amp;quot;的老路，直接用一组显式基元做 α 混合就够了。&lt;/strong&gt; 这一思路转变让 3DGS 的生态在两年内爆发式生长。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二整体流程一览&#34;&gt;二、整体流程一览
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/3dgs-pipeline.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/3dgs-pipeline.svg&#34; alt=&#34;3DGS 整体流程：从一组照片到实时新视角渲染&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;3DGS 的完整生命周期可以拆成 5 步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输入图像&lt;/strong&gt;：100~300 张多视角照片，相机姿态已知（通常由 COLMAP 估计）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SfM 初始化&lt;/strong&gt;：用运动恢复结构（SfM）得到稀疏点云，作为高斯椭球的初始位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建 3D 高斯集合&lt;/strong&gt;：每个稀疏点扩展为一个完整的 3D 高斯（位置 + 协方差 + 颜色 + 不透明度）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练优化&lt;/strong&gt;：随机梯度下降，配合&lt;strong&gt;自适应密度控制&lt;/strong&gt;（克隆 / 分裂 / 剪枝）调整高斯数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时渲染&lt;/strong&gt;：用专用光栅化器把所有高斯投影、排序、α 混合成像素。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;一个关键认知：训练完成后得到的只是一个 &lt;code&gt;.ply&lt;/code&gt; 文件，&lt;strong&gt;推理阶段不需要任何神经网络&lt;/strong&gt;，整个渲染就是 GPU 上的几何运算 + 颜色混合。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三表示一个高斯长什么样&#34;&gt;三、表示：一个高斯长什么样
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/gaussian-anatomy.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/gaussian-anatomy.svg&#34; alt=&#34;单个 3D 高斯的解剖：5 类可优化属性&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;3DGS 不用体素、不用 MLP，而是把场景表示为&lt;strong&gt;百万级个 3D 高斯椭球&lt;/strong&gt;。每个高斯有 5 类可优化属性：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;激活方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;位置 μ&lt;/td&gt;
&lt;td&gt;高斯椭球的中心&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;直接优化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缩放 s&lt;/td&gt;
&lt;td&gt;椭球的半轴长度&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;指数激活（保证非负）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;旋转 q&lt;/td&gt;
&lt;td&gt;椭球的朝向（四元数）&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;归一化后使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;不透明度 α&lt;/td&gt;
&lt;td&gt;渲染时的&amp;quot;权重&amp;quot;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Sigmoid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;颜色（SH 系数）&lt;/td&gt;
&lt;td&gt;视角相关颜色&lt;/td&gt;
&lt;td&gt;48（3 阶 SH）&lt;/td&gt;
&lt;td&gt;球谐求值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;31-协方差的参数化技巧&#34;&gt;3.1 协方差的参数化技巧
&lt;/h3&gt;&lt;p&gt;直接学习一个 3×3 的协方差矩阵 Σ 有两个坑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必须是&lt;strong&gt;半正定&lt;/strong&gt;的，否则不是合法的协方差；&lt;/li&gt;
&lt;li&gt;9 个参数冗余，优化困难。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3DGS 的做法是把它&lt;strong&gt;分解为缩放 s 和旋转 R&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Σ = R · diag(s) · diag(s)ᵀ · Rᵀ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样只需要 7 个参数（3 个缩放 + 4 个四元数），且&lt;strong&gt;自动半正定&lt;/strong&gt;，对优化器友好。&lt;/p&gt;
&lt;h3 id=&#34;32-为什么用球谐sh而不是直接存-rgb&#34;&gt;3.2 为什么用球谐（SH）而不是直接存 RGB？
&lt;/h3&gt;&lt;p&gt;真实世界里，&lt;strong&gt;同一个点从不同角度看，颜色是不一样的&lt;/strong&gt;——金属的高光、玻璃的反射、毛发的次表面散射都是典型。直接存一个 RGB 就丢失了这种视角依赖。&lt;/p&gt;
&lt;p&gt;3DGS 借鉴 NeRF 的做法，用**球谐函数（Spherical Harmonics, SH）**来表达颜色——给定观察方向 d，通过 SH 基函数求值得到 RGB。原论文用 3 阶 SH（共 48 个系数），足以刻画大多数视角相关的着色效果。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四渲染从-3d-椭球到像素&#34;&gt;四、渲染：从 3D 椭球到像素
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/rasterization-flow.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/rasterization-flow.svg&#34; alt=&#34;可微光栅化：3D 高斯如何变成像素&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;3DGS 真正的杀手锏是它的&lt;strong&gt;可微光栅化器&lt;/strong&gt;。它把传统图形学的高性能光栅化流水线，改造成了完全可微的版本。整个过程分 4 步：&lt;/p&gt;
&lt;h3 id=&#34;41-投影3d-高斯--2d-高斯&#34;&gt;4.1 投影：3D 高斯 → 2D 高斯
&lt;/h3&gt;&lt;p&gt;3D 高斯在世界坐标系下是一个椭球。渲染时，要把它&amp;quot;压&amp;quot;到屏幕空间。&lt;/p&gt;
&lt;p&gt;数学上，这个过程是通过&lt;strong&gt;投影雅可比矩阵 J&lt;/strong&gt;完成的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Σ&amp;#39; = J · W · Σ · Wᵀ · Jᵀ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中 W 是世界到相机的变换，J 是投影的局部线性化。Σ&amp;rsquo; 就是 2D 屏幕空间下的协方差矩阵——一个 2×2 的椭圆。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/splatting-concept.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/splatting-concept.svg&#34; alt=&#34;Splatting 是什么：3D 椭球&amp;amp;quot;压扁&amp;amp;quot;成 2D 色块&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这一步是 3DGS 与传统体渲染最大的不同：&lt;strong&gt;它不是采样射线，而是直接把所有高斯&amp;quot;喷&amp;quot;（splat）到屏幕上&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;42-划分-tile&#34;&gt;4.2 划分 Tile
&lt;/h3&gt;&lt;p&gt;屏幕被切成 16×16 的网格。每个 2D 高斯根据其覆盖范围，&lt;strong&gt;被分配到一个或多个 Tile&lt;/strong&gt;。同时做两件事剔除：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;视锥剔除&lt;/strong&gt;：完全在视锥外的高斯直接丢弃；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远处裁剪&lt;/strong&gt;：太远的高斯直接剔除（避免无效贡献）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;43-深度排序&#34;&gt;4.3 深度排序
&lt;/h3&gt;&lt;p&gt;α 混合必须&lt;strong&gt;从前到后&lt;/strong&gt;进行（否则会有错误的遮挡）。3DGS 在每个 Tile 内对高斯按视点距离排序——这里用了一个 GPU 友好的&lt;strong&gt;单 pass 基数排序&lt;/strong&gt;，是速度的关键之一。&lt;/p&gt;
&lt;h3 id=&#34;44-alpha-混合&#34;&gt;4.4 Alpha 混合
&lt;/h3&gt;&lt;p&gt;每个像素的颜色由所有覆盖它的高斯按顺序累积：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;C = Σᵢ  cᵢ · αᵢ · ∏ⱼ&amp;lt;ᵢ (1 − αⱼ)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cᵢ&lt;/code&gt;：第 i 个高斯在该视角下的颜色（由 SH 求值）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;αᵢ&lt;/code&gt;：不透明度 × 该像素在 2D 高斯分布下的取值；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tᵢ = ∏ⱼ&amp;lt;ᵢ (1 − αⱼ)&lt;/code&gt;：透射率，表示&amp;quot;剩余多少光&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;优化技巧&lt;/strong&gt;：当 &lt;code&gt;Tᵢ&lt;/code&gt; 趋近 0 时，说明后续高斯被完全遮挡，可以直接 &lt;code&gt;break&lt;/code&gt; 跳过——大幅节省渲染开销。&lt;/p&gt;
&lt;h3 id=&#34;45-为什么这套渲染管线这么快&#34;&gt;4.5 为什么这套渲染管线这么快？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不走神经网络前向&lt;/strong&gt;，没有 MLP 计算；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tile 并行&lt;/strong&gt;：一个 GPU 线程块处理一个 Tile，并行度极高；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提前终止&lt;/strong&gt;：T→0 时跳过被遮挡高斯。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是为什么 3DGS 能在 1080p 下跑到 100+ FPS，而 NeRF 同尺寸场景只能跑几秒一张。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五训练自适应密度控制是灵魂&#34;&gt;五、训练：自适应密度控制是灵魂
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/adaptive-control.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/adaptive-control.svg&#34; alt=&#34;自适应密度控制：3DGS 训练的灵魂&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;只靠 SGD 优化高斯属性是&lt;strong&gt;不够的&lt;/strong&gt;——SfM 给出的初始点云非常稀疏（几万个点），无法表达复杂场景。3DGS 的核心创新之一是&lt;strong&gt;自适应密度控制（Adaptive Density Control）&lt;/strong&gt;：每 100 次迭代触发一次密度调整，根据每个高斯的&amp;quot;位置梯度&amp;quot;和&amp;quot;大小&amp;quot;决定下一步动作。&lt;/p&gt;
&lt;h3 id=&#34;51-三种密度操作&#34;&gt;5.1 三种密度操作
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;触发条件&lt;/th&gt;
&lt;th&gt;物理含义&lt;/th&gt;
&lt;th&gt;具体动作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;克隆 Clone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;小高斯 + 位置梯度大&lt;/td&gt;
&lt;td&gt;欠重建区域，需要更多高斯&lt;/td&gt;
&lt;td&gt;复制一份并随机位移&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;分裂 Split&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;大高斯 + 位置梯度大&lt;/td&gt;
&lt;td&gt;一个高斯覆盖太大，需细分&lt;/td&gt;
&lt;td&gt;替换为 2 个更小的高斯&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;剪枝 Prune&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;α &amp;lt; ε / 过大 / SH 重置&lt;/td&gt;
&lt;td&gt;该高斯对渲染几乎没贡献&lt;/td&gt;
&lt;td&gt;直接删除&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;位置梯度大&lt;/strong&gt;意味着：这个高斯&amp;quot;想要&amp;quot;往某个方向移动，说明当前几何表示不到位。3DGS 用这个信号判断哪些区域需要更精细的几何。&lt;/p&gt;
&lt;h3 id=&#34;52-训练损失&#34;&gt;5.2 训练损失
&lt;/h3&gt;&lt;p&gt;3DGS 用一个简单的组合损失：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;L = (1 − λ) · L1 + λ · D-SSIM
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;L1&lt;/code&gt;：像素级绝对误差，保证整体颜色准确；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;D-SSIM&lt;/code&gt;：结构相似度的 1-SSIM 版本，保证结构和感知质量；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;λ = 0.2&lt;/code&gt; 在大多数场景下表现良好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;53-训练流程&#34;&gt;5.3 训练流程
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;用 SfM 稀疏点云初始化每个高斯的位置；&lt;/li&gt;
&lt;li&gt;高斯大小、旋转、颜色初始值用启发式设定（如平均距离）；&lt;/li&gt;
&lt;li&gt;每 100 步触发一次密度控制；&lt;/li&gt;
&lt;li&gt;训练 30000 步左右收敛，单场景约 30~45 分钟。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;这套机制的妙处在于：&lt;strong&gt;初始只有几万个高斯，最终能膨胀到几百万个&lt;/strong&gt;——数量自动匹配场景复杂度，比固定分辨率网格灵活得多。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六与-nerf-的范式对决&#34;&gt;六、与 NeRF 的范式对决
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/3dgs-vs-nerf.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/3dgs-vs-nerf.svg&#34; alt=&#34;NeRF vs 3DGS：两种范式的对决&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;3DGS 与 NeRF 经常被放在一起对比，因为它们解决的是同一类问题。这里做一个全面的对照：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;NeRF&lt;/th&gt;
&lt;th&gt;3DGS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;表示方式&lt;/td&gt;
&lt;td&gt;隐式（MLP）&lt;/td&gt;
&lt;td&gt;显式（高斯集合）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型大小&lt;/td&gt;
&lt;td&gt;紧凑（MB 级）&lt;/td&gt;
&lt;td&gt;庞大（数百 MB ~ GB）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;渲染速度&lt;/td&gt;
&lt;td&gt;慢（秒级 / 张）&lt;/td&gt;
&lt;td&gt;快（100+ FPS）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练时间&lt;/td&gt;
&lt;td&gt;几小时&lt;/td&gt;
&lt;td&gt;30~45 分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;几何平滑性&lt;/td&gt;
&lt;td&gt;平滑，无悬浮&lt;/td&gt;
&lt;td&gt;容易产生悬浮物&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可编辑性&lt;/td&gt;
&lt;td&gt;困难&lt;/td&gt;
&lt;td&gt;直接操作高斯即可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;视角相关性&lt;/td&gt;
&lt;td&gt;强（依赖方向 d）&lt;/td&gt;
&lt;td&gt;强（依赖 SH）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;像素独立计算&lt;/td&gt;
&lt;td&gt;是（射线采样）&lt;/td&gt;
&lt;td&gt;否（Tile 共享排序）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心差异在渲染范式&lt;/strong&gt;：NeRF 走&amp;quot;逐像素射线采样 + 体渲染积分&amp;quot;，每个像素都要做几十~几百次 MLP 前向；3DGS 走&amp;quot;Tile + α 混合&amp;quot;，所有高斯一次性光栅化到屏幕。&lt;/p&gt;
&lt;p&gt;3DGS 之所以能赢下实时性，本质上是把&amp;quot;每像素都要重复做的昂贵计算&amp;quot;换成了&amp;quot;一次性光栅化的廉价操作&amp;quot;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七3dgs-的六大缺陷&#34;&gt;七、3DGS 的六大缺陷
&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/limitations-overview.svg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img src=&#34;https://SymphonyW.github.io/p/3d-gaussian-splatting-principlesrebuilding-the-world-with-millions-of-gaussians-and-its-cost/limitations-overview.svg&#34; alt=&#34;3DGS 的六大缺陷全景&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;3DGS 并不完美。事实上，原论文本身就公开承认了这些局限，而过去两年大量后续工作都是围绕它们做&amp;quot;打补丁&amp;quot;。下面详细展开六大缺陷。&lt;/p&gt;
&lt;h3 id=&#34;71-存储爆炸&#34;&gt;7.1 存储爆炸
&lt;/h3&gt;&lt;p&gt;这是最显眼的问题。一个 3D 高斯需要存储：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;位置 3 + 缩放 3 + 旋转 4 + 不透明度 1 + SH(3 阶) 48 = &lt;strong&gt;59 个 float ≈ 236 字节&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个无边界场景通常有 &lt;strong&gt;百万级&lt;/strong&gt;高斯，单场景动辄 200~700 MB。这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;移动端 / Web 端难以部署&lt;/strong&gt;：浏览器加载一个 500MB 的 &lt;code&gt;.ply&lt;/code&gt; 不现实；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储成本飙升&lt;/strong&gt;：一个数字孪生项目要存数百个场景，就是几十~几百 GB；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传输带宽吃紧&lt;/strong&gt;：流式渲染 4K 场景对网络要求极高。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;因此，压缩不是可选优化，而是 3DGS 从论文 demo 走向 Web、移动端和大规模资产库时必须解决的工程问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;代表后续工作&lt;/strong&gt;：LightGaussian（剪枝 + SH 蒸馏 + VQ 量化）、CompGS、SOG、EulerGS、3DGS 量化剪枝等，目标压缩比 10×~50×。&lt;/p&gt;
&lt;h3 id=&#34;72-训练不算快&#34;&gt;7.2 训练不算快
&lt;/h3&gt;&lt;p&gt;虽然 3DGS 训练比 NeRF 快很多，但 30~45 分钟 / 场景在工业场景仍偏慢。更严重的问题是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;显存占用大&lt;/strong&gt;：训练时百万高斯需要 24GB+ 显存；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密度膨胀期显存飙升&lt;/strong&gt;：分裂操作会让高斯数量在某个阶段爆炸式增长；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;难以分钟级训练&lt;/strong&gt;：交互式应用（如实时重建）几乎不可行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;代表后续工作&lt;/strong&gt;：Mip-Splatting（抗锯齿）、AbsGrad（绝对梯度策略，加速收敛）、Warm-start 初始化等。&lt;/p&gt;
&lt;h3 id=&#34;73-无法泛化&#34;&gt;7.3 无法泛化
&lt;/h3&gt;&lt;p&gt;3DGS 必须&lt;strong&gt;每场景独立训练&lt;/strong&gt;，不能&amp;quot;喂一张新图就出模型&amp;quot;。少样本（few-shot）场景下，高斯密度控制很容易崩塌——没有足够的视角监督，高斯会胡乱增长。&lt;/p&gt;
&lt;p&gt;这与生俱来的限制让 3DGS 难以应用在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AR 实时建模（用户拍几张照就出模型）；&lt;/li&gt;
&lt;li&gt;机器人感知（环境快速重建）；&lt;/li&gt;
&lt;li&gt;大规模城市采集（场景太多，逐个训练不现实）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;代表后续工作&lt;/strong&gt;：PixelSplat、MVSplat、Splatter Image、LRM-Gauss 等——这些工作用 transformer 前馈网络直接从图像预测高斯参数，1 秒推理出模型，但质量仍不及原始 3DGS。&lt;/p&gt;
&lt;h3 id=&#34;74-视觉伪影&#34;&gt;7.4 视觉伪影
&lt;/h3&gt;&lt;p&gt;3DGS 的渲染常见几类伪影：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;悬浮高斯（Floaters / &amp;ldquo;飞虫&amp;rdquo;）&lt;/strong&gt;：训练过程中没有被剪掉的离群高斯，会在视角移动时出现在场景中&amp;quot;飘&amp;quot;的小色块；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;弹出&amp;quot;伪影（Popping）&lt;/strong&gt;：视角切换时某些高斯突然出现/消失，因为密度控制在不同视角下表现不一致；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缩放锯齿&lt;/strong&gt;：放大场景时，2D 高斯投影的离散性导致锯齿严重；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远距离模糊&lt;/strong&gt;：远处高斯采样不足，渲染时模糊。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些问题大多源于一个根本原因：&lt;strong&gt;3DGS 用&amp;quot;离散点集 + 各向异性高斯&amp;quot;近似连续场景，在高频细节和反走样处理上天生不如体渲染&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代表后续工作&lt;/strong&gt;：Mip-Splatting（3D 平滑滤波 + 屏幕空间膨胀，是当前抗锯齿的事实标准）、3DGS 正则化、深度一致性损失等。&lt;/p&gt;
&lt;h3 id=&#34;75-动态场景弱&#34;&gt;7.5 动态场景弱
&lt;/h3&gt;&lt;p&gt;原版 3DGS 只支持&lt;strong&gt;静态场景&lt;/strong&gt;。一旦场景中有运动物体，或者要做长视频重建，问题就出现了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高斯没有时间维度，无法表达运动；&lt;/li&gt;
&lt;li&gt;直接逐帧训练会导致帧间不一致（&amp;ldquo;闪烁&amp;rdquo;）；&lt;/li&gt;
&lt;li&gt;长视频的存储和计算成本爆炸。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;代表后续工作&lt;/strong&gt;：4DGS、Deformable 3DGS（用形变场建模时间）、Dynamic 3D Gaussians、SC-GS（用控制网格驱动高斯运动）等。&lt;/p&gt;
&lt;h3 id=&#34;76-鲁棒性弱&#34;&gt;7.6 鲁棒性弱
&lt;/h3&gt;&lt;p&gt;3DGS 强依赖 &lt;strong&gt;SfM 点云质量&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;纹理稀疏区域（如白墙、天空）SfM 给不出点，3DGS 重建直接失败；&lt;/li&gt;
&lt;li&gt;反光、透明物体 SfM 误差大，3DGS 跟着出错；&lt;/li&gt;
&lt;li&gt;大场景下 SfM 漂移，导致重建几何偏差。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此外，3DGS 对&lt;strong&gt;初始化超参数&lt;/strong&gt;也比较敏感——初始高斯大小、密度控制阈值等都需要场景相关调参。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代表后续工作&lt;/strong&gt;：无 SfM 初始化（如随机点云、均匀采样）、深度监督（用 monodepth 先验）、GS-SLAM 类方法（在线增量重建）等。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八总结&#34;&gt;八、总结
&lt;/h2&gt;&lt;h3 id=&#34;81-3dgs-一句话总结&#34;&gt;8.1 3DGS 一句话总结
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;3DGS = 显式高斯表示 + 可微光栅化 + 自适应密度控制。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它把&amp;quot;高质量新视角合成&amp;quot;从&amp;quot;实验室 demo&amp;quot;推向了&amp;quot;实时交互&amp;rdquo;，是过去两年计算机视觉最有影响力的工作之一。&lt;/p&gt;
&lt;h3 id=&#34;82-它的核心贡献&#34;&gt;8.2 它的核心贡献
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;表示&lt;/strong&gt;：用百万级 3D 高斯显式建模场景，可微可优化；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渲染&lt;/strong&gt;：定制可微光栅化器，把神经渲染速度提升两个数量级；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练&lt;/strong&gt;：自适应密度控制（克隆 / 分裂 / 剪枝）让表示自适应场景复杂度。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;83-它的根本代价&#34;&gt;8.3 它的根本代价
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;速度&lt;/th&gt;
&lt;th&gt;→&lt;/th&gt;
&lt;th&gt;牺牲了存储（数百 MB / 场景）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;显式性&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;牺牲了几何平滑性（悬浮伪影）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自适应&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;牺牲了训练稳定性（对初始化敏感）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实时性&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;牺牲了泛化能力（每场景重训）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;每一次&amp;quot;快&amp;quot;的背后，都对应着一个&amp;quot;慢&amp;quot;的代价——这正是 3DGS 生态持续生长的动力。理解了这些缺陷，你就能更准确地选择何时用 3DGS、何时该走 NeRF 路线、何时该用混合方案。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;原论文：&lt;a class=&#34;link&#34; href=&#34;https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;3D Gaussian Splatting for Real-Time Radiance Field Rendering (SIGGRAPH 2023)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目主页：&lt;a class=&#34;link&#34; href=&#34;https://github.com/graphdeco-inria/gaussian-splatting&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/graphdeco-inria/gaussian-splatting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mip-Splatting：&lt;a class=&#34;link&#34; href=&#34;https://github.com/nerfstudio-project/gsplat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/nerfstudio-project/gsplat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LightGaussian：&lt;a class=&#34;link&#34; href=&#34;https://lightgaussian.github.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://lightgaussian.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
