MinkowskiEngine语义分割

要运行示例,请安装Open3DPIP安装open3d-python

cd /path/to/MinkowskiEngine

python -m examples.indoor

细分酒店房间

运行示例时,将看到一个旅馆房间和房间的语义分割。运行示例时,以交互方式旋转可视化效果。

首先,加载数据并体素化(量化)数据。调用MinkowskiEngine.utils.sparse_quantize进行体素化。

pcd = o3d.read_point_cloud(file_name)

coords = np.array(pcd.points)

feats = np.array(pcd.colors)

quantized_coords = np.floor(coords / voxel_size)

inds = ME.utils.sparse_quantize(quantized_coords)

准备体素化的坐标和特征后,应用MinkowskiEngine.SparseTensor将其包裹起来。此前,通过调用MinkowskiEngine.utils.sparse_collate来创建批处理。此函数采用一组坐标和特征并将其连接起来。还将批处理索引附加到坐标。最后,通过从颜色中减去0.5,对特征进行伪归一化。

# Create a batch, this process is done in a data loader during training in parallel.

batch = [load_file(config.file_name, 0.02)]

coordinates_, featrues_, pcds = list(zip(*batch))

coordinates, features = ME.utils.sparse_collate(coordinates_, featrues_)

# Normalize features and create a sparse tensor

sinput = ME.SparseTensor(features - 0.5, coords=coordinates).to(device)

最后,将稀疏张量前馈到网络中并获得预测。

soutput = model(sinput)

_, pred = soutput.F.max(1)

经过一些后处理。可以为标签着色,并排可视化输入和预测。

运行示例后,权重会自动下载,并且权重目前是Scannet 3D分段基准测试中排名最高的算法。

有关更多详细信息,请参阅完整的室内细分示例

import os

 

import argparse

 

import numpy as np

 

from urllib.request import urlretrieve

 

try:

 

import open3d as o3d

 

except ImportError:

 

raise ImportError('Please install open3d with `pip install open3d`.')

   
 

import torch

 

import MinkowskiEngine as ME

 

from examples.minkunet import MinkUNet34C

 

from examples.common import Timer

   
 

# Check if the weights and file exist and download

 

if not os.path.isfile('weights.pth'):

 

print('Downloading weights and a room ply file...')

 

urlretrieve("http://cvgl.stanford.edu/data2/minkowskiengine/weights.pth",

 

'weights.pth')

 

urlretrieve("http://cvgl.stanford.edu/data2/minkowskiengine/1.ply", '1.ply')

   
 

parser = argparse.ArgumentParser()

 

parser.add_argument('--file_name', type=str, default='1.ply')

 

parser.add_argument('--weights', type=str, default='weights.pth')

 

parser.add_argument('--use_cpu', action='store_true')

   
 

CLASS_LABELS = ('wall', 'floor', 'cabinet', 'bed', 'chair', 'sofa', 'table',

 

'door', 'window', 'bookshelf', 'picture', 'counter', 'desk',

 

'curtain', 'refrigerator', 'shower curtain', 'toilet', 'sink',

 

'bathtub', 'otherfurniture')

   
 

VALID_CLASS_IDS = [

 

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 24, 28, 33, 34, 36, 39

 

]

   
 

SCANNET_COLOR_MAP = {

 

0: (0., 0., 0.),

 

1: (174., 199., 232.),

 

2: (152., 223., 138.),

 

3: (31., 119., 180.),

 

4: (255., 187., 120.),

 

5: (188., 189., 34.),

 

6: (140., 86., 75.),

 

7: (255., 152., 150.),

 

8: (214., 39., 40.),

 

9: (197., 176., 213.),

 

10: (148., 103., 189.),

 

11: (196., 156., 148.),

 

12: (23., 190., 207.),

 

14: (247., 182., 210.),

 

15: (66., 188., 102.),

 

16: (219., 219., 141.),

 

17: (140., 57., 197.),

 

18: (202., 185., 52.),

 

19: (51., 176., 203.),

 

20: (200., 54., 131.),

 

21: (92., 193., 61.),

 

22: (78., 71., 183.),

 

23: (172., 114., 82.),

 

24: (255., 127., 14.),

 

25: (91., 163., 138.),

 

26: (153., 98., 156.),

 

27: (140., 153., 101.),

 

28: (158., 218., 229.),

 

29: (100., 125., 154.),

 

30: (178., 127., 135.),

 

32: (146., 111., 194.),

 

33: (44., 160., 44.),

 

34: (112., 128., 144.),

 

35: (96., 207., 209.),

 

36: (227., 119., 194.),

 

37: (213., 92., 176.),

 

38: (94., 106., 211.),

 

39: (82., 84., 163.),

 

40: (100., 85., 144.),

 

}

   
   
 

def load_file(file_name):

 

pcd = o3d.io.read_point_cloud(file_name)

 

coords = np.array(pcd.points)

 

colors = np.array(pcd.colors)

 

return coords, colors, pcd

   
   
 

if __name__ == '__main__':

 

config = parser.parse_args()

 

device = torch.device('cuda' if (

 

torch.cuda.is_available() and not config.use_cpu) else 'cpu')

 

print(f"Using {device}")

 

# Define a model and load the weights

 

model = MinkUNet34C(3, 20).to(device)

 

model_dict = torch.load(config.weights)

 

model.load_state_dict(model_dict)

 

model.eval()

   
 

coords, colors, pcd = load_file(config.file_name)

 

# Measure time

 

with torch.no_grad():

 

voxel_size = 0.02

 

# Feed-forward pass and get the prediction

 

in_field = ME.TensorField(

 

features=torch.from_numpy(colors).float(),

 

coordinates=ME.utils.batched_coordinates([coords / voxel_size], dtype=torch.float32),

 

quantization_mode=ME.SparseTensorQuantizationMode.UNWEIGHTED_AVERAGE,

 

minkowski_algorithm=ME.MinkowskiAlgorithm.SPEED_OPTIMIZED,

 

device=device,

 

)

 

# Convert to a sparse tensor

 

sinput = in_field.sparse()

 

# Output sparse tensor

 

soutput = model(sinput)

 

# get the prediction on the input tensor field

 

out_field = soutput.slice(in_field)

 

logits = out_field.F

   
 

_, pred = logits.max(1)

 

pred = pred.cpu().numpy()

   
 

# Create a point cloud file

 

pred_pcd = o3d.geometry.PointCloud()

 

# Map color

 

colors = np.array([SCANNET_COLOR_MAP[VALID_CLASS_IDS[l]] for l in pred])

 

pred_pcd.points = o3d.utility.Vector3dVector(coords)

 

pred_pcd.colors = o3d.utility.Vector3dVector(colors / 255)

 

pred_pcd.estimate_normals()

   
 

# Move the original point cloud

 

pcd.points = o3d.utility.Vector3dVector(

 

np.array(pcd.points) + np.array([0, 5, 0]))

   
 

# Visualize the input point cloud and the prediction

 

o3d.visualization.draw_geometries([pcd, pred_pcd])

MinkowskiEngine语义分割的更多相关文章

  1. caffe初步实践---------使用训练好的模型完成语义分割任务

    caffe刚刚安装配置结束,乘热打铁! (一)环境准备 前面我有两篇文章写到caffe的搭建,第一篇cpu only ,第二篇是在服务器上搭建的,其中第二篇因为硬件环境更佳我们的步骤稍显复杂.其实,第 ...

  2. R-CNN论文翻译——用于精确物体定位和语义分割的丰富特征层次结构

    原文地址 我对深度学习应用于物体检测的开山之作R-CNN的论文进行了主要部分的翻译工作,R-CNN通过引入CNN让物体检测的性能水平上升了一个档次,但该文的想法比较自然原始,估计作者在写作的过程中已经 ...

  3. 【Keras】基于SegNet和U-Net的遥感图像语义分割

    上两个月参加了个比赛,做的是对遥感高清图像做语义分割,美其名曰"天空之眼".这两周数据挖掘课期末project我们组选的课题也是遥感图像的语义分割,所以刚好又把前段时间做的成果重新 ...

  4. 笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)

    图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...

  5. 笔记:基于DCNN的图像语义分割综述

    写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...

  6. 人工智能必须要知道的语义分割模型:DeepLabv3+

    图像分割是计算机视觉中除了分类和检测外的另一项基本任务,它意味着要将图片根据内容分割成不同的块.相比图像分类和检测,分割是一项更精细的工作,因为需要对每个像素点分类,如下图的街景分割,由于对每个像素点 ...

  7. 语义分割的简单指南 A Simple Guide to Semantic Segmentation

    语义分割是将标签分配给图像中的每个像素的过程.这与分类形成鲜明对比,其中单个标签被分配给整个图片.语义分段将同一类的多个对象视为单个实体.另一方面,实例分段将同一类的多个对象视为不同的单个对象(或实例 ...

  8. MIT提出精细到头发丝的语义分割技术,打造效果惊艳的特效电影

    来自 MIT CSAIL 的研究人员开发了一种精细程度远超传统语义分割方法的「语义软分割」技术,连头发都能清晰地在分割掩码中呈现.在对比实验中,他们的结果远远优于 PSPNet.Mask R-CNN. ...

  9. 语义分割Semantic Segmentation研究综述

    语义分割和实例分割概念 语义分割:对图像中的每个像素都划分出对应的类别,实现像素级别的分类. 实例分割:目标是进行像素级别的分类,而且在具体类别的基础上区别不同的实例. 语义分割(Semantic S ...

随机推荐

  1. Python中python-nmap模块的使用

    目录 python-nmap的安装 python-nmap模块的使用 portScanner()类 环境:  python 2.7.13 Windows和Linux默认都是不安装python-nmap ...

  2. Node-Web应用框架Express

    Express 是 node.js Web应用框架, 帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能的网站. Express 框架核心特性: ...

  3. Dubbo原理剖析 之 @DubboReference.version设置为*

    原文链接 Dubbo原理剖析 之 @DubboReference.version设置为* 1 背景 Dubbo在消费端提供了一个功能,即将消费者的版本号指定为*,那么不管服务端的接口版本是啥,都可以调 ...

  4. Govern EventBus - 历经多年生产环境验证的事件驱动架构框架

    Govern EventBus Govern EventBus 是一个历经四年生产环境验证的事件驱动架构框架, 通过事件总线机制来治理微服务间的远程过程调用. 使用本地事务来支持微服务内强一致性,事件 ...

  5. 提升50%!Presto如何提升Hudi表查询性能?

    分享一篇关于使用Hudi Clustering来优化Presto查询性能的talk talk主要分为如下几个部分 演讲者背景介绍 Apache Hudi介绍 数据湖演进和用例说明 Hudi Clust ...

  6. 一款好用的数据血缘关系在线工具--SQLFlow

      l  数据血缘关系(data lineage) 数据血缘属于数据治理中的一个概念,是在数据溯源的过程中找到相关数据之间的联系,它是一个逻辑概念.数据治理中经常提到血缘分析,血缘分析是保证数据融合的 ...

  7. 1.初级篇——最基础的"穷竭搜索”

    A.Lake Counting(POJ 2386) 题意: 由于最近的降雨,农夫约翰田地的各个地方都有水汇聚,用N x M(1 <= N <= 100; 1 <= M <= 1 ...

  8. 团队任务拆解$\alpha$

    项目 内容 班级:2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 团队任务拆解 我们在这个课程中的目标 提升团队管理及合作能力,开发一项满意的工程项目 这个作业对我们实现目标的 ...

  9. stm32开发笔记(二):stm32系列使用V3.5固件库的帮助文件以及GPIO基本功能(一)

    前言   stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的.  本章讲解使用库函数使用GPIO引脚功能.   补充   本文章为多年前学习 ...

  10. ES6学习-4 解构赋值(1)数组的解构赋值

    解构赋值是ES6很大的一个提升,为我们带来了很多方便,但用不好,会使程序的可读性变差,所以用时要注意,尽量保持程序的易读性. 数组解构赋值 在JS没有支持解构赋值之前,我们声明几个变量并赋值通常都是像 ...