【论文阅读】-2019-CLASSIFICATION OF AERIAL POINT CLOUDS WITH DEEP LEARNING

Abstract
  • 提出一种基于给定点云几何特征的深度学习分类方法。尽管局部受到低密度和建筑物立面缺乏点的影响,还是在ISPRS数据集上取得了预期的效果
  • 在提取特征时,提出了一种提取DEM的方法(不详细介绍)

RELATED WORK

文章所提方法包括三部分,1.点云分割,2.几何特征提取,3.深度学习分类。流程如下,
在这里插入图片描述

DATA AND METHODOLOGY

Our aim is to classify aerial point clouds in order to extract buildings’ facades and roofs, vegetation and GLOs.
两大部分:1.数据准备和特征提取,2.使用深度学习分类,其中第一部分数据准备和特征提取又可以分为:1.提取几何特征,2.区域生长分割,3.DEM提取。为了提高精度,不仅依赖提取的几何特征,而且还使用了每一个点的邻域。
使用的特征:local planarity, vertical angle, elevation change and height above ground,其中为了获得height above ground(个人理解应该是归一化高程),提出了一种基于区域生长分割的DEM提取方法。

  • Local Planarity
    邻域拟合一个平面,然后计算到平面的平均距离。用这个特征来区分非平面区域(植被)和平面区域(建筑立面和房顶)
    在这里插入图片描述

  • Vertical Angle
    每一点的法向量和水平面的夹角,可以用来区分不同方向的平面。
    在这里插入图片描述

  • Elevation Change
    高程变化值,邻域点的最大高程值和最小高程值之间的差值
    在这里插入图片描述

  • Further Features
    other geometric features are extracted from the point cloud using CloudCompare: anisotropy, surface variation, sphericity and verticality

  • DEM提取
    这里不再赘述。
    在这里插入图片描述


While analysing the segments, we control their neighbouring
points’ elevation differences and average elevation difference
between segments (Fig. 11).
Following this step, the extracted point cloud is rasterized to form
a DEM (Fig. 12), which is then used for the calculation of the
“height above ground” feature (section 3.2.7).


在分析分隔片时,我们控制近邻点的高程差和分隔片之间的平均高程差(图11)。 在此步骤之后,对提取的点云进行栅格化以形成DEM(图12),然后将其用于“地上高度”特征的计算(第3.2.7节)。


在这里插入图片描述
在这里插入图片描述

  • Height Above Ground
    利用提取出的DEM就可以计算该特征了。

starting from a DEM (Section 3.2.5), for each point in the point cloud, the elevation difference from the closest DEM point is calculated and assigned to the point (Fig. 13).


在这里插入图片描述

Training and Classification with Deep Learning

We utilized a simple deep learning approach based on a neural network with five layers including: sequence input layer, bidirectional long short-term memory layer with 200 hidden units, fully connected layer, softmax layer and classification layer (Fig. 14).


在这里插入图片描述
使用 sequential deep learning approach,使用该方法可以使用邻域点来描述每一个点的几何信息。
在训练和分类的过程中使用了如下特征:height above ground, local planarity, anisotropy, surface variation, sphericity and verticality. In addition to the geometric features of the points in a sequence, we also included each point’s decentralizing the coordinates. (去中心化的点如何得到?我们在每一个sequence中减去最小的3坐标值)
通过这种几何结合坐标和几何特征的方法,我们的方法可以学习到局部几何形状和其变形
其acc和loss如下,
在这里插入图片描述

Results

主要讨论了点的密度及其稳定性对分类造成的影响,第一次试验分为9类效果很差;第二次试验,将点数少的几类化为一类,总的class数目变为4类,实验效果和ISPRS的平均效果接近。
讨论了the replicability of the used training was evaluated(个人理解应该是训练的模型的迁移性,就是在a数据集上训练能否用于b或c数据集),得出结论:两个数据集之间点的密度的差异是主要原因。如下图所示,
在这里插入图片描述

CONCLUSIONS
  • The procedure relies on geometric features, which are calculated for each 3D point with their neighbouring points within a certain radius.
    该方法依赖于几何特征,几何特征是才能从每一个点的确定半径的邻域计算得来的。
  • 点云密度在该方法中起了至关重要的作用。如果点稀疏,则无法正确计算几何特征,因此需要消除这些点。另外,训练数据中建筑立面点的不平衡损失导致分类错误。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是使用PyTorch实现 "Learning a Deep ConvNet for Multi-label Classification with Partial Labels" 论文的示例代码。 ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.transforms import transforms from sklearn.metrics import f1_score from dataset import CustomDataset from model import ConvNet # 设置随机数种子,保证结果可重复 torch.manual_seed(2022) # 定义超参数 epochs = 50 batch_size = 128 learning_rate = 0.001 weight_decay = 0.0001 num_classes = 20 num_labels = 3 # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载数据集 train_dataset = CustomDataset(root='./data', split='train', transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2) test_dataset = CustomDataset(root='./data', split='test', transform=transform) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2) # 定义模型 model = ConvNet(num_classes=num_classes, num_labels=num_labels) # 定义损失函数和优化器 criterion = nn.BCEWithLogitsLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay) # 训练模型 for epoch in range(epochs): # 训练阶段 model.train() running_loss = 0.0 for i, data in enumerate(train_loader): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() train_loss = running_loss / len(train_loader) # 测试阶段 model.eval() y_true, y_pred = [], [] with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) predicted_labels = torch.round(torch.sigmoid(outputs)) y_true.extend(labels.cpu().numpy()) y_pred.extend(predicted_labels.cpu().numpy()) f1 = f1_score(y_true, y_pred, average='macro') print('[Epoch %d] Train Loss: %.3f, Test F1: %.3f' % (epoch + 1, train_loss, f1)) ``` `CustomDataset` 和 `ConvNet` 分别是数据集类和模型类,需要根据您的具体情况进行实现。在训练阶段,使用 `nn.BCEWithLogitsLoss()` 作为损失函数进行优化。在测试阶段,使用 `sklearn.metrics.f1_score()` 计算 F1 值作为模型评估指标。 希望以上示例代码对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech沉思录

点赞加投币,感谢您的资瓷~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值