データ拡張とは機械学習モデルを作成するとき、モデルの汎化性能を向上させるための追加データとして、元データに加工を施してデータを増やすことです。
例えば画像の場合には、元画像を反転する、水平・垂直にピクセルを移動させる、ノイズをピクセル値に加える等の方法が典型的です。
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)
シフト
各軸正方向に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)
拡大・縮小
拡大
各軸方向を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になるように切り出しを行ったのが以下の図
縮小
各軸方向を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になるように切り出しを行ったのが以下の図
回転
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)
以上です。
scipyの多次元データライブラリーとnumpyを使って、ボクセルデータのデータ拡張ができました!