完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (一) 依赖库编译、第三方库编译安装

目录

1 jetson-ffmpeg的编译安装与配置--用来做视频编码、视频解码

2 CV-CUDA库的编译安装与配置--用来做图像缩放、裁剪、色域转换

3 cuda cudnn TensorRT相关库的拷贝与配置

3.1将cuda cudnn TensorRT相关的头文件拷贝到工程中

3.2 将cuda cudnn TensorRT相关的库拷贝到/data/chw/compute_lib/lib/jetson_lib

4 cuda_utils库编译

5 算法推理库trteng_exp编译安装和配置

5.1 报错 trtNet_v2.cpp:1:10: fatal error: spdlog/fmt/fmt.h: No such file or directory

6 算法模型转换库model2trt_v2编译安装和配置

6.1 prot_parse_convert.cpp:7:10: fatal error: caffe/caffe.pb.h: No such file or directory 

6.2 error: invalid conversion from ‘const char*’ to ‘const uint8_t*’ {aka ‘const unsigned char*’}

6.3 error: no matching function for call to ‘google::protobuf::internal::InternalMetadata::unknown_fields() const

6.4 源码编译安装protobuf

6.5 caffe/caffe.pb.h:13:2: error: #error "This file was generated by a newer version of protoc which i

7 build_all.sh一键编译cuda_utils trteng_exp model2trt_v2

8 测试model2trt_v2转模型

9 拷贝所有的计算库到./nvstream/3rdparty/jetson/compute/lib/aarch64

参考文献:


记录下将CNStream流处理多路并发Pipeline框架适配到NVIDIA Jetson AGX Orin的过程,以及过程中遇到的问题,我的jetson盒子是用jetpack5.1.3重新刷机之后的,这是系列博客的第一篇

1 jetson-ffmpeg的编译安装与配置--用来做视频编码、视频解码

在jetson AGX Orin上会选择用jetson-ffmpeg做视频编解码以及图像处理工作,其中jetson-ffmpeg的编译安装见如下博客

在NVIDIA Jetson AGX Orin中使用jetson-ffmpeg调用硬件编解码加速处理-CSDN博客

编译安装完之后,相应的库文件在/usr/local/lib/,相应的头文件在/usr/local/include/

使用如下命令将编译号的jetson-ffmpeg拷贝到我的工程的./nvstream/3rdparty/ffmpeg中

cp -rf  /usr/local/lib/lib*  /data/chw/nvstream/3rdparty/ffmpeg/lib/aarch64/
cp -rf  /usr/local/include/*   /data/chw/nvstream/3rdparty/ffmpeg/include/

这样之后,工程里面的3rdparty/config_lib_aarch64.sh脚本内容需要修改,把脚本中ffmpeg相关的内容修改如下

#----------------------------------
# ffmpeg
#----------------------------------
cd ${root}/ffmpeg/lib/linux_lib
\cp ../${arch}/* .ln -snf libavcodec.so.58.134.100 libavcodec.so.58
ln -snf libavcodec.so.58 libavcodec.soln -snf libavdevice.so.58.13.100 libavdevice.so.58
ln -snf libavdevice.so.58 libavdevice.soln -snf libavfilter.so.7.110.100 libavfilter.so.7
ln -snf libavfilter.so.7 libavfilter.soln -snf libavformat.so.58.76.100 libavformat.so.58
ln -snf libavformat.so.58 libavformat.soln -snf libavutil.so.56.70.100 libavutil.so.56
ln -snf libavutil.so.56 libavutil.soln -snf libswresample.so.3.9.100 libswresample.so.3
ln -snf libswresample.so.3 libswresample.soln -snf libswscale.so.5.9.100 libswscale.so.5
ln -snf libswscale.so.5 libswscale.soln -snf libnvmpi.so.1.0.0 libnvmpi.so.1
ln -snf libnvmpi.so.1 libnvmpi.so

2 CV-CUDA库的编译安装与配置--用来做图像缩放、裁剪、色域转换

CV-CUDA库的编译和安装见如下博客:NVIDIA Jetson AGX Orin源码编译安装CV-CUDA-CSDN博客

编译安装完之后,用如下命令将cv-cuda相关的库和头文件拷贝到工程中


cp -rf  /opt/nvidia/cvcuda0/include/*  /data/chw/nvstream/3rdparty/jetson/cvcuda/include/
cp -rf  /opt/nvidia/cvcuda0/lib/aarch64-linux-gnu/lib* /data/chw/nvstream/3rdparty/jetson/cvcuda/lib/aarch64/

同样修改库的配置脚本3rdparty/config_lib_aarch64.sh,修改的部分内容如下

#----------------------------------
# jetson: cv-cuda
#----------------------------------
cd ${root}/jetson/cvcuda/lib/linux_lib
\cp ../${arch}/* .
ln -snf libcvcuda.so.0.10.1 libcvcuda.so.0
ln -snf libcvcuda.so.0 libavcodec.soln -snf libnvcv_types.so.0.10.1 libnvcv_types.so.0
ln -snf libnvcv_types.so.0 libavdevice.so

3 cuda cudnn TensorRT相关库的拷贝与配置

由于用jetpack5.1.3刷机之后,cuda cudnn TensorRT相关的库版本和之前相比有更新,所以要把cuda cudnn TensorRT相关的库拷贝到我的工程下面。为什么不直接用/usr/local下面的库,这是为了以后如果工程迁移到别的盒子上,那么可以把这些库直接考过去,这样系统路径下的库版本不一样也可以用。

3.1将cuda cudnn TensorRT相关的头文件拷贝到工程中

这个省点事,不拷贝了,到时候makefile直接去/usr/local/cuda/include这种默认路径下找吧,反正我最终的工程代码不需要cuda这些的头文件。

3.2 将cuda cudnn TensorRT相关的库拷贝到/data/chw/compute_lib/lib/jetson_lib

用如下命令拷贝cuda相关库

cp /usr/local/cuda-11.4/targets/aarch64-linux/lib/libcublasLt.so.11.6.6.84  /data/chw/compute_lib/lib/jetson_lib/
cp /usr/local/cuda-11.4/targets/aarch64-linux/lib/libcublas.so.11.6.6.84  /data/chw/compute_lib/lib/jetson_lib/
cp /usr/local/cuda-11.4/targets/aarch64-linux/lib/libcudart.so.11.4.298 /data/chw/compute_lib/lib/jetson_lib/
cp /usr/local/cuda-11.4/targets/aarch64-linux/lib/libcurand.so.10.2.5.297  /data/chw/compute_lib/lib/jetson_lib/
cp /usr/local/cuda-11.4/targets/aarch64-linux/lib/libnvrtc-builtins.so.11.4.300   /data/chw/compute_lib/lib/jetson_lib/
cp /usr/local/cuda-11.4/targets/aarch64-linux/lib/libnvrtc.so.11.4.300   /data/chw/compute_lib/lib/jetson_lib/

用下面的命令拷贝cudnn相关库

cp /usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer.so.8.6.0  /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/libcudnn.so.8.6.0   /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/libcudnn_ops_infer.so.8.6.0   /data/chw/compute_lib/lib/jetson_lib/

用下面的命令拷贝TensorRT相关的库

cp /usr/lib/aarch64-linux-gnu/libnvinfer.so.8.5.2   /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.8.5.2   /data/chw/compute_lib/lib/jetson_lib/

其他相关库的拷贝,下面的库在后面也会用到,也拷贝过去

cp /usr/lib/aarch64-linux-gnu/tegra/libnvdla_compiler.so  /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvos.so            /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvdla_runtime.so   /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libcuda.so.1          /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvrm_host1x.so     /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvrm_mem.so        /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvsocsys.so        /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvrm_gpu.so        /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvrm_sync.so       /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvrm_chip.so       /data/chw/compute_lib/lib/jetson_lib/
cp /usr/lib/aarch64-linux-gnu/tegra/libnvsciipc.so        /data/chw/compute_lib/lib/jetson_lib/

 在lib/config_lib_jetson.sh里面之前并没有增加cuda相关库的软链接命令,因为之前jetson上都是直接去的/usr/local/cuda这种默认路径下找的库,但是这次我是把这些库拷贝到工程中了,所以lib/config_lib_jetson.sh需要增加这些东西,增加内容如下:

#----------------------------------
#Specific lib for GPU
#----------------------------------
#1> cuda
ln -snf libcublas.so.11.6.6.84 libcublas.so.11
ln -snf libcublas.so.11 libcublas.soln -snf libcublasLt.so.11.6.6.84 libcublasLt.so.11
ln -snf libcublasLt.so.11 libcublasLt.soln -snf libcudart.so.11.4.298 libcudart.so.11.0
ln -snf libcudart.so.11.0 libcudart.so.11
ln -snf libcudart.so.11 libcudart.soln -snf libcurand.so.10.2.5.297 libcurand.so.10
ln -snf libcurand.so.10 libcurand.soln -snf libnvrtc.so.11.4.300 libnvrtc.so.11
ln -snf libnvrtc.so.11 libnvrtc.soln -snf libnvrtc-builtins.so.11.4.300 libnvrtc-builtins.so.11.4
ln -snf libnvrtc-builtins.so.11.4 libnvrtc-builtins.so.11
ln -snf libnvrtc-builtins.so.11 libnvrtc-builtins.soln -snf libcudnn_ops_infer.so.8.6.0 libcudnn_ops_infer.so.8
ln -snf libcudnn_ops_infer.so.8 libcudnn_ops_infer.soln -snf libcudnn_cnn_infer.so.8.6.0 libcudnn_cnn_infer.so.8
ln -snf libcudnn_cnn_infer.so.8 libcudnn_cnn_infer.soln -snf libcudnn.so.8.6.0 libcudnn.so.8
ln -snf libcudnn.so.8 libcudnn.so#2> TensorRT
ln -snf libnvinfer.so.8.5.2 libnvinfer.so.8
ln -snf libnvinfer.so.8 libnvinfer.soln -snf libnvinfer_plugin.so.8.5.2 libnvinfer_plugin.so.8
ln -snf libnvinfer_plugin.so.8 libnvinfer_plugin.so

然后执行以下这个脚本去/data/chw/compute_lib/lib目录下

 sh config_lib_jetson.sh

4 cuda_utils库编译

然后由于我把cuda cudnn这些库拷贝过来了,那么comp_nvidia/cuda_utils/Makefile_jetson中cuda cudnn这些库的路径我要修改一下,如下所示,删除默认路径

#LIBRARY_PATH := /usr/local/cuda/lib64
LIBRARY_PATH := ../../lib/linux_lib

这样他就直接去我自己的路径下找库了。然后直接用下面的命令编译

make -f Makefile_jetson clean; make -f Makefile_jetson

然后ldd看一下,确实是找的我自己路径下的了,不是/usr/local/cuda-11.4/targets/aarch64-linux/lib下的了。

5 算法推理库trteng_exp编译安装和配置

和上面一样,由于我把cuda cudnn这些库拷贝过来了,那么comp_nvidia/trteng_exp/Makefile_jetson中cuda cudnn这些库的路径我要修改一下,如下所示,删除默认路径

#LIBRARY_PATH := ../../lib/linux_lib /usr/local/cuda/lib64 /usr/lib/aarch64-linux-gnu/tegra
LIBRARY_PATH := ../../lib/linux_lib

这样他就直接去我自己的路径下找库了。然后直接用下面的命令编译。

make -f Makefile_jetson clean; make -f Makefile_jetson

用上面的命令进行编译,

5.1 报错 trtNet_v2.cpp:1:10: fatal error: spdlog/fmt/fmt.h: No such file or directory

这是因为compute_lib/include这个头文件文件夹没有放到/data/chw/compute_lib里面,上传到盒子上,

然后再次编译

6 算法模型转换库model2trt_v2编译安装和配置

model2trt_v2除了依赖前面的cuda cudnn TensorRT那一堆库之外,在comp_nvidia/model2trt_v2/lib路径下的libnvonnxparser.so.8.0.1和libnvparsers.so.8.0.1要替换成新版本,这里cp的时候加上了-d,软链接也一并拷贝过去了,

cp -drf /usr/lib/aarch64-linux-gnu/libnvparsers* /data/chw/compute_lib/comp_nvidia/model2trt_v2/lib/
cp -drf /usr/lib/aarch64-linux-gnu/libnvonnxparser*  /data/chw/compute_lib/comp_nvidia/model2trt_v2/lib/

修改makeifle

## used include librarys file path  
#LIBRARY_PATH := ../../lib/linux_lib /usr/lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu/tegra /usr/local/cuda/targets/aarch64-linux/lib
LIBRARY_PATH := ../../lib/linux_lib ./lib

然后用下面的命令编译

make -f Makefile_jetson clean; make -f Makefile_jetson -j8

然后报错

6.1 prot_parse_convert.cpp:7:10: fatal error: caffe/caffe.pb.h: No such file or directory 

prot_parse_convert.cpp:7:10: fatal error: caffe/caffe.pb.h: No such file or directory7 | #include "caffe/caffe.pb.h"

解决方法

sudo apt install -y protobuf-compiler
protoc caffe.proto --proto_path=./ --cpp_out=./caffe

6.2 error: invalid conversion from ‘const char*’ to ‘const uint8_t*’ {aka ‘const unsigned char*’}

error: invalid conversion from ‘const char*’ to ‘const uint8_t*’ {aka ‘const unsigned char*’} [-fpermissive]78 |         const IBlobNameToTensor* blobNameToTensor = parser->parseBuffers(cleaned_proto.data(),cleaned_proto.size(),

继续编译报上面的错误,这种错误看着就像是版本更新导致的错误,我直接修改代码强制类型转换

	const IBlobNameToTensor* blobNameToTensor = parser->parseBuffers(reinterpret_cast<const uint8_t*>(cleaned_proto.data()),cleaned_proto.size(),reinterpret_cast<const uint8_t*>(model_data.data()),model_data.size(),*network,DataType::kFLOAT);

6.3 error: no matching function for call to ‘google::protobuf::internal::InternalMetadata::unknown_fields() const

再次编译刷屏报类似上面两个这样的错误。

这些错误看着都是protobuf的错误,问题原因是我前面用sudo apt install -y protobuf-compiler安装的protobug太老了,需要20版本以上的。

所以先卸载掉前面安装的,然后改为源码编译安装protobuf。

sudo apt remove protobuf-compiler

6.4 源码编译安装protobuf

首先安装依赖

sudo apt-get install autoconf automake libtool curl make g++ unzip

然后下载、编译、安装

git clone --branch v23.0 https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/protobuf ..
make -j$(nproc)
sudo make install

配置环境变量,编辑/etc/profile,vim /etc/profile在里面增加如下内容

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
export PATH=$PATH:/usr/local/protobuf/bin/
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/

然后

source /etc/profile

然后

6.5 caffe/caffe.pb.h:13:2: error: #error "This file was generated by a newer version of protoc which i

继续用下面命令编译model2trt_v2

protoc caffe.proto --proto_path=./ --cpp_out=./caffe
make -f Makefile_jetson clean; make -f Makefile_jetson -j8

报上面的错误,这错误还是protoc的版本问题,其实上面不需要源码编译安装protoc,在./compute_lib/bin/jetson目录下是有这个工具和库的,只是我没有把他传到盒子上,现在把这个上传到盒子上,

然后把上面vim /etc/profile的内容删掉。

然后不这样单独编译了,用build_all.sh一键编译脚本进行编译。

7 build_all.sh一键编译cuda_utils trteng_exp model2trt_v2

使用build_all.sh前,要把某些内容注释掉,因为这次在jetson盒子上并不是所有东西都需要编译。

另外库的版本也需要修改。

完整版的build_all.sh备份如下

#!/bin/bash#出现错误即退出执行
set -e root_dir=$(dirname "$PWD")cd ${root_dir}function enable_release_type() {device=$1if [ "$device" = "mlu" ]; thensed -i "s/.*\(DBG_ENABLE\s*:=\s*\).*\$/\10/" Makefile_mluelif [ "$device" = "mlu_arm" ]; thensed -i "s/.*\(DBG_ENABLE\s*:=\s*\).*\$/\10/" Makefile_mlu_armelif [ "$device" = "jetson" ]; thensed -i "s/.*\(DBG_ENABLE\s*:=\s*\).*\$/\10/" Makefile_jetsonelif [ "$device" = "acl_arm" ]; thensed -i "s/.*\(DBG_ENABLE\s*:=\s*\).*\$/\10/" Makefile_acl_armelif [ "$device" = "bm" ]; thensed -i "s/.*\(DBG_ENABLE\s*:=\s*\).*\$/\10/" Makefile_bmelse sed -i "s/.*\(DBG_ENABLE\s*:=\s*\).*\$/\10/" Makefilefi
}function build() {device=$1#设置为release版本enable_release_type $deviceif [ "$device" = "mlu" ]; thenmake -f Makefile_mlu cleanmake -f Makefile_mlu -j8elif [ "$device" = "mlu_arm" ]; thenmake -f Makefile_mlu_arm cleanmake -f Makefile_mlu_arm -j8elif [ "$device" = "jetson" ]; thenmake -f Makefile_jetson cleanmake -f Makefile_jetson -j8elif [ "$device" = "acl_arm" ]; thenmake -f Makefile_acl_arm cleanmake -f Makefile_acl_arm -j8elif [ "$device" = "bm" ]; thenmake -f Makefile_bm cleanmake -f Makefile_bm -j8elif [ "$device" = "gpu_arm" ]; thenmake -f Makefile_gpu_arm cleanmake -f Makefile_gpu_arm -j8else make cleanmake -j8fi
}function build_caffe() {device=$1if [ "$device" = "mlu" ]; then	#设置NEUWAREexport NEUWARE_HOME=${root_dir}/comp_cambricon/include/neuwarechmod +x -R ${root_dir}/comp_cambricon/include/neuware/bin#设置protoc目录export PATH=$PATH:${root_dir}/bin/x64chmod +x -R ${root_dir}/bin/x64export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${root_dir}/bin/x64:${root_dir}/lib/linux_libln -snf ${root_dir}/lib/linux_lib ${root_dir}/comp_cambricon/include/neuware/lib64cd ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/scriptschmod +x ./*.sh#./build_caffe_mlu270_cambricon_release.sh#\cp ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/build/lib/*.a ${root_dir}/comp_cambricon/cafl_sdk/lib#\cp ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/build/tools/caffe ${root_dir}/distribute/bin/mlu#\cp ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/build/tools/generate_quantized_pt ${root_dir}/distribute/bin/mluelif [ "$device" = "mlu_arm" ]; then	#设置NEUWAREecho "1..."export NEUWARE_HOME=${root_dir}/comp_cambricon/include/neuwarechmod +x -R ${root_dir}/comp_cambricon/include/neuware/binecho "2..."#设置protoc目录export PATH=$PATH:${root_dir}/bin/x64chmod +x -R ${root_dir}/bin/x64export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${root_dir}/bin/x64:${root_dir}/lib/linux_libln -snf ${root_dir}/lib/linux_lib ${root_dir}/comp_cambricon/include/neuware/lib64cd ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/scriptsecho "3..."chmod +x ./*.sh#./build_caffe_mlu270_cambricon_release.sh#echo "4..."#\cp ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/build/lib/*.a ${root_dir}/comp_cambricon/cafl_sdk/lib#\cp ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/build/tools/caffe ${root_dir}/distribute/bin/mlu_arm#\cp ${root_dir}/comp_cambricon/caffe_mlu/caffe/src/caffe/build/tools/generate_quantized_pt ${root_dir}/distribute/bin/mlu_armelse #设置protoc目录if [ "$device" = "jetson" ]; thenexport PATH=$PATH:${root_dir}/bin/jetsonchmod +x -R ${root_dir}/bin/jetsonexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${root_dir}/bin/jetson:${root_dir}/lib/linux_libexport CUDA_DIR=/usr/local/cuda#protoc ${root_dir}/comp_nvidia/caffe_gcs/src/caffe/proto/caffe.proto --proto_path=${root_dir}/comp_nvidia/caffe_gcs/src/caffe/proto --cpp_out=${root_dir}/caffe_gcs/src/caffe/proto#cd ${root_dir}/comp_nvidia/caffe_gcs#make -f Makefile_jetson clean#make -f Makefile_jetson -j8elif [ "$device" = "gpu_arm" ]; thenexport PATH=$PATH:${root_dir}/bin/gpu_armchmod +x -R ${root_dir}/bin/gpu_armexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${root_dir}/bin/gpu_arm:${root_dir}/lib/linux_libexport CUDA_DIR=/usr/local/cudaelseexport PATH=$PATH:${root_dir}/bin/x64export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${root_dir}/bin/x64:${root_dir}/lib/linux_libexport CUDA_DIR=${root_dir}/comp_nvidia/include/cudachmod +x -R ${root_dir}/bin/x64chmod +x -R ${root_dir}/comp_nvidia/include/cuda/binchmod +x -R ${root_dir}/comp_nvidia/include/cuda/nvvm/bin#设置cudnn包含文件,只针对gpu,jetson不使用此配置cd ${root_dir}/comp_nvidia/include/cudnnchmod +x config_cudnn.sh./config_cudnn.sh#protoc ${root_dir}/comp_nvidia/caffe_gcs/src/caffe/proto/caffe.proto --proto_path=${root_dir}/comp_nvidia/caffe_gcs/src/caffe/proto --cpp_out=${root_dir}/comp_nvidia/caffe_gcs/src/caffe/proto#cd ${root_dir}/comp_nvidia/caffe_gcs#make clean#make -jfi			#\cp ${root_dir}/comp_nvidia/caffe_gcs/.build_release/lib/*.a ${root_dir}/comp_nvidia/cafl_sdk/libfi
}function config_lib() {device=$1if [ "$device" = "mlu" ]; thenchmod +x config_lib_mlu.sh./config_lib_mlu.sh 	elif [ "$device" = "mlu_arm" ]; thenchmod +x config_lib_mlu_arm.sh./config_lib_mlu_arm.sh elif [ "$device" = "jetson" ]; thenchmod +x config_lib_jetson.sh./config_lib_jetson.shelif [ "$device" = "acl_arm" ]; thenchmod +x config_lib_acl_arm.sh./config_lib_acl_arm.shelif [ "$device" = "bm" ]; thenchmod +x config_lib_bm.sh./config_lib_bm.shelif [ "$device" = "gpu_arm" ]; thenchmod +x config_lib_gpu_arm.sh./config_lib_gpu_arm.shelse chmod +x config_lib_gpu.sh./config_lib_gpu.shfi
}#build all services and libraries
function build_all(){device=$1echo "开始配置依赖库..."cd ${root_dir}/libconfig_lib $deviceecho "**********完成依赖库配置**********"echo: '#不再使用caffe引擎#if [ "$device" != "mlu_arm" ] && [ "$device" != "acl_arm" ]; thenecho "1)开始编译caffe..."build_caffe $deviceecho "**********完成编译caffe**********"echo#echo "2)开始编译cafl_sdk..."#cd ${root_dir}/cafl_sdk#build $device#echo "**********完成编译cafl_sdk**********"#echo					elseecho "1)检测到device非需要caffe框架,caffe编译跳过..."echo "---------------------------------------------"echofi'if [ "$device" == "mlu" ] || [ "$device" == "mlu_arm" ]; thenecho "3)开始编译cnrteng_exp..."cd ${root_dir}/comp_cambricon/cnrteng_expbuild $deviceecho "**********完成编译cnrteng_exp**********"echoelif [ "$device" == "acl_arm" ]; thenecho "3)开始编译acleng_exp..."cd ${root_dir}/comp_ascend/acleng_expbuild $deviceecho "**********完成编译acleng_exp**********"echoecho "4)开始编译acllite..."cd ${root_dir}/comp_ascend/acllitebuild $deviceecho "**********完成编译acllite**********"echoelif [ "$device" == "bm" ]; thenecho "3)开始编译bmrteng_exp..."cd ${root_dir}/comp_bitmain/bmrteng_expbuild $deviceecho "**********完成编译bmrteng_exp**********"echoelif [ "$device" == "gpu_arm" ]; thenbuild_caffe $deviceecho "3)开始编译cuda_utils..."cd ${root_dir}/comp_nvidia/cuda_utilsbuild $deviceecho "**********完成编译cuda_utils**********"echoecho "4)开始编译trteng_exp..."cd ${root_dir}/comp_nvidia/trteng_expbuild $deviceecho "**********完成编译trteng_exp**********"echoecho "5)开始编译model2trt_v2..."cd ${root_dir}/comp_nvidia/model2trt_v2ln -snf $(pwd)/lib_gpu_arm/libnvparsers.so.8.0.1 $(pwd)/lib_gpu_arm/libnvparsers.so.8ln -snf $(pwd)/lib_gpu_arm/libnvparsers.so.8 $(pwd)/lib_gpu_arm/libnvparsers.soln -snf $(pwd)/lib_gpu_arm/libnvonnxparser.so.8.0.1 $(pwd)/lib_gpu_arm/libnvonnxparser.so.8ln -snf $(pwd)/lib_gpu_arm/libnvonnxparser.so.8 $(pwd)/lib_gpu_arm/libnvonnxparser.soprotoc caffe.proto --proto_path=./ --cpp_out=./caffebuild $deviceecho "**********完成编译model2trt_v2**********"echoelsebuild_caffe $deviceecho "3)开始编译cuda_utils..."cd ${root_dir}/comp_nvidia/cuda_utilsbuild $deviceecho "**********完成编译cuda_utils**********"echoecho "4)开始编译trteng_exp..."cd ${root_dir}/comp_nvidia/trteng_expbuild $deviceecho "**********完成编译trteng_exp**********"echoecho "5)开始编译model2trt_v2..."cd ${root_dir}/comp_nvidia/model2trt_v2ln -snf $(pwd)/lib/libnvparsers.so.8.5.2 $(pwd)/lib/libnvparsers.so.8ln -snf $(pwd)/lib/libnvparsers.so.8 $(pwd)/lib/libnvparsers.soln -snf $(pwd)/lib/libnvonnxparser.so.8.5.2 $(pwd)/lib/libnvonnxparser.so.8ln -snf $(pwd)/lib/libnvonnxparser.so.8 $(pwd)/lib/libnvonnxparser.soprotoc caffe.proto --proto_path=./ --cpp_out=./caffebuild $deviceecho "**********完成编译model2trt_v2**********"echofiecho "10)开始编译cfldwp2..."#cd ${root_dir}/cfldwp2#build $deviceecho "**********完成编译cfldwp2**********"echoecho "<----------完成编译[${device}]设备上的[计算]库---------->"
}case "$1" in-h|--help)echo "Usage: $0 [option...]"echo "-h, --help           for help information"echo "-g, --gpu            build for gpu device"echo "-j, --jetson         build for jetson arch"echo "-m, --mlu            build for mlu device"echo "-ma, --mlu_arm       build for mlu_arm device"echo "-aa, --acl_arm       build for acl_arm device"echo "-b, --bm             build for bm device"echo "-ga, --gpu_arm       build for gpu_arm device";;-g|--gpu)echoechoecho "<----------start building for [gpu] device---------->"echobuild_all;;-j|--jetson)echoechoecho "<----------start building for [jetson] device---------->"echobuild_all jetson;;-m|--mlu)echoechoecho "<----------start building for [mlu] device---------->"echobuild_all mlu;;-ma|--mlu_arm)echoechoecho "<----------start building for [mlu_arm] device---------->"echobuild_all mlu_arm;;-aa|--acl_arm)echoechoecho "<----------start building for [acl_arm] device---------->"echobuild_all acl_arm;;-b|--bm)echoechoecho "<----------start building for [bm] device---------->"echobuild_all bm;;-ga|--gpu_arm)echoechoecho "<----------start building for [gpu_arm] device---------->"echobuild_all gpu_arm;;*)echo "Please use $0 -h|--help for more information"
esacexit 0 

8 测试model2trt_v2转模型

export LD_LIBRARY_PATH=/data/chw/compute_lib/lib/linux_lib/:$LD_LIBRARY_PATH
./model2trt_v2  1 ./model/yolov5_pcb_dynamic

测试下转模型,转成功了。

9 拷贝所有的计算库到./nvstream/3rdparty/jetson/compute/lib/aarch64

cp /data/chw/compute_lib/distribute/lib/jetson_lib/libcuda_utils.so  /data/chw/nvstream/3rdparty/jetson/compute/lib/aarch64/
cp /data/chw/compute_lib/distribute/lib/jetson_lib/libtrteng_exp.so  /data/chw/nvstream/3rdparty/jetson/compute/lib/aarch64/

下一篇博客开始写代码;

参考文献:

在NVIDIA Jetson AGX Orin中使用jetson-ffmpeg调用硬件编解码加速处理-CSDN博客

NVIDIA Jetson AGX Orin源码编译安装CV-CUDA-CSDN博客

https://github.com/Cambricon/CNStream

https://github.com/Cambricon/easydk/blob/master/samples/simple_demo/common/video_decoder.cpp

aclStream流处理多路并发Pipeline框架中 视频解码 代码调用流程整理、类的层次关系整理、回调函数赋值和调用流程整理-CSDN博客

aclStream流处理多路并发Pipeline框架中VEncode Module代码调用流程整理、类的层次关系整理、回调函数赋值和调用流程整理-CSDN博客

FFmpeg/doc/examples at master · FFmpeg/FFmpeg · GitHub

https://github.com/CVCUDA/CV-CUDA

如何使用FFmpeg的解码器—FFmpeg API教程 · FFmpeg原理

C++ API — CV-CUDA Beta documentation (cvcuda.github.io)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413323.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

学习之SQL语句之DQL(数据库查询语言)

DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录 查询关键字:SELECT 数据准备&#xff1a; CREATE TABLE emp ( id INT COMMENT “编号”, workno VARCHAR ( 10 ) COMMENT “工号”, NAME VARCHAR ( 10 ) COMME…

day45.动态规划

1035.不相交的线: 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j] 且绘制的直线不与任何其他连线&#xff08;非水…

【Python】家庭用电数据的时序分析

Household Electricity Consumption | Kaggle 目录 数据简介 探索分析 数据清洗 用电占比 趋势分析 序列分解 周期分析 周期分解 分析小结 数据简介 240000-household-electricity-consumption-records数据集包含了一个家庭6个月的用电数据&#xff0c;收集于2007年1…

安防监控/软硬一体/视频汇聚网关EasyCVR硬件启动崩溃是什么原因?

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、WS-FMP4、HTTP-…

MySql【数据查询语言DQL】

DQL[非常重要] DQL 主要指查询语句,有查询单表数据,也有查多表数据表,单表查询 基本查询 条件查询 模糊查询 排序查询 聚合查询 去重查询 分组查询 限制查询 1、 数据准备 将发的stu.sql导入到MySql中 2、 基本查询 select 字段1,字段2,... from 表名; 查询返回的是一张…

C语言 ——— 文件读取结束的判定

目录 判定文件读取结束的方式 被错误使用的feof函数 判定文件结束的正确使用 判定文件读取结束的方式 判断文本文件是否读取结束&#xff1a; 利用 fgetc 判断返回值是否为 EOF 利用 fgets 判断返回值是否为 NULL 判断二进制文件是否读取结束&#xff1a; 利用 fread 判…

MAC环境导出项目的目录结构

一、安装Homebrew包管理工具 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 官网网址&#xff1a;https://brew.idayer.com/ 二、用brew包管理工具安装tree brew install tree 三、打开终端&#xff0c;导出项目…

axios响应

一.axios请求配置项(axios在调用时所接收的参数对象&#xff09; 以下是请求时可用的配置选项&#xff0c;只有url是必须的&#xff0c;如果没有指定method&#xff0c;请求将默认使用get方法 { // url 是用于请求的服务器 URL url: "/user", // method 是创建请…

【三维重建】三角网格中轴骨架线提取

三维网格中轴线提取 方法介绍实现提取 三维网格中轴线提取是计算机图形学和三维建模领域中的一个重要技术&#xff0c;它对于理解三维形状的拓扑结构和几何特性具有重要意义。 方法介绍 以下是几种常见的三维网格中轴线提取方法&#xff1a; 基于距离变换的方法 基本原理&…

大数据计算-SQL优化手段(CBO)-以Flink为例

文章目录 背景理论知识示例结果展示结果解释 背景 大数据计算中&#xff0c;SQL生成的执行计划第一轮会经过固定规则的优化&#xff0c;第二轮会根据原计划&#xff0c;生成多条结合成本的的执行计划&#xff0c;根据cost 进行排序&#xff0c;选出最优的执行计划。 理论知识…

【大数据算法】时间亚线性算法之:时间亚线性判定算法概述。

时间亚线性判定算法概述 1、引言2、空间亚线性算法2.1 定义2.2 实现方式2.3 应用场景2.3.1 大数据分析2.3.2 流数据处理2.3.3 近似计算2.3.4 稀疏数据操作 2.4 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近看新闻没啊&#xff1f; 小鱼&#xff1a;我天天…

Upload-labs靶场通过攻略

pass-01 1.写一个一句话木马 2.上传php文件 当我们上传php文件时 提示文件类型不正确 3.修改php后缀 通过修改php后缀为jpg 抓包再次修改成php文件 4.查看是否上传成功 页面显示图片 表示上传成功 pass-02 1.上传一个php文件 页面显示文件类型不正确 2.抓包修改 可以看…

【化学方程式配平 / 3】

题目 代码 #include <bits/stdc.h> using namespace std; const double eps 1e-8; unordered_map<string, int> e; int eidx, midx; //eidx 元素数&#xff0c; midx 物质数 double matrix[45][45]; int q; bool check_alpha(char c) {if(c > a && c …

Android APK打包脚本

build.gradle版本 同目录创建config.gradle文件写入需要的信息入 config.gradle文件内容 ext { /*** 自定义APP运行环境* dev: 开发* test: 测试* pro: 生产*/ env "pro" /*** 动态参数配置&#xff0c;根据自己需要添加参数* APP_ID: 包名* VERSION_CODE: 版本号…

【TDesign】如何修改CSS变量

Tdesign的组件想通过style定义样式没效果, 可以通过组件api文档修改, 组件提供了下列 CSS 变量&#xff0c;可用于自定义样式。 比如Cell, https://tdesign.tencent.com/miniprogram/components/cell?tabapi 提供了&#xff1a; –td-cell-left-icon-color 图标颜色 –td-cell…

yolo训练策略--使用 Python 和 OpenCV 进行图像亮度增强与批量文件复制

简介 在计算机视觉和深度学习项目中&#xff0c;数据增强是一种常用的技术&#xff0c;通过对原始图像进行多种变换&#xff0c;可以增加数据集的多样性&#xff0c;从而提高模型的泛化能力。本文将介绍如何使用 Python 和 OpenCV 实现图像的亮度增强&#xff0c;并将增强后的…

Golang | Leetcode Golang题解之第383题赎金信

题目&#xff1a; 题解&#xff1a; func canConstruct(ransomNote, magazine string) bool {if len(ransomNote) > len(magazine) {return false}cnt : [26]int{}for _, ch : range magazine {cnt[ch-a]}for _, ch : range ransomNote {cnt[ch-a]--if cnt[ch-a] < 0 {r…

Vue(八) localStorage、组件的自定义事件、Todo案例修改

文章目录 一、浏览器本地存储1. 相关API2. Todo案例中的应用 二、组件的自定义事件1. 回顾props传值方式2. 绑定自定义事件&#xff08;1&#xff09;方式一&#xff1a;v-on或&#xff08;2&#xff09;方式二&#xff1a; ref 3. 解绑自定义事件4. 注意点总结 三、Todo案例采…

算法复盘——LeetCode hot100:哈希

文章目录 哈希表哈希表的基本概念哈希表的使用1. 插入操作2. 查找操作3. 删除操作 哈希表的优点和缺点1.两数之和复盘 242.有效的字母异位词复盘 49.字母异位词分组复盘 128. 最长连续序列复盘HashSet 哈希表 先来搞清楚什么是哈希表吧~ 概念不清楚方法不清楚怎么做题捏 哈希表…