3. 编译安装指南
3.1. 源码目录结构
源码的目录结构如下:
└── sophon-sail
├── 3rdparty
│ ├── json
│ ├── prebuild
│ ├── pybind11
│ └── spdlog
├── cmake # Cmake Files
│ ├── BM168x_ARM_PCIE
│ └── BM168x_SOC
├── docs # Documentation codes
│ ├── common
│ ├── source_common
│ └── source_zh
├── include # Includes
├── python # Wheel codes
│ ├── arm_pcie
│ ├── pcie
│ └── soc
├── python_wheels # Python Wheels
│ ├── arm_pcie
│ └── soc
├── sample # Sample files
│ ├── cpp
│ └── python
└── src # Source codes
其中3rdparty主要包含了编译sail需要依赖的第三方的一些头文件; cmake中是编译用到的一些cmake文件; include是sail的一些头文件; python文件夹内包含了以下各平台下面python wheel的打包代码及脚本; python_wheels文件夹内是一些预编译出来的wheel包,arm_pcie和soc两个文件夹分别是对应的平台; sample文件夹内是一些示例程序; src文件夹下面是各接口的实现代码。
3.2. SAIL的编译及安装
3.2.1. 编译参数
BUILD_TYPE : 编译的类型,目前有pcie、soc、arm_pcie、loongarch四种模式, pcie是编译在x86主机上可用的SAIL包,soc表示使用交叉编译的方式,在x86主机上编译soc上可用的SAIL包,arm_pcie表示使用交叉编译的方式,在x86主机上编译插有bm168x卡的arm主机上可用的SAIL包,loongarch表示使用交叉编译的方式,在x86主机上编译插有bm168x卡的LoongArch64架构主机上可用的SAIL包。默认pcie。
ONLY_RUNTIME : 编译结果是否只包含运行时,而不包含bmcv,sophon-ffmpeg,sophon-opencv,如果此编译选项为ON,则SAIL的编解码及Bmcv接口不可用,只有推理接口可用。默认OFF。
INSTALL_PREFIX : 执行make install时的安装路径,pcie模式下默认“/opt/sophon”,与libsophon的安装路径一致,交叉编译模式下默认“build_soc”。
PYTHON_EXECUTABLE : 编译使用的“python3”的路径名称(路径+名称),默认使用当前系统中默认的python3。
CUSTOM_PY_LIBDIR : 编译使用的python3的动态库的路径(只包含路径),默认使用当前系统中默认python3的动态库目录。
LIBSOPHON_BASIC_PATH : 交叉编译模式下,libsophon的路径,如果配置不正确则会编译失败。pcie模式下面此编译选项不生效。
FFMPEG_BASIC_PATH : 交叉编译模式下,sophon-ffmpeg的路径,如果配置不正确,且ONLY_RUNTIME为“ON”时会编译失败。pcie模式下面此编译选项不生效。
OPENCV_BASIC_PATH : 交叉编译模式下,sophon-opencv的路径,如果配置不正确,且ONLY_RUNTIME为“ON”时会编译失败。pcie模式下面此编译选项不生效。
TOOLCHAIN_BASIC_PATH : 交叉编译模式下,交叉编译器的路径,目前只有在BUILD_TYPE为loongarch时生效。
BUILD_PYSAIL : 编译结果是否包含python版SAIL,默认为为“ON”,包含python版本SAIL。
3.2.2. 编译可被C++接口调用的动态库及头文件
3.2.2.1. PCIE MODE
.安装libsophon,sophon-ffmpeg,sophon-opencv的SAIL
libsophon,sophon-ffmpeg,sophon-opencv的安装方式可参考算能官方文档
.典型编译方式一
使用默认安装路径,编译包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_PYSAIL=OFF .. make sail
安装SAIL动态库及头文件,编译结果将安装在‘/opt/sophon’下面
sudo make install
.典型编译方式二
使用默认安装路径,编译不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL,
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DONLY_RUNTIME=ON -DBUILD_PYSAIL=OFF .. make sail
安装SAIL动态库及头文件,编译结果将安装在‘/opt/sophon’下面
sudo make install
3.2.2.2. SOC MODE
.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv
此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。
从算能官网中获取‘libsophon_soc_0.4.1_aarch64.tar.gz’,并解压
tar -xvf libsophon_soc_0.4.1_aarch64.tar.gz
解压后libsophon的目录为‘libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’
从算能官网中获取‘sophon-mw-soc_0.4.1_aarch64.tar.gz’,并解压
tar -xvf sophon-mw-soc_0.4.1_aarch64.tar.gz
解压后sophon-ffmpeg的目录为‘sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1’。
解压后sophon-opencv的目录为‘sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1’。
.安装gcc-aarch64-linux-gnu工具链
如果已经安装,可忽略此步骤
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
.典型编译方式一
通过交叉编译的方式,编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=soc -DBUILD_PYSAIL=OFF \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake \ -DLIBSOPHON_BASIC_PATH=libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 \ -DFFMPEG_BASIC_PATH=sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1 \ -DOPENCV_BASIC_PATH=sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1 .. make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_soc’,编译结果将安装在‘build_soc’下面
make install
将‘build_soc’文件夹下的‘sophon-sail’拷贝至目标SOC的‘/opt/sophon’目录下,即可在soc上面进行调用。
.典型编译方式二
通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL。
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=soc \ -DBUILD_PYSAIL=OFF \ -DONLY_RUNTIME=ON \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake \ -DLIBSOPHON_BASIC_PATH=libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 .. make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_soc’,编译结果将安装在‘build_soc’下面
make install
将‘build_soc’文件夹下的‘sophon-sail’拷贝至目标SOC的‘/opt/sophon’目录下,即可在soc上进行调用。
3.2.2.3. ARM PCIE MODE
.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv
此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。
从算能官网中获取‘libsophon_0.4.1_aarch64.tar.gz’,并解压
tar -xvf libsophon_0.4.1_aarch64.tar.gz
解压后libsophon的目录为‘libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’
从算能官网中获取‘sophon-mw_0.4.1_aarch64.tar.gz’,并解压
tar -xvf sophon-mw_0.4.1_aarch64.tar.gz
解压后sophon-ffmpeg的目录为‘sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1’。
解压后sophon-opencv的目录为‘sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1’。
.安装gcc-aarch64-linux-gnu工具链
如果已经安装,可忽略此步骤
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
.典型编译方式一
通过交叉编译的方式,编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=arm_pcie \ -DBUILD_PYSAIL=OFF \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_ARM_PCIE/ToolChain_aarch64_linux.cmake \ -DLIBSOPHON_BASIC_PATH=libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 \ -DFFMPEG_BASIC_PATH=sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1 \ -DOPENCV_BASIC_PATH=sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1 .. make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_arm_pcie’,编译结果将安装在‘build_arm_pcie’下面
make install
将‘build_arm_pcie’文件夹下的‘sophon-sail’拷贝至目标ARM主机的‘/opt/sophon’目录下,即可在目标机器上面进行调用。
.典型编译方式二
通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL。
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=arm_pcie \ -DONLY_RUNTIME=ON \ -DBUILD_PYSAIL=OFF \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_ARM_PCIE/ToolChain_aarch64_linux.cmake \ -DLIBSOPHON_BASIC_PATH=libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 .. make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_arm_pcie’,编译结果将安装在‘build_arm_pcie’下面
make install
将‘build_arm_pcie’文件夹下的‘sophon-sail’拷贝至目标ARM主机的‘/opt/sophon’目录下,即可在目标机器上面进行调用。
3.2.2.4. LOONGARCH64 MODE
.安装loongarch64-linux-gnu工具链
从LoongArch64官网获取其[交叉编译的工具链](http://ftp.loongnix.cn/toolchain/gcc/release/loongarch/gcc8/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.1.tar.xz), 解压到本地,解压后的目录结构如下:
└── loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.1
├── bin
├── lib
├── lib64
├── libexec
├── loongarch64-linux-gnu
├── share
├── sysroot
└── versions
.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv
此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.7, sophon-ffmpeg的版本为0.6.0,sophon-opencv的版本为0.6.0。
.典型编译方式一
通过交叉编译的方式,编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL,
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=loongarch \ -DBUILD_PYSAIL=OFF \ -DTOOLCHAIN_BASIC_PATH=toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.1 \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_LoongArch64/ToolChain_loongarch64_linux.cmake \ -DLIBSOPHON_BASIC_PATH=libsophon_0.4.7_loongarch64/opt/sophon/libsophon-0.4.7 \ -DFFMPEG_BASIC_PATH=sophon-mw_0.6.0_loongarch64/opt/sophon/sophon-ffmpeg_0.6.0 \ -DOPENCV_BASIC_PATH=sophon-mw_0.6.0_loongarch64/opt/sophon/sophon-opencv_0.6.0 \ .. make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_loongarch’,编译结果将安装在‘build_loongarch’下面
make install
将‘build_loongarch’文件夹下的‘sophon-sail’拷贝至目标龙芯主机的‘/opt/sophon’目录下,即可在目标机器上调用。
.典型编译方式二
通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL。
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=loongarch \ -DBUILD_PYSAIL=OFF \ -DONLY_RUNTIME=ON \ -DTOOLCHAIN_BASIC_PATH=toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.1 \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_LoongArch64/ToolChain_loongarch64_linux.cmake \ -DLIBSOPHON_BASIC_PATH=libsophon_0.4.7_loongarch64/opt/sophon/libsophon-0.4.7 \ .. make sail
安装SAIL动态库及头文件,程序将自动在源码目录下创建‘build_loongarch’,编译结果将安装在‘build_loongarch’下面
make install
将‘build_loongarch’文件夹下的‘sophon-sail’拷贝至目标龙芯主机的‘/opt/sophon’目录下,即可在目标机器上调用。
3.2.3. 编译可被Python3接口调用的Wheel文件
3.2.3.1. PCIE MODE
.安装libsophon,sophon-ffmpeg,sophon-opencv的SAIL
libsophon,sophon-ffmpeg,sophon-opencv的安装方式可参考算能官方文档
.典型编译方式一
使用默认安装路径,编译包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake .. make pysail
打包生成python wheel,生成的wheel包的路径为‘python/pcie/dist’,文件名为‘sophon-3.5.0-py3-none-any.whl’
cd ../python/pcie chmod +x sophon_pcie_whl.sh ./sophon_pcie_whl.sh
安装python wheel
pip3 install ./dist/sophon-3.5.0-py3-none-any.whl --force-reinstall
.典型编译方式二
编译不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL,
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DONLY_RUNTIME=ON .. make pysail
打包生成python wheel,生成的wheel包的路径为‘python/pcie/dist’,文件名为‘sophon-3.5.0-py3-none-any.whl’
cd ../python/pcie chmod +x sophon_pcie_whl.sh ./sophon_pcie_whl.sh
安装python wheel
pip3 install ./dist/sophon-3.5.0-py3-none-any.whl --force-reinstall
.典型编译方式三
如果生产环境与开发环境上的python3版本不一致,可以通过升级python3版本使其保持一致, 也可以通过python3的官方网站获取获取相应的python3包, 或者从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 也就是使用非系统默认的python3,编译包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL,并打包到‘build_pcie’目录下, 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 -DCUSTOM_PY_LIBDIR=python_3.8.2/lib .. make pysail
打包生成python wheel,生成的wheel包的路径为‘python/pcie/dist’,文件名为‘sophon-3.5.0-py3-none-any.whl’
cd ../python/pcie chmod +x sophon_pcie_whl.sh ./sophon_pcie_whl.sh
安装python wheel
将‘sophon-3.5.0-py3-none-any.whl’拷贝到目标机器上,然后执行如下安装命令
pip3 install ./dist/sophon-3.5.0-py3-none-any.whl --force-reinstall
3.2.3.2. SOC MODE
.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv
此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。
从算能官网中获取‘libsophon_soc_0.4.1_aarch64.tar.gz’,并解压
tar -xvf libsophon_soc_0.4.1_aarch64.tar.gz
解压后libsophon的目录为‘libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’
从算能官网中获取‘sophon-mw-soc_0.4.1_aarch64.tar.gz’,并解压
tar -xvf sophon-mw-soc_0.4.1_aarch64.tar.gz
解压后sophon-ffmpeg的目录为‘sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1’。
解压后sophon-opencv的目录为‘sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1’。
.安装gcc-aarch64-linux-gnu工具链
如果已经安装,可忽略此步骤
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
.典型编译方式一
使用指定版本的python3(和目标SOC上的python3保持一致),通过交叉编译的方式,编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=soc \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake \ -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \ -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \ -DLIBSOPHON_BASIC_PATH=libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 \ -DFFMPEG_BASIC_PATH=sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1 \ -DOPENCV_BASIC_PATH=sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1 .. make pysail
打包生成python wheel,生成的wheel包的路径为‘python/soc/dist’,文件名为‘sophon_arm-3.5.0-py3-none-any.whl’
cd ../python/soc chmod +x sophon_soc_whl.sh ./sophon_soc_whl.sh
安装python wheel
将‘sophon_arm-3.5.0-py3-none-any.whl’拷贝到目标SOC上,然后执行如下安装命令
pip3 install sophon_arm-3.5.0-py3-none-any.whl --force-reinstall
.典型编译方式二
使用指定版本的python3(和目标SOC上的python3保持一致),通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=soc \ -DONLY_RUNTIME=ON \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_SOC/ToolChain_aarch64_linux.cmake \ -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \ -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \ -DLIBSOPHON_BASIC_PATH=libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 .. make pysail
打包生成python wheel,生成的wheel包的路径为‘python/soc/dist’,文件名为‘sophon_arm-3.5.0-py3-none-any.whl’
cd ../python/soc chmod +x sophon_soc_whl.sh ./sophon_soc_whl.sh
安装python wheel
将‘sophon_arm-3.5.0-py3-none-any.whl’拷贝到目标SOC上,然后执行如下安装命令
pip3 install sophon_arm-3.5.0-py3-none-any.whl --force-reinstall
3.2.3.3. ARM PCIE MODE
.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv
此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。
从算能官网中获取‘libsophon_0.4.1_aarch64.tar.gz’,并解压
tar -xvf libsophon_0.4.1_aarch64.tar.gz
解压后libsophon的目录为‘libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’
从算能官网中获取‘sophon-mw_0.4.1_aarch64.tar.gz’,并解压
tar -xvf sophon-mw_0.4.1_aarch64.tar.gz
解压后sophon-ffmpeg的目录为‘sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1’。
解压后sophon-opencv的目录为‘sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1’。
.安装gcc-aarch64-linux-gnu工具链
如果已经安装,可忽略此步骤
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
.典型编译方式一
使用指定版本的python3(和目标ARM主机上的python3保持一致),通过交叉编译的方式,编译出包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=arm_pcie \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_ARM_PCIE/ToolChain_aarch64_linux.cmake \ -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \ -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \ -DLIBSOPHON_BASIC_PATH=libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 \ -DFFMPEG_BASIC_PATH=sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1 \ -DOPENCV_BASIC_PATH=sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1 .. make pysail
打包生成python wheel,生成的wheel包的路径为‘python/arm_pcie/dist’,文件名为‘sophon_arm_pcie-3.5.0-py3-none-any.whl’
cd ../python/arm_pcie chmod +x sophon_arm_pcie_whl.sh ./sophon_arm_pcie_whl.sh
安装python wheel
将‘sophon_arm_pcie-3.5.0-py3-none-any.whl’拷贝到目标ARM主机上,然后执行如下安装命令
pip3 install sophon_arm_pcie-3.5.0-py3-none-any.whl --force-reinstall
.典型编译方式二
使用指定版本的python3(和目标ARM主机上的python3保持一致),通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.8.2/bin/python3’,python3的动态库目录‘python_3.8.2/lib’。
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=arm_pcie \ -DONLY_RUNTIME=ON \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_ARM_PCIE/ToolChain_aarch64_linux.cmake \ -DPYTHON_EXECUTABLE=python_3.8.2/bin/python3 \ -DCUSTOM_PY_LIBDIR=python_3.8.2/lib \ -DLIBSOPHON_BASIC_PATH=libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1 .. make
打包生成python wheel,生成的wheel包的路径为‘python/arm_pcie/dist’,文件名为‘sophon_arm_pcie-3.5.0-py3-none-any.whl’
cd ../python/arm_pcie chmod +x sophon_arm_pcie_whl.sh ./sophon_arm_pcie_whl.sh
安装python wheel
将‘sophon_arm_pcie-3.5.0-py3-none-any.whl’拷贝到目标ARM主机上,然后执行如下安装命令
pip3 install sophon_arm_pcie-3.5.0-py3-none-any.whl --force-reinstall
3.2.3.4. LOONGARCH64 MODE
.安装loongarch64-linux-gnu工具链
从LoongArch64官网获取其[交叉编译的工具链](http://ftp.loongnix.cn/toolchain/gcc/release/loongarch/gcc8/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.1.tar.xz), 解压到本地,解压后的目录结构如下:
└── loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.1
├── bin
├── lib
├── lib64
├── libexec
├── loongarch64-linux-gnu
├── share
├── sysroot
└── versions
.获取交叉编译需要使用的libsophon
此章节所有的编译操作都是在x86主机上,使用交叉编译的方式进行编译。下面示例中选择libsophon的版本为0.4.7。
.典型编译方式一
使用指定版本的python3(和目标龙芯主机上的python3保持一致),通过交叉编译的方式,编译出不包含bmcv,sophon-ffmpeg,sophon-opencv的SAIL, python3的安装方式可通过python官方网站获取, 也可以从[此链接](http://219.142.246.77:65000/sharing/8MlSKnV8x)下载已经编译好的python3。 本示例使用的python3路径为‘python_3.7.3/bin/python3’,python3的动态库目录‘python_3.7.3/lib’。
通过此方式编译出来的SAIL无法使用其Decoder、Bmcv等多媒体相关接口。
下载sophon-sail源码,解压后进入其源码目录
创建编译文件夹build,并进入build文件夹
mkdir build && cd build
执行编译命令
cmake -DBUILD_TYPE=loongarch \ -DONLY_RUNTIME=ON \ -DTOOLCHAIN_BASIC_PATH=toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.1 \ -DCMAKE_TOOLCHAIN_FILE=../cmake/BM168x_LoongArch64/ToolChain_loongarch64_linux.cmake \ -DPYTHON_EXECUTABLE=python_3.7.3/bin/python3 \ -DCUSTOM_PY_LIBDIR=python_3.7.3/lib \ -DLIBSOPHON_BASIC_PATH=libsophon_0.4.7_loongarch64/opt/sophon/libsophon-0.4.7 \ .. make pysail
打包生成python wheel,生成的wheel包的路径为‘python/loongarch64/dist’,文件名为‘sophon_loongarch64-3.5.0-py3-none-any.whl’
cd ../python/loongarch64 chmod +x sophon_loongarch64_whl.sh ./sophon_loongarch64_whl.sh
安装python wheel
将‘sophon_loongarch64-3.5.0-py3-none-any.whl’拷贝到目标主机上,然后执行如下安装命令
pip3 install sophon_loongarch64-3.5.0-py3-none-any.whl --force-reinstall
3.2.4. 编译用户手册
.安装软件包
# 更新apt
sudo apt update
# 安装latex
sudo apt install texlive-xetex texlive-latex-recommended
# 安装Sphinx
pip3 install sphinx sphinx-autobuild sphinx_rtd_theme rst2pdf
# 安装结巴中文分词库,以支持中文搜索
pip3 install jieba3k
.安装字体
[Fandol](https://ctan.org/pkg/fandol) - Four basic fonts for Chinese typesetting
# 下载Fandol字体
wget http://mirrors.ctan.org/fonts/fandol.zip
# 解压缩字体包
unzip fandol.zip
# 拷贝安装字体包
sudo cp -r fandol /usr/share/fonts/
cp -r fandol ~/.fonts
.执行编译
下载sophon-sail源码,解压后进入其源码的docs目录
cd docs
make pdf
编译好的用户手册路径为‘docs/build/sophon-sail_zh.pdf’
如果编译仍然报错,可以安装以下 ‘sudo apt-get install texlive-lang-chinese’,然后重新执行上述命令。
3.3. 使用SAIL的Python接口进行开发
3.3.1. PCIE MODE
在使用PCIE MODE编译好SAIL,执行安装python wheel之后,即可以使用python中调用SAIL,其接口文档可参考API章节。
3.3.2. SOC MODE
.使用自己编译的Python wheel包
在使用SOC MODE通过交叉编译的方式编译好SAIL之后,将python wheel拷贝到SOC上面进行安装,即可以使用python中调用SAIL,其接口文档可参考API章节。
.使用预编译的Python wheel包
查看SOC上的libsophon版本和sophon-mw(sophon-ffmpeg,sophon-opencv)的版本
ls /opt/sophon/
查看SOC上的Python3版本
python3 --version
从预编译的Python wheel包中找到对应版本的wheel包,将对应的wheel包拷贝到SOC上面进行安装,即可以使用python中调用SAIL,其接口文档可参考API章节。
3.3.3. ARM PCIE MODE
在使用ARM PCIE MODE通过交叉编译的方式编译好SAIL之后,将python wheel拷贝到ARM主机上面进行安装,即可以在python中调用SAIL,其接口文档可参考API章节。
查看ARM主机上的libsophon版本和sophon-mw(sophon-ffmpeg,sophon-opencv)的版本
cat /opt/sophon/
查看ARM主机上的Python3版本
python3 --version
从预编译的Python wheel包中找到对应版本的wheel包,将对应的wheel包拷贝到ARM主机上面进行安装,即可以使用python中调用SAIL,其接口文档可参考API章节。
3.4. 使用SAIL的C++接口进行开发
3.4.1. PCIE MODE
在使用PCIE MODE编译好SAIL,并且通过执行‘sudo make install’或者通过拷贝的方式安装好SAIL的c++库之后, 推荐使用cmake来将SAIL中的库链接到自己的程序中,如果需要使用SAIL多媒体相关的功能, 也需要将libsophon,sophon-ffmpeg,sophon-opencv的头文件目录及动态库目录添加到自己的程序中。 可以在您程序的CMakeLists.txt中添加如下段落:
find_package(libsophon REQUIRED)
include_directories(${LIBSOPHON_INCLUDE_DIRS})
# 添加libsophon的头文件目录
set(SAIL_DIR /opt/sophon/sophon-sail/lib/cmake)
find_package(SAIL REQUIRED)
include_directories(${SAIL_INCLUDE_DIRS})
link_directories(${SAIL_LIB_DIRS})
# 添加SAIL的头文件及动态库目录
find_package(libsophon REQUIRED)
include_directories(${LIBSOPHON_INCLUDE_DIRS})
# 添加libsophon的头文件目录
set(OpenCV_DIR /opt/sophon/sophon-opencv-latest/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加sophon-opencv的头文件目录
set(FFMPEG_DIR /opt/sophon/sophon-ffmpeg-latest/lib/cmake)
find_package(FFMPEG REQUIRED)
include_directories(${FFMPEG_INCLUDE_DIRS})
link_directories(${FFMPEG_LIB_DIRS})
# 添加sophon-ffmpeg的头文件及动态库目录
add_executable(${YOUR_TARGET_NAME} ${YOUR_SOURCE_FILES})
target_link_libraries(${YOUR_TARGET_NAME} sail)
在您的代码中即可以调用sail中的函数:
#define USE_FFMPEG 1
#define USE_OPENCV 1
#define USE_BMCV 1
#include <stdio.h>
#include <sail/cvwrapper.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
int device_id = 0;
std::string video_path = "test.avi";
sail::Decoder decoder(video_path,true,device_id);
if(!decoder.is_opened()){
printf("Video[%s] read failed!\n",video_path.c_str());
exit(1) ;
}
sail::Handle handle(device_id);
sail::Bmcv bmcv(handle);
while(true){
sail::BMImage ost_image = decoder.read(handle);
bmcv.imwrite("test.jpg", ost_image);
break;
}
return 0;
}
3.4.2. SOC MODE
.SOC板卡上编译程序
在SOC板卡上安装好libsophon,sophon-ffmpeg,sophon-opencv,及SAIL之后,您可以参考PCIE MODE的开发方法使用cmake将SAIL中的库链接到自己的程序中, 如果需要使用SAIL多媒体相关的功能, 也需要将libsophon,sophon-ffmpeg,sophon-opencv的头文件目录及动态库目录添加到自己的程序中。
.x86交叉编译程序
如果您希望使用SAIL搭建交叉编译环境,您需要用到libsophon,sophon-ffmpeg,sophon-opencv以及gcc-aarch64-linux-gnu工具链。
.创建‘soc-sdk’文件夹
创建‘soc-sdk’文件夹,后续交叉编译需要用到的头文件及动态库都将存放在此目录中。
mkdir soc-sdk
.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv
下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。
从算能官网中获取‘libsophon_soc_0.4.1_aarch64.tar.gz’,并解压拷贝至‘soc-sdk’文件夹
tar -xvf libsophon_soc_0.4.1_aarch64.tar.gz cp -r libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/include soc-sdk cp -r libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/lib soc-sdk
解压后libsophon的目录为‘libsophon_soc_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’
从算能官网中获取‘sophon-mw-soc_0.4.1_aarch64.tar.gz’,并解压拷贝至‘soc-sdk’文件夹
tar -xvf sophon-mw-soc_0.4.1_aarch64.tar.gz cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/include soc-sdk cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/lib soc-sdk cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/include/opencv4/opencv2 soc-sdk/include cp -r sophon-mw-soc_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/lib soc-sdk
.将交叉编译好的SAIL,也即是‘build_soc’拷贝至‘soc-sdk’文件夹
cp build_soc/sophon-sail/include soc-sdk cp build_soc/sophon-sail/lib soc-sdk
.安装gcc-aarch64-linux-gnu工具链
如果已经安装,可忽略此步骤
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
上述步骤配置好之后,可以通过配置cmake来完成交叉编译,在您程序的CMakeLists.txt中添加如下段落:
CMakeLists.txt中需要使用‘soc-sdk’的绝对路径为‘/opt/sophon/soc-sdk’,实际应用中需要根据自己实际的位置来进行配置。
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_ASM_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
include_directories("/opt/sophon/soc-sdk/include")
include_directories("/opt/sophon/soc-sdk/include/sail")
# 添加交叉编译需要使用的头文件目录
link_directories("/opt/sophon/soc-sdk/lib")
# 添加交叉编译需要使用的动态库目录
add_executable(${YOUR_TARGET_NAME} ${YOUR_SOURCE_FILES})
target_link_libraries(${YOUR_TARGET_NAME} sail)
# sail为需要链接的库
3.4.3. ARM PCIE MODE
.ARM主机上编译程序
在ARM主机上安装好libsophon,sophon-ffmpeg,sophon-opencv,及SAIL之后,您可以参考PCIE MODE的开发方法使用cmake将SAIL中的库链接到自己的程序中, 如果需要使用SAIL多媒体相关的功能, 也需要将libsophon,sophon-ffmpeg,sophon-opencv的头文件目录及动态库目录添加到自己的程序中。
.x86交叉编译程序
如果您希望使用SAIL搭建交叉编译环境,您需要用到libsophon,sophon-ffmpeg,sophon-opencv以及gcc-aarch64-linux-gnu工具链。
.创建‘arm_pcie-sdk’文件夹
创建‘arm_pcie-sdk’文件夹,后续交叉编译需要用到的头文件及动态库都将存放在此目录中。
mkdir arm_pcie-sdk
.获取交叉编译需要使用的libsophon,sophon-ffmpeg,sophon-opencv
下面示例中选择libsophon的版本为0.4.1, sophon-ffmpeg的版本为0.4.1,sophon-opencv的版本为0.4.1。
从算能官网中获取‘libsophon_0.4.1_aarch64.tar.gz’,并解压拷贝至‘arm_pcie-sdk’文件夹
tar -xvf libsophon_0.4.1_aarch64.tar.gz cp -r libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/include arm_pcie-sdk cp -r libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1/lib arm_pcie-sdk
解压后libsophon的目录为‘libsophon_0.4.1_aarch64/opt/sophon/libsophon-0.4.1’
从算能官网中获取‘sophon-mw_0.4.1_aarch64.tar.gz’,并解压拷贝至‘arm_pcie-sdk’文件夹
tar -xvf sophon-mw_0.4.1_aarch64.tar.gz cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/include arm_pcie-sdk cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-ffmpeg_0.4.1/lib arm_pcie-sdk cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/include/opencv4/opencv2 arm_pcie-sdk/include cp -r sophon-mw_0.4.1_aarch64/opt/sophon/sophon-opencv_0.4.1/lib arm_pcie-sdk
.将交叉编译好的SAIL,也即是‘build_arm_pcie’拷贝至‘arm_pcie-sdk’文件夹
cp build_arm_pcie/sophon-sail/include arm_pcie-sdk cp build_arm_pcie/sophon-sail/lib arm_pcie-sdk
.安装gcc-aarch64-linux-gnu工具链
如果已经安装,可忽略此步骤
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
上述步骤配置好之后,可以通过配置cmake来完成交叉编译,在您程序的CMakeLists.txt中添加如下段落:
CMakeLists.txt中需要使用‘arm_pcie-sdk’的绝对路径为‘/opt/sophon/arm_pcie-sdk’,实际应用中需要根据自己实际的位置来进行配置。
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_ASM_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
include_directories("/opt/sophon/arm_pcie-sdk/include")
include_directories("/opt/sophon/arm_pcie-sdk/include/sail")
# 添加交叉编译需要使用的头文件目录
link_directories("/opt/sophon/arm_pcie-sdk/lib")
# 添加交叉编译需要使用的动态库目录
add_executable(${YOUR_TARGET_NAME} ${YOUR_SOURCE_FILES})
target_link_libraries(${YOUR_TARGET_NAME} sail)
# sail为需要链接的库