2021-10-13 QT中使用DNNDK 调用dpu api 使用dpu 模型部署到zynq7020

QT中使用DNNDK 调用dpu api 使用dpu 模型

  1. 软件环境
    1.1 xilinx的工具链 2019.1版本(vivado,pentalinx)
    1.2 xilinx的DPU ip核 dpu_v3.0
    1.3 xilinx的DNNDK软件包 xilinx_dnndk_v3.1
    1.4 qt版本5.7.1
    1.5 opencv版本 3.4.7
    1.6 host机器,虚拟机中装的ubuntu16.04.5,ubuntu版本必须满足pentalinx的要求,不然无法使用,在
  2. 硬件环境
    基于zynq7020的板卡
  3. 前期准备
    3.1 利用vivado生成带DPU的硬件流工程
    3.2 基于硬件流用pentalinx生成带dnndk包和dpu驱动的linux系统
    3.3 板卡能正常运行,DNNDK和dpu都能正常使用

1. 编译opencv,并添加到QT工程中

dnndk库中使用了opencv,所以需要安装opencv,不然无法使用,petalinux文件系统自动装的是3.4.3版本,此处我们装3.4.7版本(手中有的最接近版本)

  1. 解压alinx_opencv_3.4.7.tar.gz
  2. 修改build_host.sh和build_zynq.sh中的SDK路径
  3. build_host.sh
#!/bin/sh
Cur_Dir=$(pwd)
echo $Cur_Dir
export ZYNQ_CV_BUILD=/opt/alinx/opencv3.4.7_host_lib

export LD_LIBRARY_PATH=$ZYNQ_CV_BUILD/lib:${LD_LIBRARY_PATH}
export C_INCLUDE_PATH=$ZYNQ_CV_BUILD/include:${C_INCLUDE_PATH}
export CPLUS_INCLUDE_PATH=$ZYNQ_CV_BUILD/include:${CPLUS_INCLUDE_PATH}
export PKG_CONFIG_PATH=$ZYNQ_CV_BUILD/lib/pkgconfig:${PKG_CONFIG_PATH}

OPENCV_SRC=opencv-3.4.7
TMP_DIR=host_src_tmp

if [ -d $ZYNQ_CV_BUILD ]; then
  sudo rm -rf $ZYNQ_CV_BUILD
fi

sudo mkdir -p $ZYNQ_CV_BUILD
sudo chmod 777 $ZYNQ_CV_BUILD


mkdir -p $TMP_DIR
cp -r -f $Cur_Dir/src_pkg/* $Cur_Dir/$TMP_DIR


cd $Cur_Dir/$TMP_DIR/ffmpeg-4.0.6
./configure --enable-shared --disable-static --disable-yasm --prefix=$ZYNQ_CV_BUILD
make -j6
make install

cd $Cur_Dir/$TMP_DIR/$OPENCV_SRC
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
  -D BUILD_opencv_nonfree=OFF \
  -D WITH_IPP=OFF  \
  -D WITH_IPP_A=OFF  \
  -D CMAKE_INSTALL_PREFIX=$ZYNQ_CV_BUILD $Cur_Dir/$TMP_DIR/opencv-3.4.7
#ccmake . 
make -j6
make install
cd $Cur_Dir
  1. build_zynq.sh
#!/bin/sh
SDK_PATH=/tools/Xilinx/SDK/2019.1
if [ ! -d $SDK_PATH ]; then
  echo "no dir ${SDK_PATH}"
  exit 1
fi

source ${SDK_PATH}/settings64.sh 
#export CROSS_COMPILE=arm-xilinx-linux-gnueabi
export CROSS_COMPILE=arm-linux-gnueabihf
export ZYNQ_CV_BUILD=/opt/alinx/opencv3.4.7_zynq_lib
Cur_Dir=$(pwd)
export LD_LIBRARY_PATH=$ZYNQ_CV_BUILD/lib:${LD_LIBRARY_PATH}
export C_INCLUDE_PATH=$ZYNQ_CV_BUILD/include:${C_INCLUDE_PATH}
export CPLUS_INCLUDE_PATH=$ZYNQ_CV_BUILD/include:${CPLUS_INCLUDE_PATH}
export PKG_CONFIG_PATH=$ZYNQ_CV_BUILD/lib/pkgconfig:${PKG_CONFIG_PATH}
#export PKG_CONFIG_LIBDIR=/opt/Xilinx/SDK/2015.4/gnu/arm/lin/arm-xilinx-linux-gnueabi/lib
export PKG_CONFIG_LIBDIR=${SDK_PATH}/gnu/aarch32/lin/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/lib
OPENCV_SRC=opencv-3.4.7
TMP_DIR=zynq_src_tmp

sudo mkdir -p $ZYNQ_CV_BUILD
sudo chmod 777 $ZYNQ_CV_BUILD

mkdir -p $TMP_DIR
cp -r -f $Cur_Dir/src_pkg/* $Cur_Dir/$TMP_DIR
cd $Cur_Dir/$TMP_DIR/v4l-utils-1.12.5
./bootstrap.sh
./configure --prefix=$ZYNQ_CV_BUILD --host=${CROSS_COMPILE} --without-jpeg --with-udevdir=$ZYNQ_CV_BUILD/lib/udev
make -j6
make install

cd $Cur_Dir/$TMP_DIR/zlib-1.2.11
export CC=${CROSS_COMPILE}-gcc
./configure --prefix=$ZYNQ_CV_BUILD --shared
make -j6
make install

cd $Cur_Dir/$TMP_DIR/jpeg-9d
./configure --prefix=$ZYNQ_CV_BUILD --host=${CROSS_COMPILE} --enable-shared
make -j6
make install


cd $Cur_Dir/$TMP_DIR/libpng-1.6.37
./configure --prefix=$ZYNQ_CV_BUILD --host=${CROSS_COMPILE} --with-pkgconfigdir=$ZYNQ_CV_BUILD/lib/pkgconfig LDFLAGS=-L$ZYNQ_CV_BUILD/lib CFLAGS=-I$ZYNQ_CV_INSTALL/include
make -j6
make install


cd $Cur_Dir/$TMP_DIR/x264-snapshot-20191217-2245-stable 
./configure --host=arm-linux --cross-prefix=${CROSS_COMPILE}- --enable-shared --prefix=$ZYNQ_CV_BUILD
make -j6
make install

cd $Cur_Dir/$TMP_DIR/xvidcore/build/generic
./configure --prefix=$ZYNQ_CV_BUILD --host=${CROSS_COMPILE} --disable-assembly
make -j6
make install


cd $Cur_Dir/$TMP_DIR/tiff-4.0.6
./configure --prefix=$ZYNQ_CV_BUILD --host=${CROSS_COMPILE} --enable-shared LDFLAGS=-L$ZYNQ_CV_BUILD/lib CFLAGS=-I$ZYNQ_CV_BUILD/include
make -j6
make install


cd $Cur_Dir/$TMP_DIR/ffmpeg-4.0.6
./configure --prefix=$ZYNQ_CV_BUILD --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=armv7l --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cross-prefix=${CROSS_COMPILE}- --enable-swscale --extra-cflags=-I$ZYNQ_CV_BUILD/include --extra-ldflags=-L$ZYNQ_CV_BUILD/lib --disable-asm
make -j6
make install

cd $Cur_Dir/$TMP_DIR/$OPENCV_SRC
mkdir build
cd build
echo "set( CMAKE_SYSTEM_NAME Linux )" > toolchain.make
echo "set( CMAKE_SYSTEM_PROCESSOR arm )" >> toolchain.make
echo "set( CMAKE_C_COMPILER ${CROSS_COMPILE}-gcc )" >> toolchain.make
echo "set( CMAKE_CXX_COMPILER ${CROSS_COMPILE}-g++ )" >> toolchain.make
echo "set( CMAKE_INSTALL_PREFIX $ZYNQ_CV_BUILD )" >> toolchain.make
echo "set( CMAKE_FIND_ROOT_PATH $ZYNQ_CV_BUILD )" >> toolchain.make
echo "set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )" >> toolchain.make
echo "set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )" >> toolchain.make
echo "set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )" >> toolchain.make
echo "set( QT_QMAKE_EXECUTABLE /opt/alinx/zynq_qt5.7.1/bin/qmake )" >> toolchain.make
cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.make \
  -D BUILD_DOCS=OFF  \
  -D BUILD_opencv_nonfree=OFF \
  -D BUILD_JPEG=OFF  \
  -D BUILD_PACKAGE=OFF \
  -D BUILD_PERF_TESTS=OFF \
  -D BUILD_PNG=OFF  \
  -D BUILD_SHARED_LIBS=ON \
  -D BUILD_TESTS=OFF   \
  -D BUILD_TIFF=OFF  \
  -D BUILD_WITH_DEBUG_INFO=OFF  \
  -D BUILD_ZLIB=OFF   \
  -D BUILD_opencv_apps=OFF  \
  -D BUILD_opencv_calib3d=ON \
  -D BUILD_opencv_videostab=ON \
  -D BUILD_opencv_world=OFF \
  -D WITH_1394=OFF  \
  -D WITH_CUDA=OFF  \
  -D WITH_CUFFT=OFF  \
  -D WITH_EIGEN=OFF  \
  -D WITH_GIGEAPI=OFF  \
  -D WITH_GPHOTO2=OFF  \
  -D WITH_GTK=OFF  \
  -D WITH_GSTREAMER=OFF   \
  -D WITH_JASPER=OFF   \
  -D WITH_LIBV4L=OFF \
  -D WITH_MATLAB=OFF \
  -D WITH_OPENCL=OFF \
  -D WITH_OPENCLAMDBLAS=OFF \
  -D WITH_OPENCLAMDFFT=OFF \
  -D WITH_OPENEXR=OFF \
  -D WITH_PTHREADS_PF=OFF \
  -D WITH_PVAPI=OFF \
  -D WITH_V4L=ON  \
  -D WITH_JPEG=ON   \
  -D WITH_PNG=ON   \
  -D WITH_TIFF=ON   \
  -D WITH_FFMPEG=ON  \
  -D WITH_WEBP=OFF $Cur_Dir/$TMP_DIR/$OPENCV_SRC
#ccmake . 
cp -r -f $ZYNQ_CV_BUILD/lib/* $Cur_Dir/$TMP_DIR/$OPENCV_SRC/build/lib
make -j6
make install
cd $Cur_Dir
  1. 编译安装host版本opencv 安装在了/opt/alinx/opencv3.4.7_host_lib
./build_host.sh
  1. 交叉编译安装zynq版本opencv 安装在了/opt/alinx/opencv3.4.7_zynq_lib
./build_zynq.sh

7.在QT工程的Build Settings中修改交叉编译套件ZYNQ的qmake参数,增加Additional arguments,条件编译选项

DEFINES+=zynq

8.在QT .pro文件中增加opencv的条件编译选项,指定头文件以及库文件

# opencv head and lib
ZYNQ_LIB=/opt/alinx/opencv3.4.7_zynq_lib
HOST_LIB=/opt/alinx/opencv3.4.7_host_lib

if(contains(DEFINES,zynq)){
    message("compile for zynq")
    QMAKE_LIBDIR_FLAGS +=-L$$ZYNQ_LIB/lib
    INCLUDEPATH +=$$ZYNQ_LIB/include \
    $$ZYNQ_LIB/include/opencv \
    $$ZYNQ_LIB/include/opencv2
    LIBS += \
    -lz

}else{
    message("compile for host")
    QMAKE_LIBDIR_FLAGS +=-L$$HOST_LIB/lib
    INCLUDEPATH +=$$HOST_LIB/include \
    $$HOST_LIB/include/opencv \
    $$HOST_LIB/include/opencv2
}
    LIBS += \
    -lopencv_core \

2. 将dnndk 的共享库与头文件添加到QT工程.pro同级目录

dnndk相关文件用的xilinx_dnndk_v3.1/ZedBoard/pkgs中include和lib文件夹中的文件(与zynq7000适配)

  1. 在QT工程目录中新建dnndk目录和dnndk/lib目录
  2. 将头文件dnndk.h dputils.h n2cube.h放在dnndk目录中
  3. 将dnndk的相关库文件放入dnndk/lib中
  4. 在.pro文件中添加头文件路径和库文件,此处DNNDK_DIR写的是绝对路径,lib使用相对路径时报错
# dnndk head and lib
DNNDK_DIR=/home/wim/work/APP/FXC_AI_LINUX/FXC_AI_LINUX/dnndk
INCLUDEPATH += $$DNNDK_DIR
QMAKE_LIBDIR_FLAGS +=-L$$DNNDK_DIR/lib
LIBS += -ln2cube -lhineon

3. 将dpu模型添加到QT工程.pro同级目录

  1. 在QT工程目录中新建model文件夹
  2. 将量化编译后的DPU模型放入model文件夹,我这里有两个模型
  3. 修改.pro文件,添加模型的链接选项
#model
MODEL_DIR = /home/wim/work/APP/FXC_AI_LINUX/FXC_AI_LINUX/model
QMAKE_LFLAGS += /home/wim/work/APP/FXC_AI_LINUX/FXC_AI_LINUX/model/dpu_AlexNet_hqs.elf
QMAKE_LFLAGS += /home/wim/work/APP/FXC_AI_LINUX/FXC_AI_LINUX/model/dpu_Net_kfs.elf

以上就完成了在QT中调用DNNDK并交叉编译的环境搭建,接下来就可以写测试代码了,下面是我的.pro文件

QT += core
QT -= gui

CONFIG += c++11
DESTDIR = bin
TARGET = FXC_AI_LINUX
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp \
    top_main.cpp \
    dputools.cpp

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

HEADERS += \
    top_main.h \
    dputools.h

PRODIR=$$PWD
# dnndk head and lib
DNNDK_DIR=$$PRODIR/dnndk
INCLUDEPATH += $$DNNDK_DIR
QMAKE_LIBDIR_FLAGS +=-L$$DNNDK_DIR/lib
LIBS += -ln2cube -lhineon

#model
MODEL_DIR = $$PRODIR/model
QMAKE_LFLAGS += $$MODEL_DIR/dpu_AlexNet_hqs.elf
QMAKE_LFLAGS += $$MODEL_DIR/dpu_Net_kfs.elf


# opencv head and lib
ZYNQ_LIB=/opt/alinx/opencv3.4.7_zynq_lib
HOST_LIB=/opt/alinx/opencv3.4.7_host_lib

if(contains(DEFINES,zynq)){
    message("compile for zynq")
    QMAKE_LIBDIR_FLAGS +=-L$$ZYNQ_LIB/lib
    INCLUDEPATH +=$$ZYNQ_LIB/include \
    $$ZYNQ_LIB/include/opencv \
    $$ZYNQ_LIB/include/opencv2
    LIBS += \
    -lz

}else{
    message("compile for host")
    QMAKE_LIBDIR_FLAGS +=-L$$HOST_LIB/lib
    INCLUDEPATH +=$$HOST_LIB/include \
    $$HOST_LIB/include/opencv \
    $$HOST_LIB/include/opencv2
}
    LIBS += \
    -lopencv_core



编译opencv报错问题

  1. libpng16.so libpcre.so找不到
/usr/bin/ld: warning: libpng16.so.16, needed by //home/wim/anaconda3/lib/libcairo.so.2, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libpcre.so.1, needed by //home/wim/anaconda3/lib/libgobject-2.0.so.0, not found (try using -rpath or -rpath-link)

解决办法: 安装

sudo apt-get install libpng16-dev
  1. gtk/gtk.h: No such file or directory
opencv-3.4.7/modules/highgui/src/window_gtk.cpp:48:21: fatal error: gtk/gtk.h: No such file or directory

解决办法:安装

sudo apt-get install libgtk2.0-dev
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值