この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
1 はじめに
CX事業本部の平内(SIN)です。
パナソニック様の提供するVieureka(ビューレカ)は、カメラ内のアプリで画像の解析などを行い、クラウドと連携することで多様なサービスが作成可能です。
今回は、簡単な分類モデルを作成し、VRK-C301カメラで推論するアプリを作成してみました。
最初に、動作している様子です。カメラに映ったものが、「トマト羊」なのか「アヒル」なのかを判定してブラウザで確認しています。推論はカメラ上で行われているので、推論結果だけをクラウド上に送るようなアプリへの応用が可能だと思います。
2 開発環境
Vieurekaで動作するアプリは、C/C++及び、Pythonで作成可能ですが、アプリ追加制御機構であるAdam上で動作する形式とするため、 AdamAppSDKの開発環境が必要です。
AdamAppSDK は、Ubuntu Linux 16.04、18.04、20.04 (64bit 版のみ)で動作しますが、下記を参照させて頂いて、Mac上のDockerで準備しました。
Ubuntu Linux 16.04をベースに、SDKで提供されるツールをセットアップしています。
Dockerfile
FROM ubuntu:16.04
ARG TOOL_CHAIN=gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz
ARG SYSROOT=vrk-c301-sysroot_20201030-6c86463ce.tar.gz
COPY ./${TOOL_CHAIN} ./
COPY ./${SYSROOT} ./
RUN apt-get update && apt-get upgrade -y && apt-get install -y xz-utils \
g++ g++-multilib make zip unzip libjpeg-turbo8-dev zlib1g-dev \
libcurl4-openssl-dev libgphoto2-6 && \
mkdir /opt/vrk-c301 && \
tar xf ./${TOOL_CHAIN} -C /opt/vrk-c301 && \
tar xf ./${SYSROOT} -C /opt/vrk-c301 && \
rm -f ./${SYSROOT} && \
rm -f ./${TOOL_CHAIN}
Macからも作業できるよう ./share をマウントしています。HTTP用のポートは、デバッグ用にUbuntu上で、Adamを起動した場合にアクセスするためのものです(今回は利用していません)
docker-compose.yml
version: '3'
services:
devenv:
image: vieureka_devenv
stdin_open: true
tty: true
build: .
volumes:
- ./share:/home/ubuntu
ports:
- "80:80"
Dockerイメージを起動しています。
$ docker-compose build
Building devenv
Step 1/6 : FROM ubuntu:16.04
・・・略
Removing intermediate container 5cf0c5da0885
---> d697c1b6458b
Successfully built d697c1b6458b
Successfully tagged vieureka_devenv:latest
% docker-compose run --service-ports devenv
root@9a8b4178f0f0:/# ls -F /opt/vrk-c301
gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/ sysroot/
作業場所で、SDKを解凍し、setup_env.shにスイッチを指定して環境をセッアップします。
- vrk-pc PC上で実行するアプリを作成する場合
- vrk-c201 VRK-C201カメラで実行するアプリを作成する場合
- vrk-c301 VRK-C301カメラで実行するアプリを作成する場合
# unzip AdamAppSDK_V1_15_20210121.zip
# cd AdamAppSDK_V1_15_20210121
# source setup_env.sh vrk-c301
ここまで準備できれば、後は、アプリのディレクトリでmakeするだけです。(Pythonの場合)
例)サンプルアプリ jpeg_app の作成
root@9a8b4178f0f0:/home/ubuntu/AdamAppSDK_V1_15_20210121/src/adamapp-py/jpeg_app# make
/bin/sh: 1: lsb_release: not found
/bin/sh: 1: lsb_release: not found
C++ main.cpp
LINK pyJpegApp
MAKE Package [==> Copy]
MAKE Package [==> Configuration]
APPLICATION --> pyJpegApp
APPVERSION --> V1.0
APPNAME0 --> Jpeg App by Python
ROMSIZE --> 2000
RAMSIZE --> 1000
FUNCID --> 0000FFA0
APPID --> 00003300
APPID --> 00003301
APPID --> 00003302
TRIALTIME --> -1
MODELID --> VRK_C301_LINUX (Automatic setting)
MAKE ZIP Package [==> Packing]
adding: python/hello.py (deflated 16%)
adding: python/pymain.py (deflated 54%)
adding: bin/pyJpegApp (deflated 60%)
adding: conf/profile.bin (deflated 11%)
adding: conf/applicense.bin (deflated 56%)
adding: conf/appPrefs.json (deflated 51%)
adding: data/ (stored 0%)
adding: setup/ (stored 0%)
adding: conf/appConf.json (deflated 17%)
MAKE EXT Package [==> Making pyJpegApp_V1_0_vrkc301.ext]
------ Finish! -----
3 Lobe
分類モデルは、Lobeで作成しました。
Webカメラで撮影しながら、分類したい映像をポチポチとクリックするだけで、簡単にデータセット作成出来ます。アヒルとトマト羊で、それぞれ60枚程度の画像を準備しました。
Lobeでは、TensorFlow Lite へのエクスポートが可能で、これを利用しています。
参考:ローカルで機械学習モデル(データ作成から学習・推論まで)が5分で出来てしまう、Lobeが凄すぎる
参考:[Lobe] Lobeで作成したモデルをTensorflow Lite形式でエクスポートしてMacで使用してみました
4 コード
コードは、SDKで提供されているサンプル、adamapp-py/image_classification_app をそのまま利用させて頂いています。
変更したのは、入力データをLobeで学習したものと合わせるために、0〜1.0の表現に変えたのと、推論結果の評価だけです。
class ImageClassification:
・・・(略)
#
# @brief execute function
# 画像分類実行関数
# @param img [in] memoryview 画像データ
#
def execute(self, img):
#分類に有効な画像サイズを取得
_, height, width, _ = self.m_interpreter.get_input_details()[0]['shape']
#サイズを変更
image = cv2.resize(img, (height, width))
#BGR -> RGB
image = image[:, :, [2,1,0]]
#0 〜 255 => 0.0 〜 1.0
image = image /255
#次元を増やす => (1, 244, 244, 3)
image = np.expand_dims(image, axis=0)
#テンサーフローへの入力
self.set_input_tensor(self.m_interpreter, image)
#推論実行
self.m_interpreter.invoke()
label = self.m_interpreter.get_tensor(self.m_interpreter.get_output_details()[0]["index"])[0].decode()
print("label:{}".format(label))
json_data = '{"label": "'
json_data += label
json_data += '"}'
# ファイル操作オブジェクト
filecontrol = FileControl()
# JSONファイル保存
filecontrol.save_file(json_data, ConstDefine.JSON_FILE_PATH)
・・・(略)
5 インストール
カメラへのインストールは、SDKで提供されている Google Chrome拡張機能で作業しています。Installボタンをクリックして、ファイルを選択するだけで簡単にインストールできます。 また、この拡張では、ログをTailで確認できたりして、非常に作業が捗ります。
インストールするのは、makeで生成された、拡張子 extのファイルです。
6 ブラウザ確認
ブラウザで確認している画面も、サンプル、adamapp-py/image_classification_app で提供されているものをそのまま利用させて頂いています。
http://<camaera_address>/cgi-bin/adam.cgi?methodName=sendDataToAdamApplication&installId=<install_id> &s_appDataType=0&s_appData=
7 最後に
今回は、パナソニック様の提供するVieureka(ビューレカ)で、簡単なアプリを作成してみました。と言っても、すいません、提供されているサンプルを、僅かに触っただけで、殆ど何もしてません。
SDKでは、非常に丁寧で分かりやすいドキュメントと充実したサンプルコードが提供されているため、初めてでも、殆ど戸惑うこと無く作業できました。
今度は、ちゃんと自分で何か作ってみたいです。