RGB+深度图像 语义分割paper阅读笔记(ICRA2021)

paper:Efficient RGB-D Semantic Segmentation for Indoor Scene Analysis

本文主要贡献在以下
结合深度图像,提升仅用RGB图像分割的mIOU
设计一种结构,可用tensorRT实现,进而可在NX板上提升分割效率,比如有限计算能力和电池量的机器人场景
改进的ResNet-based encoder和decoder. 降低计算量,提升效率

本文的语义分割结合了RGB图像和深度图像 as input, 主要针对室内场景,
RGB图像和深度图在encoder中进入两个不同的branch, 然后再合并,结构如下图:
在这里插入图片描述

看起来很复杂的样子,其实分解开来也没那么复杂,

因为如果feature在多个stage中进行fuse,分割结果会提升,所以可以看到深度图和RGB图的特征在中间多个stage都有RGB-D Fusion.
encode以ResNet作为backbone, 为了提升效率,并没有像deepLabv3那样用空洞卷积,而是用strided convolution.
在encoder的末尾,feature map的size会比input image 缩小32倍,用的是ResNet34,

但是每个3x3卷积被替换成图中紫色部分的block, 即把3x3分解成了3x1 和 1x3, 加ReLU在中间,
这个模块叫做Non-Bottleneck-1D-Block,说是这样可以缩短推断时间,提高performance。

RGB Fusion用的是Squeeze and Excitation模块。具体在图中左下角绿色模块。

Context module是解决ResNet的有限感受野问题,把不同scales的feature结合,类似Pyramid Pooling Module in PSPNet,
而且修改了Avg Pooling,因为TensorRT只支持固定size的pooling, 所以用与input resolution相关的pooling size取代adaptive pooling.
因此,根据数据集的不同,pooling size会有不同。

Decoder
有3个decoder 模块
并没有用转置卷积用于上采样,因为计算量较大,且会产生gridding artifacts, 如下图
在这里插入图片描述
本文用了learned upsampling方法,在图1的墨绿色方块里,
用NN upsampling来加大resolution, 再用一个3x3 depthwise卷积层来连接相邻的feature.

但是上采样后会损失一些细节,因为细节在encoder的downsampling中会丢失,
所以作者设计了skip connections,把encoder的特征连接到相同resolution的decoder中,
为了确保channel相同,用了1x1卷积,
这样做可以恢复一些细节。

在恢复到比input image小4x的图像后,跟一个3x3卷积层,再用2个上采样层恢复到input image的resolution.

一般算loss都是用结果和ground truth比较,作者为了避免只用最后的结果,会在每个decoder模块输出一个结果,
和相应的ground truth缩放后的图像计算loss,这样就可以多尺度地计算loss.

参数

训练用了500个epoch, batch size为8,
SGD优化器,momentum=0.9, 学习率为{0.00125, 0.0025, 0.005, 0.01, 0.02, 0.04}
Adam学习率为{0.0001, 0.0004}
weight decay为0.0001,
学习率用pytorch的one-cycle learning rate scheduler调节

在AGX上的帧率
在这里插入图片描述

mIOU
在这里插入图片描述
可以看到本文的ESANet的mIOU在mobile(SwiftNet, BiSeNet)和非mobile模型之间,

测试一下nyuv2数据集样本:
在这里插入图片描述
可以看到在光线变化较大 或者 颜色较为接近 的区域不是那么稳定。但整体轮廓比较清晰。

### PointNet++RGB数据的应用和实现 PointNet++ 是一种基于点云数据的深度学习模型,其扩展了原始的 PointNet 架构以更好地捕捉局部特征结构。尽管 PointNet 和 PointNet++ 主要设计用于处理三维空间中的无序点集(即点云),但在许多实际应用场景中,RGB 数据通常作为辅助输入被引入到模型中。 #### 结合 RGB 数据的方式 在计算机视觉领域,结合 RGB 数据可以通过多种方式增强 PointNet++ 的性能。常见的方法包括但不限于: 1. **多模态融合** 将 RGB 图像信息与其他传感器数据(如 LiDAR 或深度相机获取的点云)结合起来。这种融合可以在不同层次上完成,例如早期融合、中间融合或后期融合[^4]。 2. **特征级融合** 在提取点云特征的同时,利用卷积神经网络(CNN)从对应的 RGB 图像中提取二维特征图,并将其映射回三维点的位置。随后,将这两种类型的特征进行拼接或加权组合[^5]。 3. **端到端架构** 设计一个统一的框架,在该框架下同时接受点云和 RGB 输入。例如,Voxel-based 方法可以将点云体素化并与图像特征相结合;或者采用注意力机制动态调整两种模态的重要性权重[^6]。 #### 实现细节 以下是使用 PyTorch 编写的一个简单示例代码片段,展示如何在一个假设场景中联合训练 PointNet++ 和 CNN 来处理带有颜色信息的任务: ```python import torch from pointnet2.pointnet2_modules import PointnetFPModule, PointnetSAModuleMSG class RGBPointCloudFusion(torch.nn.Module): def __init__(self): super(RGBPointCloudFusion, self).__init__() # 定义 PointNet++ 骨干网络部分 self.sa1 = PointnetSAModuleMSG( npoint=512, radii=[0.1, 0.2], nsamples=[16, 32], mlps=[[3, 16], [3, 32]] ) self.fp1 = PointnetFPModule(mlp=[64 + 3, 64]) # 定义简单的 CNN 处理 RGB 图像 self.cnn = torch.nn.Sequential( torch.nn.Conv2d(3, 64, kernel_size=3), torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2) ) # 融合模块 self.fuse_layer = torch.nn.Linear(64 + 64, 128) def forward(self, xyz, rgb_image): l1_xyz, l1_points = self.sa1(xyz, None) # 提取点云特征 interpolated_l1_points = self.fp1(l1_xyz, xyz, l1_points, None) cnn_features = self.cnn(rgb_image).view(rgb_image.size(0), -1) # 提取 RGB 特征 fused_features = torch.cat([interpolated_l1_points.squeeze(), cnn_features], dim=-1) output = self.fuse_layer(fused_features) return output ``` 上述代码定义了一个基础的多模态融合模型,其中 `xyz` 表示点云坐标,而 `rgb_image` 则表示对应的颜色图像。通过这种方式,能够充分利用两者之间的互补特性。 #### 应用案例 - **语义分割**:对于自动驾驶车辆来说,精确识别道路上的对象至关重要。此时,结合高分辨率摄像头捕获的 RGB 帧以及激光雷达生成的稀疏点云可以帮助提高分类精度[^7]。 - **目标检测**:类似地,在机器人抓取任务或其他工业自动化环境中,借助彩色纹理有助于区分外观相似但材质不同的物体。 - **姿态估计**:当需要重建复杂形状的目标时,额外的颜色线索可能提供更丰富的几何约束条件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值