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}として記載します。

外部ライブラリのビルドにつきましてはサポート対象外となっております。本章に記載の情報を参考に外部ライブラリをビルドしてください。問い合わせいただいてもサポートできかねますので予めご了承ください。

 

目次


 

概要


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権限など)設定も実施しておいてください。

参考:Docker公式ドキュメント

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が使用できるか確認します。

 

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モジュールは、以下の手順で作成します。

  1. ${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリにソースファイルを配置する。

  2. ${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.sh にコンパイル手順を記載する。

  3. dockerを実行し、コンパイルを行う。

  4. ${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:

https://github.com/opencv/opencv/archive/3.4.7.zip

ダウンロードしたファイルは、${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

https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

ダウンロードしたファイルは、${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

https://files.pythonhosted.org/packages/a8/af/24d3acfa76b867dbd8f1166853c18eefc890fc5da03a48672b38ea77ddae/pycurl-7.45.2.tar.gz

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.zip

Numpy 1.19.4:
https://github.com/numpy/numpy/archive/v1.19.4.tar.gz

LLVM 11.1.0:
https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-11.1.0.tar.gz

llvmlite 0.39.1:
https://github.com/numba/llvmlite/archive/refs/tags/v0.39.1.tar.gz

importlib_metadata 6.7.0:
https://github.com/python/importlib_metadata/archive/refs/tags/v6.7.0.zip

typing_extensions 4.7.1:
https://github.com/python/typing_extensions/archive/refs/tags/4.7.1.zip

zipp 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バージョンに応じて実施ください。

アプリ画面を開いて、画面に映っている物体(人など)に枠が付いていれば成功です。

サンプルアプリの動作説明も参照ください。

 

失敗した場合はアプリ画面にアプリ起動失敗を示すメッセージが表示されます。

今後はメッセージ内容やデバッグツールなどを用いて問題を解決し、アプリを作成してください。

 

チュートリアルは以上となります。