0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Open3D的Lidar-Segment

新機(jī)器視覺 ? 來源:古月居 ? 作者: 敢敢のwings ? 2022-12-08 13:50 ? 次閱讀

1. Open3D-ML安裝和使用

首先對于Open3d,我們要先對源碼下載

# make sure you have the latest pip version
pip install --upgrade pip
# install open3d
pip install open3d

然后選擇要安裝兼容版本的PyTorch或TensorFlow,Open3d中提供了兩種安裝方式:

# To install a compatible version of TensorFlow
pip install -r requirements-tensorflow.txt
# To install a compatible version of PyTorch with CUDA
pip install -r requirements-torch-cuda.txt

這里作者選擇的是Pytorch,因?yàn)樽髡邔ytorch比較熟悉,然后使用下面命令測試Open3d是否安裝成功

# with PyTorch
python -c "import open3d.ml.torch as ml3d"
# or with TensorFlow
python -c "import open3d.ml.tf as ml3d"

下面我們可以下載數(shù)據(jù)集進(jìn)行測試了

SemanticKITTI (project page)

Toronto 3D (github)

Semantic 3D (project-page)

S3DIS (project-page)

Paris-Lille 3D (project-page)

Argoverse (project-page)

KITTI (project-page)

Lyft (project-page)

nuScenes (project-page)

Waymo (project-page)

ScanNet(project-page)

這里選擇了SemanticKITTI的數(shù)據(jù)集進(jìn)行測試

# Launch training for RandLANet on SemanticKITTI with torch.
python scripts/run_pipeline.py torch -c ml3d/configs/randlanet_semantickitti.yml --dataset.dataset_path  --pipeline SemanticSegmentation --dataset.use_cache True


# Launch testing for PointPillars on KITTI with torch.
python scripts/run_pipeline.py torch -c ml3d/configs/randlanet_semantickitti.yml --split test --dataset.dataset_path data --pipeline SemanticSegmentation --dataset.use_cache True --batch_size 16

雖然官方提供的predefined scripts非常便捷,但是既然我們裝好了Open3d,那我們就可以通過自己編寫代碼的方式來完成。

2. 基于Open3d的二次開發(fā)

下面將展示如何自己去調(diào)用Open3d的api去寫訓(xùn)練集、測試集、可視化

模型訓(xùn)練:

import os
import open3d.ml as _ml3d
import open3d.ml.torch as ml3d


cfg_file = "ml3d/configs/randlanet_semantickitti.yml"
cfg = _ml3d.utils.Config.load_from_file(cfg_file)


cfg.dataset['dataset_path'] = "./data"


dataset = ml3d.datasets.SemanticKITTI(cfg.dataset.pop('dataset_path', None), **cfg.dataset)


# create the model with random initialization.
model = ml3d.models.RandLANet(**cfg.model)


pipeline = ml3d.pipelines.SemanticSegmentation(model=model, dataset=dataset,device="cuda:0", **cfg.pipeline)


# prints training progress in the console.
pipeline.run_train()

在這里主要需要側(cè)重關(guān)注的有兩處:cfg_file和cfg.dataset['dataset_path'],這兩處分別是環(huán)境配置和數(shù)據(jù)集設(shè)置。

在randlanet_semantickitti.yml中里面包含了所有需要配置的內(nèi)容

randlanet_semantickitti.yml

dataset:
 name: Semantic3D
 dataset_path: # path/to/your/dataset
 cache_dir: ./logs/cache_small3d/
 class_weights: [5181602, 5012952, 6830086, 1311528, 10476365, 946982, 334860, 269353]
 ignored_label_inds: [0]
 num_points: 65536
 test_result_folder: ./test
 use_cache: true
 val_files:
 - bildstein_station1_xyz_intensity_rgb
 - domfountain_station1_xyz_intensity_rgb
 steps_per_epoch_train: 500
 steps_per_epoch_valid: 10
model:
 name: RandLANet
 batcher: DefaultBatcher
 ckpt_path: # path/to/your/checkpoint
 num_neighbors: 16
 num_layers: 5
 num_points: 65536
 num_classes: 8
 ignored_label_inds: [0]
 sub_sampling_ratio: [4, 4, 4, 4, 2]
 in_channels: 6
 dim_features: 8
 dim_output: [16, 64, 128, 256, 512]
 grid_size: 0.06
 augment:
  recenter:
   dim: [0, 1]
  normalize:
   feat:
    method: linear
    bias: 0
    scale: 255
  rotate:
   method: vertical
  scale:
   min_s: 0.9
   max_s: 1.1
  noise:
   noise_std: 0.001
pipeline:
 name: SemanticSegmentation
 optimizer:
  lr: 0.001
 batch_size: 2
 main_log_dir: ./logs
 max_epoch: 100
 save_ckpt_freq: 5
 scheduler_gamma: 0.9886
 test_batch_size: 1
 train_sum_dir: train_log
 val_batch_size: 2
 summary:
  record_for: []
  max_pts:
  use_reference: false
  max_outputs: 1

模型測試:

import os
import open3d.ml as _ml3d
import open3d.ml.torch as ml3d


cfg_file = "ml3d/configs/randlanet_semantickitti.yml"
cfg = _ml3d.utils.Config.load_from_file(cfg_file)


model = ml3d.models.RandLANet(**cfg.model)
cfg.dataset['dataset_path'] = "./data"
dataset = ml3d.datasets.SemanticKITTI(cfg.dataset.pop('dataset_path', None), **cfg.dataset)
pipeline = ml3d.pipelines.SemanticSegmentation(model, dataset=dataset, device="cuda:0", **cfg.pipeline)


# download the weights.
ckpt_folder = "./logs/"
os.makedirs(ckpt_folder, exist_ok=True)
ckpt_path = ckpt_folder + "randlanet_semantickitti_202201071330utc.pth"
randlanet_url = "https://storage.googleapis.com/open3d-releases/model-zoo/randlanet_semantickitti_202201071330utc.pth"
if not os.path.exists(ckpt_path):
  cmd = "wget {} -O {}".format(randlanet_url, ckpt_path)
  os.system(cmd)


# load the parameters.
pipeline.load_ckpt(ckpt_path=ckpt_path)


test_split = dataset.get_split("test")
print("len%d",test_split)
data = test_split.get_data(0)


# run inference on a single example.
# returns dict with 'predict_labels' and 'predict_scores'.
result = pipeline.run_inference(data)


# evaluate performance on the test set; this will write logs to './logs'.
pipeline.run_test()

在模型測試中和模型訓(xùn)練一樣也需要cfg_file和cfg.dataset['dataset_path'],但是同時(shí)需要加入ckpt_path作為訓(xùn)練模型的導(dǎo)入。

模型可視化

import os
import open3d.ml as _ml3d
import open3d.ml.torch as ml3d


cfg_file = "ml3d/configs/randlanet_semantickitti.yml"
cfg = _ml3d.utils.Config.load_from_file(cfg_file)
cfg.dataset['dataset_path'] = "./data"
# construct a dataset by specifying dataset_path
dataset = ml3d.datasets.SemanticKITTI(cfg.dataset.pop('dataset_path', None),**cfg.dataset)


# get the 'all' split that combines training, validation and test set
all_split = dataset.get_split('test')


# print the attributes of the first datum
print(all_split.get_attr(0))


# print the shape of the first point cloud
print(all_split.get_data(0)['point'].shape)


# show the first 100 frames using the visualizer
vis = ml3d.vis.Visualizer()
vis.visualize_dataset(dataset, 'all', indices=range(100))

模型可視化就沒什么好說的了,基本上和上述兩種差不不多,只是使用了ml3d.vis.Visualizer()做了可視化。

3. 如何理解SemanticKITTI數(shù)據(jù)集

KITTI Vision Benchmark 的里程計(jì)數(shù)據(jù)集,顯示了市中心的交通、住宅區(qū),以及德國卡爾斯魯厄周圍的高速公路場景和鄉(xiāng)村道路。

原始里程計(jì)數(shù)據(jù)集由 22 個(gè)序列組成,將序列 00 到 10 拆分為訓(xùn)練集,將 11 到 21 拆分為測試集。

SemanticKITTI數(shù)據(jù)集采用和 KITTI 數(shù)據(jù)集相同的標(biāo)定方法。這使得該數(shù)據(jù)集和kitti數(shù)據(jù)集等數(shù)據(jù)集可以通用。

該數(shù)據(jù)集中對28個(gè)類進(jìn)行了注釋,確保了類與Mapillary Visiotas數(shù)據(jù)集和Cityscapes數(shù)據(jù)集有很大的重疊,并在必要時(shí)進(jìn)行了修改,以考慮稀疏性和垂直視野。

aa2cace0-76a9-11ed-8abf-dac502259ad0.png

bin文件中存儲(chǔ)著每個(gè)點(diǎn),以激光雷達(dá)為原點(diǎn)的x,y,z,i信息,其中i是強(qiáng)度。

把數(shù)據(jù)提取出來也很簡單。用numpy庫。提取出來就是一個(gè)n行4列的矩陣。

points = np.fromfile(".bin文件路徑", dtype=np.float32).reshape(-1, 4)

接下來就是.label文件,在KITTI API的github中能找到說明。


里面東西也挺多的,主要就看.label那部分。

在remap_semantic_labels.py文件中。終于知道,label中每個(gè)值表示什么了。

在config目錄下的semantic-kitti.yaml文件中。

 label = np.fromfile(".label文件路徑", dtype=np.uint32)
 label = label.reshape((-1))

我們還區(qū)分了移動(dòng)和非移動(dòng)車輛與人類,即,如果車輛或人類在觀察時(shí)在某些掃描中移動(dòng),則會(huì)獲得相應(yīng)的移動(dòng)類別。

下圖列出了所有帶注釋的類,補(bǔ)充材料中可以找到對不同類的更詳細(xì)討論和定義。

總之,我們有28個(gè)類別,其中6個(gè)類別被指定為移動(dòng)或非移動(dòng)屬性

aa6799ea-76a9-11ed-8abf-dac502259ad0.png

每個(gè)velodyne文件夾下的xxxx.bin文件為每次掃描的原始數(shù)據(jù),每個(gè)數(shù)據(jù)點(diǎn)的標(biāo)簽的二進(jìn)制表示儲(chǔ)存在文件xxxx.label中。

每個(gè)點(diǎn)的標(biāo)簽是32位無符號整數(shù)(也稱為’uint32_t’),其中較低的16位對應(yīng)于標(biāo)簽。

較高位對應(yīng)了16位編碼實(shí)例id,該id在整個(gè)序列中時(shí)間上是一致的,即兩次不同掃描中的同一對象獲得相同的id。

這也適用于移動(dòng)車輛,但也適用于環(huán)路閉合后看到的靜態(tài)對象。

這里是開源SemanticKITTI的API。功能包括但不限于:可視化、計(jì)算IOU等。按照腳本的介紹即可完成使用。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3215

    瀏覽量

    42328
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    632

    瀏覽量

    29110
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    802

    瀏覽量

    13115

原文標(biāo)題:基于Open3D的Lidar-Segment

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    淺談SiPM 傳感器在汽車 LiDAR的應(yīng)用

    周圍環(huán)境的 3D 模型。LiDAR?系統(tǒng)捕獲的圖像中的每個(gè)像素都將具有與其關(guān)聯(lián)的深度。這允許更好地識別對象并消除可能存在于僅由圖像傳感器獲得的 2D 圖像中的任何歧義。 LiDAR如何
    的頭像 發(fā)表于 06-21 11:55 ?8019次閱讀
    淺談SiPM 傳感器在汽車 <b class='flag-5'>LiDAR</b>的應(yīng)用

    LiDAR如何構(gòu)建3D點(diǎn)云?如何利用LiDAR提供深度信息

    3D模型。LiDAR 系統(tǒng)捕獲的圖像中的每個(gè)像素都將具有與之關(guān)聯(lián)的深度。這樣可以更好地識別物體,并消除僅采用圖像傳感器獲得的2D圖像中可能存在的模糊。 LiDAR如何構(gòu)建
    的頭像 發(fā)表于 04-06 12:00 ?4304次閱讀
    <b class='flag-5'>LiDAR</b>如何構(gòu)建<b class='flag-5'>3D</b>點(diǎn)云?如何利用<b class='flag-5'>LiDAR</b>提供深度信息

    Atmel Segment LCD1用戶指南

      Atmel Segment LCD1 Xplained Pro is an extension board to the Atmel Xplained Pro evaluation
    發(fā)表于 09-12 19:25 ?7次下載

    TriLumina將推出940nm VCSEL照明,包羅3D LiDAR系統(tǒng)

    在CES 2018展會(huì)上會(huì)有許多來自四面八方的最先進(jìn)的技術(shù)展示,據(jù)悉TriLumina將在CES 2018展現(xiàn)采取3D感應(yīng)VCSEL照明的3D固態(tài)LiDAR,通過供給汽車裝備原廠LiDAR
    發(fā)表于 12-21 10:23 ?2831次閱讀

    微雪電子STM32開發(fā)板 Open32F3-D簡介

    STM32F303VCT6開發(fā)板 學(xué)習(xí)板 套餐B 含9款模塊 引出常用接口,含LCD、串口、音頻、存儲(chǔ)等模塊 型號 Open32F3-D (套餐B)
    的頭像 發(fā)表于 12-27 10:56 ?1590次閱讀
    微雪電子STM32開發(fā)板 <b class='flag-5'>Open32F3-D</b>簡介

    微雪電子STM32開發(fā)板 Open32F3-D簡介

    STM32F303VCT6開發(fā)板 學(xué)習(xí)板 套餐A 含7款模塊 引出常用接口,含LCD、串口、音頻、存儲(chǔ)等模塊 型號 Open32F3-D (套餐A)
    的頭像 發(fā)表于 12-27 11:20 ?1544次閱讀
    微雪電子STM32開發(fā)板 <b class='flag-5'>Open32F3-D</b>簡介

    微雪電子STM32開發(fā)板 Open32F3-D簡介

    STM32F303VCT6開發(fā)板底板 可接 STM32F3DISCOVERY 引出常用接口,可接微雪外圍模塊 型號 Open32F3-D (標(biāo)準(zhǔn)版)
    的頭像 發(fā)表于 12-27 11:04 ?1589次閱讀
    微雪電子STM32開發(fā)板 <b class='flag-5'>Open32F3-D</b>簡介

    日本Konami與假Open Bionic合作,推出了一款3D打印的仿生手臂

    2020年11月22日,南極熊獲悉,日本視頻游戲開發(fā)商Konami(科樂美)與假肢設(shè)計(jì)公司Open Bionic合作,推出了一款3D打印的仿生手臂,靈感來自于《 Metal Gear Solid
    的頭像 發(fā)表于 11-23 10:53 ?2657次閱讀

    如何在LiDAR點(diǎn)云上進(jìn)行3D對象檢測

    該項(xiàng)目將借助KV260上的PYNQ-DPU覆蓋,從而能夠使我們在LiDAR點(diǎn)云上進(jìn)行3D對象檢測比以往任何時(shí)候都更加高效!
    的頭像 發(fā)表于 04-26 17:41 ?2122次閱讀
    如何在<b class='flag-5'>LiDAR</b>點(diǎn)云上進(jìn)行<b class='flag-5'>3D</b>對象檢測

    Open3D 3D數(shù)據(jù)處理庫

    ./oschina_soft/Open3D.zip
    發(fā)表于 06-17 14:45 ?1次下載
    <b class='flag-5'>Open3D</b> <b class='flag-5'>3D</b>數(shù)據(jù)處理庫

    Quanergy和PARIFEX合作發(fā)布基于3D LiDAR的超速抓拍系統(tǒng)

    領(lǐng)先的激光雷達(dá)傳感器和智能3D解決方案供應(yīng)商Quanergy Systems, Inc. (NYSE:QNGY)今天宣布,PARIFEX的解決方案已被法國檢測機(jī)構(gòu)認(rèn)證為首個(gè)符合規(guī)范的3D-LiDAR技術(shù)超速抓拍系統(tǒng)。
    的頭像 發(fā)表于 07-15 15:46 ?1720次閱讀

    3D LiDAR 社交距離解決方案

    進(jìn)行 3D 檢測方面,該公司還提供了一種解決方案,用于監(jiān)控空間中的人流,以防止過度擁擠并實(shí)施占用限制,甚至可以跟蹤身材高大的人溫度。 QORTEX 流量管理平臺已被提名為 2020 年大流行技術(shù)創(chuàng)新獎(jiǎng)的獲得者。在全球 Covid-19 大流行的浪潮中,Quanergy 對其平臺進(jìn)行了調(diào)整,以提供
    發(fā)表于 07-28 11:16 ?350次閱讀
    <b class='flag-5'>3D</b> <b class='flag-5'>LiDAR</b> 社交距離解決方案

    徹底搞懂基于Open3D的點(diǎn)云處理教程!

    面向點(diǎn)云處理領(lǐng)域的基礎(chǔ)工具課,主要以Python為編程主要語言,介紹Open3D庫的使用方法。課程特點(diǎn)簡單易用,快速上手點(diǎn)云數(shù)據(jù)處理,更加側(cè)重于實(shí)戰(zhàn),涉及的話題包括點(diǎn)云的配準(zhǔn)、去噪、采樣、分割等,每個(gè)案例均提供源碼進(jìn)行實(shí)戰(zhàn)。
    的頭像 發(fā)表于 05-29 09:49 ?4930次閱讀
    徹底搞懂基于<b class='flag-5'>Open3D</b>的點(diǎn)云處理教程!

    應(yīng)用于機(jī)器人3D感知的高精度LiDAR與電機(jī)驅(qū)動(dòng)解決方案

    機(jī)器人想要進(jìn)行自主移動(dòng),便需要擁有3D感知(3D perception)功能,必須利用各種的傳感器來實(shí)時(shí)掌握機(jī)器人在空間中的位置,其中以LiDAR(激光雷達(dá))能夠提供高精度的位置傳感,最受到業(yè)界
    的頭像 發(fā)表于 07-26 10:28 ?863次閱讀
    應(yīng)用于機(jī)器人<b class='flag-5'>3D</b>感知的高精度<b class='flag-5'>LiDAR</b>與電機(jī)驅(qū)動(dòng)解決方案

    基于LiDAR的行人重識別的研究分析

    基于激光雷達(dá)(LiDAR)的行人重識別。我們利用低成本的LiDAR設(shè)備解決了人員再識別中的挑戰(zhàn),構(gòu)建了名為LReID的LiDAR數(shù)據(jù)集,并提出了一種名為ReID3D
    發(fā)表于 12-11 10:41 ?641次閱讀
    基于<b class='flag-5'>LiDAR</b>的行人重識別的研究分析