AI CORE Xスターターキット TIPS

2020/05/12

AI CORE XスターターキットとOpenVINO™ですぐに始めるディープラーニング推論」シリーズのAppendix記事です。

このシリーズは、「ディープラーニングとは何か」から始まり、「各種ツールの使い方」「プログラミング基礎」「プログラミング応用・実践」までをステップバイステップでじっくり学び、自分で理解してオリジナルのAIアプリケーションが作れるようになることを目指しています。

ここでは、UbuntuやOpenVINO及びPythonに関するTIPSをご紹介します。
主に中級者向けの内容ですので、初心者の方は理解できなくても問題ありません。

目次

SSH

AI CORE Xスターターキットを他のPCからリモートで操作したい人向けの情報

AI CORE Xスターターキット側の設定

以下のコマンドでインストールすればOK

sudo apt-get install ssh

インストールしてないとPC側からの接続時にConnection refusedが起きる

PC側の設定

SSH向けのアプリは色々あるが、chromeの拡張機能で出来る以下のアプリが便利
Secure Shell App


黄色の線の部分は任意の文字列、赤線の2箇所のみ記入してEnterキーで接続
パスワードを求められるので入力する

もしうまく接続出来ない場合はホスト名UP-APL01の代わりにAI CORE XスターターキットのIPアドレス(例:192.168.11.1)を使う
AI CORE XスターターキットのIPアドレスは以下のコマンドで分かる

hostname -I

OpenCV実行時の対応

SSHにてPythonプログラムを実行する際、OpenCVなどWindow画面表示を伴うものはエラーが生じる。例えば、以下のようなエラー表示になる

Unable to init server: Could not connect: Connection refused
 
(image:3987): Gtk-WARNING **: 14:05:07.417: cannot open display:

まず、AI CORE Xスターターキット側で以下のコマンドを打ってdisplay番号を確認
※PC側ではなくAI CORE Xスターターキット側であることに注意

echo $DISPLAY

:0などと番号が表示されるので、その番号に合わせてPC側から以下のコマンドを打てばOK

export DISPLAY=:0

これはSSHでログインしなおす度に必要なので注意
(ディスプレイ番号は基本的に変わらないはずなので、PC側のコマンドだけで良い)

FTP

SSHにてscpコマンド等を使えば、ファイルのやり取りは可能だが、少し不便
GUI操作のできるFTPを使った方がやりやすい。PC側は例えばFFFTPなどを使う。

AI CORE Xスターターキット側の設定

まず以下のコマンドでインストールを行う

sudo apt-get install vsftpd

これだけでアクセスやダウンロードは可能になるが、PC側からアップロードが出来ない(permission denied)ため、書き込み権限を有効にする
書き込み権限を有効にするには/etc/vsftpd.confファイルの中を少し編集する必要がある。
ここではnanoエディタを使った編集方法を紹介

まず以下のコマンドを打つ

sudo nano /etc/vsftpd.conf

パスワードを求められたら入力する
以下の箇所を見つけて

# Uncomment this to enable any form of FTP write command.
#write_enable=YES

#write_enable=YES#を削除する

# Uncomment this to enable any form of FTP write command.
write_enable=YES

キーボードにて Ctrl + O で保存、Ctrl + X で終了

再起動

sudo service vsftpd restart

これでOK

PC Editor

PC側のエディタ(例:VSCodeやAtomなど)を使ってコーディングする場合、編集後にPC側からAI CORE Xスターターキット側へ毎回アップロードするのは面倒。
Cyberduckを使ってFTPでアクセスし、右クリックでエディタで編集から開いた状態で編集すると、保存時に自動的にアップロードされるので便利。FFFTPの場合だと、保存してもAI CORE Xスターターキット側へは反映されないので注意。
ちなみに、Windows10 PCでCyberduckを使ってFTPでファイルのアップロードやダウンロードを使うと遅いので、エディタ編集はCyberduck、ファイル転送はFFFTPと分けて使っている。

Iterator

Inference Engineで登場するこちらのコードについての解説

input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))

これはnet.inputsnet.outputsキーワードを取り出すためのコードで、Iterator(イテレータ)を使っている。イテレータとはざっくり言うと要素を1つずつ順番に取り出すオブジェクト。
イテレータにするための関数がiterで、イテレータから要素を取り出すのがnext

以下はリストをイテレータ化して要素を取り出している例
nextで取り出すと、次の取り出しはその続きになっているのがポイント

# リスト 
= [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
 
# リストをイテレータ化 
= iter(a)
 
# イテレータから要素取り出し 
= next(b)
print(c)
 
# イテレータから要素取り出し 
= next(b)
print(c)
 
# イテレータから要素取り出し 
= next(b)
print(c)
 
# 実行結果 
# 10 
# 20 
# 30 

辞書にも適用できる。辞書に適用した場合はnextで得られるのはキーワードのみ

# 辞書 
= {'apple':148, 'banana':99, 'orange':358}
 
# 辞書をイテレータ化 
= iter(a)
 
# イテレータから要素取り出し 
= next(b)
print(c)
 
# イテレータから要素取り出し 
= next(b)
print(c)
 
# イテレータから要素取り出し 
= next(b)
print(c)
 
# 実行結果 
# apple 
# banana 
# orange 

なお、上記の例では順番通りに取り出せているが、辞書の取り出し順は必ず順番通りと限らないので注意。

Inference Engineを使ったコードでnet.inputsnet.outputsの中身を表示してみると辞書形式であることが分かる。また、要素は1つしかないので、順番を気にする必要がない。

# import 
from openvino.inference_engine import IENetwork, IEPlugin
 
# モデルの読み込み 
net  = IENetwork(model='intel/face-detection-retail-0005/FP16/face-detection-retail-0005.xml',
 weights='intel/face-detection-retail-0005/FP16/face-detection-retail-0005.bin')
 
# モデルの中身を表示してみる 
print(net.inputs)
print(net.outputs)
 
# 実行結果 
# {'input.1': <openvino.inference_engine.ie_api.DataPtr object at 0x7fa434602c10>} 
# {'527': <openvino.inference_engine.ie_api.DataPtr object at 0x7fa434602c10>} 

Inference Engineでは最初のキーワードだけが取り出せれば良いので、iternextを一気に書いて処理している。

input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
print(input_blob)
print(out_blob)
 
# 実行結果 
# input.1 
# 527 

以下に、その他の書き方も紹介する。これらと比べてイテレータを使った方がシンプルで分かりやすい

keysを利用した場合

keys()を使うことにより辞書から全てのキーを取り出すことが可能
ただし、出力される型はdict_keysという型なのでリストとして取り出せない
そのため、さらにリスト化してから取り出すということが必要

input_blob = list(net.inputs.keys())[0]
out_blob = list(net.outputs.keys())[0]

keys と for in を利用した場合

今まで何気なく使ってきたfor inであるが、これがまさにイテレータと同じ動き。最後の要素が取り出されるまでnextを繰り返している。net.inputsnet.outputsには要素が1つしかないため即終了する
見やすいが、コード行が少し長くなる

for key in net.inputs.keys():
    input_blob = key
 
for key in net.outputs.keys():
    out_blob = key

強制リスト化

辞書をリスト化するとキーワードのみが取得される
シンプルさだけに注目すれば、こちらの書き方の方が良いかもしれない

input_blob = list(net.inputs)[0]
out_blob = list(net.outputs)[0]

以上、「AI CORE Xスターターキット TIPS」でした。