コンテンツにスキップ

User Guide

このページではsensorutilsの代表的なツールの利用方法を紹介しています.

sensorutils.coreの利用

ターゲットラベルをもとにデータを分割する

行動認識データセットでは,すべてのデータが一つのCSVファイルにまとめられていることがあり,このデータから行動ごとのセンサデータを取り出すには行動ラベルをもとに配列を分割する必要があります.

sensorutilsではsplit_using_target関数を用いることでラベルをもとにした配列の分割を高速に実行することが可能です.次のコードはsplit_using_target関数の簡単な利用例です.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np
from sensorutils.core import split_using_target

target = np.array([0, 0, 1, 1, 2, 2, 1])    # ターゲットラベル
source = np.array([1, 2, 3, 4, 5, 6, 7])    # 分割する配列
splited = split_from_target(src, tgt)
print(splited)

# splited == {
#    0: [np.array([1, 2])],
#    1: [np.array([3, 4]), np.array([7])],
#    2: [np.array([5, 6])]
# }

Numpy配列に対してsliding-window処理を行う

機械学習モデルや深層学習モデルへの入力は多くの場合一定のサイズである必要がありますが,センサデータは可変長の時系列データであるため,そのままではモデルへ入力することができません.そこでセンサを用いた行動認識では,可変長の時系列データからスライディングウィンドウを用いて一定サイズの部分系列を取り出すことでモデルへの入力を作成します.

sensorutilsではto_frames関数を用いることで高速なsliding-window処理を簡単に実行することが可能です.次のコードはto_frames関数の使用例です.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np
from sensorutils.core import to_frames

source = np.array([1, 2, 3, 4, 5, 6, 7])    # 分割する配列
window_size = 3
stride = 2
frames = to_frames(source, window_size, stride)

# frames == np.array([
#     [1, 2, 3],
#     [3, 4, 5],
#     [5, 6, 7],
# ])

データセットローダの利用

センサに関するオープンなベンチマークデータセットを利用するには,提供されているデータセットを読み込むコードを実装する必要があります.しかし,行動認識データセットなどのデータセットは画像系のデータセットと異なり,データセットによって提供される形が大きく異なるため,読み込みコードの実装は煩雑な作業となります.

sensorutilsでは,読み込みコードの実装の手間を削減するために代表的なセンサ系のベンチマークデータセットのローダを提供しています.これを活用することで,読み込みコードの実装の手間を減らし,より本質的な作業に注力することが可能です.

以下では実装が非常に厄介なHASCデータセットの読み込みをsensorutilsを利用して行います.

HASCデータセットをロードしてみる

HASCデータセットを読み込んで、ウィンドウ幅256、ストライド幅256でsliding-window処理したデータを取得します.

手順

  1. HASCデータセットを取得する.
  2. 下記コードのhasc_pathの箇所を取得したデータセットのパスに書き換える.
  3. (Optional) 16行目のキャッシュを作成するパスを変更

    デフォルトではスクリプトの実行ディレクトリ下にhasc.csvという名前でキャッシュが作成される.

  4. 実行!

Warning

初回の実行ではメタデータの収集と統合の処理を行うため時間がかかります.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
from pathlib import Path
from sensorutils.datasets.hasc import HASC

# About HASC
## http://hasc.jp/

window_size = 256   # sliding-windowでセグメンテーションするときのwindow幅
stride = 256        # stride幅

# HASCデータセットパス
hasc_path = Path('E:/<any where>/HASC-PAC2016/')

# hascローダインスタンスの作成
# 第2引数はメタデータのキャッシュ先パス
hasc = HASC(hasc_path, Path('hasc.csv'))


x, y, act2id = hasc.load(window_size, stride, ftrim=2*100, btrim=2*100)
print(f'x: {x.shape}')
print(f'y: {y.shape}')

HASCデータセットを被験者でフィルタリングして読み込む

手順は"HASCデータセットをロードしてみる"と同様です.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
from pathlib import Path
from sensorutils.datasets.hasc import HASC

# About HASC
## http://hasc.jp/

window_size = 256   # sliding-windowでセグメンテーションするときのwindow幅
stride = 256        # stride幅

# HASCデータセットパス
hasc_path = Path('E:/<any where>/HASC-PAC2016/')

# hascローダインスタンスの作成
# 第2引数はメタデータのキャッシュ先パス
hasc = HASC(hasc_path, Path('hasc.csv'))

# クエリの作成
# この6人の被験者のセンサデータのみを取得する
persons = ['person01068', 'person03053', 'person02033', 'person01106', 'person03079', 'person02007']
queries = {'Person': f'Person in {persons}'}

# 読み込み
x, y, act2id = hasc.load(window_size, stride, queries=queries, ftrim=2*100, btrim=2*100)
print(f'x: {x.shape}')
print(f'y: {y.shape}')