Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 34 Next »

はじめに

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のインストールディレクトリを${SDK_DIR}として記載します。

目次


概要


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

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

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

  • OpenCV 3.4.7

Docker環境を構築する


Docker環境は、AdamAppSDKがインストールされたUbuntu上に構築します。

チュートリアルでのインストール対象OS
  • Ubuntu 18.04.2 LTS (bionic)

あらかじめAdamAppSDK開発環境を構築してください。(本チュートリアルでは省略します)

また、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

リポジトリを追加する

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

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

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

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

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

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

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リポジトリをシステムに追加します。

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

インターネット接続にプロキシサーバが必要な場合は、環境変数”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にリポジトリが追加されていることを確認してください。

$ 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実行用ファイルをインストールする

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

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

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

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

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

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

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

$ sudo usermod -a -G docker $(whoami)

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

Docker実行確認

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

$ 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と呼ばれるイメージ作成手順を記載したファイルを作成します。

ひな形として、NumPyとOpenCVモジュールのコンパイルに必要なイメージを作成するためのDockerfileを用意しています。

external/build/sample/docker/Dockerfile

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 chmod +x /bin/exec_entry.sh

ENTRYPOINT ["/bin/exec_entry.sh"]

※Dockerfileを変更する際は、上記の1,3,4,14,16行目は変更しないでください。

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

RUN apt-get update \

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

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

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

Dockerイメージを作成する

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

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

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

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
compile/ubuntu-rel   0.1                 ca4409cf01fd        45 minutes ago      559MB

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

  • exec_entry.sh

  • qemu-aarch64-static

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

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

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

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

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

このチュートリアルでは、Numpy 1.14.9、OpenCV 3.4.7を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

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

ダウンロードしたファイルは、${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が/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を実行してください。

$ 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にコンパイル済みモジュールが作成されます。

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

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

$ 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

$ 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を以下のディレクトリにコピーしてください。

例)${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/

$ 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

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

$ 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__)は使用しません。

容量削減のため削除することをお勧めします。

$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/
$ find . -name *pycache* -print | xargs rm -rf

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

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

$ 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画像が表示されていればOK

Pythonモジュールをコンパイルする(SQLite)


NumpyとOpenCVのコンパイルを実施することができました。

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

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

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

このチュートリアルでは、例として3.40.0を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz

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

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

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

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

#!/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を用いてNumPyモジュールとOpenCVモジュールをコンパイルします。

${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。

$ 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にコンパイル済みモジュールが作成されます。

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

AdamAppに配置する

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

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

  • No labels