ubuntu16.04-交叉编译-SeetaFaceEngine-master

0、前言  

  • 在要移植opecv和SeetaFaceEngine-master到ARM板子上运行的所有步骤之前,有几点需要注意的:
  • 查看板子运行的Kernel版本
  • 交叉编译工具链的gcc版本,关键就是工具链里库所能支持的最低内核版本
    • 可以用file xxx,查看(xxx是可执行程序,你可以随意编写一个简单helloworld来编译后,测试)
    • 工具链的版本会影响到opecv、seetaface的编译工程,以及编译出来的opecv库、seetaface最终的可执行文件能否在板子的内核里跑起来
  • 文件系统系统里的lib库最好用与上面提到的同一个工具链里的库
  • 在进行seetaface的交叉编译之前,要先确定opencv已经交叉编译好了,opencv、seetaface、制作根文件系统的busybox这三者用到的交叉编译工具链应一致
  • 说明:该博客接续上篇opencv交叉编译:https://www.cnblogs.com/xz-954042850-qq/p/12598388.html

下面操作尽量不要在共享文件夹目录中进行,在Ubuntu其他原生目录中进行

1、前提准备

  • Linux操作系统:Ubuntu 16.04
  • OpenCv版本:3.4.6
  • 交叉工具链:arm-2014.05-29-arm-none-linux-gnueabi-,gcc version 4.8.3
  • 目标平台:ARM
  • 板       子:study210,kernel:2.6.35
  • SoC       :S5PV210
  • busybox :1.31.1
  • 文件系统:nfs方式挂载
  • 编译时间:2020/3/30

2、下载安装

  • 下载SeetaFaceEngine-master.zip,并解压
  • 搭建根文件系统
    • 利用上面工具链,busybox,搭建文件夹形式的文件系统,此步骤可百度,不细说。
    • 注意:文件系统中的lib库也用工具链里的,编译opev、seetafaceengine时,最好都是用同一个工具链以及工具链里面的库

3、编译seetaface-master

  • cd 进入 SeetaFaceEngine_dir/SeetaFaceEngine-master
  • 编译FaceDetection
    • cd FaceDetection/
    • mkdir build
    • 进行cmake,注意这里的工具链路径是我的,不一定和你的一样,要灵活变动
      • sudo cmake -D CMAKE_C_COMPILER=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc -D CMAKE_CXX_COMPILER=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-g++ ..
      • 要注意类似下面这样的信息,看看编译的工具链是否真的对应自己指定的工具链,当然下面图中的cmake方式和工具链不对应我指定的,因为之前编译时没留图,此处以这图来对应说明
    • 报错信息1:例如上面的-msse4.1问题
    • 解决方法:vim 打开 FaceDetection顶层的CMakeList.txt,做以下修改,修改后,切记:要重新cmake,否则不生效
    • 报错信息2:
    • 解决方法:在FaceDetection/CMakeList.txt中添加下面一行信息,后续两部分同样会碰到这问题,也是这样解决即可,修改后,切记:要重新cmake,否则不生效。
    • 此后,忘记还有没有其他报错信息了,方法百度,如果没能直接找到答案,冷静地,耐心地结合多篇博客,找出问题根源,去解决
    • 如果cmake成功,则进行make
      • make -j4 
    • 编译FaceAlignment
      • cd 进入 FaceAlignment
      • mkdir build
      • cp 将 FaceDetection/include/face_detection.h和FaceDetection/build/libseeta_facedet_lib.so
        拷贝到FaceAlignment/build文件夹下。
        然后在FaceAlignment/src/test/face_alignment_test.cpp中的main函数中的开头地方:

      • seeta::FaceDetection detector("./build/seeta_fd_frontal_v1.0.bin"); //修改这里的路径成这样

      • cd 进入 到FaceAlignment/build
      • 进行cmake,注意这里的工具链路径是我的,不一定和你的一样,要灵活变动
        • sudo cmake -D CMAKE_C_COMPILER=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc -D CMAKE_CXX_COMPILER=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-g++ ..
      • make -j4

编译FaceIndentification

    • cd 进入 FaceAlignment
    • mkdir build
    • cp 将 libseeta_facedet_lib.so(FaceDetection/build/),libseeta_fa_lib.so(FaceAlignment/build/),seeta_fd_frontal_v1.0.bin(/FaceDetection/model/),seeta_fa_v1.1.bin(FaceAlignment/model/),添加到FaceIndentification/build中
    • cp 将 face_alignment.h(FaceAlignment/include/),face_detection.h(/FaceDetection/include/)添加到FaceIndentification/include中
    • vim 打开 FaceIdentification/src/test/CMakeLists.txt,用下面内容全代替CMakeLists.txt中地内容
      • aux_source_directory (. SRC_LIST)
      • link_directories(${PROJECT_BINARY_DIR})
      • message(${SRC_LIST})
      • # add external libraries
      • find_package(OpenCV REQUIRED)
      • include_directories(${seeta_facedet_lib_INCLUDE_DIRS} ${seeta_fa_lib_INCLUDE_DIRS})
      • list(APPEND seeta_fi_lib_required_libs ${OpenCV_LIBS} seeta_facedet_lib seeta_fa_lib)
      • enable_testing ()
      • foreach (f ${SRC_LIST})
      • string(REGEX REPLACE "[.]cpp" ".bin" BIN ${f})
      • add_executable(${BIN} ${f})
      • #target_link_libraries(${BIN} viplnet ${OpenCV_LIBS} seeta_facede_lib seeta_fa_lib)
      • target_link_libraries(${BIN} viplnet ${seeta_fi_lib_required_libs})
      • endforeach ()
    • FaceIdentification/src/test/test_face_recognizer.cpp文件中添加如下内容头文件:
      • #include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>
    • FaceIdentification/src/test/test_face_verification.cpp文件中添加如下内容头文件:
      • #include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>
    • 解压 FaceIdentification/model/seeta_fr_v1.0.part1.rar
      • apt-get install unrar
      • unrar x seeta_fr_v1.0.part1.rar
    • cd 进入 FaceIdentification/build
    • 进行cmake,注意这里的工具链路径是我的,不一定和你的一样,要灵活变动
      • sudo cmake -D CMAKE_C_COMPILER=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc -D CMAKE_CXX_COMPILER=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-g++ ..
    • make -j4
    • 报错信息1:
    • 解决方法:复制这个链接中已经打开地文件内容https://github.com/ydar95/SeetaFaceEngine/blob/4c2ce314b0e618306879acb285af80ed05a2b49e/FaceIdentification/src/math_functions.cpp,替换FaceIdentification/src/math_functions.cpp中的全部内容即可
    • 报错信息2:
      • #error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use arm_neon.h
      • 如果有上面这类报错信息,则在FaceIdentification/CMakeLists.txt的CMAKE_CXX_FLAGS_RELEASE中加上-mfloat-abi=softfp -mfpu=neon
      • 注意:注意是硬浮点还是软浮点,mfloat-abi选项有hard、soft、softfp,如果写成了softfp,而硬件支持硬浮点可能导致运行程序时找不到动态链接库的问题。(至于如何查看动态链接库是否是硬浮点,可以运行ldconfig -p|grep xxx来查看输出中是否包含hardsoft字样)。所有以后发现找不到动态链接库,而ldconfig -p能找到、ldd却找不到且设置LD_LIBRARY_PATH也无效的情况下就要考虑CPU架构不同、编译选项不同了。
    • 编译成功,至此,seetaface全部交叉编译成功
  • 你的点赞,便是我的动力!!!
posted @ 2020-03-30 16:36  小张在路上  阅读(922)  评论(1编辑  收藏  举报