The decoder takes the image and point cloud features as inputs, and outputs the per-point classification result. In general, it follows the interpolation idea of PointNet++ [1]}. At the beginning of the decoder, the global image feature \(I^{(3)}\)  and global point cloud feature \(P^{(3)}\)  are stacked \(M_2\)  times, so that they can be concatenated with the node features \(P^{(2)}\)  and the Attention Fusion output \(\tilde{I}^{(2)}\) . The concatenated \([I^{(3)}, \tilde{I}^{(2)}, P^{(3)}, P^{(2)}]\)  is processed by a shared MLP to get \(M_2\)  feature vectors denoted as \(\tilde{P}^{(2)} \in \mathbb {R}^{C_2\times M_2}\) . We perform interpolation to get \(\tilde{P}^{(2)}_{(itp)} \in \mathbb {R}^{C_2\times M_1}\) , where the \(M_2\)  features are upsampled to \(M_1 \ge M_2\)  features. Note that \(P^{(2)}\)  and \(\tilde{P}^{(2)}\)  are associated with node coordinates \(\mathfrak {P}^{(2)} \in \mathbb {R}^{3\times M_2}\) . The interpolation is based on \(k\) -nearest neighbors between node coordinates \(\mathfrak {P}^{(1)} \in \mathbb {R}^{3\times M_1}\) , where \(M_1 \ge M_2\) . For each \(C_2\)  channel, the interpolation is denoted as:
\( \tilde{P}^{(2)}_{(itp)_i} = \frac{\sum _{j=1}^k w_j \tilde{P}^{(2)}_j }{\sum _{j=1}^k w_j}, \text{\,\,where \,\,} w_j = \frac{1}{d(\mathfrak {P}^{(1)}_i, \mathfrak {P}^{(2)}_j)},\) 
