Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

SDK同梱ドキュメント:PythonModuleInstallManual

はじめに

SDK V1.61以前を使用している場合、まず初めに下記を対応してください。
この修正は次回のSDKバージョンアップで反映いたします。この修正は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}として記載します。

Note

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

目次

...

Table of Contents
minLevel1
maxLevel4

概要

...

Python版のAdamAppで外部ライブラリを使用する場合は、Pythonモジュールのコンパイルが必要です。

本チュートリアルでは、Python用外部ライブラリをビルドするための環境構築~モジュールのコンパイルまでの手順を解説します。

チュートリアルで使用する外部ライブラリ
  • NumPy 1.1419.94

  • 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
  • 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開発環境を構築されている場合、重複して実施している手順があります。実施不要な箇所は適宜省略して作業してください。
また、AdamAppSDK開発環境を構築した際に.devcontainer/Dockerfileを用いて作成したDockerイメージと本章で説明しているDockerイメージは異なるDockerイメージですので注意ください。

また、apt-getコマンドなどを使ってソフトのインストールを行いますので、apt-getが可能なインターネット接続と、インストールが可能な権限(root権限など)設定も実施しておいてください。

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

Note

VirtualBox上の環境の場合、ホスト - ゲストの共有ディレクトリ上ではDockerのコンパイルに失敗する可能性がありますので、失敗した場合はUbuntu上のディレクトリにて作業してみてください。

パッケージをインストールする

Docker環境の構築に必要なパッケージをインストールします。

Code Block
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common \
    qemu-user-static

リポジトリを追加する

...

Docker社提供のUbuntu用aptリポジトリをシステムに追加します。

(apt-keyコマンドを利用する場合)

Note

apt-key コマンドは廃止時期は未定ですが廃止予定となっております。後述のapt-keyコマンドを利用しない方法をお試しください。リポジトリ追加方法は1つの例ですので、代替方法は各自でご検討ください。

Docker社提供のUbuntu用aptリポジトリをシステムに追加します。

Docker社オフィシャルPGPキーをシステムに追加します。

Code Block
languagebash
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
Info

インターネット接続にプロキシサーバが必要な場合は、-xオプションを使用します。

(プロキシサーバのURLやポート番号は、使用するプロキシサーバに即したものへと変更してください。)

$ curl -x http://proxy.example.com:8080/ -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

PGPキーを追加したら、fingerprintがこのようになっているか確認してください。

Code Block
languagebash
$ 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
languagebash
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Info

インターネット接続にプロキシサーバが必要な場合は、環境変数”http_proxy”と”https_proxy”を以下のように追加してください。

(プロキシサーバのURLやポート番号は、使用するプロキシサーバに即したものへと変更してください。)

$ sudo http_proxy=http://proxy.example.com:8080 https_proxy=https://proxy.example.com:8080 add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

aptリポジトリを追加したら、/etc/apt/sources.listにリポジトリが追加されていることを確認してください。

Code Block
languagebash
$ 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

Docker実行用ファイルをインストールする

...

リポジトリを追加する(apt-keyコマンドを利用しない場合)

Note

apt-key コマンドは廃止予定となっておりますので、代替方法の例を示しています。代替方法は各自で検討ください。また、既にapt-keyコマンドを利用した環境でDockerイメージを作成している場合はDockerコンテナから作成をやり直さないと正常に動作しない可能性があります。ご注意ください。

Docker社提供のUbuntu用aptリポジトリをシステムに追加します。

事前に/etc/aptディレクトリにkeyringsディレクトリを作成します。

Code Block
languagebash
$ sudomkdir apt-get update
/etc/apt/keyrings

Docker社オフィシャルPGPキーをシステムに追加します。

Code Block
languagebash
$ sudo apt-get installcurl docker-ce docker-ce-cli containerd.io

(任意)Dockerにプロキシ設定を行う

インターネット接続にプロキシサーバが必要な場合は、Dockerにプロキシ設定を行ってください。

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

Dockerコマンドの権限を変更する

dockerコマンドを一般ユーザでも使用できるように設定を変更します。

fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker-key.asc

次に、Docker公式aptリポジトリをシステムに追加します。

Code Block
languagebash
$ sudo usermod -a -G docker $(whoami)

一度ログアウトして、再度ログインしてください。

Docker実行確認

...

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker-key.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker実行用ファイルをインストールする

Docker実行に必要なファイルを、aptを使用してインストールします。

Code Block
languagebash
$ dockersudo run helloapt-worldget Helloupdate
from$ Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker sudo apt-get install docker-ce docker-ce-cli containerd.io

(任意)Dockerにプロキシ設定を行う

インターネット接続にプロキシサーバが必要な場合は、Dockerにプロキシ設定を行ってください。

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

Dockerコマンドの権限を変更する

dockerコマンドを一般ユーザでも使用できるように設定を変更します。

Code Block
languagebash
$ sudo usermod -a -G docker $(whoami)

一度ログアウトして、再度ログインしてください。

Docker実行確認

Dockerが使用できるか確認します。

Code Block
languagebash
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

...

Dockerイメージを作成する

...

Pythonモジュールコンパイル用のDockerイメージを作成します。

Dockerfileを編集する

Dockerイメージを作成する場合、一般的にDockerfileと呼ばれるイメージ作成手順を記載したファイルを作成します。

...

Code Block
languagenone
FROM arm64v8/ubuntu:bionic

ADD qemu-aarch64-static /usr/bin
ADD exec_entry.sh /bin

RUN apt-get update \
 && apt-get install -y --no-install-recommends \
    build-essential gcc-8 g++-8 gfortran-8 python3.7 python3-distutils python3-setuptools python3.7-dev python3-pip cmake unzip \
 && apt-get -y clean && rm -rf /var/lib/apt/lists/*
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 --slave /usr/bin/g++ g++ /usr/bin/g++-8 \
 && update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-8 800 \
 && update-alternatives --install /usr/bin/python python /usr/bin/python3.7 800
RUN python -m pip install Cython
RUN ==0.29.36
RUN chmod +x /bin/exec_entry.sh

ENTRYPOINT ["/bin/exec_entry.sh"]

...

Info

インターネット接続にプロキシサーバが必要な場合は、

RUN apt-get update \

の前の行に、以下の行を追加してください。

(プロキシサーバのURLやポート番号は、使用するプロキシサーバに即したものに変更してください。)

ENV http_proxy=http://proxy.example.com:8080/ https_proxy=http://proxy.example.com:8080/

Dockerイメージを作成する

Dockerイメージは、Dockerfileが存在するディレクトリで作成します。

Code Block
languagebash
$ cd ${SDK_DIR}/external/build/sample/docker/
$ docker build -t compile/ubuntu-rel:0.1 .
Info

エラーが出るなどして失敗した場合、後述のqemuインストールを実施ください。

作成が完了したら、compile/ubuntu-relというリポジトリが作成されていることを確認してください。

...

Note

Dockerfileが存在するディレクトリに、以下の2ファイルが存在することを確認してください。

  • exec_entry.sh

  • qemu-aarch64-static

これらのファイルはPythonモジュール作成時に必要であるため、削除しないでください。

...

qemuインストール

...

コンテナ版追加アプリを作成するために、開発環境にインストールする必要のある、qemuのインストール方法を記載します。Dockerイメージの作成が完了している場合はqemuのインストールは不要ですので、次の章に進んでください。AdamApp用Pythonモジュールは、以下の手順で作成します。

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

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

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

  4. external/build/sample/docker/docker_volume/install_pathディレクトリに作成されたモジュールが配置される。

チュートリアルとして、NumPyとOpenCVのコンパイルを実施します。

Note

VirtualBox環境の場合、共有フォルダ上で作業するとコンパイルに失敗します。
Ubuntu上にフォルダを作成・移動したうえで作業してください。

ソースコードをダウンロードする

NumpyとOpenCVのソースコードを以下URLからダウンロードしてください。

Numpy 1.14.9:

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

ダウンロードしたファイルは、external/build/sample/docker/docker_volumeディレクトリに配置してください。

コンパイル手順ファイルを更新する

external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。

Info

コンパイル手順を更新するときは、以下にご注意ください。

  • dockerを実行した際、external/build/sample/docker/docker_volumeが/home/dockerとしてmountされます。

  • ソースファイルやコンパイルディレクトリも/home/dockerに配置されます。

  • コンパイル済みモジュールは/home/docker/install_pathにインストールするようにしてください。

  • OpenCVのコンパイルには、NumPyモジュールが必要になります。

サンプルスクリプトとして、NumpyとOpenCVをコンパイルするためのmodule_compile.shを用意しています。

チュートリアルではmodule_compile.shを変更せずに進めます。

コンパイルする

Dockerを用いてNumPyモジュールとOpenCVモジュールをコンパイルします。

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

OpenCVのコンパイルには時間がかかるため、しばらく待ちます。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。

チュートリアルではsrc/adamapp-py/jpeg_appを例とします。

Numpyを配置する

NumPyモジュールは以下のディレクトリにインストールされています。

external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpy

ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。

src/adamapp-py/jpeg_app/python/site-packages

Code Block
$ cp -R external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpy src/adamapp-py/jpeg_app/python/site-packages

コピー後のディレクトリ構成は以下のようになります。

src/adamapp-py/jpeg_app/python/site-packages/numpy

OpenCVを配置する

OpenCV Python用モジュールは以下のディレクトリにインストールされています。

external/build/sample/docker/docker_volume/install_path/lib/python3.7/dist-packages/cv2

ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。

src/adamapp-py/jpeg_app/python/site-packages

Code Block
$ cp -R external/build/sample/docker/docker_volume/install_path/lib/python3.7/dist-packages/cv2 src/adamapp-py/jpeg_app/python/site-packages

コピー後のディレクトリ構成は以下のようになります。

src/adamapp-py/jpeg_app/python/site-packages/cv2

OpenCVは、Python用モジュールだけではなくOpenCVライブラリも必要となるため、あわせて配置します。

OpenCVライブラリは以下のディレクトリにインストールされています。

external/build/sample/docker/docker_volume/install_path/lib

libopencv_world.so.3.4.7を以下のディレクトリにコピーしてください。

例)src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/

Code Block
$ cp -R external/build/sample/docker/docker_volume/install_path/lib/libopencv_world.so.3.4.7 src/adamapp-py/jpeg_app/external/external/lib/aarch64-linux-gnu

コピーしたら、シンボリックリンクを作成してください。

Code Block
languagebash
$ cd 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
languagebash
$ cd src/adamapp-py/jpeg_app/python/site-packages/
$ find . -name *pycache* -print | xargs rm -rf

また、作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。

アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。

Code Block
languagebash
$ sudo apt-get install binutils-aarch64-linux-gnu $ cd src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/ $ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.3.4.7

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

  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のコンパイルを実施します。

Note

VirtualBox環境の場合、共有フォルダ上で作業するとコンパイルに失敗します。
Ubuntu上にフォルダを作成・移動したうえで作業してください。

ソースコードをダウンロードする

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ファイルに、コンパイル手順を記載します。

Info

コンパイル手順を更新するときは、以下にご注意ください。

  • dockerを実行した際、${SDK_DIR}/external/build/sample/docker/docker_volumeが/home/dockerとしてmountされます。

  • ソースファイルやコンパイルディレクトリも/home/dockerに配置されます。

  • コンパイル済みモジュールは/home/docker/install_pathにインストールするようにしてください。

  • OpenCVのコンパイルには、NumPyモジュールが必要になります。

サンプルスクリプトとして、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
  • OpenCVのコンパイルには時間がかかるため、しばらく待ちます。

  • SDK V1.70以前でコンパイルエラーが発生した場合は「はじめに」項で記載しているexternal/build/sample/docker/Dockerfileを修正していることを確認してください。修正できていない場合はDockerイメージの作成からやりなおしてください。

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
languagebash
$ 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
languagebash
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/
$ find . -name *pycache* -print | xargs rm -rf

また、作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。

アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。

Code Block
languagebash
$ 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

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ファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

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カードを挿入できるカメラのみ確認可能です。
また、カメラのファームウェアによってはext4でフォーマットした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/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

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 *

サンプルアプリをビルドする

サンプルアプリをビルドする前に、下記の画面にて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ディレクトリに配置してください。

Info

SoCがambaCV5Xのカメラファームv3.10以前の場合はカメラ内のOpenSSL 1.1.1を利用するため、OpenSSLを配置しなくても動作します。カメラファームのv3.20以降はOpenSSL 3.0.12にアップデートされているためOpenSSLをアプリに配置するか、OpenSSL 3.0.12を用いてビルドしなければ動作しません。アプリの環境に合わせてOpenSSLのバージョンを選択して利用してください。

SoCについては下記を参照してください。

i-PROカメラへのソフトウェアインストール条件 - FAQ - Development Partner Portal

コンパイル手順ファイルを更新する

${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/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}/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ファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

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 ディレクトリで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のコンパイルに時間がかかるため、しばらく待ちます。
コンパイル済みモジュールのファイルサイズは、合計で約60MByteになります。

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

View file
namepymain_numba.zip

サンプルアプリをビルドする

サンプルアプリ「yuv_yolov5_app」をビルドして、カメラにインストールします。

ビルド方法は各SDKバージョンに応じて実施ください。

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

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

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

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

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