...
Docker環境は、AdamAppSDKがインストールされたUbuntu上に構築します。
チュートリアルでのインストール対象OS
Ubuntu SDK v1.71以前:Ubuntu 18.04.2 LTS (bionic)
SDK v1.80以降:Ubuntu 22.04.3 LTS (Jammy Jellyfish)
あらかじめAdamAppSDK開発環境を構築してください。(本チュートリアルでは省略します)
Info |
---|
SDK ver.1.80以降にて、既にAdamAppSDK開発環境を構築されている場合、重複して実施している手順があります。実施不要な箇所は適宜省略して作業してください。 |
また、apt-getコマンドなどを使ってソフトのインストールを行いますので、apt-getが可能なインターネット接続と、インストールが可能な権限(root権限など)設定も実施しておいてください。
...
Code Block |
---|
$ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common \ qemu-user-static |
リポジトリを追加する(apt-keyコマンドを利用する場合)
Note |
---|
apt-key コマンドは廃止時期は未定ですが廃止予定となっております。後述のapt-keyコマンドを利用しない方法をお試しください。リポジトリ追加方法は1つの例ですので、代替方法は各自でご検討ください。 |
Docker社提供のUbuntu用aptリポジトリをシステムに追加します。
Docker社オフィシャルPGPキーをシステムに追加します。
Code Block | ||
---|---|---|
| ||
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - OK | ||
Note | ||
apt-key コマンドは廃止予定となっております。廃止時期は未定ですが代替方法は各自でご検討ください。 |
Info |
---|
|
PGPキーを追加したら、fingerprintがこのようになっているか確認してください。
Code Block | ||
---|---|---|
| ||
$ sudo apt-key fingerprint 0EBFCD88 pub rsa4096 2017-02-22 [SCEA] 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid [ unknown ] Docker Release (CE deb) docker@docker.com sub rsa4096 2017-02-22 [S] |
次に、Docker公式aptリポジトリをシステムに追加します。
Code Block | ||
---|---|---|
| ||
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |
Info |
---|
|
aptリポジトリを追加したら、/etc/apt/sources.listにリポジトリが追加されていることを確認してください。
Code Block | ||
---|---|---|
| ||
$ cat /etc/apt/sources.list (省略) deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable # deb-src [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable |
...
リポジトリを追加する(apt-keyコマンドを利用しない場合)
Note |
---|
apt-key コマンドは廃止予定となっておりますので、代替方法の例を示しています。代替方法は各自で検討ください。コマンドは廃止予定となっておりますので、代替方法の例を示しています。代替方法は各自で検討ください。また、既にapt-keyコマンドを利用した環境でDockerイメージを作成している場合はDockerコンテナから作成をやり直さないと正常に動作しない可能性があります。ご注意ください。 |
Docker社提供のUbuntu用aptリポジトリをシステムに追加します。
...
Code Block | ||
---|---|---|
| ||
$ cd ${SDK_DIR}/external/build/sample/docker/ $ docker build -t compile/ubuntu-rel:0.1 . |
Info |
---|
エラーが出るなどして失敗した場合、下記を実施ください。 |
作成が完了したら、compile/ubuntu-relというリポジトリが作成されていることを確認してください。
...
Note |
---|
Dockerfileが存在するディレクトリに、以下の2ファイルが存在することを確認してください。
これらのファイルはPythonモジュール作成時に必要であるため、削除しないでください。 |
Pythonモジュールをコンパイルする(Numpy, OpenCV)
手順
AdamApp用Pythonモジュールは、以下の手順で作成します。
${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリにソースファイルを配置する。
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.sh にコンパイル手順を記載する。
dockerを実行し、コンパイルを行う。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_pathディレクトリに作成されたモジュールが配置される。
チュートリアルとして、NumPyとOpenCVのコンパイルを実施します。
Note |
---|
VirtualBox環境の場合、共有フォルダ上で作業するとコンパイルに失敗します。 |
ソースコードをダウンロードする
NumpyとOpenCVのソースコードを以下URLからダウンロードしてください。
このチュートリアルでは、Numpy 1.19.4、OpenCV 3.4.7を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
Numpy 1.19.4:
https://github.com/numpy/numpy/archive/v1.19.4.tar.gz
OpenCV 3.4.7:
...
qemuインストール
コンテナ版追加アプリを作成するために、開発環境にインストールする必要のある、qemuのインストール方法を記載します。Dockerイメージの作成が完了している場合はqemuのインストールは不要ですので、次の章に進んでください。
Info |
---|
PCを再起動すると、build可能なアーキテクチャにlinux/arm64が表示されなくなる場合があります。その際は、再度同じ手順でqemuをインストールしてください。 |
qemuのインストール
Code Block |
---|
sudo apt update
sudo apt-get install qemu binfmt-support qemu-user-static # Install the qemu packages
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # This step will execute the registering scripts |
docker buildxの準備
experimental 機能や BuildKit を使うため、環境変数を追加設定 & 反映 します。
設定ファイルを開く
Code Block vi ~/.bashrc
以下を末尾に追加
Code Block export DOCKER_CLI_EXPERIMENTAL=enabled export DOCKER_BUILDKIT=1
保存
buildxが使えるようになっているか確認。
Code Block docker --help | grep buildx
出力例
Code Block buildx* Docker Buildx (Docker Inc., v0.10.5)
現在build可能なアーキテクチャを確認。
Code Block docker buildx ls
出力例
Code Block NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS default * docker default default running v0.11.7-0.20230525183624-798ad6b0ce9f linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386, linux/arm64, linux/riscv64, linux/ppc64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
この出力の中に linux/arm64 があれば成功です。
Pythonモジュールをコンパイルする(Numpy, OpenCV)
...
手順
AdamApp用Pythonモジュールは、以下の手順で作成します。
${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリにソースファイルを配置する。
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.sh にコンパイル手順を記載する。
dockerを実行し、コンパイルを行う。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_pathディレクトリに作成されたモジュールが配置される。
チュートリアルとして、NumPyとOpenCVのコンパイルを実施します。
Note |
---|
VirtualBox環境の場合、共有フォルダ上で作業するとコンパイルに失敗します。 |
ソースコードをダウンロードする
NumpyとOpenCVのソースコードを以下URLからダウンロードしてください。
このチュートリアルでは、Numpy 1.19.4、OpenCV 3.4.7を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
Numpy 1.19.4:
https://github.com/numpy/numpy/archive/v1.19.4.tar.gz
OpenCV 3.4.7:
ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。
コンパイル手順ファイルを更新する
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。
Info |
---|
コンパイル手順を更新するときは、以下にご注意ください。
|
サンプルスクリプトとして、NumpyとOpenCVをコンパイルするためのmodule_compile.shを用意しています。
チュートリアルではmodule_compile.shを変更せずに進めます。
コンパイルする
Dockerを用いてNumPyモジュールとOpenCVモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
Code Block |
---|
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1 |
external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。
Info |
---|
|
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルでは${SDK_DIR}/src/adamapp-py/jpeg_appを例とします。
Numpyを配置する
NumPyモジュールは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpy
ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpy ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/numpy
OpenCVを配置する
OpenCV Python用モジュールは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/dist-packages/cv2
ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/dist-packages/cv2 ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/cv2
OpenCVは、Python用モジュールだけではなくOpenCVライブラリも必要となるため、あわせて配置します。
OpenCVライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib
libopencv_world.so.3.4.7を以下のディレクトリにコピーしてください。
Info |
---|
externalフォルダ以降は手動で作製ください。 |
例)${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libopencv_world.so.3.4.7 ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu |
コピーしたら、シンボリックリンクを作成してください。
Code Block | ||
---|---|---|
| ||
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ ln -s libopencv_world.so.3.4.7 libopencv_world.so.3.4
$ ln -s libopencv_world.so.3.4 libopencv_world.so |
不要なファイルを削除する
AdamAppでは、Pythonキャッシュファイル(__pycache__)は使用しません。
容量削減のため削除することをお勧めします。
Code Block | ||
---|---|---|
| ||
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/
$ find . -name *pycache* -print | xargs rm -rf |
また、作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。
アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。
Code Block | ||
---|---|---|
| ||
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.3.4.7 |
サンプルアプリをビルドする
サンプルアプリ「jpeg_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。
ビルド方法は各SDKバージョンに応じて実施ください。
アプリ画面を開いて(下記画像の赤枠ボタン)、カメラが撮影したjpeg画像が表示されていれば成功です。
...
Pythonモジュールをコンパイルする(SQLite)
...
NumpyとOpenCVのコンパイルを実施することができました。
次のチュートリアルとして、SQLiteのコンパイルを実施します。
ソースコードをダウンロードする
sqliteとPythonのソースコードを以下URLからダウンロードしてください。
このチュートリアルでは、sqlite 3.40.0、Python 3.7.9 を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
sqlite 3.40.0
https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz
Python 3.7.9
ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。
コンパイル手順ファイルを更新する
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
Code Block |
---|
#!/bin/sh -x
HOME_PATH=/home/docker
LIB_INSTALL_DIR=${HOME_PATH}/install_path
SQLITE_ARCHIVES=sqlite-autoconf-3400000.tar.gz
SQLITE_DIR=sqlite-autoconf-3400000
SQLITE_BUILD_DIR=sqlite-autoconf-3400000/build
PYTHONPATH=$PYTHONPATH:${NUMPY_SITE_PACKAGES}
export PYTHONPATH
PYTHON_ARCHIVES=Python-3.7.9.tgz
PYTHON_DIR=Python-3.7.9
## for sqlite
cd ${HOME_PATH}
tar zxf ${SQLITE_ARCHIVES}
mkdir -p ${SQLITE_BUILD_DIR}
cd ${SQLITE_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install
## for python
cd ${HOME_PATH}
tar zxf ${PYTHON_ARCHIVES}
cd ${PYTHON_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install |
コンパイルする
Dockerを用いてsqliteモジュールとPythonモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
Code Block |
---|
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1 |
${SDK_DIR}/external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルではsrc/adamapp-py/sqlite_appを例とします。
Note |
---|
sqlite_app の動作にはSDカードが必要です。SDカードを挿入できるカメラのみ確認可能です。 |
SQLiteを配置する
sqliteライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib
libsqlite3.so
libsqlite3.so.0
libsqlite3.so.0.8.6
libsqlite3.la
libsqlite3.a
上記5ファイルを、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.so ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu $ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.so.0 ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu $ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.so.0.8.6 ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu $ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.la ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu $ cp -R ${SDK_DIR}/external/build/sample/docker/docker |
...
コンパイル手順ファイルを更新する
_volume/install_path/lib/libsqlite3.a ${SDK_DIR}/src/adamapp-py/sqlite_app/external/ |
...
Info |
---|
コンパイル手順を更新するときは、以下にご注意ください。 dockerを実行した際、$lib/aarch64-linux-gnu |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/
...
src/
...
ソースファイルやコンパイルディレクトリも/home/dockerに配置されます。
...
コンパイル済みモジュールは/home/docker/install_pathにインストールするようにしてください。
...
OpenCVのコンパイルには、NumPyモジュールが必要になります。
サンプルスクリプトとして、NumpyとOpenCVをコンパイルするためのmodule_compile.shを用意しています。
チュートリアルではmodule_compile.shを変更せずに進めます。
コンパイルする
...
adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so
${SDK_DIR}/src/adamapp-py/sqlite_app/external/
...
Code Block |
---|
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1 |
external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。
Info |
---|
|
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
...
lib/aarch64-linux-gnu/libsqlite3.so.0
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0.8.6
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.la
${SDK_DIR}/src/adamapp-py/
...
Numpyを配置する
...
sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.a
Python用sqliteを配置する
Python用sqliteモジュールは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpysqlite3
ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpysqlite3 ${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages |
...
${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/numpysqlite3
...
Python用sqliteは、モジュールだけではなくライブラリも必要となるため、あわせて配置します。
OpenCV Python用モジュールは以下のディレクトリにインストールされています。Python用sqliteライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/distlib-packages/cv2
...
dynload
_sqlite3.cpython-37m-aarch64-linux-gnu.soを以下のディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/sqlite3
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/distlib-packages/cv2dynload/_sqlite3.cpython-37m-aarch64-linux-gnu.so ${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/sqlite3 |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/cv2
OpenCVは、Python用モジュールだけではなくOpenCVライブラリも必要となるため、あわせて配置します。
OpenCVライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib
libopencv_world.so.3.4.7を以下のディレクトリにコピーしてください。
Info |
---|
externalフォルダ以降は手動で作製ください。 |
例)$sqlite3/_sqlite3.cpython-37m-aarch64-linux-gnu.so
次に、import時にPython用sqliteライブラリを読み込めるよう、dbapi2.pyを修正します。
${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libopencv_world.so.3.4.7 ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu |
コピーしたら、シンボリックリンクを作成してください。
Code Block | ||
---|---|---|
| ||
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ ln -s libopencv_world.so.3.4.7 libopencv_world.so.3.4
$ ln -s libopencv_world.so.3.4 libopencv_world.so |
不要なファイルを削除する
AdamAppでは、Pythonキャッシュファイル(__pycache__)は使用しません。
容量削減のため削除することをお勧めします。
...
language | bash |
---|
...
sqlite_app/python/site-packages/sqlite3/dbapi2.py
下記の通りに修正します。
修正前)from _sqlite3 import *
↓
修正後)from sqlite3._sqlite3 import *
サンプルアプリをビルドする
サンプルアプリをビルドする前に、下記の画面にてSDカードをフォーマットします。(フォーマットしてよいSDカードか事前に確認ください、SDカードのデータは全て消去されます。)
フォーマットが完了したら、SDカードをext(ext4)フォーマットにしてSetボタンを押下します。
...
サンプルアプリ「sqlite_app」をビルドして、カメラにインストールします。
ビルド方法は各SDKバージョンに応じて実施ください。
アプリ画面を開いて、下記の画面が表示されていれば成功です。
...
Pythonモジュールをコンパイルする(Pycurl)
SQLiteのコンパイルを実施できました。
次のチュートリアルとして、Pycurlのコンパイルを実施します。
ソースコードをダウンロードする
PyCurlとOpenSSLのソースコードを以下URLからダウンロードしてください。
このチュートリアルでは、pycurl 7.45.2、OpenSSL 1.1.1 を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
pycurl 7.45.2
OpenSSL 1.1.1
https://github.com/openssl/openssl/archive/OpenSSL_1_1_1i.tar.gz
ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。
Info |
---|
SoCがambaCV5Xのカメラファームv3.10以前の場合はカメラ内のOpenSSL 1.1.1を利用するため、OpenSSLを配置しなくても動作します。カメラファームのv3.20以降はOpenSSL 3.0.12にアップデートされているためOpenSSLをアプリに配置するか、OpenSSL 3.0.12を用いてビルドしなければ動作しません。アプリの環境に合わせてOpenSSLのバージョンを選択して利用してください。 SoCについては下記を参照してください。 |
コンパイル手順ファイルを更新する
${SDK_DIR}/
...
external/
...
また、作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。
アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。
Code Block | ||
---|---|---|
| ||
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.3.4.7 |
サンプルアプリをビルドする
サンプルアプリ「jpeg_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。
ビルド方法はこちらを参照してください。
アプリ画面を開いて(下記画像の赤枠ボタン)、カメラが撮影したjpeg画像が表示されていれば成功です。
...
Pythonモジュールをコンパイルする(SQLite)
NumpyとOpenCVのコンパイルを実施することができました。
次のチュートリアルとして、SQLiteのコンパイルを実施します。
ソースコードをダウンロードする
sqliteとPythonのソースコードを以下URLからダウンロードしてください。
このチュートリアルでは、sqlite 3.40.0、Python 3.7.9 を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
sqlite 3.40.0
https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz
Python 3.7.9
ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。
コンパイル手順ファイルを更新する
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
Code Block |
---|
#!/bin/sh -x
HOME_PATH=/home/docker
LIB_INSTALL_DIR=${HOME_PATH}/install_path
SQLITE_ARCHIVES=sqlite-autoconf-3400000.tar.gz
SQLITE_DIR=sqlite-autoconf-3400000
SQLITE_BUILD_DIR=sqlite-autoconf-3400000/build
PYTHONPATH=$PYTHONPATH:${NUMPY_SITE_PACKAGES}
export PYTHONPATH
PYTHON_ARCHIVES=Python-3.7.9.tgz
PYTHON_DIR=Python-3.7.9
## for sqlite
cd ${HOME_PATH}
tar zxf ${SQLITE_ARCHIVES}
mkdir -p ${SQLITE_BUILD_DIR}
cd ${SQLITE_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install
## for python
cd ${HOME_PATH}
tar zxf ${PYTHON_ARCHIVES}
cd ${PYTHON_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install |
コンパイルする
Dockerを用いてsqliteモジュールとPythonモジュールをコンパイルします。build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
Code Block |
---|
#!/bin/sh -x
HOME_PATH=/home/docker
OPENSSL_ARCHIVES=openssl-OpenSSL_1_1_1i.tar.gz
OPENSSL_DIR=openssl-OpenSSL_1_1_1i
PYCURL_ARCHIVES=pycurl-7.45.2.tar.gz
PYCURL_DIR=pycurl-7.45.2
apt update
apt install libcurl4-openssl-dev libssl-dev
cd ${HOME_PATH}
tar zxf ${OPENSSL_ARCHIVES}
cd ${OPENSSL_DIR}
./Configure linux-aarch64
make
export PYCURL_SSL_LIBRARY=openssl
export CPPFLAGS=-I${HOME_PATH}/${OPENSSL_DIR}/include/openssl
export LDFLAGS=-L${HOME_PATH}/${OPENSSL_DIR}
## for pycurl
cd ${HOME_PATH}
tar zxf ${PYCURL_ARCHIVES}
cd ${PYCURL_DIR}
python3.7 setup.py --with-openssl --openssl-dir=${HOME_PATH}/${OPENSSL_DIR} build |
コンパイルする
Dockerを用いてpycurlモジュールとOpenSSLモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
Code Block |
---|
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1 |
${SDK_DIR}/external/build/sample/docker/docker_volumeにコンパイル済みモジュールが作成されます。
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルではsrc/adamapp-py/hogehoge_appを例とします。
PyCurlを配置する
PyCurlライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/pycurl-7.45.2/build/lib.linux-aarch64-3.7
pycurl.cpython-37m-aarch64-linux-gnu.so
上記ファイルを、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/hogehoge_app/python/site-packages
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/pycurl-7.45.2/build/lib.linux-aarch64-3.7/pycurl.cpython-37m-aarch64-linux-gnu.so ${SDK_DIR}/src/adamapp-py/hogehoge_app/python/site-packages |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/
...
src/adamapp-py/hogehoge_app/python/site-packages/pycurl.cpython-37m-aarch64-linux-gnu.so
PyCurlを読み込むようソースコードを修正する
${SDK_DIR}/externalsrc/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルではsrc/adamapp-py/sqlite_appを例とします。
Info |
---|
sqlite_app の動作にはSDカードが必要です。SDカードを挿入できるカメラのみ確認可能です。 |
SQLiteを配置する
sqliteライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib
libsqlite3.so
libsqlite3.so.0
libsqlite3.so.0.8.6
libsqlite3.la
libsqlite3.a
上記5ファイルを、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu
...
adamapp-py/hogehoge_app/python/pymain.py を開き、下記の通り追記します。
import os;
の1つ下の行に下記を追記する。
import pycurl;
...
サンプルアプリをビルドする
サンプルアプリ「hogehoge_app」をビルドして、カメラにインストールします。
ビルド方法は各SDKバージョンに応じて実施ください。
Pythonモジュールをコンパイルする(Numba)
Pythonの高速化に使われるNumbaのビルド手順について記載します。
ソースコードをダウンロードする
Numbaを実行するために、複数のモジュールが必要です。
それぞれのソースコードは以下のURLからダウンロードしてください。
また各モジュールのバージョンは、Python 3.7.9 に対応しているものを選択してください。
Numba 0.56.4:
https://github.com/numba/numba/archive/refs/tags/0.56.4.zipNumpy 1.19.4:
https://github.com/numpy/numpy/archive/v1.19.4.tar.gzLLVM 11.1.0:
https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-11.1.0.tar.gzllvmlite 0.39.1:
https://github.com/numba/llvmlite/archive/refs/tags/v0.39.1.tar.gzimportlib_metadata 6.7.0:
https://github.com/python/importlib_metadata/archive/refs/tags/v6.7.0.ziptyping_extensions 4.7.1:
https://github.com/python/typing_extensions/archive/refs/tags/4.7.1.zipzipp 3.15.0:
https://github.com/jaraco/zipp/archive/refs/tags/v3.15.0.zip
ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。
コンパイル手順ファイルを更新する
${SDK_DIR}/external/build/sample/docker/docker_volume/
...
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0.8.6
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.la
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.a
Python用sqliteを配置する
Python用sqliteモジュールは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/sqlite3
ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/sqlite3 ${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3
Python用sqliteは、モジュールだけではなくライブラリも必要となるため、あわせて配置します。
Python用sqliteライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/lib-dynload
_sqlite3.cpython-37m-aarch64-linux-gnu.soを以下のディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3
Code Block |
---|
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-aarch64-linux-gnu.so ${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3 |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3/_sqlite3.cpython-37m-aarch64-linux-gnu.so
次に、import時にPython用sqliteライブラリを読み込めるよう、dbapi2.pyを修正します。
${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3/dbapi2.py
下記の通りに修正します。
修正前)from _sqlite3 import *
↓
修正後)from sqlite3._sqlite3 import *
サンプルアプリをビルドする
サンプルアプリ「sqlite_app」をビルドして、カメラにインストールします。
ビルド方法はこちらを参照してください。
アプリ画面を開いて、下記の画面が表示されていれば成功です。
...
Pythonモジュールをコンパイルする(Pycurl)
SQLiteのコンパイルを実施できました。
次のチュートリアルとして、Pycurlのコンパイルを実施します。
ソースコードをダウンロードする
PyCurlとOpenSSLのソースコードを以下URLからダウンロードしてください。
このチュートリアルでは、pycurl 7.45.2、OpenSSL 1.1.1 を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
pycurl 7.45.2
OpenSSL 1.1.1
https://github.com/openssl/openssl/archive/OpenSSL_1_1_1i.tar.gz
ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。
コンパイル手順ファイルを更新する
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
Code Block |
---|
#!/bin/sh -x
HOME_PATH=/home/docker
OPENSSL_ARCHIVES=openssl-OpenSSL_1_1_1i.tar.gz
OPENSSL_DIR=openssl-OpenSSL_1_1_1i
PYCURL_ARCHIVES=pycurl-7.45.2.tar.gz
PYCURL_DIR=pycurl-7.45.2
apt update
apt install libcurl4-openssl-dev libssl-dev
cd ${HOME_PATH}
tar zxf ${OPENSSL_ARCHIVES}
cd ${OPENSSL_DIR}
./Configure linux-aarch64
make
export PYCURL_SSL_LIBRARY=openssl
export CPPFLAGS=-I${HOME_PATH}/${OPENSSL_DIR}/include/openssl
export LDFLAGS=-L${HOME_PATH}/${OPENSSL_DIR}
## for pycurl
cd ${HOME_PATH}
tar zxf ${PYCURL_ARCHIVES}
cd ${PYCURL_DIR}
python3.7 setup.py --with-openssl --openssl-dir=${HOME_PATH}/${OPENSSL_DIR} build |
コンパイルする
Dockerを用いてpycurlモジュールとOpenSSLモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
Code Block |
---|
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1 |
${SDK_DIR}/external/build/sample/docker/docker_volumeにコンパイル済みモジュールが作成されます。
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルではsrc/adamapp-py/additional_info_sample_appを例とします。
PyCurlを配置する
PyCurlライブラリは以下のディレクトリにインストールされています。
module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
Code Block |
---|
#!/bin/sh -x
#----------
HOME_PATH=/home/docker
LIB_INSTALL_DIR=${HOME_PATH}/install_path
SITE_PACKAGES=${LIB_INSTALL_DIR}/lib/python3.7/site-packages
NUMPY_ARCHIVES=numpy-1.19.4.tar.gz
NUMPY_DIR=numpy-1.19.4
LLVM_ARCHIVES=llvm-project-llvmorg-11.1.0.tar.gz
LLVM_DIR=llvm-project-llvmorg-11.1.0
LLVM_INSTALL_DIR=${LIB_INSTALL_DIR}/llvm
LLVM_PATCH_SRC=${LLVMLITE_DIR}/conda-recipes
LLVM_PATCH_DST=${LLVM_DIR}/llvm
LLVMLITE_ARCHIVES=llvmlite-0.39.1.tar.gz
LLVMLITE_DIR=llvmlite-0.39.1
NUMBA_ARCHIVES=numba-0.56.4.zip
NUMBA_DIR=numba-0.56.4
#----------
# NumPy
cd ${HOME_PATH}
mkdir -p ${SITE_PACKAGES}
tar xf ${NUMPY_ARCHIVES}
cd ${NUMPY_DIR}
python setup.py build
PYTHONPATH=$PYTHONPATH:${SITE_PACKAGES}
export PYTHONPATH
python setup.py install --prefix=${LIB_INSTALL_DIR}
# LLVM / llvmlite
cd ${HOME_PATH}
tar xf ${LLVM_ARCHIVES}
tar xf ${LLVMLITE_ARCHIVES}
cd ${LLVM_PATCH_DST}
for patchFile in $(find ../../${LLVM_PATCH_SRC} -name "*.patch" -type f); do
patch --dry-run -f -p1 -i ${patchFile}
if [ $? -eq 0 ]; then
patch -p1 -i ${patchFile}
fi
done
LLVM_BUILD_SH="../../${LLVMLITE_DIR}/conda-recipes/llvmdev/build.sh"
mkdir -p ${LLVM_INSTALL_DIR}
export PREFIX=${LLVM_INSTALL_DIR} CPU_COUNT=2
sed -i -e "s/\(^LLVM_TARGETS_TO_BUILD=\).*/\1\$\{LLVM_TARGETS_TO_BUILD:-\"AArch64\"\}/" ${LLVM_BUILD_SH}
sed -i -e "/LLVM_ENABLE_ASSERTIONS/d" ${LLVM_BUILD_SH}
sed -i -e "/LLVM_EXPERIMENTAL_TARGETS_TO_BUILD/d" ${LLVM_BUILD_SH}
chmod +x ${LLVM_BUILD_SH}
${LLVM_BUILD_SH}
cd ../../
cd ${LLVMLITE_DIR}
export LLVM_CONFIG=${LLVM_INSTALL_DIR}/bin/llvm-config
python setup.py build
python setup.py install --prefix=${LIB_INSTALL_DIR}
cd ../
# numba
unzip ${NUMBA_ARCHIVES}
cd ${NUMBA_DIR}
export NUMBA_DISABLE_TBB=1
python setup.py build
python setup.py install --prefix=${LIB_INSTALL_DIR}
cd ../
# replace some libraries compatible with python3.7
cd ${HOME_PATH}
unzip importlib_metadata-6.7.0.zip
mv importlib_metadata-6.7.0/importlib_metadata ${SITE_PACKAGES}
unzip typing_extensions-4.7.1.zip
mv typing_extensions-4.7.1/src/typing_extensions.py ${SITE_PACKAGES}
unzip zipp-3.15.0.zip
mv zipp-3.15.0/zipp ${SITE_PACKAGES}
# cleanup
cd ${SITE_PACKAGES}
rm -f easy-install.pth setuptools.pth site.py
find . -maxdepth 2 -name numpy -type d -exec mv {} . \;
find . -maxdepth 2 -name numba -type d -exec mv {} . \;
rm -rf *.egg*
find . -name *pycache* -type d -print | xargs rm -rf
find . -name tests -type d -print | xargs rm -rf
find . -name *.so | xargs aarch64-linux-gnu-strip --strip-debug
cd ${HOME_PATH} |
コンパイルする
Dockerを用いて各モジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker
...
pycurl.cpython-37m-aarch64-linux-gnu.so
上記ファイルを、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/additional_info_sample_app/python/site-packages
...
ディレクトリでDockerを実行してください。
Code Block |
---|
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1 |
コンパイル済みのモジュールは以下のディレクトリに配置されます。
${SDK_DIR}/external/build/sample/docker/docker_volume/
...
install_path/lib/python3.7/
...
site-packages
Info |
---|
LLVMのコンパイルに時間がかかるため、しばらく待ちます。 |
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルでは${SDK_DIR}/src/adamapp-py/
...
yuv_
...
コピー後のディレクトリ構成は以下のようになります。
...
yolov5_appを例とします。
モジュールを配置する
コンパイル済みのモジュールをディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。
$ cp -R ${SDK_DIR}/srcexternal/adamapp-py/additional_info_sample_app/python/site-packages/pycurl.cpython-37m-aarch64-linux-gnu.so
PyCurlを読み込むようソースコードを修正する
build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages ${SDK_DIR}/src/adamapp-py/
...
yuv_
...
yolov5_
...
app/python/
pymain.py を開き、下記の通り追記します。
import os;
の1つ下の行に下記を追記する。
import pycurl;
...
サンプルアプリをビルドする
サンプルアプリ「additional_info_sample_app」をビルドして、カメラにインストールします。
ビルド方法はこちらを参照してください。
アプリ画面を開いて、「body」のように文字列が表示されていれば成功です。を更新する
numbaに対応したソースコードに変更します。下記のファイルと添付ファイル「pymain.py」を差し替えます。
\src\adamapp-py\yuv_yolov5_app\python\pymain.py
View file | ||
---|---|---|
|
サンプルアプリをビルドする
サンプルアプリ「yuv_yolov5_app」をビルドして、カメラにインストールします。
ビルド方法は各SDKバージョンに応じて実施ください。
アプリ画面を開いて、画面に映っている物体(人など)に枠が付いていれば成功です。
サンプルアプリの動作説明も参照ください。
失敗した場合はアプリ画面にアプリ起動失敗を示すメッセージが表示されます。
...