catch-img

CONEXIOBlackBearで機械学習モデルを動かす

こんにちは。コネクシオIoTブログ 技術記事担当のHです。

さて、今回はCONEXIOBlackBearで機械学習モデルを動かす話をいたします。

CONEXIOBlackBear は、画像認識・予知保全・AIによるリアルタイム検知などの用途で活用できるエッジコンピューティングゲートウェイです。これらの用途においてはすでに活用されており、また、今後も拡大が見込まれる技術の1つとして画像認識の機械学習モデルがありますが、私自身はまだCONEXIOBlackBear上で動かしたことがありません。

そこで、本記事では、CONEXIOBlackBear上で画像認識の機械学習モデルを動かし、USBカメラにて撮影した画像をリアルタイムに認識させてみたいと思います。


0. 実施環境

  • CONEXIOBlackBear OSバージョン 1.1.5
  • Python3.5
  • tensorflow 2.0.0(keras 2.2.4)
  • USB接続のWebカメラ


1. 学習データとモデルの作成

1.1 学習データ

ここでは、CIFAR-10というデータセットを用います。

CIFAR-10は、10種類に分類した学習用5万枚、テスト用1万枚からなる合計6万枚の画像データセットです。詳細はリンク先をご覧ください。


1.2 モデル

ニューラルネットワークを記述するためのPythonライブラリkerasにサンプルとして含まれているcifar10_cnn.pyを用います。したがって、kerasによって記述されたモデルになります。

このサンプルは、https://github.com/keras-team/keras/tree/2.2.4をダウンロードして展開したものの中のexamplesというフォルダに入っています。

モデルの構造は、cifar10_cnn.pyの名前からわかる通り、畳み込みニューラルネットワーク(Convolutional Neural Network、CNN)です。

入力画像は32*32ピクセルのカラー画像(RGB)です。

層構成は、以下のようになっています。

①畳み込み層(32*32*3入力、32チャネル出力)

②畳み込み層(32チャネル出力)

③MaxPooling層(サイズ2*2)

④畳み込み層(64チャネル出力)

⑤畳み込み層(64チャネル出力)

⑥MaxPooling層(サイズ2*2)

⑦全結合層(512ユニット)

⑧全結合層(10ユニット=分類の数)

畳み込み層のフィルタサイズは3*3です。活性化関数は、最終出力以外はReLUで、最終出力は、多クラス分類なのでsoftmax関数です。MaxPooling層の後ろと全結合層の間にDropout層があります。


1.3 学習

学習は、cifar10_cnn.pyで実行可能ですので、自分でコーディングせずそのまま動かします。学習回数は50epochとしました。この回数だと精度が75%程度だとサンプルのソースコード内に注意書きがありますが、今回はサンプルの動作確認ですので、精度にこだわらず、50エポックでよしとします。実際にやってみたところ79%となり、やはり注意書きの通りといったところです。

学習は、膨大な計算が必要なため、一般にエッジデバイスではなく、計算リソースの豊富な環境で行うことが一般的です。そのため、CONEXIOBlackBearではなく、手元のPCにて行いました。所要時間はおよそ1.5hでした。

  • MacBook Pro
  • Windows10(bootcamp)
  • Python3.7
  • tensorflow 2.0.0(keras 2.2.4)



2. CONEXIOBlackBear上で動作させる

2.1 準備

kerasのモデルを動かすためには、kerasと、今回バックエンドとして使用しているtensorflowのインストールが必要です。

kerasは、後述のtensorflowに同梱されていますので、別途インストールしてはいません。

tensorflowは、CONEXIOBlackBearで動かすには、CONEXIOBlackBear用にビルドしたバージョンが必要ですので、当社でビルドしたものを使用してインストールします。

※なお、当社でビルドしたtensorflowは、CONEXIOBlackBearのユーザー様へご提供可能ですので、お問い合わせください。


2.2 コーディング

CONEXIOBlackBearで実行するコードは以下です。約5秒ごとにカメラで撮影した画像をCNNモデルに入力して推論を行います。画像のサイズは、モデルの入力サイズに合わせてリサイズしています。

学習モデルのデータは、1.3で出力されたkeras_cifar10_trained_model.h5というファイルを用いるので、PCからCONEXIOBlackBear上に配置しておきます。

# coding: utf-8

import cv2
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import load_img, img_to_array
import time
import numpy as np

# モデルへの入力画像サイズ
input_image_shape = (32, 32, 3)

# カメラ
capture = cv2.VideoCapture(2, cv2.CAP_V4L)

label_names = [
    "airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"
]

def capture_image():
    """
    カメラ読み取り
    """
    # 読み取り
    ret, frame = capture.read()
    cv2.imwrite("test.jpg", frame) # 保存(デバッグ用)

    return frame

def convert_shape(frame):
    """
    画像形状の変換
    """
    data = np.array(frame)
    # リサイズ
    data = cv2.resize(data, (32, 32))
    cv2.imwrite("data.jpg", data) # 保存(デバッグ用)
    # 正規化
    data = data.astype("float32") / 255.0
    # 入力形式に変換
    input_array = data.reshape((1, ) + input_image_shape)

    return input_array

# モデルのロード
model = load_model("keras_cifar10_trained_model.h5", compile=False)

# 推論繰り返し
while True:

    # 画像の取り込み
    frame = capture_image()

    # 形状の変換
    input_array = convert_shape(frame)

    # 推論
    t0 = time.time()
    pred = model.predict(input_array)
    t1 = time.time()

    # 表示
    label = label_names[pred.argmax()]
    socre = pred.max()
    print("elapsed_time: {:.3} sec".format(t1 - t0))
    print("scores: %s" % pred)
    print("result: label={}, score={:.3}".format(label, socre))

    time.sleep(5)

capture.release()


2.3 動作させた結果

実際の景色を撮影しながら動作させることが難しかったので、PCの画面に表示した写真をWebカメラで撮影しました。精度は学習回数の関係上それほど高くないですが、以下の例ではautomobileが正しく判別されています。

推論1回の所要時間は、50~60msecでした。今回のモデルの規模であれば、推論は十分短い時間で実行できました。このように学習済みモデルをCONEXIOBlackBearにデプロイすれば、画像認識のアプリケーションが十分実現できそうです。また、アプリケーション次第ですが、もっと複雑なモデルでも十分リアルタイムに実行できそうです。

結果

elapsed_time: 0.0548 sec
scores: [[1.1939509e-03 8.6154062e-01 2.2574966e-06 8.3335271e-06 1.5354365e-06
  2.4803043e-07 3.4322095e-06 3.7648991e-07 3.1799115e-02 1.0545027e-01]]
result: label=automobile, score=0.862


元画像(https://www.pakutaso.com/ より)


モデルへの入力画像(PC画面に画像を映し、USBカメラで撮って32*32リサイズ)

※サイズが小さいのでぼやけて見える。


まとめ

以上のように、CONEXIOBlackBearで機械学習モデルを動かせました。学習済みモデルであれば十分短時間で実行可能ということがわかりました。

以前、greengrassでアプリケーションをデプロイという記事を書きました。今回のような機械学習モデルを豊富なリソースがあるクラウド側で開発して、同様の方法でエッジ側にデプロイすれば、まさに本格的なエッジコンピューティングになると思います。今後の記事で、トライしてみたいと思います。




5分で理解できる!
Smart Ready IoTソリューションセット
ご質問やご要望はこちらから
お気軽にお問い合わせください

製造業が直面する課題と人材難・IT化・技術継承の解決策

2021-07-28

新型コロナウイルス感染症(以下、コロナ)の感染拡大によってテレワークが徐々に定着しつつあるなか、製造業もまた時代の変化に適応しなければならない時期にさしかかっています。少子高齢化による人手不足やIT化の遅れ、移り変わる社会情勢に対応しきれていないことなど、製造業が抱える課題と解決策について解説します。

ローカル5Gとは? メリット・デメリットと活用法を解説

2021-07-28

2020年3月、国内で次世代の通信規格として新たに商用化した5G。そうしたなか、通信キャリアが展開する5Gとは別に、企業や自治体などが独自に5Gネットワークを構築できるローカル5Gが登場しました。この記事では、ローカル5Gの仕組みをはじめ、メリット・デメリット、製造業における活用法などを解説します。

プライベートLTE導入の課題と活用シーン

2021-07-28

プライベートLTEは、有線でのネットワーク構築が難しい大規模な工場、遠隔制御装置や監視装置を使用するなど、安定した通信が求められる状況において活用が期待されています。この記事では、プライベートLTEのメリットや導入のために押さえておきたい点、活用が期待できる事業などを解説します。

設備点検・監視を効率化するアナログメーターのデジタル化

2021-07-08

製造業においては人手不足の現状も無視できません。今後も深刻化していくと予想される製造業の人手不足に対応するためには、IoTを活用した業務効率化が急務です。今回は工場の設備点検・監視業務における課題やアナログメーターをデジタルデータ化するメリットについて解説します。

スマートファクトリーの実情と5G導入で期待できるメリット

2021-07-08

近年、工場の設備や機械をインターネットで接続するスマートファクトリーが注目されています。そうしたなか、スマートファクトリー化を後押しする次世代の通信技術として、高速大容量通信や多数同時接続に対応した5G回線が登場しました。この記事では、5Gの基礎知識や特徴、スマートファクトリー市場の現状、5Gを活用することによる具体的なメリットなどを解説します。