<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://jianhengliu.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jianhengliu.github.io/" rel="alternate" type="text/html" /><updated>2026-05-06T18:36:58-07:00</updated><id>https://jianhengliu.github.io/feed.xml</id><title type="html">Jianheng Liu</title><subtitle>personal description</subtitle><author><name>Jianheng Liu</name><email>liujianhengchris@qq.com</email></author><entry><title type="html">2DGS梯度推导</title><link href="https://jianhengliu.github.io/posts/2024/11/2DGS%E6%A2%AF%E5%BA%A6%E6%8E%A8%E5%AF%BC/" rel="alternate" type="text/html" title="2DGS梯度推导" /><published>2024-11-05T00:00:00-08:00</published><updated>2024-11-05T00:00:00-08:00</updated><id>https://jianhengliu.github.io/posts/2024/11/%E6%A2%AF%E5%BA%A6%E6%8E%A8%E5%AF%BC</id><content type="html" xml:base="https://jianhengliu.github.io/posts/2024/11/2DGS%E6%A2%AF%E5%BA%A6%E6%8E%A8%E5%AF%BC/"><![CDATA[<p>https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities</p>

<h1 id="rendercuda">renderCUDA</h1>

<p><strong>1. Input:</strong></p>

<ul>
  <li>$xy_j$: gaussian point pixel coord</li>
  <li>pixf: current pix coord</li>
  <li>$d_j = xy_j - pixf$</li>
  <li>${con_o}_j$: [conic_x, conic_y, conic_z, opacity]
    <ul>
      <li>$[\Sigma^{-1},o]$</li>
      <li>这是 2d 的 cov, 3d 的会加粗处理</li>
    </ul>
  </li>
</ul>

<p><strong>2. Forward: near to far</strong></p>

<ol>
  <li>$power_j = -0.5*d^T\Sigma^{-1}d$</li>
  <li>$G_j =  \exp(power_j)$</li>
  <li>
    <ol>
      <li>$\alpha_j = o_j * \exp(power_j) = o_j * G_j$</li>
    </ol>
  </li>
  <li>$ch(annel) += sh_j * \alpha_j *T_j$
\(ch = \sum_{j=0}c_j\alpha_jT_j(\alpha)\)</li>
  <li>$T_{j+1} = T_j*(1-\alpha_j)$</li>
</ol>

<p><strong>3. Backward: far to near</strong></p>

<p><strong>3.1. Original Alpha: $\alpha_j = o_j * \exp(power_j) = o_j * G_j$</strong></p>

<ol>
  <li>
    <p>dch_dalpha $\frac{\partial ch}{\partial \alpha_j}$</p>

\[\begin{equation}
\begin{aligned}
\frac{\partial ch}{\partial \alpha_j} &amp;= \frac{\partial ch}{\partial \alpha_j}\frac{\partial \alpha_j}{\partial \alpha_j} + \sum_{k = j+1}\frac{\partial ch}{\partial T_k}\frac{\partial T_k}{\partial \alpha_j}\\

 &amp;= sh_j * T_j
+ \sum_{k=j+1}sh_k\alpha_k*\frac{T_k}{(1-\alpha_j)}(-1)\\

 &amp;= (sh_j
-\sum_{k=j+1}sh_k\alpha_k*\frac{T_k}{T_j(1-\alpha_j)})*T_j\\

 &amp;= (sh_j
-\sum_{k=j+1}sh_k\alpha_k*\frac{T_k}{T_{j+1}})*T_j\\

 &amp;= \left(sh_j
-\sum_{k=j+1}sh_k\alpha_k\prod^{k-1}_{t=j+1}\left(1-\alpha_{t}\right)\right)*T_j\\

 &amp;= \left(sh_j
-accum\_rec_{j}\right)*T_j
 \end{aligned}
 \end{equation}\]

\[\begin{equation}
\begin{aligned}
accum\_rec_{j} &amp;= \sum_{k=j+1}sh_k\alpha_k\prod^{k-1}_{t=j+1}\left(1-\alpha_{t}\right)
\\
&amp;= sh_{j+1}\alpha_{j+1} + sh_{j+2}\alpha_{j+2}(1-\alpha_{j+1}) + sh_{j+3}\alpha_{j+3}(1-\alpha_{j+1})(1-\alpha_{j+2}) + ...\\
&amp;= \alpha_{j+1}sh_{j+1} + (1-\alpha_{j+1})*accum\_rec_{j+1}
 \end{aligned}
 \end{equation}\]
  </li>
  <li>
    <p>dL_dalpha
\(\begin{equation}
\frac{\partial L}{\partial \alpha_j} = \frac{\partial L}{\partial ch}\frac{\partial ch}{\partial \alpha_j}\\= \frac{\partial L}{\partial ch} *(sh_j - accum\_rec_j) * T_j + （background \ color \ part）
\end{equation}\)</p>

    <p>2.1. If $\alpha_j = \left(1-\exp \left(-o_i\mathcal{G}_i \delta_i\right)\right)$</p>
  </li>
  <li>
    <p>dL_dconic2D  <br />
 \(\begin{equation}
 \begin{aligned}
 \frac{\partial L}{\partial \Sigma^{-1}} &amp;= \frac{\partial L}{\partial ch}\frac{\partial ch}{\partial \alpha_j}\frac{\partial \alpha_j}{\partial G_j}\frac{\partial G_j}{\partial \Sigma^{-1}} 
 = \frac{\partial L}{\partial G_j}\frac{\partial G_j}{\partial \Sigma^{-1}} 
 \end{aligned}
 \end{equation}\)</p>

\[\begin{equation}
 \begin{aligned}
 \frac{\partial G_j}{\partial \Sigma^{-1}} &amp;= \frac{\partial G_j}{\partial power_j}\frac{\partial power_j}{\partial \Sigma^{-1}}
 \\
 &amp;= G_j\frac{\partial power_j}{\partial \Sigma^{-1}} = G_j(-0.5*dd^T)
 \end{aligned}
 \end{equation}\]
  </li>
  <li>
    <p>dL_do
 \(\frac{\partial L}{\partial o_j} = \frac{\partial L}{\partial \alpha_j}\frac{\partial \alpha_j}{\partial o_j}   = \frac{\partial L}{\partial \alpha_j} G\)</p>
  </li>
</ol>

<p><strong>3.2. Volume Alpha: $\alpha_j = 1- \exp(-o_j * G_j * \delta_j)$</strong></p>

<ol>
  <li>dL_ddelta
 \(\frac{\partial L}{\partial \delta_j} = \frac{\partial L}{\partial \alpha_j}\frac{\partial \alpha_j}{\partial \delta_j}   = \frac{\partial L}{\partial \alpha_j} \exp(-o_j * G_j * \delta_j) * o_j *  G_j\)
 按照NeRF来说，这个梯度不需要传导，因为采样间隔应该是均匀的。但是也计算一下试试看。
 \(\delta_j = d_{j+1} - d_j\)
 In the backward pass, we assume the Gaussians are sorted in right order, but in the forward pass, we calculate $\delta_j = |d_{j+1} - d_j|$.
 \(\frac{\partial \delta_j}{\partial d_j} = -1,
 \frac{\partial \delta_j}{\partial d_{j+1}} = 1\)</li>
  <li>dL_dG
 \(\frac{\partial L}{\partial G_j } = \frac{\partial L}{\partial \alpha_j}\frac{\partial \alpha_j}{\partial G_j }   = \frac{\partial L}{\partial \alpha_j} \exp(-o_j * G_j * \delta_j) * o_j *  \delta_j\)</li>
  <li>dL_do
 \(\frac{\partial L}{\partial o_j} = \frac{\partial L}{\partial \alpha_j}\frac{\partial \alpha_j}{\partial o_j}   = \frac{\partial L}{\partial \alpha_j} \exp(-o_j * G_j * \delta_j) *G_j * \delta_j\)</li>
</ol>

<h1 id="ray-splat-points">Ray-splat points</h1>

\[\mathbf{x}=(x z, y z, z, 1)^{\mathrm{T}}=\mathbf{W} P(u, v)=\mathbf{W H}(u, v, 1,1)^{\mathrm{T}}\]

\[\hat{\mathbf{x}}=(x, y, z)^{\mathrm{T}}=(\frac{1}{z}, \frac{1}{z}, 1)\mathbf{W} P(u, v)\]

<h1 id="depth">Depth</h1>

<h2 id="mean-depth">Mean depth</h2>

\[D=\sum_i \omega_i z_i\]

<p>where</p>

\[\omega_i=T_i \alpha_i \hat{\mathcal{G}}_i(\mathbf{u}(\mathbf{x}))\]

<p>is the weight contribution of the</p>

<p>$i$</p>

<p>-th Gaussian and</p>

\[T_i=\prod_{j=1}^{i-1}\left(1-\alpha_j \hat{\mathcal{G}}_j(\mathbf{u}(\mathbf{x}))\right)\]

<p>measures its visibility.</p>

<ul>
  <li>Relative variables
    <ul>
      <li>
\[z_i\]
      </li>
      <li>
\[\omega_i\]
      </li>
    </ul>
  </li>
</ul>

<h3 id="calculate">Calculate</h3>

\[z_i\]

\[\frac{\partial z_{\text {mean }}}{\partial z_i}=\omega_i\]

\[\frac{\partial L}{\partial z_i}=\frac{\partial L}{D}\frac{D}{\partial z_i}=\frac{\partial L}{D}\omega_i\]

<h3 id="calculate-1">Calculate</h3>

\[\omega_i\]

\[\frac{\partial z_{\text {mean }}}{\partial \omega_i}= z_i\]

\[\frac{\partial L}{\partial \omega_i}=\frac{\partial L}{D}\frac{D}{\partial \omega_i}=\frac{\partial L}{D}z_i\]

<h3 id="calculate-2">Calculate</h3>

\[\alpha_i\]

\[\frac{\partial T_i}{\partial \alpha_i} =  T_{i-1} \left(-\hat{\mathcal{G}}_{i-1}(\mathbf{u}(\mathbf{x}))\right)\]

\[\frac{\partial \omega_i}{\partial \alpha_i}= T_i \hat{\mathcal{G}}_i(\mathbf{u}(\mathbf{x})) +  \alpha_i \hat{\mathcal{G}}_i(\mathbf{u}(\mathbf{x})) \frac{\partial T_i}{\partial \alpha_i}\\
= T_i \hat{\mathcal{G}}_i(\mathbf{u}(\mathbf{x})) - \alpha_i T_{i-1} \hat{\mathcal{G}}_{i-1}(\mathbf{u}(\mathbf{x})) \hat{\mathcal{G}}_i(\mathbf{u}(\mathbf{x}))\]

<h1 id="distortion-loss">Distortion loss</h1>

\[\begin{aligned}
&amp;\begin{aligned}
\mathcal{Dist} &amp; =\sum_{i=0}^{N-1} \sum_{j=0}^{i-1} \omega_i \omega_j\left(m_i-m_j\right)^2 \\
&amp; =\sum_{i=0}^{N-1} \omega_i\left(m_i^2 \sum_{j=0}^{i-1} \omega_j+\sum_{j=0}^{i-1} \omega_j m_j^2-2 m_i \sum_{j=0}^{i-1} \omega_j m_j\right) \\
&amp; =\sum_{i=0}^{N-1} \omega_i\left(m_i^2 A_{i-1}+D_{i-1}^2-2 m_i D_{i-1}\right)
\end{aligned}\\
&amp;\text { where } A_i=\sum_{j=0}^{i} \omega_j, D_i=\sum_{j=0}^{i} \omega_j m_j \text { and } D_i^2=\sum_{j=0}^{i} \omega_j m_j^2 \text {. }
\end{aligned}\]

\[A_i=\sum_{j=0}^{i} \omega_j =\sum_{j=0}^{i} \alpha_j \hat{\mathcal{G}}_j(\mathbf{u}(\mathbf{x})) T_j = 1.0 - T_i = 1.0 - \prod_{j=1}^{i}\left(1-\alpha_j \hat{\mathcal{G}}_j(\mathbf{u}(\mathbf{x}))\right)\]

\[\frac{\partial \mathcal{Dist}}{\partial m_i}=\omega_i * 2 * m_i * A_{i-1} - 2 D_{i-1} = 2 (\omega_i * m_i * A_{i-1} - D_{i-1})\]

\[\frac{\partial \mathcal{Dist}}{\partial \omega_i}=m_i^2 A_{i-1}+D_{i-1}^2-2 m_i D_{i-1}\]

\[\frac{\partial \mathcal{Dist}}{\partial \alpha_i}=\frac{\partial L}{\partial \omega_i} \frac{\partial \omega_i}{\partial \alpha_i}\]]]></content><author><name>Jianheng Liu</name><email>liujianhengchris@qq.com</email></author><category term="2DGS" /><summary type="html"><![CDATA[https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities]]></summary></entry></feed>