※当サイトはPRを含みます

【Python_K3D】K3Dでクラスごとに色を付けて点群データを可視化

2022年5月26日

はじめに

点群データを処理するなかで三次元データをmatplotlibで3Dプロットするのは良く見かけるが、
立体的に見て直感的に理解したかったのでK3Dというライブラリを試してみました。

今回は室内の点群データをJupyter lab上で可視化します。

K3Dとは

Jupyter Notebookの拡張機能で、3Dデータの可視化に用いられるライブラリです。

3Dデータをメッシュ(Mesh)や点群(Point Cloud)などでインタラクティブに可視化できます。

似たようなライブラリでplotly もありますが、
サンプル数の多いデータだとK3Dの方が動作が軽い気がします。

実装

今回はjupyterlab上で実装していきます。

インポート

K3dをインポートします。

import numpy as np
import k3d

データ読み込み & プロット

可視化したいデータを読み込んで表示します。

2行目の第一引数にはプロットするデータ[x,y,z]を渡します。

#データ読み込み
data = np.loadtxt('パス')

##プロット
plot += k3d.points(data[:,0:3], point_size=0.01, shader="flat")

plot.display()
image.png

表示されました。
GUIのマウス操作で回転、ズーム、パンが簡単にできます。

上記では色をしていないのですべての物体が同じ色で出力されてしまいました。
そこで、物体ごとに色をつけて出力してみます。

クラスごとに色をつけてプロット

今回使用しているデータにはRGBも格納されています。[x, y, z, R, G, B]
RGBからクラス番号を作成し、元データに結合して[x, y, z, R, G, B, class]、
RGBを16進の色情報に変換してからプロットします。

#クラスと色の定義
Indoorclass = {0: [0,255,0, 'ceiling'],
              1:  [0,0,255, 'floor'],
              2:  [0,255,255, 'wall'],
              3:  [255,255,0, 'beam'],
              4:  [255,0,255, 'column'],
              5:  [100,100,255, 'window'],
              6:  [200,200,100, 'door'],
              7:  [170,120,200, 'table'],
              8:  [255,0,0, 'chair'],
              9:  [200,100,100, 'sofa'],
              10: [10,200,100, 'bookcase'],
              11: [2000,200,200, 'board'],
              12: [50,50,50, 'clutter']}

#元データの最終列にクラス番号を結合
arr = np.empty((data.shape[0],1))
data1 = np.append(data, arr,axis=1)

for x in Indoorclass.keys():
    index = np.where((data[:,3]==Indoorclass[x][0]) & (data[:,4]==Indoorclass[x][1]) & (data[:,5]==Indoorclass[x][2]))
    data1[index,-1] = x

プロット

for i in range(int(np.max(data1[:,-1]))):

    # クラスごとのデータを取得
    getclass = i
    data2 = data1[data1[:,-1] == getclass]
    if data2.shape[0] <= 0:
        continue

    # クラスごとの色を16進に変換してプロット
    d = data2[:,3:6][0].tolist()
    color_list = [round(x) for x in d]
    color = '0x%02x%02x%02x' % tuple(color_list)
    color = int(color,16)

    # プロット
    plot += k3d.points(data2[:,0:3], point_size=0.01, shader="flat", color=color)

plot.display()
image.png

クラスごとに色を付けて表示できました。(椅子:赤, ドア:黄, 壁:グレー…)
image.png

おわりに

今回はJupyterlab上でK3Dを使って点群データを可視化しました。
K3DのGUIにはスクリーンショットや別ウィンドウでの出力、プロットの表示・非表示選択などの便利機能もあります。
クラスごとに色を付けることでセグメンテーション結果などを簡単に確認できそうです。

おすすめ参考書