/
Python用外部ライブラリをビルドする

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

上記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

 

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

OpenSSL 3.0.12

https://github.com/openssl/openssl/releases/download/openssl-3.0.12/openssl-3.0.12.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バージョンに応じて実施ください。

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

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

 

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

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

 

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

 

Related content

yuv_yolov5_appの動作説明
yuv_yolov5_appの動作説明
Read with this
Compile external library for Python
Compile external library for Python
More like this
Pythonアプリの高速化
Pythonアプリの高速化
Read with this
各SDK Versionと対応カメラFW version表
各SDK Versionと対応カメラFW version表
Read with this
Pythonアプリ起動失敗
Pythonアプリ起動失敗
Read with this
yuv_pose_appの動作説明
yuv_pose_appの動作説明
Read with this