計測制御分野におけるAI(人工知能)の活用

近年、AI(人工知能)の認知度が広まってきており、様々な企業で活用されつつあります。製造現場でもAI(人工知能)を用いて自動化による生産性の向上など様々な課題を解決することが期待されます。
今回は、AI(人工知能)の計測制御分野での活用についてサンプルプログラムを例に解説いたします。

目次

AI(人工知能)とは

「AI(人工知能)」に対して明確な定義はありませんが、一般的に人工的に創られた知能を実現する技術や処理などの広義的な概念として認知されています。
AIと関連してよく使われる「機械学習」と「ディープラーニング(深層学習)」は図1のように「AI(人工知能)」の技術に含まれます。

深層学習は機械学習に含まれ、機械学習は人工知能に含まれている図。 深層学習 DL:Deep Learning 機械学習のうち、多数の層から成るニューラルネットワークを用いるもの パターン/ルールを発見する上で何に着目するか(特徴量) を自ら抽出することが可能 機械学習 ML:Machine Learning AIのうち、人間の「学習」に相当する仕組みをコンピュータ等で実現するもの 入力されたデータからパターン/ルールを発見し、新たなデータに当てはめることで、その新たなデータに関する識別や予測等が可能。 人工知能 AI:Artificial Intelligence 人間の思考プロセスと同じような形で動作するプログラム全般 あるいは、人間が知的と感じる情報処理・技術全般図 1:AIイメージ図

ディープラーニングとは

「ディープラーニング」とは、大量のデータを学習することにより、共通点や法則性などの「特徴量」を自動的に抽出できるようにしたもののことです。
従来は人間がインプットする必要があった「特徴量」を、データさえ用意すればコンピュータが自動的に判断できるようになりました。その結果、従来の機械学習では難しかった顔認識やノイズ除去などの複雑な処理を実現できるようになりました。

猫の画像を入力 入力層から中間層(隠れ層)、中間層(隠れ層)から出力層へデータを処理 猫の画像を出力 正解率96%図 2:ディープラーニングイメージ図

今回はディープラーニングの中でもっとも簡単なオートエンコーダを使った教師なし学習と機械学習に関するライブラリが豊富なPythonを用いたノイズ除去プログラムを紹介したいと思います。

オートエンコーダとは

オートエンコーダ(自己符号化器:Autoencoder)とは、ニューラルネットワークを利用した機械学習の手法の一つです。不要な情報を取り除くための次元削減や特徴抽出を目的として開発されましたが、近年では異常検知などの生成モデルとして使用されています。
また、オートエンコーダの学習は、教師あり学習も行うことが可能ですが基本的には入力データと一致するデータを出力することを目的とする教師なし学習になります。

エンコーダの4つの各円から特徴量の2つの各円に1本ずつ矢印が伸びている 特徴量の2つの各円からデコーダの4つの各円に1本ずつ矢印が伸びている図 3:オートエンコーダイメージ図

オートエンコーダは図のような構造をしており、左から右にエンコード/デコードを行うことで学習していきます。図の円部分をノード、矢印部分をエッジと呼びます。
入力層のノードからデータを受け取り、各エッジに対してそれぞれに重みづけがされ、最終的にそれらの合計が最終的な値になります。
このような処理のうち、前半部分の次元削減と特徴抽出を行う機能をエンコーダ、後半部分の小さくした次元数のデータをもとにデータを生成する機能をデコーダと呼びます。
オートエンコーダのネットワークは、入力したデータの次元数を小さくし、再びデータをもとに戻して出力するようになっています。また、これらのエンコーダとデコーダの機能をそれぞれ個別に使用することも可能になっています。

オートエンコーダを用いたノイズ除去プログラム

今回は一例として以下の構成でサンプリングを行った正弦波のデータに疑似的にノイズを付加したデータセットを用いて、付加されたノイズの除去を行うPythonプログラムをオートエンコーダの教師なし学習で作成します。

本記事で紹介しているプログラムのサンプルソースコードを公開しています。以下よりダウンロードいただけます。

サンプルプログラム:オートエンコーダを用いたノイズ除去プログラム別ウィンドウが開きます

対象デバイス:エッジAIコンピュータDX-U1100P1-2E0211 + アナログ入力ボードAI-1616L-LPE
使用言語:Python3.10
使用ライブラリ:tensorflow、keras、他

まず、以下のコマンドを実行し、Pythonのインストールと必要なライブラリなどをインストールしてください。また、Pythonのインストールにはいくつかのビルドツールも必要になりますのであわせてインストールを行ってください。

# Pythonのインストール ※Python環境がインストールされていない場合のみ
sudo apt update
sudo apt upgrade
sudo apt install build-essential libbz2-dev libdb-dev libreadline-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libsqlite3-dev libssl-dev zlib1g-dev uuid-dev tk-dev
wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz
tar -xf Python-3.10.0.tgz
cd Python-3.10.0/
./configure --enable-optimizations
make -j $(nproc)
sudo make altinstall

# ライブラリのインストール
pip install --upgrade pip
pip install tensorflow
pip install numpy pandas matplotlib scikit-learn opencv-python

ライブラリのインポート

まず、必要なライブラリをインポートしてください。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense
from IPython.display import display

データの前処理

特徴となるデータ抽出のためにデータセットを適切に処理できるように前処理を行います。
用意したデータを一次元配列に変換し、訓練用データを生成します。

# データの窓幅
input_shape_num = 50

# データセットの正規化
scaler = MinMaxScaler()
# 変換式の計算およびデータ変換
train_list = scaler.fit_transform(train_data[['Signal']], test_data[['Signal']])
test_list = scaler.transform(test_data[['Signal']])

# 一次元配列へ変換
train_list = train_list.flatten()
test_list = test_list.flatten()

# 部分時系列作成
train_vec = []
test_vec = []
for i in range(len(train_list)-input_shape_num+1):
    train_vec.append(train_list[i:i+input_shape_num])
for i in range(len(test_list)-input_shape_num+1):
    test_vec.append(test_list[i:i+input_shape_num])

モデルの定義

次に学習を行うオートエンコーダのモデルをkerasのSequentialモデルを使用して定義します。モデルへの入力数を一度圧縮し、再度復元することで過学習や勾配を抑えつつ特徴の抽出を行っています。
Sequentialモデルのレイヤーに学習させるデータの情報を指定していきます。
今回はいくつかあるkerasのレイヤーの中からよく使用されるDense(全結合レイヤー)を使用します。
Denseの各パラメータの説明は以下になっております。

  • units:出力の次元数を指定します。
  • activation:使用する活性化関数を指定します。
  • input_shape:タプルと呼ばれる固定配列を渡します。渡す要素が複数存在する場合は(0,1,2,...,n)のように表記しますが、今回は要素がひとつなので(input_shape_num,)という表記になります。
# オートエンコーダの設定
def init_autoencorder(input_shape_num):
    model = Sequential()
    # エンコード(出力するユニット数=units、活性化関数=relu、入力数=input_shape_num)
    model.add(Dense(units=200, activation='relu',
              input_shape=(input_shape_num,)))
    # デコード(出力するユニット数=units、活性化関数=relu)
    model.add(Dense(units=100, activation='relu'))
    # 出力層(出力数=input_shape_num、活性化関数=sigmoid)
    model.add(Dense(input_shape_num, activation='sigmoid'))

    # 作成したモデルの確認
    model.summary()

    return model

モデルの学習

作成したオートエンコーダのモデルに対して学習を行います。
まず、compileメソッドを用いて学習の処理について設定を行う必要があります。
次に学習を実行させるにはfitメソッドに訓練データなどを指定する必要があります。
オートエンコーダでは教師なし学習と教師あり学習を使用できますが、今回は教師なし学習を使用するため、教師データ(正解データ)にも訓練データを指定しています。

各パラメータの説明は以下になっております。

  • optimizer:使用する最適化アルゴリズムを指定します。
  • loss:損失関数(モデルの正解値と予測値のずれを計算するための関数)を指定します。
  • metrics:評価関数(モデルの精度を測るために関数)を指定します。
# オートエンコーダ実行
def run_auto_encoder(model, train_vec, batch_size, epochs):
    # 学習条件の設定(最適化=adam法、損失関数=平均2乗誤差、評価関数=多クラス分類の正解率)
    model.compile(optimizer='adam', loss='mse', metrics=['acc'])

    # 学習の実行(訓練データ=train_vec、教師データ=train_vec、勾配更新のサンプル数=batch_size、訓練データの反復回数=epochs、進行状況の表示=プログレスバー、訓練データの割合)
    hist = model.fit(x=train_vec, y=train_vec, batch_size=batch_size,
                     epochs=epochs, verbose=1, validation_split=0.2)

    return hist

学習の結果

生成したモデルをテスト用のノイズデータに適用してモデルの評価を行います。

# モデルをテストデータで評価
pred_vec = model.predict(test_vec)
pred_vec = scaler.inverse_transform(pred_vec)
test_vec = scaler.inverse_transform(test_vec)

# テストデータをグラフに出力
plt.figure(figsize=(16, 2))
plt.plot(test_vec[:, 0], clor='blue', label='Test')
plt.plot(pred_vec[:, 0], color='orange', label='Filter')
plt.legend()
plt.show()

それでは、出力されたグラフで学習結果を確認しましょう。
橙色線がテストデータ(ノイズが付加されたデータ)で青色線が学習モデルから生成されたフィルタを適用したデータになります。
概ね、ノイズが除去されきれいな正弦波が出力されています。

図 4:テストデータへのフィルタ適用

このようにPythonではディープラーニングを用いたノイズ除去プログラムを比較的容易に構築することができます。今回は単純な正弦波データに限定した説明になっておりますが、手法ごとの特徴を理解したうえで適切なパラメータやデータを選択することで従来のノイズ除去処理では対応できなかった不規則な信号などにも対応することも可能です。

エッジAIコンピュータDXシリーズ

デジタル技術の進化による変革で人々の生活を豊かにするデジタルトランスフォーメーション (DX)。その実現に向けたコンテックの1つのソリューションが「DXシリーズ」です。今回のノイズ除去プログラムで使用したDX-U1100P1-2E0211はNVIDIA® Jetson Nano™ モジュールを搭載し、実用性を重視した汎用の産業用エッジAIコンピュータです。1x PCI Expressスロット、2x Gigabit LAN、HDMI、2x USB、汎用I/O、RTC (リアルタイム/カレンダクロック) を搭載、柔軟な設置性と耐環境性を実現しています。
「DXシリーズ」はDXの実現に欠かせない、AI、IoT、5Gといった新技術をより身近で使いやすくお客様に提供することを目指しています。

関連コンテンツ

技術コラムTOPへ戻る

メールマガジンのご登録はお済ですか?

技術コラムなどのお役たち情報を含めた最新情報をメルマガでお届けしています。( メルマガサンプル表示別ウィンドウが開きます

myCONTEC会員サービスについて

詳細はこちら

新規ご登録

今すぐ登録

  • myCONTEC会員にご登録済みで、メルマガ配信をご希望の方は、ログイン後「会員情報変更」より設定変更ください。