LoginSignup
2

More than 1 year has passed since last update.

エッジデバイスでAIを現場に! ~Jupyter NotebookでDocker上のOpenVINOを試す~

Last updated at Posted at 2021-12-20

はじめに

概要

この記事では、日立のエッジ製品CE50-10Aを用いたAIアプリケーションの開発の初歩(Hello Worldレベル)の手順をご説明します。
この手順に従うことで、高度な知識が求められる学習モデルの作成や環境セットアップといった作業をスルーして、初歩的なAIアプリケーションの開発を体験することができます。

読者としては、あまりAIに馴染みのない方を想定しています。

CE50-10Aとは

CE50-10Aは、工場や発電所のような産業・インフラ業界におけるAI活用を念頭に、日立が2021年に販売開始したエッジ製品です。

image.png
引用元:https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html

IntelのAI推論フレームワーク OpenVINO をプレインストールしており、すぐに開発を始めることができます。
また、粉塵や振動、多湿といった過酷な環境に耐えうる堅牢な構造により、幅広い現場で長期に渡る利用が可能です。

OpenVINOとは

OpenVINOとは、Intelが提供するフリーのAI推論の開発フレームワークです。
Intel製のCPUやGPUで推論処理を高速に実行することができます。
OpenVINOは、C/C++やPythonから利用可能ですが、CE50-10AではPythonからの利用をサポートしています。

CE50-10Aが提供する機能

CE50-10Aは、単にOpenVINOをプレインストールしているだけでなく、AIアプリケーションの開発/運用を効率よく・確実に行えるように複数の機能を提供しています。
具体的には、

  • 複数の種類のカメラデバイスに対応し、アプリケーション側でその違いに対応する必要を無くすデータ入力機能
  • データをキャッシュして状態を管理するデータ管理機能
  • 現場に配備(=再頒布)する時問題となる、OSSや動画コーデックなどのライセンスに対応した推論実行機能
  • OpenVINO上のアプリ開発を手軽に体験出来る推論開発機能

などです。
本記事では、「推論開発機能」について、実際に操作を体験していきます。

推論開発機能を使ってみる

推論開発機能は、Dockerコンテナ上にセットアップされたOpenVINOとJupyter Notebookを提供するものです。
Jupyter Notebookは、PythonなどをWebブラウザ上で記述・実行出来る開発環境です。
入力したプログラムをすぐに実行したり、実行結果を確認できるので非常に便利です。

この章で出来ること

監視カメラの映像に映っている自動車の位置を検出してみます。

car-detection.gif

引用元:https://github.com/intel-iot-devkit/sample-videos/blob/master/preview/car-detection.gif

結果がこのように表示されます。

これを応用すれば、例えば、

  • 通過した自動車の台数をカウントしたい
  • 自動車が写っているときだけ録画したい

といったユースケースで使うことができるでしょう。

準備するもの

以下のファイルをダウンロードしておきます。

環境のセットアップ

CE50-10Aと操作用のPCを同じネットワークに接続します。
また、Dockerが利用可能なようにセットアップしておきます。セットアップ方法はユーザーズガイドの3章を参照してください。

Dockerコンテナの起動

推論実行機能はDockerコンテナとして実行されます。
以下のコマンドを実行します。

$ sudo docker run -it --rm -p 8888:8888 ctrl_edge_ai/openvino_devel:1.0

以下のようにURLが表示されます。

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://0.0.0.0:8888/?token=66b5d8ca82cac0134b3af02709acb1cf8d521ec17e6016da

このURLの0.0.0.0を、CE50-10Aに設定したIPアドレスに置き換えて、作業用PCのブラウザで開きます。

以下のようにJupyter Notebookの画面が表示されます。

image.png

ファイルのアップロード

「準備するもの」でダウンロードしたファイルをアップロードしていきます。

[Upload]をクリックします。

image.png

ファイル選択ダイアログが表示されたら、アップロードするファイルを開きます。
以下のようにファイル名が表示されるので、表示されたファイル名の右にある[Upload]をクリックすると、ファイルがアップロードされます。

image.png

Notebookの作成

[New]をクリックし、[Python3]をクリックします。
image.png

以下のようにNotebookが開きます。
image.png

プログラムの入力と実行

いよいよプログラムの入力と実行をしていきます。

ライブラリのインポート

まずは使用するライブラリをインポートします。

import cv2
import matplotlib.pyplot as plt
from openvino.inference_engine import IECore
import numpy as np

上のコードをNotebookにコピー&ペーストして、Shift+Enterを実行します。すると、入力したプログラムが実行されます。

image.png

以降も同様に
(1)プログラムをコピー&ペースト
(2)Shift+Enterでプログラムを実行
を実施してください。

動画ファイルのオープン

動画ファイルを読み込みます。
2行目では、動画の200コマ目から画像を読み出すよう設定しています。自動車が映っているタイミングを選ぶためです。

cap=cv2.VideoCapture("car-detection.mp4")
cap.set(cv2.CAP_PROP_POS_FRAMES,200)

画像の読み出しとプレビュー

読み込んだ動画の画像をJupyter Notebook上で確認してみます。

ret,img=cap.read()
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

以下のようにJupyter Notebook上に画像が表示されます。
image.png

学習済みモデルの読み込み

学習済みモデルのファイルを読み込みます。
OpenVINOでニューラルネットワークの推論を行うInference Engineのインスタンスを生成して、
そこにモデルファイルを読み込ませます。
load_network関数のパラメータで、推論を実行するデバイスを指定します。
ここでは"CPU"としていますが、ここを"GPU"にするだけでGPUで実行できます1

model_xml="vehicle-detection-adas-0002.xml"
model_bin="vehicle-detection-adas-0002.bin"
ie=IECore()
net=ie.read_network(model=model_xml,weights = model_bin)
exec_net=ie.load_network(network=net,device_name="CPU")

画像の変換

取得した画像を推論できるように変換します。

n, c, h,w = net.inputs['data'].shape
ih, iw = img.shape[:-1]
input_img = cv2.resize(img,(w,h))
input_img=input_img.transpose((2,0,1))
data={}
data['data']=input_img

推論を実行

いよいよ推論を実行します。
学習済みモデルを読み込んだInference Engineのインスタンスに、変換した画像データを入力すると、結果が出力されて変数resに格納されます。

res=exec_net.infer(inputs=data)

推論結果を確認

推論結果を表示させてみます。

res['detection_out'][0][0][0]

image.png

この数値が、画像上で自動車が存在する場所の座標などの情報を示しています。

推論結果を表示

このままではよくわからないので、推論結果を表示させてみます。
推論結果は、自動車のある位置の左上・右下のそれぞれの位置を画像の幅・高さを1とした割合で示しています。
forにより推論結果から、1件ずつ自動車のある位置を取り出し、OpenCVのrectangle関数で、その座標に白い枠を描画しています2

for number, proposal in enumerate(res['detection_out'][0][0]):
    xmin = np.int(iw * proposal[3])
    ymin = np.int(ih * proposal[4])
    xmax = np.int(iw * proposal[5])
    ymax = np.int(ih * proposal[6])
    img = cv2.rectangle(img, (xmin,ymin),(xmax,ymax),(255,255,255),2)
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

image.png

自動車の位置を囲んで表示することができました。

まとめ

CE50-10Aに搭載された推論開発機能を用いて、Docker上に構築したOpenVINOをJupyter Notebookで操作する手順を示しました。
上記に沿って実施することで、初歩的なAIアプリケーションの開発を体験することができます。

CE50-10Aについての詳しい情報は以下のサイトをご覧ください。
https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html

免責・商標類

  • 本記事に記載した手順は、その動作や結果を保証するものではありません。
  • 製品の改良により、予告なく記載されている仕様が変更になる場合があります。
  • 本記事に記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です。

  1. 実際にはコンテナ上のプログラムがGPUにアクセスできるようにDockerの設定が必要です。 

  2. 実際には、座標に加えて(1)バッチ処理時の画像ID(2)画像のクラス(3)confidence(推論結果の確からしさ)が返されます。プログラムを単純化するための省略していますが、閾値未満のconfidenceの座標は描画しないといった処理の検討が必要です。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2