サンプルアプリケーションの作成

ここまででArmadillo Base OSでの開発環境の整備や、開発手順がわかったところで、いよいよサンプルアプリケーションを作成していきます。

初めに、USBカメラを使用しないサンプルアプリケーションを含むpodmanコンテナを作成し、その後それをベースにUSBカメラに対応したpodmanコンテナを作成します。

ここからはサンプルアプリケーション作成手順を各ステップ毎に説明していきますが、 こちらから完成したアプリケーションを含むpodmanコンテナイメージをダウンロードできます。

podmanコンテナイメージのインポート方法については、「作成したコンテナを他のArmadilloに組み込む」を参照してください。

6.1. サンプルアプリケーションの詳細

今回作成するサンプルアプリケーションの大まかな概要は、「本ドキュメントの成果物」で示したとおりですが、詳細について紹介します。

6.1.1. 詳細な動作

今回作成するアプリケーションの詳細な動作を図6.1「サンプルアプリケーションの詳細な動作の流れ」にまとめます。

./images/sample_operation.png

図6.1 サンプルアプリケーションの詳細な動作の流れ


図中の各処理について説明します。

6.1.1.1. USBカメラから画像を取得

基本的に画像の操作は、PythonのOpenCVライブラリを用いて行っていきます。

初めに、USBカメラまたは任意の動画ファイルから画像を取得します。

./images/gauge.jpg

図6.2 元画像


6.1.1.2. 画像からアナログメーターを検出

この部分に機械学習の物体検出を用います。 予めアナログメーターの画像を学習させておいたTFLite形式の推論モデルを用いて、取得した画像に対して推論を実行し、画像内のアナログメーターの有無とその位置を検出します。

検出できたならば次の処理に移り、検出できなければ取得した画像をHDMIモニタに出力して再度画像の取得を行います。

./images/cliped.png

図6.3 物体検出した箇所をもとに画像を切り出し


6.1.1.3. アナログメーター検出箇所から円を検出

アナログメーターを検出した部分のみを切り出し、その中でハフ変換を用いて円とその中心座標を検出します。

./images/circle.png

図6.4 円を検出


検出できたならばその円に外接する四角形で元の画像を切り抜きます。 これによって、物体検出による検出位置のズレや誤検出を吸収しつつ、画像内のアナログメーター部分のみを切り抜いています。

./images/circle_cliped.png

図6.5 画像の枠が円に外接するようにリサイズ


円を検出できなければ、取得した画像をHDMIモニタに出力して再度画像の取得を行います。

6.1.1.4. メーターの読み取り

アナログメーターの針の形をなす2本の直線をハフ変換を用いて検出します。 その2本の直線から針の角度を算出して、予め設定したparameter_sample.jsonの情報と照らし合わせてアナログメーターが示す値を求めています。

./images/houghlines.png

図6.6 直線を検出


求めた値を元画像に描画した上でHDMIモニタに出力します。

直線が検出できなかった場合や、求めた値がそのアナログメーターでは表示できない値であった場合は、読み取った値は画像に描画されずにHDMIモニタに出力します。

その後、再度画像の取得に戻ります。

以上が、本サンプルアプリケーションの動作です。

6.2. 推論モデルの作成 ./images/ML_icon.png

ここからはサンプルアプリケーションを作成手順を紹介していきます。

まずはじめに、アプリケーション本体の前に物体検出モデルを作成します。 以下の作業を本ドキュメントでは説明のためATDE上で行っていますが、他のPC上などでも問題ありません。 ATDE以外の環境で実行する際には、適宜各ソフトウェアの使用方法などを調べた上でご使用ください。

6.2.1. 教師データの用意

今回行う物体検出における転移学習では、既存の物体検出用の推論モデルであるMobileNet SSD v2をベースに、新たに検出させたい物が写った画像を含む教師データを用意して学習させることで、対象物を検出するモデルを効率よく作成します。

物体検出においては、検出させたい物が写った画像と、それらの画像内のどこに何があるかをラベル付けしたアノテーション情報の2つをまとめて教師データと呼びます。

機械学習用に教師データをデータセットという形で公開/販売しているところも存在しているので、使用上のライセンスをよく確認した上でそちらを使用しても問題ありません。

本ドキュメントでは既存のデータセットは使用せず、Web上から画像を収集して実際にアノテーションを行います。

6.2.1.1. 画像の用意

まずは教師データの元となる画像を収集します。 一から推論モデルを学習するのであれば数千枚ほどのデータがほしいところですが、今回は転移学習を用いるため、最低100枚程度からある程度の精度を出せます。

表6.1「画像収集に使用できるツール」に示すように、様々な機械学習向けに画像を収集できるツールが公開されているので、そちらを利用することで効率よく画像を集めることができます。

表6.1 画像収集に使用できるツール

ツール名概要

icrawler

Pythonで動作するウェブクローラのフレームワーク

Bing Image Search API

Microsoft社が無料提供しているBing画像検索API

Google Images Download

Googleの画像検索から画像を収集できるPythonスクリプト


上記の他にも、機械学習などで使用できる画像を収集できるツールやWebサイトなどが存在しているので、興味のある方は調べてみてください。

第三者がアップロードした画像を学習に使用する際には、著作権などの法律を十分に確認した上で、ご自身の責任において画像の収集・利用をして頂くようお願いします。

今回はGoogle Images Downloadを使用して、画像データを収集していきます。

まずインストールについてですが、Google Images Downloadはpipでインストールできます。 しかし執筆時点では最新のGoogle画像検索APIに対応できていませんので、有志がパッチを適用したものをインストールします。 Google Images Downloadのインストール時に必要なパッケージも合わせてインストールします。

[ATDE ~]$ sudo apt update && sudo apt upgrade -y
[ATDE ~]$ sudo apt install -y python3-pip
[ATDE ~]$ git clone https://github.com/Joeclinton1/google-images-download.git gid-joeclinton
[ATDE ~]$ cd gid-joeclinton && sudo python3 setup.py install

図6.7 Google Images Downloadのインストール


Google Images Downloadを使用して、gauge(アナログメーター)の画像を収集します。 Google Images Downloadは、ダウンロードする画像の拡張子と縦横のサイズ、ダウンロードする数を指定することができます。

ここでは、Googleで"gauge"と画像検索した際に得られる画像をjpg形式で100枚ダウンロードします。

[ATDE ~/gid-joeclinton]$ cd
[ATDE ~]$ mkdir -p dataset_gauge/annotations && cd dataset_gauge 1
[ATDE ~/dataset_gauge]$ googleimagesdownload -k "gauge" -l 100 -f jpg 2
Item no.: 1 --> Item name = gauge
Evaluating...
Starting Download...
: (省略)
Everything downloaded!
Total errors: 2 3
Total time taken: 54.75878143310547 Seconds

図6.8 Google Images Downloadの実行


1

作業ディレクトリを作成し、移動します

2

Google Images Downloadを実行します

3

ファイルによってはエラーとなるものがあり、必ずしも指定した枚数の画像を収集できるとは限りません

Google Images Downloadを用いて100枚より多くの画像を収集する際には、別途Google Chromeとchromedriverをインストールする必要があります。 詳しくは[公式ドキュメント](https://google-images-download.readthedocs.io/en/latest/troubleshooting.html#installing-the-chromedriver-with-selenium)を参照してください

図6.8「Google Images Downloadの実行」の実行例ならば98枚のgaugeで画像を検索した際の結果が得られました。

[ATDE ~/dataset_gauge]$ ls downloads/gauge/ | wc -l
98

図6.9 Google Images Downloadでダウンロードしたファイル


また、場合によっては壊れたファイルをダウンロードしてくる場合がありますので、その場合は適宜手動で削除してください。

その後、図6.10「画像ファイルを連番でリネーム」を実行して、ファイル名をリネームしておきます。

[ATDE ~/dataset_gauge]$ cd downloads/gauge/
[ATDE ~/dataset_gauge/downloads/gauge/]$ ls | awk '{ printf "mv %s %06d.jpg\n", $0, NR }' | sh
[ATDE ~/dataset_gauge/downloads/gauge/]$ ls
000001.jpg
000002.jpg
: (省略)

図6.10 画像ファイルを連番でリネーム


6.2.1.2. アノテーション

画像が用意できたら、次はその画像内のどこに何が写っているかを示すラベル付け(アノテーション)を行っていきます。 画像データの数によりますが、推論モデル学習の一連の流れの中で一番工数がかかる手順がこのアノテーション作業です。

表6.2「物体検出アノテーションに使用できるツール」にアノテーションする際によく使われるツールをまとめました。どれもWindows/Linux共に使用可能ですので、お好きなものをご使用ください。

表6.2 物体検出アノテーションに使用できるツール

ツール名概要

labelImg

Python+Qtで記述されたオープンソースアノテーションソフトウェア

VoTT

Microsoft社が提供しているオープンソースアノテーションソフトウェア

Labelbox

リッチなGUIで多機能なLabelbox社製ツール。基本無料で利用量が一定を超えると課金される点に注意


本ドキュメントでは、labelImgを使用してアノテーションを行っていきます。

labelImgは図6.11「labelImgをインストールする」に示すコマンドを実行することでインストールできます。

[ATDE ~]$ sudo pip3 install labelImg

図6.11 labelImgをインストールする


labelImgを起動するには、図6.12「Linux環境におけるlabelImg実行例」に示すコマンドを実行します。

[ATDE ~]$ labelImg

図6.12 Linux環境におけるlabelImg実行例


実行すると、図6.13「labelImgの起動」のようなlabelImgのアプリケーションウィンドウが立ち上がります。

./images/run_labelimg.png

図6.13 labelImgの起動


まず、アノテーション情報の保存形式を指定します。 今回はPascalVOC形式で保存します。

./images/set_pascalvoc.png

図6.14 出力形式の変更


アノテーションを開始するために、画面左の「ディレクトリを開く」をクリックして、アノテーションしたい画像が入ったディレクトリ(今回は~/dataset_gauge/downloads/gauge/)を指定します。

./images/open_dir.png

図6.15 アノテーション元の選択


さらに、アノテーション情報をどこに保存するかを設定します。 画面左の「保存先を変更する」をクリックして、アノテーション情報を保存したいディレクトリ(今回は~/dataset_gauge/annotations/)を指定します。

./images/open_annotation_dir.png

図6.16 アノテーション情報の保存先の選択


その後作業効率化のために、画面上部のツールバーの[表示]から、以下を有効化をしておくことをお勧めします。

  • 自動で保存する
  • 単一のラベルだけをアノテーションする
./images/setting_checkbox.png

図6.17 作業効率化のための設定1


さらに、画面右側にて、「指定されたラベル名を使う」にチェックを入れ、ラベル名を「gauge」とします。

./images/setting_label.png

図6.18 作業効率化のための設定2


表6.3「labelImgでよく使用するショートカットキー一覧」に、labelImgを使用したアノテーション作業中によく用いるショートカットキーを示します。 作業効率化のために使用することをお勧めします。 詳しくは、labelImgの画面上部のツールバーの[ヘルプ]→[ショートカット一覧を見る(英語)]から確認できます。

表6.3 labelImgでよく使用するショートカットキー一覧

ショートカットキー役割

W

矩形選択モードに切り替え

D

次の画像へ

A

前の画像へ


上記設定後、Wキーを押下して矩形選択モードに切り替え、マウス左ドラッグで画像内の対象物を選択します。 選択すると自動的に選択範囲がgaugeでラベル付けされます。

./images/labeling_gauge.png

図6.19 ラベル付け例


Dキー押下で次の画像へ切り替えられます。

以上の手順を用意した全ての画像に対して行っていきます。

アノテーションする際の注意事項としまして以下が挙げられます。

  • アノテーションのポリシーは作業中一貫させること

    • 見切れているものはアノテーションする/しない
    • 対象物の裏面や別角度の写真をアノテーションする/しない
    • 最終的に検出したい物を常に意識して作業する
  • 用意した全ての画像に対して必ずしもアノテーションしなければならないわけではない

    • 画像を用意したが、対象物がよく写っている画像でないならアノテーションしないことも重要

アノテーションが完了したら、保存先のディレクトリにアノテーション情報(.xmlファイル)が保存されていることを確認してください。

[ATDE ~/dataset_gauge/annotations]$ ls *.xml
000001.xml
000002.xml
: (省略)

図6.20 アノテーション情報ファイルを確認


次に、label_map.pbtxtというファイルを~/dataset_gauge/xmls/内に作成します。 物体検出は、画像を推論モデルに入力し、結果として「どこに」、「何が」あるかが返ってくるのですが、「何が」の部分は1から始まるIDで返ってきます。 label_map.pbtxtは、そのIDとラベル名を紐付けるファイルです。

本サンプルアプリケーションでは"gauge"のみを認識し、画面上にはメーターが指し示す値を表示させる仕様なので、アプリケーション本体ではこのラベルファイルは使用しません。 しかし、この後の推論モデルの学習時に使用するので、ここで作成しておきます。

今回作成するlabel_map.pbtxtの内容を図6.21「label_map.pbtxt作成例」に示します。

item {
  id: 1
  name: 'gauge'
}

図6.21 label_map.pbtxt作成例


以上でアノテーション作業は完了です。

6.2.2. 推論モデルの生成

教師データが用意できたら、いよいよ学習して独自の物体検出モデルを作成します。

「機械学習向け開発環境の準備 ./images/ML_icon.pngでも述べましたが、今回推論モデルの学習はGoogle Colaboratory上で行います。

ATDEのWebブラウザで、Armadillo-IoT_G4_create_detection_modelをGoogle Colaboratoryで開いてください。 そのノートブック内に転移学習とTFLite形式への変換の具体的な手順をテキストとソースコード内のコメントにてまとめています。

各セルに対してCtrl+Enterを押し、セルごとに実行していくことで転移学習済みTFLiteモデルを取得することができます。 実行には、全体で数十分程度時間がかかることにご注意ください。

結果としてArmadillo上で動作するTFLite形式のモデル(model.tflite)が得られます。

以上で推論モデルの作成は完了です。

6.3. podmanコンテナのベースイメージを選択する

推論モデルが作成できたらアプリケーションの作成を行いますが、先にそのアプリケーションが動作するコンテナイメージを作成します。

今回作成するサンプルアプリケーションでは、NPUやVPUをアプリケーション内で使用するため、アットマークテクノが提供しているサンプルコンテナイメージをベースとして使用します。

6.3.1. 開発前の準備

ここからはArmadillo-IoT ゲートウェイ G4上で作業を行います。

Armadillo Base OSでは全ての変更はRAM上に保持され、電源を切った段階でそれらの変更は消えて変更前の状態に戻ります。 運用時にはこの状態で問題ありませんが、開発時に変更した内容が再起動時に保持されないのは不都合です。

podmanコンテナ上での作業も同様に全て消えてしまうので、開発中は基本的に図6.22「podman関連ファイルをeMMC上に保存する」に示すコマンドを実行して、コンテナイメージやコンテナの中身などのpodman関連のファイルはeMMC上に保存するよう設定しておきます。

[armadillo /]# podman_switch_storage --disk

図6.22 podman関連ファイルをeMMC上に保存する


また、予めArmadillo-IoT ゲートウェイ G4の製品マニュアルの「VPUやNPUを使用する」の手順を行ってください。

6.3.2. サンプルコンテナをビルド

前述の通り、今回作成するサンプルアプリケーションは、アットマークテクノが提供しているサンプルコンテナイメージをベースに開発を行います。 そのため、まずはそのサンプルコンテナイメージを生成します。

Armadillo-IoT ゲートウェイ G4 コンテナから「Debian 11 (bullseye) サンプル Dockerfile」をダウンロードしてください。 [VERSION]は適宜読み替えてください。

[armadillo /]# wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/container/at-debian-image-dockerfile-[VERSION].tar.gz

図6.23 Dockerfileのダウンロード


図6.24「サンプルコンテナのイメージのビルド」に示すコマンドを実行することで、アットマークテクノが提供しているサンプルコンテナイメージをArmadillo-IoT ゲートウェイ G4上でビルドできます。 ここでは"abos-dev-guide"という名称で、"v0.0.0"というタグ名のコンテナを作成しています。

[armadillo /]# tar xzf at-debian-image-dockerfile-[VERSION].tar.gz
[armadillo /]# cd at-debian-image-dockerfile-[VERSION]
[armadillo /]# podman build -t abos-dev-guide:v0.0.0 .
: (省略)
[armadillo /]# podman images abos-dev-guide
REPOSITORY                TAG         IMAGE ID      CREATED             SIZE
localhost/abos-dev-guide  v0.0.0      c38bd7464cd8  About a minute ago  234 MB

図6.24 サンプルコンテナのイメージのビルド


6.3.3. コンテナ内に入る

作成したコンテナの中に入り、開発作業を行います。

図6.25「コンテナ内に入る」に示すコマンドを実行することで、コンテナの中に入ることができます。 この時、後にサンプルアプリケーションを動作させるために必要になるオプションも指定しておきます。

[armadillo /]# podman run -ti \
        --name=sample_container \
        --env=XDG_RUNTIME_DIR=/tmp \
        --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu \
        --device=/dev/tty1 \
        --device=/dev/input \
        --device=/dev/dri \
        --device=/dev/galcore \
        --device=/dev/mxc_hantro \
        --device=/dev/mxc_hantro_vc8000e \
        --device=/dev/ion \
        --volume=/run/udev:/run/udev:ro \
        --volume=/opt/firmware:/opt/firmware:ro \
        --cap-add "SYS_TTY_CONFIG" \
        localhost/abos-dev-guide:v0.0.0 /bin/bash
[container /]#

図6.25 コンテナ内に入る


6.4. アプリケーション実行の準備をする

アットマークテクノが提供しているサンプルコンテナには、必要最低限のパッケージしかインストールされていません。 このままでは、サンプルアプリケーションのダウンロードや実行ができませんので、最初に必要なパッケージをインストールしておきます。

[container /]# apt update
[container /]# apt install -y \
   wget \
   procps \
   python3 \
   python3-pip \
   python3-opencv \
   python3-numpy \
   python3-tflite-runtime \
   nn-imx \
   gstreamer1.0-tools \
   gstreamer1.0-plugins-bad \
   gstreamer1.0-plugins-good \
   gstreamer1.0-imx
[container /]# pip3 install pillow

図6.26 コンテナへパッケージをインストール


6.5. アプリケーションを作成する

podmanコンテナ内で実行するアプリケーションを作成します。

以下では開発の際の手順の一例を紹介しますが、サンプルアプリケーションは こちらから作成済みのものをダウンロードしてご使用ください。

コンテナ内で図6.27「サンプルアプリケーションのダウンロードと展開」に示すコマンドを実行することで、サンプルアプリケーションをダウンロード・展開できます。 今回は、/opt以下にアプリケーションファイルを展開します。

[container /]# cd /opt
[container /opt]# wget https://download.atmark-techno.com/armadillo-iot-g4/example/armadillo-base-os-dev-guide/read_meter.tar.gz
[container /opt]# tar xzf read_meter.tar.gz
[container /opt]# rm read_meter.tar.gz

図6.27 サンプルアプリケーションのダウンロードと展開


6.5.1. ファイル構成

ダウンロードしたファイルを展開すると、read_meterというディレクトリが現れます。

システムを構成するファイルは全てread_meterディレクトリに配置されています。 配置した各ファイルと、その役割を図6.28「サンプルアプリケーションを構成するファイル」に示します。

read_meter
|-- gauge_sample.mp4 1
|-- model.tflite 2
|-- modules
|   |-- __init__.py
|   |-- inferencer.py 3
|   `-- meter.py 4
|-- parameter_sample.json 5
`-- read_meter 6

図6.28 サンプルアプリケーションを構成するファイル


1

アナログメーターが映り続けた動画です。USBカメラの代わりに入力映像として使用できます。

2

TFLite形式の推論モデルファイルです。

3

物体検出に関わる処理を記したPythonモジュールファイルです

4

メーター読み取りに関わる処理を記したPythonモジュールファイルです

5

読み取るアナログメーターの中心座標や、各スケールの座標などを記録したファイルです。

6

アプリケーション本体です。

6.5.2. コンテナ内のファイルの編集

実際にArmadilloで動かすソフトウェア開発を行う場合、ATDE等の他の環境で作成したアプリケーションをArmadilloのコンテナ内に転送して動かすことが一般的です。

転送方法は様々ありますが、開発時にATDEとArmadilloが同一ネットワーク内にあればATDEがデフォルトで起動しているウェブサーバ機能を使用する方法が手軽です。

[ATDE ~/]$ sudo cp file /var/www/html

: (以下Armadillo内のコンテナ内での作業)
[container /]# wget http://[ATDEのIPアドレス]/file
[container /]# ls file
file

図6.29 ATDEからArmadilloへファイルを送信


もちろんArmadillo内でファイルの編集をすることも可能です。 アットマークテクノが提供しているサンプルコンテナイメージには、デフォルトではエディタが含まれていないので、図6.30「コンテナ内にエディタをインストールする」に示すコマンドを実行することでお好きなエディタ(この例ではvim)をインストールできます。

[container /]# apt update && apt upgrade
[container /]# apt install -y vim

図6.30 コンテナ内にエディタをインストールする


ただし、基本的にはエディタはアプリケーションを実行するだけの本番環境には必要ないため、最終的なコンテナイメージのサイズ削減のためにも、開発完了時にはアンインストールするか別途実行用のコンテナを作成することをお勧めします。

6.5.3. アプリケーションの動作確認

コンテナ内にアプリケーションを配置できたら動作確認をしてみましょう。 予めArmadillo-IoT ゲートウェイ G4をHDMIケーブルでモニタと接続しておいてください。

今回はサンプルアプリケーションの動作確認として図6.31「サンプルアプリケーションの動作確認」に示すコマンドを実行します。 ここではUSBカメラは使用せず、gauge_sample.mp4を映像の入力として動作確認をします。

[container /]# cd /opt/read_meter
[container /opt/read_meter]# weston --tty=1 &
[container /opt/read_meter]# ./read_meter --model model.tflite --param_file parameter_sample.json --video gauge_sample.mp4

図6.31 サンプルアプリケーションの動作確認


図6.32「Armadillo-IoT ゲートウェイ G4への周辺機器の接続」のような画面が表示されれば正しく動作しています。

./images/op_check.png

図6.32 Armadillo-IoT ゲートウェイ G4への周辺機器の接続


Ctrl+Cでサンプルアプリケーションを終了させます。 動作確認が完了したら、westonは終了させます。

[container /opt/read_meter]# pkill weston //バックグラウンドのwestonを終了

図6.33 westonを終了


以上でアプリケーションの作成は完了です。

6.5.4. podmanコンテナの保存

コンテナ内の編集が完了しても、この後にコンテナを停止したりArmadilloの電源をOFFにしたりすると、ここまで編集してきたコンテナ内の変更の差分がなくなってしまいます。 そのため、podmanコンテナ内の整備が完了したらコンテナ内の変更を保存する必要があります。

まず、 exit コマンドを実行してコンテナから抜けます。

[container /]# exit
[armadillo ~]# //コンテナから抜けた

図6.34 podmanコンテナから抜ける


図6.34「podmanコンテナから抜ける」の方法でコンテナから抜けると、コンテナは停止します。

起動中のコンテナは図6.35「起動中のpodmanコンテナを確認する」に示すコマンドで確認できます。

[armadillo ~]# podman ps
CONTAINER ID  IMAGE                                   COMMAND     CREATED         STATUS             PORTS       NAMES
//sample_containerが起動中でないことを確認

図6.35 起動中のpodmanコンテナを確認する


停止中のコンテナは図6.36「停止中のpodmanコンテナを確認する」に示すコマンドで確認できます。

[armadillo ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND     CREATED        STATUS                     PORTS       NAMES
9c908ab45ed8  localhost/abos-dev-guide:v0.0.0  /bin/bash   3 minutes ago  Exited (0) 12 seconds ago              sample_container

図6.36 停止中のpodmanコンテナを確認する


次に、 podman commit コマンドで先程までの変更内容を保存します。 図6.37「podmanコンテナの変更を保存する」は、変更後の"sample_container"を"abos-dev-guide"というイメージ名、"v1.0.0"というタグ名で保存する例です。

[armadillo ~]# podman commit sample_container abos-dev-guide:v1.0.0
[armadillo ~]# podman images abos-dev-guide //保存されたことを確認
REPOSITORY                TAG         IMAGE ID      CREATED             SIZE
localhost/abos-dev-guide  v1.0.0      d0de8c2e70f0  About a minute ago  901 MB
localhost/abos-dev-guide  v0.0.0      c38bd7464cd8  2 hours ago         234 MB

図6.37 podmanコンテナの変更を保存する


タグ名の部分でコンテナイメージのバージョン管理を行うことが可能です。

podman commit することで、コンテナ内で行った変更がeMMC内に保存され、Armadillo本体の電源を切ったり、コンテナを削除してもcommitした箇所までが保持されます。 開発時にArmadiiloの電源を切る場合は、commitを行ったことを確認してから電源を切ってください。

6.5.5. podmanコンテナのエクスポート

Armadillo-IoT ゲートウェイ G4上で作成したpodmanコンテナイメージは、他のArmadillo-IoT ゲートウェイ G4上でも動作します。 作成したpodmanコンテナイメージを他のArmadilloに書き込む方法として以下があります。

  1. podmanコンテナイメージを外部ストレージなどに保存する
  2. dockerhubなどのリモートリポジトリに保存する

以下では、作成したコンテナイメージをUSBメモリに保存する方法を紹介します。 予めArmadilloに4GB以上の空き容量があるUSBメモリを挿入してください。

図6.38「podmanコンテナイメージを外部ストレージに出力する」は、USBメモリの第1パーティション(/dev/sda1)にabos-dev-guide.tarという名前でabos-dev-guideのv1.0.0を保存する例です。

[armadillo ~]# mount /dev/sda1 /mnt 1
[armadillo ~]# podman save -o /mnt/abos-dev-guide.tar abos-dev-guide:v1.0.0 2

図6.38 podmanコンテナイメージを外部ストレージに出力する


1

USBメモリなどの外部記憶デバイスをマウント

2

USBメモリにイメージ名:abos-dev-guide、タグ名:v1.0.0をabos-dev-guide.tarで保存

保存したコンテナイメージは、SWUpdateのswuパッケージに含ませたり、 podman load コマンドで読み込んだりすることで、他のArmadillo上で動かすことができます。

6.5.6. podmanコンテナとアプリケーションの自動実行

最後に、Armadillo-IoT ゲートウェイ G4の起動時に、作成したpodmanコンテナ及びコンテナ内の自作アプリケーションが自動実行するように設定します。

Armadillo Base OSでは、起動時に podman_start というスクリプトを実行して、/etc/atmark/containers/以下の.confファイルを参照し、そこで指定されているコンテナを起動します。

各種設定方法について、詳しくは製品マニュアルをご確認ください。 以下では、本サンプルアプリケーション向けの設定を示します。

6.5.6.1. confファイルの作成

コンテナの外で/etc/atmark/containers/sample_container.confを作成します。

image="localhost/abos-dev-guide:v1.0.0"
devices="/dev/tty1 /dev/input /dev/dri /dev/galcore /dev/mxc_hantro /dev/mxc_hantro_vc8000e /dev/ion"
volumes="/run/udev:/run/udev:ro /opt/firmware:/opt/firmware"
readonly=false
append_args --env=XDG_RUNTIME_DIR=/tmp
append_args --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu
append_args --cap-add=SYS_TTY_CONFIG
append_args -w /opt/read_meter
set_command /bin/bash -c "
weston --tty=1 & \
python3 read_meter \
        --model model.tflite \
        --param_file parameter_sample.json \
        --video gauge_sample.mp4"

図6.39 sample_container.conf作成例


なお、図6.39「sample_container.conf作成例」に示したconfファイルは こちらからダウンロード可能です。

[armadillo /]# wget https://download.atmark-techno.com/armadillo-iot-g4/example/armadillo-base-os-dev-guide/sample_container.conf -O /etc/atmark/containers/sample_container.conf

図6.40 sample_container.confのダウンロード


6.5.6.2. 設定の確認

「confファイルの作成」で作成したconfファイルの設定が正しく出来ているかを確認します。

図6.41「podman_startの実行例」を実行すると、/etc/atmark/containers/sample_container.confファイルの内容に従ってコンテナが起動します。 これにより正常にコンテナとサンプルアプリケーションが起動することを確認します。

[armadillo ~]# podman_start sample_container

図6.41 podman_startの実行例


正常にサンプルアプリケーションが実行されると、「アプリケーションの動作確認」で動作確認した時と同様の画面が表示されます。

ここまでの動作確認が完了したら、/etc/atmark/containers/sample.confを persist_file コマンドで永続化します。

[armadillo ~]# persist_file /etc/atmark/containers/sample_container.conf

図6.42 sample_container.confの永続化


図6.42「sample_container.confの永続化」を実行することにより、作成したsample_container.confが再起動後もeMMC内に残り、次回以降Armadilloに電源を投入した際にコンテナが自動起動します。

podman_start によって起動したコンテナも図6.43「コンテナの停止・削除」に示すコマンドで停止、削除できます。

[armadillo ~]# podman stop sample_container 1
[armadillo ~]# podman rm sample_container 2

図6.43 コンテナの停止・削除


1

sample_containerを停止します。

2

sample_containerを削除します。

6.6. 動作確認

最後に動作確認を行います。

周辺機器の接続後、Armadillo-IoT ゲートウェイ G4に電源を投入してください。

しばらくすると自動的にアプリケーションが起動して、サンプルの動画ウィンドウをHDMIモニタに映し出します。 青い四角は、物体検出にてアナログメーターだと検知した箇所です。

./images/detection_window.png

図6.44 サンプル動画に対して物体検出


この状態でしばらく待つと、アナログメーターが指す値が変わっていき、スケールの最小値である0を超えた辺りから青い四角の上に読み取れた数値が表示されます。

./images/read_meter.png

図6.45 サンプル動画内のアナログメーターを読む


動画が終了すると、アプリケーション及びコンテナが停止します。

ここまでを確認できたならば、本ドキュメントにおけるサンプルアプリケーションは完成です。

6.7. USBカメラから映像を取得するように変更

以降の手順はUSBカメラを使用するオプションです。

ここまでで作成したアプリケーションは、サンプル動画を映像入力としてメーターの読み取りを行っています。 USBカメラと撮影対象のアナログメーターをお持ちの場合は、USBカメラから映像を取得し、任意のアナログメーターの値を読むことも可能です。

sample_containerが起動している場合は、図6.43「コンテナの停止・削除」のコマンドを実行して停止・削除しておいてください。

6.7.1. 撮影対象のparameter.jsonを作成

本サンプルアプリケーションでは、アナログメーターの値を読む為に、各アナログメーターの中心とスケールがなす角度などのパラメータを保存したjsonファイルが必要になります。 サンプル動画以外のアナログメーターに対応させるためには、撮影対象となるアナログメーターの中心と各スケールの座標等を示すparameter.jsonを作成し、コンテナ内のアプリケーションから読み出す必要があります。

ここでは、サンプルアプリケーション向けのパラメータファイルを作成するためのPythonスクリプトについて紹介します。

アナログメーターを正面から捉えた画像から各点の座標を取得できるPythonスクリプト(config_param.py)を こちらからダウンロードできます。

図6.46「config_param.pyのダウンロードと起動」に、image.pngをアナログメーターを正面から捉えた画像とした時の、config_param.pyの実行例を示します。

[ATDE ~/]$ wget https://download.atmark-techno.com/armadillo-iot-g4/example/armadillo-base-os-dev-guide/config_param.py
[ATDE ~/]$ python3 config_param.py --image image.png

図6.46 config_param.pyのダウンロードと起動


./images/image.png

図6.47 アナログメーターを正面から捉えたサンプル画像(image.png)


実行すると以下のようなウィンドウが出現するので、アナログメーターの中心をクリックしてください。

./images/select_center.png

図6.48 アナログメーターの中心をクリック


選択された中心点は赤い点で描画され、中心の選択は何度もやり直すことができます。 選択が完了したら、何かキーを押下してください。

次に、以下のようなウィンドウが出現するので、アナログメーターが示すことができる最低値から順に、スケールの位置をクリックしてください。

./images/select_scales.png

図6.49 各スケールの位置をクリック


クリックした位置と順番は画面に描画されます。 右クリックで一個前の選択を取り消すことができます。 選択が完了したら、何かキーを押下してください。

次に、コンソールでクリックした位置の値を入力してください。 コンソールで表示されているx個目と画面内の選択点の数値は対応しています。 入力したらEnterキーを押下し、選択した点の数だけこれを繰り返してください。

0個目の数値> -25
1個目の数値> -20
2個目の数値> -10
3個目の数値> 0
4個目の数値> 10
5個目の数値> 20
6個目の数値> 30
7個目の数値> 40
8個目の数値> 50
9個目の数値> 55
Done!

図6.50 各スケールの数値を入力


最後まで入力すると、「Done!」と表示され、parameter.jsonが出力されています。

[ATDE ~/]$ ls parameter.json
parameter.json

図6.51 各スケールの数値を入力


出力されたparameter.jsonは、任意の方法でArmadilloに転送してください。

6.7.2. パラメータファイルの配置

作成したパラメータファイルを、コンテナ内のアプリケーションに読み込ませます。

読み取りたいアナログメーター1つにつき、パラメータファイルを1つ用意する都合上、何度も書き換えることになりそうなファイルです。 このパラメータファイルをコンテナイメージの中に含めるとすると、ファイルの差し替え時には毎回コンテナイメージを作り直す必要があり手間です。

このようなファイルはコンテナイメージ内に含めず、Armadillo Base OSが提供するデータ保存用ディレクトリに保存し、コンテナにvolumeとして渡す方法がお勧めです。

データ保存用ディレクトリは、/var/app/volumesと/var/app/rollback/volumesの2種類が用意されています。 それぞれの詳細については、Armadillo-IoT ゲートウェイ G4の製品マニュアルの「 データを保存する」を参照してください。

今回は/var/app/rollback/volumesを使用します。

まず、コンテナの外で図6.52「/var/app/rollback/volumes/assetsの作成」に示すコマンドで、/var/app/rollback/volumes/の下にassetsディレクトリを作成します。

[armadillo ~]# mkdir -p /var/app/rollback/volumes/assets

図6.52 /var/app/rollback/volumes/assetsの作成


次に、作成したパラメータファイル(parameter.json)を/var/app/rollback/volumes/assetsの中に配置します。

[armadillo ~]# cp /path/to/parameter.json /var/app/rollback/volumes/assets

図6.53 parameter.jsonを配置


以上でパラメータファイルの配置は完了です。

なお、データ保存用ディレクトリである/var/app/volumes及び、/var/app/rollback/volumesに配置したファイルは、eMMC上に保存されるため再起動後も消えずに残り続けます。

6.7.3. .confファイルの設定

以下の2点に対応させるために、/etc/atmark/containers/sample_container.confを図6.54「USBカメラを使用するsample_container.conf作成例」のように編集します。 ほとんどUSBカメラ対応前と同じですが、異なる部分のみ注釈で解説します。

  1. サンプルアプリケーションの映像入力を動画ではなくUSBカメラにする
  2. 「パラメータファイルの配置」で配置したparameter.jsonをコンテナ内で使用する
image="localhost/abos-dev-guide:v1.0.0"
devices="/dev/tty1 /dev/input /dev/dri /dev/galcore /dev/mxc_hantro /dev/mxc_hantro_vc8000e /dev/ion /dev/video*" 1
volumes="/run/udev:/run/udev:ro /opt/firmware:/opt/firmware assets:/assets:ro" 2
readonly=false
append_args --env=XDG_RUNTIME_DIR=/tmp
append_args --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu
append_args --cap-add=SYS_TTY_CONFIG
append_args -w /opt/read_meter
set_command /bin/bash -c "
weston --tty=1 & \
python3 read_meter \
        --model model.tflite \
        --param_file /assets/parameter.json \ 3
        --camera 3" 4

図6.54 USBカメラを使用するsample_container.conf作成例


1

USBカメラを使用するために/dev/video*を追加します。

2

作成したassetsディレクトリをコンテナに渡します。

3

パラメータファイルはコンテナ内では/assets/parameter.jsonに配置されていますので、そこを指定します。

4

"--video…" の行を削除し、"--camera 3" に修正します。

volumesに相対パスを指定すると、/var/app/rollback/volumes以下のディレクトリを指定したことになります。

サンプルアプリケーションは、起動時のオプションに"--camera <デバイス番号>"を指定することで、/dev/video<デバイス番号>のカメラデバイスから映像を取得します。 <デバイス番号>は、USBカメラ接続時のログなどから判断してください。

6.7.4. 自動実行の確認

podman_start コマンドでコンテナが起動することを確認します。

[armadillo /]# podman_start sample_container

USBカメラから映像とアナログメーターの値を取得できることを確認します。

./images/read_meter_from_usb_cam.png

図6.55 USBカメラの映像からアナログメーターの値を取得


次回Armadillo起動時に自動実行させるには、/etc/atmark/containers/sample_container.confを persist_file コマンドで永続化させます。

[armadillo ~]# persist_file /etc/atmark/containers/sample_container.conf

図6.56 sample_container.confの永続化