PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020

1、最近在Linux下实现了基于tensorflow的人脸识别算法,所以想着如何才能把这个程序放在PYNQ上。

2、在arm中我们是没有办法训练的,所以需要提前把tensorflow的权重训练好,在arm中只需要前向传播计算就可以了,还好,目前opencv3.3版本已经支持caffe \ tnesorflow\pytorch模型,所以,我们利用opencv 来加载tensorflow的模型和权重,不关乎tensorflwo什么事情了。只需要把权重拿出来就可以了。

2、PYNQ是ZYNQ的集成开发板,已经包含了很多接口,pmod、usb、SD、网卡等,所以想着如何利用交叉编译把程序编译为.so动态链接库文件,然后给PYNQ内部的python程序调用。利用python来读取图像,给*.so处理后反馈给pyhton程序输出到HDMI OUT中。

3、xilinx 还算有良心,在SDK内部集成了交叉编译器。SDK本来就是用来为嵌入式FPGA开发的一款软件,但我很反感,因为我只需要交叉编译工具不需要SDK的编程界面等一些工具,没办法,只能乖乖下载了一个小时,我想说就不能把这个交叉编译工具独立出来吗?

4、交叉编译一定要用到源码,包括库内部的.so也要重新生成,因为这个是为intel处理器准备的,gcc也全部使用arm-gcc。

5、好了,前面都是一些废话,现在开始我们的工作吧。。。

6、首先下载Opencv zlib libpng jpeg 的源文件,不要问我为什么,因为爱情。。。。

7、首先交叉编译opencv,利用cmake-gui 很方便,如下所示。generate 以后会又makefile 生成,我们make 再make install 一下,发现出现了zlib的错误,这个就是第三方库了,我们安装。

 

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第1张图片

9、去下载tar.gz 的zlib 用cmake-gui 编译 并且make install 。

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第2张图片

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第3张图片

10、同样交叉编译jpeg,但是make 通过后有错,我们手动创建每一个文件,一直到成功.

./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --prefix=$OPENCV_DEPEND --enable-shared --enable-static

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第4张图片

 PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第5张图片

11、在安装libpng也出现问题,一看就是math库没有,cmake-gui 可以添加标准库,我们使用linux 自带的或者SDK目录下的,我使用第二种。M_LIBRARY的路径里添加,OK??

 

 

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第6张图片

 

13、之后据就可以make install opencv 了。

 

 

 

14、理想很好、现实却是残酷的,到了37%的时候出现了错误,可以去这个地址https://bbs.csdn.net/topics/391919588,我们位zlib 第三方库添加-fPIC 选项。

15、修改一下zlib.tar 下的flags.make 文件。

 

 

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第7张图片

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第8张图片

16、到了这个也出错了,不过是同样的错误,我们打3rdparty下的每一个文件都加上-fPIC 选项。

 

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第9张图片

 

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第10张图片

17.到了这一步,pthred 也出错误了,我们知道,这个是线程的库。修改opencv的CmakeCache.txt文件

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第11张图片

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第12张图片PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第13张图片

18、世上无难事,只怕有心人。

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第14张图片

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第15张图片

19、在这里我们可以发现,opencv 已经包含了我们需要的dnn 的库文件。。。

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第16张图片

20、开始编译我的人脸识别算法吧,这个我是用opencv 的dnn 实现的,用tensorflow训练的模型。。

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第17张图片

21、大家使用下面的这些链接库来编译程序。

sudo /sdk/SDK/2018.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++ -I/usr/local/include -L/usr/local/opencv/config/lib /usr/local/opencv/config/lib/libopencv_core.so /usr/local/opencv/config/lib/libopencv_flann.so /usr/local/opencv/config/lib/libopencv_calib3d.so /usr/local/opencv/config/lib/libopencv_dnn.so /usr/local/opencv/config/lib/libopencv_imgproc.so /usr/local/opencv/config/lib/libopencv_highgui.so /usr/local/opencv/config/lib/libopencv_videoio.so /usr/local/opencv/config/lib/libopencv_imgcodecs.so /usr/local/opencv/config/lib/libopencv_imgproc.so  /usr/local/opencv/config/lib/libopencv_features2d.so /usr/local/opencv/config/lib/libopencv_photo.so main.cpp -lpthread -ldl -o main.o

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第18张图片

22、如果程序还是存在错误的话,记得再加上-Wall -g 选项,可以在ZYNQ下利用GDB调试程序,毕竟能在CPU执行的程序不一定能够能在arm上执行,虽然都可以交叉编译成功。以下就是人脸检测的效果,程序被完美的执行了。

PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020_第19张图片

23、或者自己定义一个Makefile文件

 

sdk_gcc = /sdk/SDK/2018.3/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++
CC = /sdk/SDK/2018.3/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc
lib = -L/usr/local/opencv/config/lib
include = -I/usr/local/include  -I/usr/arm/arm-linux/include
obj =libopencv_core.so libopencv_flann.so libopencv_calib3d.so libopencv_dnn.so libopencv_imgproc.so libopencv_highgui.so libopencv_videoio.so libopencv_imgcodecs.so libopencv_imgproc.so  libopencv_features2d.so libopencv_photo.so
prefix = /usr/local/opencv/config/lib/
obj1 = $(addprefix $(prefix),$(obj))
obj2 = /usr/arm/arm-linux/lib/libjpeg.so.9
FLAG = -lpthread -ldl  -Wall -g -Wl,-rpath=../../lib
include_obj = $(include) $(lib) $(obj1) $(obj2)
all:cam_inp cam_inp.h
    sudo $(sdk_gcc)  $(include_obj) cam_inp.o $(FLAG) main.cpp -o main
    @echo "--------------------------------------------\n"
    @echo "success compile"
    @echo "--------------------------------------------\n"
    
cam_inp:cam_inp.h
    sudo $(CC) $(include_obj) $(FLAG) -c cam_inp.cpp -o cam_inp.o 
clean:
    sudo rm -rf main main.o cam_inp.o

 

 

你可能感兴趣的:(PYNQ 、tensorflow 、opencv 、交叉编译、dnn、contrib、ZYNQ、XC7Z020)