Python用外部ライブラリをビルドする
はじめに
SDK V1.61以前を使用している場合、まず初めに下記を対応してください。
この修正はSDK v1.62以降で対応されています。
external/build/sample/docker/Dockerfileの以下の記述を削除してください。
6行目: ENV http_proxy=http://proxy.mei.co.jp:8080/ https_proxy=http://proxy.mei.co.jp:8080/external/build/sample/docker/docker_volume/module_compile.shの以下の記述を修正してください。
4行目:
変更前:NUMPY_ARCHIVES=v1.19.4.tar.gz
変更後:NUMPY_ARCHIVES=numpy-1.19.4.tar.gz
8行目:
変更前:OPENCV_ARCHIES=opencv-3.4.7.zip
変更後:OPENCV_ARCHIVES=opencv-3.4.7.zip
SDK V1.70以前を使用している場合、まず初めに下記を対応してください。
この修正はSDK v1.71以降で対応されています。
external/build/sample/docker/Dockerfileの以下の記述を修正してください。
13行目:
変更前:RUN python -m pip install Cython
変更後:RUN python -m pip install Cython==0.29.36
このチュートリアルでは、SDKのインストールディレクトリを${SDK_DIR}
として記載します。
外部ライブラリのビルドにつきましてはサポート対象外となっております。本章に記載の情報を参考に外部ライブラリをビルドしてください。問い合わせいただいてもサポートできかねますので予めご了承ください。
目次
- 1 はじめに
- 2 目次
- 3 概要
- 4 Docker環境を構築する
- 5 Dockerイメージを作成する
- 5.1 Dockerfileを編集する
- 5.2 Dockerイメージを作成する
- 5.3 qemuインストール
- 5.3.1 qemuのインストール
- 5.3.2 docker buildxの準備
- 6 Pythonモジュールをコンパイルする(Numpy, OpenCV)
- 6.1 手順
- 6.2 ソースコードをダウンロードする
- 6.3 コンパイル手順ファイルを更新する
- 6.4 コンパイルする
- 6.5 AdamAppに配置する
- 6.5.1 Numpyを配置する
- 6.5.2 OpenCVを配置する
- 6.5.3 不要なファイルを削除する
- 6.5.4 サンプルアプリをビルドする
- 7 Pythonモジュールをコンパイルする(SQLite)
- 7.1 ソースコードをダウンロードする
- 7.2 コンパイル手順ファイルを更新する
- 7.3 コンパイルする
- 7.4 AdamAppに配置する
- 7.4.1 SQLiteを配置する
- 7.4.2 Python用sqliteを配置する
- 7.4.3 サンプルアプリをビルドする
- 8 Pythonモジュールをコンパイルする(Pycurl)
- 8.1 ソースコードをダウンロードする
- 8.2 コンパイル手順ファイルを更新する
- 8.3 コンパイルする
- 8.4 AdamAppに配置する
- 8.4.1 PyCurlを配置する
- 8.4.2 PyCurlを読み込むようソースコードを修正する
- 8.4.3 サンプルアプリをビルドする
- 9 Pythonモジュールをコンパイルする(Numba)
- 9.1 ソースコードをダウンロードする
- 9.2 コンパイル手順ファイルを更新する
- 9.3 コンパイルする
- 9.4 AdamAppに配置する
- 9.4.1 モジュールを配置する
- 9.4.2 サンプルアプリをビルドする
概要
Python版のAdamAppで外部ライブラリを使用する場合は、Pythonモジュールのコンパイルが必要です。
本チュートリアルでは、Python用外部ライブラリをビルドするための環境構築~モジュールのコンパイルまでの手順を解説します。
チュートリアルで使用する外部ライブラリ
NumPy 1.19.4
OpenCV 3.4.7
sqlite 3.40.0
Python 3.7.9
pycurl 7.45.2
OpenSSL 1.1.1
Docker環境を構築する
Docker環境は、AdamAppSDKがインストールされたUbuntu上に構築します。
チュートリアルでのインストール対象OS
SDK v1.71以前:Ubuntu 18.04.2 LTS (bionic)
SDK v1.80以降:Ubuntu 22.04.3 LTS (Jammy Jellyfish)
あらかじめAdamAppSDK開発環境を構築してください。(本チュートリアルでは省略します)
SDK ver.1.80以降にて、既にAdamAppSDK開発環境を構築されている場合、重複して実施している手順があります。実施不要な箇所は適宜省略して作業してください。
また、AdamAppSDK開発環境を構築した際に.devcontainer/Dockerfileを用いて作成したDockerイメージと本章で説明しているDockerイメージは異なるDockerイメージですので注意ください。
また、apt-getコマンドなどを使ってソフトのインストールを行いますので、apt-getが可能なインターネット接続と、インストールが可能な権限(root権限など)設定も実施しておいてください。
VirtualBox上の環境の場合、ホスト - ゲストの共有ディレクトリ上ではDockerのコンパイルに失敗する可能性がありますので、失敗した場合はUbuntu上のディレクトリにて作業してみてください。
パッケージをインストールする
Docker環境の構築に必要なパッケージをインストールします。
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common \
qemu-user-static
リポジトリを追加する(apt-keyコマンドを利用する場合)
Docker社提供のUbuntu用aptリポジトリをシステムに追加します。
Docker社オフィシャルPGPキーをシステムに追加します。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
PGPキーを追加したら、fingerprintがこのようになっているか確認してください。
$ 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リポジトリをシステムに追加します。
aptリポジトリを追加したら、/etc/apt/sources.listにリポジトリが追加されていることを確認してください。
リポジトリを追加する(apt-keyコマンドを利用しない場合)
Docker社提供のUbuntu用aptリポジトリをシステムに追加します。
事前に/etc/aptディレクトリにkeyringsディレクトリを作成します。
Docker社オフィシャルPGPキーをシステムに追加します。
次に、Docker公式aptリポジトリをシステムに追加します。
Docker実行用ファイルをインストールする
Docker実行に必要なファイルを、aptを使用してインストールします。
(任意)Dockerにプロキシ設定を行う
インターネット接続にプロキシサーバが必要な場合は、Dockerにプロキシ設定を行ってください。
Dockerコマンドの権限を変更する
dockerコマンドを一般ユーザでも使用できるように設定を変更します。
一度ログアウトして、再度ログインしてください。
Docker実行確認
Dockerが使用できるか確認します。
Dockerイメージを作成する
Pythonモジュールコンパイル用のDockerイメージを作成します。
Dockerfileを編集する
Dockerイメージを作成する場合、一般的にDockerfileと呼ばれるイメージ作成手順を記載したファイルを作成します。
ひな形として、NumPyとOpenCVモジュールのコンパイルに必要なイメージを作成するためのDockerfileを用意しています。
external/build/sample/docker/Dockerfile
Dockerイメージを作成する
Dockerイメージは、Dockerfileが存在するディレクトリで作成します。
作成が完了したら、compile/ubuntu-relというリポジトリが作成されていることを確認してください。
qemuインストール
コンテナ版追加アプリを作成するために、開発環境にインストールする必要のある、qemuのインストール方法を記載します。Dockerイメージの作成が完了している場合はqemuのインストールは不要ですので、次の章に進んでください。
qemuのインストール
docker buildxの準備
experimental 機能や BuildKit を使うため、環境変数を追加設定 & 反映 します。
設定ファイルを開く
以下を末尾に追加
保存
buildxが使えるようになっているか確認。
出力例
現在build可能なアーキテクチャを確認。
出力例
この出力の中に 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のコンパイルを実施します。
ソースコードをダウンロードする
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ファイルに、コンパイル手順を記載します。
サンプルスクリプトとして、NumpyとOpenCVをコンパイルするためのmodule_compile.shを用意しています。
チュートリアルではmodule_compile.shを変更せずに進めます。
コンパイルする
Dockerを用いてNumPyモジュールとOpenCVモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。
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
コピー後のディレクトリ構成は以下のようになります。
${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
コピー後のディレクトリ構成は以下のようになります。
${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を以下のディレクトリにコピーしてください。
例)${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
コピーしたら、シンボリックリンクを作成してください。
不要なファイルを削除する
AdamAppでは、Pythonキャッシュファイル(__pycache__)は使用しません。
容量削減のため削除することをお勧めします。
また、作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。
アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。
サンプルアプリをビルドする
サンプルアプリ「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ファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
コンパイルする
Dockerを用いてsqliteモジュールとPythonモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルではsrc/adamapp-py/sqlite_appを例とします。
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
コピー後のディレクトリ構成は以下のようになります。
${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
コピー後のディレクトリ構成は以下のようになります。
${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
コピー後のディレクトリ構成は以下のようになります。
${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 *
サンプルアプリをビルドする
サンプルアプリをビルドする前に、下記の画面にて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ディレクトリに配置してください。
コンパイル手順ファイルを更新する
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
コンパイルする
Dockerを用いてpycurlモジュールとOpenSSLモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
${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
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/hogehoge_app/python/site-packages/pycurl.cpython-37m-aarch64-linux-gnu.so
PyCurlを読み込むようソースコードを修正する
${SDK_DIR}/src/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/module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
コンパイルする
Dockerを用いて各モジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
コンパイル済みのモジュールは以下のディレクトリに配置されます。
${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルでは${SDK_DIR}/src/adamapp-py/yuv_yolov5_appを例とします。
モジュールを配置する
コンパイル済みのモジュールをディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages ${SDK_DIR}/src/adamapp-py/yuv_yolov5_app/python/
pymain.py を更新する
numbaに対応したソースコードに変更します。下記のファイルと添付ファイル「pymain.py」を差し替えます。
\src\adamapp-py\yuv_yolov5_app\python\pymain.py
サンプルアプリをビルドする
サンプルアプリ「yuv_yolov5_app」をビルドして、カメラにインストールします。
ビルド方法は各SDKバージョンに応じて実施ください。
アプリ画面を開いて、画面に映っている物体(人など)に枠が付いていれば成功です。
サンプルアプリの動作説明も参照ください。
失敗した場合はアプリ画面にアプリ起動失敗を示すメッセージが表示されます。
今後はメッセージ内容やデバッグツールなどを用いて問題を解決し、アプリを作成してください。
チュートリアルは以上となります。