...
チュートリアルではmodule_compile.shを変更せずに進めます。
コンパイルする
Dockerを用いてNumPyモジュールとOpenCVモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
Code Block |
---|
Code Block |
#!/bin/sh -x HOME_PATH=/home/docker compile/ubuntu-rel:0.1 |
external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。
Info |
---|
|
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルでは${SDK_DIR}/src/adamapp-py/jpeg_appを例とします。
Numpyを配置する
NumPyモジュールは以下のディレクトリにインストールされています。
...
NUMPY_ARCHIVES=numpy-1.19.4.tar.gz NUMPY_DIR=numpy-1.19.4 LIB_INSTALL_DIR=${HOME_PATH}/install_path NUMPY_SITE_PACKAGES=${LIB_INSTALL_DIR}/lib/python3.7/site-packages |
...
ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages
Code Block |
---|
$ cp -R ${SDK_DIR}/external OPENCV_ARCHIVES=opencv-3.4.7.zip OPENCV_DIR=opencv-3.4.7 OPENCV_BUILD_DIR=opencv-3.4.7/build ## for NumPy cd ${HOME_PATH} mkdir -p ${NUMPY_SITE_PACKAGES} tar zxf ${NUMPY_ARCHIVES} cd ${NUMPY_DIR} python setup.py build PYTHONPATH=$PYTHONPATH:${NUMPY_SITE_PACKAGES} export PYTHONPATH python setup.py install --prefix=${LIB_INSTALL_DIR} ## for OpenCV cd ${HOME_PATH} unzip ${OPENCV_ARCHIVES} mkdir -p ${OPENCV_BUILD_DIR} cd ${OPENCV_BUILD_DIR} cmake \ -G "Unix Makefiles" \ -D CMAKE_INSTALL_PREFIX=${LIB_INSTALL_DIR} \ -D BUILD_CUDA_STUBS=OFF \ -D BUILD_DOCS=OFF \ -D BUILD_EXAMPLES=OFF \ -D BUILD_JASPER=OFF \ -D BUILD_JPEG=OFF \ -D BUILD_OPENEXR=OFF \ -D BUILD_PACKAGE=ON \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_PNG=OFF \ -D BUILD_SHARED_LIBS=ON \ -D BUILD_TBB=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_TIFF=OFF \ -D BUILD_WITH_DEBUG_INFO=ON \ -D BUILD_ZLIB=OFF \ -D BUILD_WEBP=OFF \ -D BUILD_opencv_apps=OFF \ -D BUILD_opencv_calib3d=ON \ -D BUILD_opencv_core=ON \ -D BUILD_opencv_cudaarithm=OFF \ -D BUILD_opencv_cudabgsegm=OFF \ -D BUILD_opencv_cudacodec=OFF \ -D BUILD_opencv_cudafeatures2d=OFF \ -D BUILD_opencv_cudafilters=OFF \ -D BUILD_opencv_cudaimgproc=OFF \ -D BUILD_opencv_cudalegacy=OFF \ -D BUILD_opencv_cudaobjdetect=OFF \ -D BUILD_opencv_cudaoptflow=OFF \ -D BUILD_opencv_cudastereo=OFF \ -D BUILD_opencv_cudawarping=OFF \ -D BUILD_opencv_cudev=OFF \ -D BUILD_opencv_features2d=ON \ -D BUILD_opencv_flann=ON \ -D BUILD_opencv_hal=ON \ -D BUILD_opencv_highgui=ON \ -D BUILD_opencv_imgcodecs=ON \ -D BUILD_opencv_imgproc=ON \ -D BUILD_opencv_java=OFF \ -D BUILD_opencv_ml=ON \ -D BUILD_opencv_objdetect=ON \ -D BUILD_opencv_photo=ON \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=ON \ -D PYTHON3_DEFAULT_EXECUTABLE=/usr/bin/python3.7 \ -D PYTHON3_EXECUTABLE=/usr/bin/python3.7 \ -D PYTHON3_LIBRARY=/usr/lib/python3.7 \ -D PYTHON3_INCLUDE_DIR=/usr/include/python3.7 \ -D PYTHON3_NUMPY_INCLUDE_DIRS=${NUMPY_SITE_PACKAGES}/numpy-1.19.4-py3.7-linux-aarch64.egg/numpy/core/include \ -D BUILD_opencv_shape=OFF \ -D BUILD_opencv_stitching=OFF \ -D BUILD_opencv_superres=OFF \ -D BUILD_opencv_ts=OFF \ -D BUILD_opencv_video=ON \ -D BUILD_opencv_videoio=ON \ -D BUILD_opencv_videostab=OFF \ -D BUILD_opencv_viz=OFF \ -D BUILD_opencv_world=ON \ -D CMAKE_BUILD_TYPE=RELEASE \ -D ENABLE_NEON=ON \ -D WITH_1394=OFF \ -D WITH_CUBLAS=OFF \ -D WITH_CUDA=OFF \ -D WITH_CUFFT=OFF \ -D WITH_EIGEN=OFF \ -D WITH_FFMPEG=OFF \ -D WITH_GDAL=OFF \ -D WITH_GPHOTO2=OFF \ -D WITH_GIGEAPI=OFF \ -D WITH_GSTREAMER=OFF \ -D WITH_GTK=OFF \ -D WITH_INTELPERC=OFF \ -D WITH_IPP=OFF \ -D WITH_IPP_A=OFF \ -D WITH_JASPER=OFF \ -D WITH_JPEG=ON \ -D WITH_LIBV4L=OFF \ -D WITH_OPENCL=OFF \ -D WITH_OPENCLAMDBLAS=OFF \ -D WITH_OPENCLAMDFFT=OFF \ -D WITH_OPENCL_SVM=OFF \ -D WITH_OPENEXR=OFF \ -D WITH_OPENGL=OFF \ -D WITH_OPENMP=OFF \ -D WITH_OPENNI=OFF \ -D WITH_PNG=OFF \ -D WITH_PTHREADS_PF=OFF \ -D WITH_PVAPI=OFF \ -D WITH_QT=OFF \ -D WITH_TBB=OFF \ -D WITH_TIFF=OFF \ -D WITH_UNICAP=OFF \ -D WITH_V4L=OFF \ -D WITH_VTK=OFF \ -D WITH_WEBP=OFF \ -D WITH_XIMEA=OFF \ -D WITH_XINE=OFF \ ../../${OPENCV_DIR} make make install |
コンパイルする
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 |
---|
|
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 |
...
AdamAppでは、Pythonキャッシュファイル(__pycache__)は使用しません。
容量削減のため削除することをお勧めします。
Info |
---|
不要なファイルを削除するだけで数十MBの容量削減になります。アプリのファイルサイズが大きくなるとROM容量制限によりアプリ異常終了の原因となりますのでご注意ください。 |
Code Block | ||
---|---|---|
| ||
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/ $ find . -name *pycache* -print | xargs rm -rf |
...
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カードを挿入できるカメラのみ確認可能です。 |
SQLiteを配置する
...
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
...
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
...
ディレクトリで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カードを挿入できるカメラのみ確認可能です。 |
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
...
Code Block |
---|
$ 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.so.la0 ${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.aso.0.8.6 ${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モジュールは以下のディレクトリにインストールされています。
...
pycurl 7.45.2
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ディレクトリに配置してください。
Info |
---|
SoCがambaCV2XおよびambaCV5X(カメラファームv3.10以前)の場合はカメラ内のOpenSSLとバージョンを合わせるためにOpenSSL 1.1.1を利用してください。ambaCV5X(v3.20以降)の場合はOpenSSL 3.0.12にアップデートされているためOpenSSL 3.0.12を利用してください。 SoCについては下記を参照してください。 |
コンパイル手順ファイルを更新する
${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-openssl --openssl-dir=${HOME_PATH}/${OPENSSL_DIR} build |
Info |
---|
OpenSSL 3.0.12を利用する場合は下記のとおり書き換えてください。 修正前) OPENSSL_ARCHIVES=openssl-OpenSSL_1_1_1i.tar.gz 修正後) OPENSSL_ARCHIVES=openssl-3.0.12.tar.gz |
コンパイルする
Dockerを用いてpycurlモジュールとOpenSSLモジュールをコンパイルします。
...
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルではsrc/adamapp-py/additional_info_samplehogehoge_appを例とします。
PyCurlを配置する
PyCurlライブラリは以下のディレクトリにインストールされています。
...
${SDK_DIR}/src/adamapp-py/additionalhogehoge_info_sample_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/additionalhogehoge_info_sample_app/python/site-packages |
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp-py/additional_info_samplehogehoge_app/python/site-packages/pycurl.cpython-37m-aarch64-linux-gnu.so
...
${SDK_DIR}/src/adamapp-py/additional_info_samplehogehoge_app/python/pymain.py を開き、下記の通り追記します。
import os;
の1つ下の行に下記を追記する。
import pycurl;
...
サンプルアプリをビルドする
サンプルアプリ「additionalサンプルアプリ「hogehoge_info_sample_app」をビルドして、カメラにインストールします。
ビルド方法は各SDKバージョンに応じて実施ください。アプリ画面を開いて、「body」のように文字列が表示されていれば成功です。
Pythonモジュールをコンパイルする(Numba)
...
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} |
...
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルでは${SDK_DIR}/src/adamapp-py/yuv_yolov5_appを例とします。
モジュールを配置する
コンパイル済みのモジュールを、ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。コンパイル済みのモジュールをディレクトリ構成そのままで、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/
...