QT中使用DNNDK 调用dpu api 使用dpu 模型
- 软件环境
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的要求,不然无法使用,在 - 硬件环境
基于zynq7020的板卡 - 前期准备
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版本(手中有的最接近版本)
- 解压alinx_opencv_3.4.7.tar.gz
- 修改build_host.sh和build_zynq.sh中的SDK路径
- 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
- 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
- 编译安装host版本opencv 安装在了/opt/alinx/opencv3.4.7_host_lib
./build_host.sh
- 交叉编译安装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适配)
- 在QT工程目录中新建dnndk目录和dnndk/lib目录
- 将头文件dnndk.h dputils.h n2cube.h放在dnndk目录中
- 将dnndk的相关库文件放入dnndk/lib中
- 在.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同级目录
- 在QT工程目录中新建model文件夹
- 将量化编译后的DPU模型放入model文件夹,我这里有两个模型
- 修改.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报错问题
- 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
- 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