概要
Spresense活用コンテスト2024に向けて、元々用意されたデータセットと自作データセットの両方を用いて分類できるか試したので紹介します。
サンプル数値データを用いた分類
データセットの準備
Sony Neural NetworkのExeファイルがインストールされているフォルダに今回使用するcsvファイルがあります。このデータはアヤメのがく、はなびらの長さ、幅から3種類のアヤメにラベル付けされているデータになります。
今回使用するデータセットはNeural Network Consoleをインストールした際に以下のパスに保存されています。
"C\your_folder\neural_network_console\samples\sample_dataset\iris_flower_dataset\iris_flower_dataset_training_delo.csv"
または
"C\your_folder\neural_network_console\samples\sample_dataset\iris_flower_dataset\iris_flower_dataset_validation_delo.csv"
データセットの登録
- Neural Network Console を起動します。
- メニューバー右側の「プロジェクトに名前を付けて保存」をクリックして、プロジェクト名を保存します。
- 左メニューの「Dataset」タブをクリックします。
- 「データセットを作成」を選択し、「ファイルまたはフォルダ」を選択
5. 事前に用意された学習用データ(iris_flower_dataset_training_delo.csv)と検証用データ(iris_flower_dataset_validation_delo.csv)を読みこみます.
6.「編集」のタブを開いて、使用する分類モデルの構築をします。
今回はニューラルネットワークを使って花の分類を行うので、添付画像に示すような設定にします。
Inputには判別する状態の個数を設定します。(今回は4つの状態を判別します)
7. 分類モデルを構築したら、編集タブの右上にある「実行」をクリックして学習を開始します。
「学習」タブで学習結果を確認することができます。

8. 学習が終わったら右上にある「実行」をクリックすると、テスト用データによる分類結果を確認することができます。

自作の数値データを用いた分類
次にSpresenseに6軸の加速度・ジャイロセンサ取り付け、取得したセンサデータを用いて分類用のデータセットを作成する方法について解説します
対象となる状態は以下の3つです。
- 直立(立ち止まっている状態)
- 歩行
- 転倒(直立から前方に転倒する)
この3つの動作を行った際のデータをAIモデルに学習させることで、リアルタイムで人の状態を判別できるように目指します。
センサデータ収集
センサデータを収集し、モデルの学習に利用するデータセットを作成します。
データ収集の手順:
- 直立・歩行・転倒の各状態を10秒ずつ記録
- それぞれの動作に対して学習用に5回、検証用に1回ずつ行う。
フォルダ構成(データの分類)
状態ごとにラベルを付けられるように、以下のようにデータをフォルダに整理します。
dataset/
├── falling/ # 転倒
│ ├── falling1.csv
│ ├── falling2.csv
│ ├── falling3.csv
├── normal/ # 歩行
│ ├── normal_walk1.csv
│ ├── normal_walk2.csv
│ ├── normal_walk3.csv
├── stop/ # 立位
│ ├── normal_stop1.csv
│ ├── normal_stop2.csv
│ ├── normal_stop3.csv
データの前処理
取得したセンサーデータをAIモデルで学習できる形式に整えるため、データの統合とラベル付けを行います。これを手作業ではなく、Pythonスクリプトで自動化します。
スクリプトでは以下の処理を行います。
-
データの統合とヘッダーの作成
センサーデータは複数のCSVファイルに分かれていますが、これらを1つのデータセットに統合します。その際、Neural Network Consoleで正しく読み込めるように、1行目に各列が表す物理量を示すヘッダーを追加します。
注意点:ラベル付けを行う際、説明変数のカラム名をx__:やy:labelのように適切に設定しないと、Neural Network Consoleが正しく認識しない問題が発生します。 -
データのラベル付け
- 転倒 (fall) → ラベル
0 - 歩行 (walk) → ラベル
1 - 立位 (standing) → ラベル
2
import os
import csv
# 入力フォルダパス# 出力CSVファイル名
# input_path = r"C:\Users\Desktop\dataset\train"
# output_csv = os.path.join(input_path, "Training_Acc_gyro.csv")
input_path = r"C:\Users\Desktop\dataset\vaild"
output_csv = os.path.join(input_path, "Test_Acc_gyro.csv")
# フォルダごとのラベル
folder_labels = {
"normal": 0,
"stop": 1
}
# センサラベル
sensor_labels = [
"x__0:Acc_x", "x__1:Acc_y", "x__2:Acc_z",
"x__4:Gyro_x", "x__5:Gyro_y", "x__6:Gyro_z",
"y:label"
]
# データセット作成
dataset = []
for folder, label in folder_labels.items():
folder_path = os.path.join(input_path, folder)
if os.path.exists(folder_path):
files = os.listdir(folder_path)
for file in files:
if file.endswith(".csv"):
# ファイルパスを追加
file_path = os.path.join(folder_path, file)
# CSVファイルを開いてデータを読み込む
with open(file_path, mode="r", encoding="utf-8") as csvfile:
reader = csv.reader(csvfile)
for row in reader:
# 行データにフォルダラベルを追加
dataset.append(row + [label])
else:
print(f"フォルダが見つかりません: {folder_path}")
# CSVファイルに書き込み
with open(output_csv, mode="w", newline="", encoding="utf-8") as csvfile:
writer = csv.writer(csvfile)
# ヘッダー行
writer.writerow(sensor_labels)
# データ行
writer.writerows(dataset)
print(f"データセットが作成されました: {output_csv}")
Neural Network Consoleでの学習
アヤメの花分類モデル構築と同様の手順に従うことでNeural Network Consoleを用いて分類モデルを構築することができます。
分類モデル
分類結果
テストデータによる分類結果を示します。ノイズ対策なしや前処理なしでもでも分類精度はそこそこ良いことが分かりました。

おわりに
今回はマイコンで収集したセンサデータをもとに、AIモデルを構築しました。次はこのAIモデルをSpresenseに組み込み、人の状態を判別できるか試してみたいと思います。
