8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ボクセルデータをPythonでデータ拡張する

Posted at

データ拡張とは機械学習モデルを作成するとき、モデルの汎化性能を向上させるための追加データとして、元データに加工を施してデータを増やすことです。

例えば画像の場合には、元画像を反転する、水平・垂直にピクセルを移動させる、ノイズをピクセル値に加える等の方法が典型的です。

3Dデータの一種にはボクセルデータ(x, y, zの3次元格子をもつ、2次元画像データの拡張)があり、CADモデルやCTスキャンのデータがこの形式で表されることがあります。
このボクセルデータを対象にして、3D CNNで分類やセグメンテーションを行う、といったケースに用いられています。

本記事では、Pythonのscipyとnumpyを使ってボクセルデータの拡張データを生成してみます。
(拡張データを使った学習は本記事では扱いません。)

拡張元データ

PRINCETON MODELNETの10クラスのものを使用しています。
http://modelnet.cs.princeton.edu/

MODELNETのデータを32 × 32 × 32のサイズのarray型にして用いています。

print(type(data))
# >>> <class 'numpy.ndarray'>

print(data.shape)
# >>> (1, 32, 32, 32)

各格子は、0(物体が存在しない) or 1(物体が存在する)のどちらかの整数の値を持ちます。
下図はサンプルと、図に対応する各軸の方向です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/285894/4d0cfdac-8fc2-d949-61bd-c3df5ebf681d.png" width=50% height=50%

※環境
Python 3.6.2
scipy 0.19.1
numpy 1.13.3

反転

各軸方向に反転

import numpy as np
# flip: x axis
np.flip(data, 1)

# flip: y axis
np.flip(data, 2)

# flip: z axis
np.flip(data, 3)

flip1.png

シフト

各軸正方向に1辺の長さの0.3割ずつシフト

from scipy.ndimage.interpolation import shift

# shift: x axis
shift(data, shift=[0, 0.3, 0, 0], cval=0)

# shift: y axis
shift(data, shift=[0, 0, 0.3, 0], cval=0)

# shift: z axis
shift(data, shift=[0, 0, 0, 0.3], cval=0)

shift1.png

拡大・縮小

拡大
各軸方向を1.5倍に拡大

from scipy.ndimage.interpolation import zoom

# zoom: x axis
zoom(data, zoom=[1, 1.5, 1, 1], cval=0)

# zoom: y axis
zoom(data, zoom=[1, 1, 1.5, 1], cval=0)

# zoom: z axis
zoom(data, zoom=[1, 1, 1, 1.5], cval=0)

zoomで返却されるデータは各軸方向に拡大率分サイズが大きくなるので、32×32×32になるように切り出しを行ったのが以下の図

expand_1.png

縮小
各軸方向を0.5倍に縮小

from scipy.ndimage.interpolation import zoom

# zoom: x axis
zoom(data, zoom=[1, 0.5, 1, 1], cval=0)

# zoom: y axis
zoom(data, zoom=[1, 1, 0.5, 1], cval=0)

# zoom: z axis
zoom(data, zoom=[1, 1, 1, 0.5], cval=0)

zoomで返却されるデータは各軸方向に縮小率分サイズが小さくなるので、32×32×32になるように切り出しを行ったのが以下の図

shrink.png

回転

from scipy.ndimage import rotate

# Rotate: x axis
rotate(data, axes=(2,3), angle=45, cval=0.0, reshape=False)

# Rotate: y axis
rotate(data, axes=(3,1), angle=45, cval=0.0, reshape=False)

# Rotate: z axis
rotate(data, axes=(1,2), angle=45, cval=0.0, reshape=False)

rotate_1.png

以上です。
scipyの多次元データライブラリーとnumpyを使って、ボクセルデータのデータ拡張ができました!

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?