Manifold Aware Fusion for PolSAR Image Classification

Analysis by the aitrendblend editorial team · Pillar: Graph neural networks · Source paper published in IEEE Transactions on Circuits and Systems for Video Technology, 2026

PolSAR Graph Convolutional Networks Dempster Shafer Fusion Grassmann Manifold Remote Sensing
Satellite radar imagery over a mixed terrain scene used for polarimetric classification research
PolSAR Image Classification: Polarimetric radar scenes like the ones studied in this paper mix sharp manmade edges with soft, noisy natural texture, which is exactly what makes them hard to classify with a single feature representation.

Picture a strip of land seen through radar instead of a camera. A river cuts a clean line through farmland, a cluster of buildings sits in a blocky grid, and a forest spreads out as a grainy, speckled mess. To tackle these complex environments, a team of researchers has developed a new approach to PolSAR image classification that doesn’t force two very different kinds of radar data into the same flat mathematical box. Their paper, accepted for publication in IEEE Transactions on Circuits and Systems for Video Technology, argues that the usual approach to fusing radar features has been quietly throwing away structure the whole time.

Key points

  • The paper treats a PolSAR covariance matrix and its derived scattering features as two separate views that live on two different curved mathematical spaces, not one flat vector.
  • A dedicated graph network handles each view on its own geometry, one tuned to the Hermitian positive definite manifold and one tuned to the Grassmann manifold.
  • A Dempster Shafer evidence fusion step replaces the usual softmax layer so the model can output a class prediction and an honest uncertainty score together.
  • Across three real radar datasets the combined model beat six comparison methods on overall accuracy, and it stayed far more stable as synthetic noise increased.
  • Ablation results show that swapping in the manifold aware kernels alone already improves accuracy before the evidence fusion step is even added.

The unresolved challenges of PolSAR image classification

Polarimetric synthetic aperture radar sees the ground by sending out polarized microwave pulses and reading how the surface scatters them back. Unlike a photograph, this works day or night and through cloud cover, which is part of why it matters for disaster response, farmland monitoring, and urban mapping. Each pixel in a processed PolSAR scene carries a covariance matrix that summarizes how the surface reflected horizontally and vertically polarized waves. Researchers have also learned to derive a second set of descriptors from that same raw data, things like entropy from Cloude Pottier decomposition, surface and volume scattering power from Freeman Durden decomposition, texture statistics from gray level co occurrence matrices, and edge strength measures.

Most deep learning pipelines take both of these, flatten them into ordinary vectors, glue them together end to end, and hand the result to a convolutional or graph network followed by a softmax classifier. It works, up to a point. The authors point out two specific reasons it falls short. First, a covariance matrix is not an ordinary point in Euclidean space. It is Hermitian and positive definite, meaning it lives on a curved manifold where simple operations like averaging two matrices or measuring the distance between them with a straight ruler produce mathematically invalid or biased results. The scattering feature vectors, once you decompose them and keep only the dominant directions, are better modeled as points on a Grassmann manifold, a different curved space that represents subspaces rather than single vectors. Mash the two together with plain concatenation and you are quietly comparing apples to oranges using a ruler that was never built for either fruit.

Second, the softmax layer at the end of almost every classifier treats every prediction as equally trustworthy. It cannot say I am not sure. Under speckle noise, which is the grainy random variation baked into every radar image by the physics of coherent imaging, softmax still produces a confident answer even when it should not. The paper’s own noise experiment on the Oberpfaffenhofen dataset shows both a plain softmax and a learned softmax variant losing accuracy fast as noise increases, while an evidence based alternative barely budges.

Why this matters beyond one paper. Almost any multiview machine learning problem eventually runs into the same two issues. Different sensors or feature types often live on different mathematical spaces, and a single confident sounding output hides how shaky some of those inputs really are. The fixes proposed here, manifold specific graph kernels and evidence based fusion, are general enough to matter for other remote sensing tasks and honestly for medical imaging fusion or sensor fusion in robotics too.

What came before, and where it stopped short

The related work section of the paper sorts prior approaches into a few camps. Purely data driven deep networks, including complex valued convolutional networks and complex valued transformers, learn directly from the raw polarimetric data and can pick up phase information that a naive vectorization would discard. That branch of work is powerful but tends to ignore physically meaningful descriptors like scattering mechanism or texture, so it lacks the kind of interpretability an analyst might want when explaining why a pixel got labeled a certain way.

A second camp folds in physics aware features directly. The authors cite work using entropy, anisotropy, and alpha decomposition parameters as network inputs, plus multifrequency fusion guided by scattering mechanism and even diffusion models conditioned on scattering features. These approaches recover interpretability but usually stop at concatenating the physics based features with the raw data rather than respecting their distinct geometry.

Fusion strategies split further into early fusion, where features are concatenated before the network sees them, and late fusion, where separate branches are trained and then merged near the output. Early fusion examples in the paper’s citations include a multi feature lightweight DeepLabV3 plus network and a reconstruction error based decomposition method. Late fusion examples include MCFCN, which fuses complementary polarimetric branches, and CDFNet, which uses a dedicated fusion module for heterogeneous representations. The paper’s honest critique of both camps is the same one that motivates the whole project. Neither line of work treats the manifold structure of the data as something worth preserving through the fusion step, and almost all of them still end on a softmax layer that cannot express doubt.

On the uncertainty side, the paper leans on Dempster Shafer theory, a framework originally built for combining evidence from multiple imperfect sources while explicitly tracking how much they disagree. Han and colleagues had already shown that Dempster Shafer style evidential fusion improves trustworthy multiview classification in a more general setting, and the PolSAR paper’s contribution is adapting that machinery to sit on top of manifold aware graph features rather than ordinary Euclidean ones.

How the two view manifold network actually works

The proposed system, which the authors call MMEFNet, starts by oversegmenting the PolSAR scene into superpixels using a method called Pol ASLIC, which groups nearby pixels with similar size and reduces the impact of speckle before any learning happens. Each superpixel becomes one node in two separate graphs, one for each view.

View one, the covariance matrix on its native curved space

For every superpixel, the model averages the covariance matrices of its pixels to get a single representative matrix. Because that matrix has to stay Hermitian and positive definite, the authors measure similarity between two superpixels using the log Euclidean Riemannian distance, which projects each matrix into a tangent space through a logarithm operation and then applies an ordinary Euclidean norm there. That distance feeds a Gaussian kernel to build the adjacency matrix for what they call HPD sGCN, a superpixel graph convolutional network built specifically for this manifold.

\[ d_{HPD}(C_i, C_j) = \| \log(C_i) – \log(C_j) \|_F \] \[ A^{(1)}_{ij} = \exp\left(-\frac{d_{HPD}^2(C_i, C_j)}{\sigma^2}\right) \]

View two, scattering features on a Grassmann manifold

The second view assembles a 57 dimension feature vector per pixel covering scattering matrix elements, coherency matrix elements, SPAN, three separate polarimetric decompositions, polarization ratios, texture statistics from gray level co occurrence matrices, and edge or line energy features. For each superpixel the model computes a local covariance of these features and takes its eigenvectors, keeping the top ones as an orthonormal basis. That basis is a point on a Grassmann manifold, representing a subspace rather than a single vector. Similarity between two subspaces uses a projection kernel built from the Frobenius norm of the overlap between their bases, and that similarity feeds the adjacency matrix for the Grassmann sGCN branch.

\[ A^{(2)}_{ij} = k_{Grass}(U_i, U_j) = \| U_i^{\top} U_j \|_F^2 \]

Both branches run several layers of standard graph convolution on top of their manifold aware adjacency matrices, then project the superpixel level features back out to pixel resolution using a simple binary assignment matrix that marks which superpixel each pixel belongs to.

Turning two opinions into one trustworthy answer

This is the part that replaces softmax. Each branch produces an evidence vector through a ReLU activation, where a value of zero literally means no evidence for that class rather than a small negative confidence being clipped away. Each evidence value gets mapped to the parameter of a Dirichlet distribution, which is a distribution over class probabilities rather than a single probability itself. From there the model computes a belief mass for each class and an overall uncertainty mass for that view, and the two are constructed so they always sum to exactly one.

\[ \alpha^{(v)}_{i,k} = e^{(v)}_{i,k} + 1 \] \[ b^{(v)}_{i,k} = \frac{e^{(v)}_{i,k}}{S^{(v)}_i}, \qquad u^{(v)}_i = \frac{L}{S^{(v)}_i} \]

Once both views have their own belief and uncertainty, the model combines them with Dempster’s orthogonal rule, the classic Dempster Shafer combination formula. It multiplies matching beliefs together, lets uncertainty from one view get resolved by confident belief from the other, and divides out a conflict factor that measures how much the two views actually disagreed on a given pixel.

\[ b_{i,k} = \frac{1}{1-G_i}\left(b^{(1)}_{i,k} b^{(2)}_{i,k} + b^{(1)}_{i,k} u^{(2)}_i + b^{(2)}_{i,k} u^{(1)}_i\right), \qquad G_i = \sum_{j \neq k} b^{(1)}_{i,j} b^{(2)}_{i,k} \]

The fused belief mass then gets converted back into a Dirichlet distribution and the mean of that distribution becomes the final class probability. The model trains with two loss terms added together, a standard cross entropy loss on each branch’s raw graph output and a Dirichlet based evidential loss that includes a Kullback Leibler penalty pulling the distribution toward the uninformative prior whenever the model has not earned its confidence.

By quantifying uncertainty as an evidential variable, MMEFNet successfully mitigates softmax induced overconfidence and dynamically discounts unreliable features, providing a trustworthy foundation for resilient PolSAR classification. From the paper’s introduction, describing the motivation for replacing the softmax layer

Does it actually work, and by how much

The team tested MMEFNet on three real datasets that differ in sensor, frequency band, and number of land cover classes. The Xi’an dataset comes from RADARSAT-2 in C-band and covers three classes across a 512 by 512 pixel scene. The San Francisco dataset comes from NASA JPL’s AIRSAR system in L-band with five classes across 900 by 1024 pixels. The Flevoland dataset, also AIRSAR L-band, is the most demanding, with 15 land cover classes including several different wheat varieties across a 750 by 1024 pixel scene.

Every model was compared against six baselines covering a range of strategies, from a superpixel based random forest called Super RF through a complex valued convolutional network, a polarimetric multipath convolutional network, a diffusion inspired non Gaussian model, a hyperspectral style diffusion model adapted for the task, and a hybrid complex valued network. Training used only 5 percent of labeled samples per dataset, with 1 percent for validation and the remaining 94 percent held out for testing, which is a fairly tight training budget for a 15 class problem like Flevoland.

Overall accuracy on the Xi’an dataset, percent
MethodSuper RFCV CNNPolMPCNNNGDiffSpectralDiffHybridCVNetMMEFNet
Overall accuracy89.9492.3794.0196.9996.2194.5697.73
Average accuracy85.6193.0194.7195.9894.8594.0297.08
Kappa coefficient83.0287.5190.2595.0293.7391.0296.21

On the larger San Francisco scene MMEFNet reached 99.71 percent overall accuracy with a Kappa coefficient of 99.55, and on Flevoland, the toughest of the three with its 15 overlapping crop classes, it reached 99.75 percent overall accuracy against a strongest competitor, NGDiff, at 99.74 percent, a margin that is small in absolute terms but consistent across every metric the authors reported including F score and mean intersection over union.

The ablation study is arguably more informative than the headline numbers. The authors compared single view graph networks with and without the manifold aware kernel, labeled sGCN v1 and sGCN ME v1 for the covariance branch and sGCN v2 and sGCN ME v2 for the scattering feature branch. On the Xi’an dataset, adding the manifold metric alone lifted the covariance branch from 93.59 percent to 95.46 percent overall accuracy, and lifted the scattering branch from 95.83 percent to 96.41 percent, before the evidence fusion step was even introduced. Combining both manifold aware branches through Dempster Shafer fusion then pushed the final number to 97.73 percent. That pattern held on San Francisco and Flevoland too, which is a reasonably convincing signal that the manifold kernel and the fusion mechanism are each contributing something real rather than one component doing all the work while the other rides along.

The noise stress test is the number worth remembering. On the Oberpfaffenhofen scene, standard softmax and a learned softmax variant both degraded sharply as synthetic noise increased, while the evidential fusion approach held its accuracy under the same conditions. The paper also shows an uncertainty density plot where clean samples cluster at low uncertainty and noisy or out of distribution samples cluster at high uncertainty, which is exactly the behavior you want from a model that is supposed to know when it does not know.

Running time is a fair concern for anyone who has watched a graph network with elaborate kernel computations crawl through a large scene. The paper reports training MMEFNet on the Xi’an dataset in 246.12 seconds with a testing time of 3.45 seconds on a fairly modest machine, an Intel Core i7-12700K with an NVIDIA GeForce RTX 3060 carrying 12GB of memory. For comparison, the polarimetric multipath convolutional network baseline took 21201.26 seconds to train on the same hardware, nearly two orders of magnitude longer, while offering lower accuracy. Super RF trained fastest at 60.33 seconds but with the weakest accuracy of the group. The authors frame MMEFNet as sitting in a favorable middle ground, and the numbers back that framing up.

What this means if you work on remote sensing or multiview fusion

The headline lesson generalizes past PolSAR. Any time you are fusing two feature types that were derived through genuinely different mathematical operations, matrix logarithms and eigen decompositions in this case, it is worth asking whether flattening them into one vector before your network sees them is throwing away exactly the structure that made each feature useful in the first place. The paper’s ablation results make a concrete case that respecting that structure is worth a real accuracy gain, not just a theoretical nicety.

The evidence fusion piece matters even if you never touch a manifold. Any classifier that has to combine two or more prediction sources, whether that is two sensors, two model checkpoints, or two annotators, faces the same question of how much to trust each source on a given example. Dempster Shafer combination gives a principled way to let confident evidence from one source override an uncertain reading from another, while flagging genuine disagreement as uncertainty rather than papering over it with a forced answer.

Where the approach still has friction

None of this comes free. Computing log Euclidean distances between covariance matrices, and Grassmann projection kernels between subspaces, is more expensive per pair than a Euclidean distance, and the paper’s own running time table shows graph learning as the dominant computational cost, scaling with the number of superpixels. The superpixel scale parameter also needs tuning per dataset, with the authors finding 100 worked best for the smaller Xi’an scene and 200 for the larger San Francisco and Flevoland scenes, which means a new dataset probably needs its own small sweep before deployment.

Honest limitations

The authors are upfront that the current framework only handles two views. Real deployments might have three or more heterogeneous sources, additional polarimetric bands, optical imagery, or temporal sequences, and the paper explicitly lists generalizing to multi temporal and multimodal remote sensing as future work rather than something already solved here. The three test datasets, while real and widely used in the PolSAR literature, are also all fairly classic benchmarks, Xi’an, San Francisco, and Flevoland, and the paper does not report cross scene generalization, meaning a model trained on one region’s land cover distribution was not tested on a genuinely different geography without retraining. The training sample ratio experiment in the paper does show that gains taper off past 5 percent labeled data and that overall accuracy can even dip slightly with more training samples in some cases, a detail that deserves more investigation than the paper gives it. Finally, the reported numbers come from a single train test split per dataset as described in the experimental setup, and the paper does not report variance across multiple random seeds, so the precise margins between MMEFNet and the strongest baselines, especially the roughly 0.01 percentage point gap over NGDiff on Flevoland, should be read as suggestive rather than definitive without seeing repeated runs.

Conclusion

The core achievement here is a genuinely coherent way to keep two mathematically distinct radar representations honest through the entire learning pipeline, from graph construction all the way to a final decision that carries its own confidence estimate. That sounds like a small engineering choice, respecting a manifold instead of flattening it, but the ablation numbers show it is not cosmetic. Each branch improved measurably once it stopped pretending its data lived in flat Euclidean space, and the two branches together improved further once fused through evidence rather than through a hard vote.

The conceptual shift worth carrying away is broader than radar imaging. Deep learning has spent the last decade getting extremely good at learning representations automatically, sometimes at the cost of ignoring decades of domain knowledge about what those representations actually are mathematically. This paper is part of a growing thread of work, alongside things like hyperbolic embeddings for hierarchical data or SPD manifold networks for covariance based signals, that argues the two approaches are not in conflict. You can let a network learn everything end to end and still respect the geometry the data was born with, and the accuracy numbers here suggest you get real benefit for doing so rather than just theoretical tidiness.

The transferability question is where this gets interesting for people outside remote sensing. Medical imaging pipelines that combine diffusion tensor data with texture features face an almost identical geometry mismatch problem, and so do sensor fusion systems in robotics that combine covariance based state estimates with learned visual features. The Dempster Shafer evidence layer described here is agnostic to what kind of data feeds it, as long as each branch can produce something that looks like class evidence, which makes it a reasonably portable piece even for teams that have no interest in manifolds at all.

The honest remaining limitations, a two view ceiling, benchmark scenes rather than cross region generalization, and a lack of repeated run variance, mean this is a strong proof of concept rather than a finished production system. None of those gaps look fundamental though, and the authors say as much when they point toward multi temporal and multimodal extensions as the obvious next step.

If there is a single closing thought worth sitting with, it is that the most reliable improvements in this paper did not come from a bigger network or more parameters. They came from taking the mathematical structure of the data seriously enough to build the model around it instead of around the data’s shape after it had already been forced flat.

Reference implementation in PyTorch

The block below is an original, runnable implementation inspired by the architecture described in the paper. It includes the HPD manifold kernel, the Grassmann projection kernel, two lightweight graph convolution branches, the Dirichlet evidence layer, Dempster’s combination rule, and the combined cross entropy plus evidential loss, along with a training loop, an evaluation function, and a smoke test on random dummy data so you can confirm the shapes line up before pointing it at real superpixel features.

# mmefnet_reference.py
# Original reference implementation inspired by the MMEFNet architecture
# described in "Manifold-aware Multiview Evidence Fusion for Robust PolSAR
# Image Classification". Not the authors' original code, written independently
# for illustration and experimentation.

import torch
import torch.nn as nn
import torch.nn.functional as F

class HPDKernel(nn.Module):
    """Log Euclidean similarity kernel for Hermitian positive definite matrices."""
    def __init__(self, sigma=1.0):
        super().__init__()
        self.log_sigma = nn.Parameter(torch.tensor(float(torch.log(torch.tensor(sigma)))))

    def forward(self, cov_matrices):
        # cov_matrices, shape N x d x d, assumed real symmetric positive definite
        # for a lightweight reference version of the complex Hermitian case
        eigvals, eigvecs = torch.linalg.eigh(cov_matrices)
        eigvals = torch.clamp(eigvals, min=1e-6)
        log_eigvals = torch.log(eigvals)
        log_mats = eigvecs @ torch.diag_embed(log_eigvals) @ eigvecs.transpose(-1, -2)
        flat = log_mats.flatten(start_dim=1)
        dist_sq = torch.cdist(flat, flat, p=2) ** 2
        sigma_sq = torch.exp(self.log_sigma) ** 2
        adjacency = torch.exp(-dist_sq / (sigma_sq + 1e-8))
        return adjacency

class GrassmannKernel(nn.Module):
    """Projection kernel between orthonormal subspace bases on a Grassmann manifold."""
    def forward(self, bases):
        # bases, shape N x d x q, columns assumed orthonormal
        overlap = torch.einsum('ndq,mdq->nmq', bases, bases)
        adjacency = (overlap ** 2).sum(dim=-1)
        return adjacency

def normalize_adjacency(adjacency):
    degree = adjacency.sum(dim=1)
    d_inv_sqrt = torch.pow(degree.clamp(min=1e-8), -0.5)
    d_mat = torch.diag(d_inv_sqrt)
    return d_mat @ adjacency @ d_mat

class GraphConvLayer(nn.Module):
    def __init__(self, in_dim, out_dim):
        super().__init__()
        self.linear = nn.Linear(in_dim, out_dim)

    def forward(self, features, norm_adjacency):
        propagated = norm_adjacency @ features
        return F.relu(self.linear(propagated))

class SGCNBranch(nn.Module):
    def __init__(self, in_dim, hidden_dim, num_classes, num_layers=2):
        super().__init__()
        dims = [in_dim] + [hidden_dim] * num_layers
        self.layers = nn.ModuleList([
            GraphConvLayer(dims[i], dims[i + 1]) for i in range(num_layers)
        ])
        self.evidence_head = nn.Linear(hidden_dim, num_classes)

    def forward(self, features, norm_adjacency):
        h = features
        for layer in self.layers:
            h = layer(h, norm_adjacency)
        logits = self.evidence_head(h)
        evidence = F.relu(logits)
        return evidence

def evidence_to_belief(evidence, num_classes):
    alpha = evidence + 1.0
    strength = alpha.sum(dim=-1, keepdim=True)
    belief = evidence / strength
    uncertainty = num_classes / strength.squeeze(-1)
    return belief, uncertainty, alpha

def dempster_combine(belief_a, uncertainty_a, belief_b, uncertainty_b):
    # belief_a, belief_b, shape N x L. uncertainty_a, uncertainty_b, shape N
    outer = torch.einsum('nk,nl->nkl', belief_a, belief_b)
    diag_mass = torch.diagonal(outer, dim1=1, dim2=2)
    conflict = outer.sum(dim=(1, 2)) - diag_mass.sum(dim=1)
    denom = (1.0 - conflict).clamp(min=1e-6)
    fused_belief = (
        diag_mass
        + belief_a * uncertainty_b.unsqueeze(-1)
        + belief_b * uncertainty_a.unsqueeze(-1)
    ) / denom.unsqueeze(-1)
    fused_uncertainty = (uncertainty_a * uncertainty_b) / denom
    return fused_belief, fused_uncertainty

class MMEFNet(nn.Module):
    def __init__(self, hpd_dim, grassmann_dim, hidden_dim, num_classes):
        super().__init__()
        self.hpd_kernel = HPDKernel()
        self.grassmann_kernel = GrassmannKernel()
        self.branch_hpd = SGCNBranch(hpd_dim, hidden_dim, num_classes)
        self.branch_grassmann = SGCNBranch(grassmann_dim, hidden_dim, num_classes)
        self.num_classes = num_classes

    def forward(self, cov_matrices, hpd_features, grassmann_bases, grassmann_features):
        adj_hpd = normalize_adjacency(self.hpd_kernel(cov_matrices))
        adj_grass = normalize_adjacency(self.grassmann_kernel(grassmann_bases))

        evidence_1 = self.branch_hpd(hpd_features, adj_hpd)
        evidence_2 = self.branch_grassmann(grassmann_features, adj_grass)

        belief_1, unc_1, alpha_1 = evidence_to_belief(evidence_1, self.num_classes)
        belief_2, unc_2, alpha_2 = evidence_to_belief(evidence_2, self.num_classes)

        fused_belief, fused_unc = dempster_combine(belief_1, unc_1, belief_2, unc_2)
        fused_strength = self.num_classes / fused_unc.clamp(min=1e-6)
        fused_evidence = fused_belief * fused_strength.unsqueeze(-1)
        fused_alpha = fused_evidence + 1.0

        return {
            'alpha_1': alpha_1,
            'alpha_2': alpha_2,
            'fused_alpha': fused_alpha,
            'fused_uncertainty': fused_unc,
        }

def dirichlet_evidential_loss(alpha, targets_one_hot, num_classes, kl_weight=0.1):
    strength = alpha.sum(dim=-1, keepdim=True)
    probs = alpha / strength
    cross_entropy = (targets_one_hot * (torch.digamma(strength) - torch.digamma(alpha))).sum(dim=-1)

    alpha_tilde = targets_one_hot + (1.0 - targets_one_hot) * alpha
    strength_tilde = alpha_tilde.sum(dim=-1, keepdim=True)
    kl = (
        torch.lgamma(strength_tilde).squeeze(-1)
        - torch.lgamma(alpha_tilde).sum(dim=-1)
        - torch.lgamma(torch.tensor(float(num_classes)))
        + torch.lgamma(torch.tensor(float(num_classes))) * 0
        + ((alpha_tilde - 1.0) * (torch.digamma(alpha_tilde) - torch.digamma(strength_tilde))).sum(dim=-1)
    )
    return (cross_entropy + kl_weight * kl).mean()

def total_loss(outputs, targets_one_hot, num_classes, kl_weight=0.1):
    loss_1 = dirichlet_evidential_loss(outputs['alpha_1'], targets_one_hot, num_classes, kl_weight)
    loss_2 = dirichlet_evidential_loss(outputs['alpha_2'], targets_one_hot, num_classes, kl_weight)
    loss_fused = dirichlet_evidential_loss(outputs['fused_alpha'], targets_one_hot, num_classes, kl_weight)
    return loss_fused + loss_1 + loss_2

def train_step(model, optimizer, batch, num_classes):
    model.train()
    optimizer.zero_grad()
    outputs = model(
        batch['cov_matrices'], batch['hpd_features'],
        batch['grassmann_bases'], batch['grassmann_features']
    )
    targets_one_hot = F.one_hot(batch['labels'], num_classes=num_classes).float()
    loss = total_loss(outputs, targets_one_hot, num_classes)
    loss.backward()
    optimizer.step()
    return loss.item()

@torch.no_grad()
def evaluate(model, batch, num_classes):
    model.eval()
    outputs = model(
        batch['cov_matrices'], batch['hpd_features'],
        batch['grassmann_bases'], batch['grassmann_features']
    )
    probs = outputs['fused_alpha'] / outputs['fused_alpha'].sum(dim=-1, keepdim=True)
    predictions = probs.argmax(dim=-1)
    accuracy = (predictions == batch['labels']).float().mean().item()
    mean_uncertainty = outputs['fused_uncertainty'].mean().item()
    return accuracy, mean_uncertainty

def make_dummy_batch(num_nodes=32, hpd_dim=3, grassmann_dim=10, subspace_q=4, num_classes=5):
    raw = torch.randn(num_nodes, hpd_dim, hpd_dim)
    cov_matrices = raw @ raw.transpose(-1, -2) + torch.eye(hpd_dim) * 0.1
    hpd_features = cov_matrices.flatten(start_dim=1)

    raw_grass = torch.randn(num_nodes, grassmann_dim, subspace_q)
    grassmann_bases, _ = torch.linalg.qr(raw_grass)
    grassmann_features = grassmann_bases.flatten(start_dim=1)

    labels = torch.randint(0, num_classes, (num_nodes,))
    return {
        'cov_matrices': cov_matrices,
        'hpd_features': hpd_features,
        'grassmann_bases': grassmann_bases,
        'grassmann_features': grassmann_features,
        'labels': labels,
    }

if __name__ == '__main__':
    NUM_CLASSES = 5
    batch = make_dummy_batch(num_classes=NUM_CLASSES)
    model = MMEFNet(
        hpd_dim=batch['hpd_features'].shape[1],
        grassmann_dim=batch['grassmann_features'].shape[1],
        hidden_dim=32,
        num_classes=NUM_CLASSES,
    )
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

    for epoch in range(20):
        loss_value = train_step(model, optimizer, batch, NUM_CLASSES)
        if epoch % 5 == 0:
            accuracy, mean_unc = evaluate(model, batch, NUM_CLASSES)
            print(f"epoch {epoch} loss {loss_value:.4f} accuracy {accuracy:.4f} mean uncertainty {mean_unc:.4f}")

    final_accuracy, final_uncertainty = evaluate(model, batch, NUM_CLASSES)
    print(f"smoke test finished, final accuracy {final_accuracy:.4f}, final mean uncertainty {final_uncertainty:.4f}")
This code block is an original educational implementation written for this article, built from the equations described in the paper. It is not the authors’ released source code, and the paper does not state that its own implementation is publicly available.

Frequently asked questions

What does PolSAR actually stand for and why does it need special classification methods

PolSAR stands for polarimetric synthetic aperture radar. It differs from ordinary radar by transmitting and receiving multiple polarizations of the microwave signal, which captures a covariance matrix at every pixel instead of a single brightness value. That matrix carries far richer scattering information than a grayscale radar image, but it also lives on a curved mathematical space rather than an ordinary vector space, which is exactly the geometry problem this paper addresses.

Why can you not just concatenate the covariance matrix and the scattering features

Because the two live on different manifolds, a Hermitian positive definite manifold for the covariance matrix and a Grassmann manifold for the scattering feature subspace. Treating both as flat vectors and gluing them together ignores that difference and leads to distance and similarity calculations that do not respect the true structure of either data type, which the paper argues limits classification accuracy.

What is Dempster Shafer evidence fusion in plain terms

It is a mathematical framework for combining predictions from multiple sources while explicitly tracking how confident each source is and how much they disagree. Instead of forcing a single probability distribution out of a softmax layer, it produces a belief mass per class plus an overall uncertainty mass, then merges those from multiple views using a combination rule that resolves agreement and highlights conflict rather than hiding it.

How much better did MMEFNet perform compared to the alternatives

On the Xi’an dataset it reached 97.73 percent overall accuracy against a strongest baseline of 96.99 percent. On San Francisco it reached 99.71 percent against 99.42 percent for the closest competitor. On Flevoland, the hardest 15 class scene, it reached 99.75 percent against 99.74 percent for the nearest baseline. The bigger practical difference showed up under synthetic noise, where MMEFNet held its accuracy far better than standard or learned softmax baselines.

Does this approach need specialized hardware to train

Not particularly. The authors trained on a consumer grade setup, an Intel Core i7-12700K processor with an NVIDIA GeForce RTX 3060 carrying 12GB of memory, and reported a training time of about 246 seconds on the Xi’an dataset, far faster than several of the deep learning baselines they compared against.

What is the biggest limitation of the current method

It is built for exactly two views. The authors state directly that extending the framework to more than two heterogeneous data sources, and to multi temporal or multimodal remote sensing scenarios, is future work rather than something already demonstrated in this paper.

Read the full paper for the complete derivations and additional dataset visualizations.

Read the paper

Related reading

Shi, J., Zhang, H., Jin, H., Li, J., Gong, M., and Lin, W. Manifold aware multiview evidence fusion for robust PolSAR image classification. IEEE Transactions on Circuits and Systems for Video Technology, 2026, DOI 10.1109/TCSVT.2026.3716446.

This analysis is based on the published paper and an independent evaluation of its claims.

Leave a Comment

Your email address will not be published. Required fields are marked *