0、前言  

  • 在要移植opecv和SeetaFaceEngine-master到ARM板子上运行的所有步骤之前,有几点需要注意的:
  • 查看板子运行的Kernel版本
  • 交叉编译工具链的gcc版本,关键就是工具链里库所能支持的最低内核版本
    • 可以用file xxx.so,查看
    • 工具链的版本会影响到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全部交叉编译成功
  • 你的点赞,便是我的动力!!!

ubuntu16.04-交叉编译-SeetaFaceEngine-master的更多相关文章

  1. ubuntu16.04(64位)建立交叉编译环境,并配置编译内核

    安装步骤 1.准备工具安装目录 将压缩包gcc-linaro-arm-linux-bnueabihf-4.9-2014.07_linux.tar存放在一个目录下,这个目录就是你等会解压缩的目录,以后这 ...

  2. 在Ubuntu16.04集群上手工部署Kubernetes

    目前Kubernetes为Ubuntu提供的kube-up脚本,不支持15.10以及16.04这两个使用systemd作为init系统的版本. 这里详细介绍一下如何以非Docker方式在Ubuntu1 ...

  3. ubuntu16.04配置py-faster-rcnn

    在ubuntu16.04下编译安装了py-faster-rcnn. 主要步骤包括:安装cuda/cudnn,换apt源,装开源显卡驱动,装caffe依赖的apt包和python包,下载py-faste ...

  4. acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)

    日常手贱把ubuntu14.04更新到了16.04,然后就game over了.mdzz,不然泥萌也看不到这篇博客了=.= 然后花了些时间重装了一个16.04版的,原来那个14.04的用可以用,就是动 ...

  5. ubuntu16.04下配置JDK 1.8+安装Java EE,并实现最大子数组算法

    软工第二次作业: 1.在个人电脑中安装一个集成开发环境(Microsoft Visual Studio.Eclipse或其它工具均可),要求该环境能够提供单元自动测试功能: 2.记录安装过程,并将全部 ...

  6. 深度学习主机环境配置: Ubuntu16.04 + GeForce GTX 1070 + CUDA8.0 + cuDNN5.1 + TensorFlow

    深度学习主机环境配置: Ubuntu16.04 + GeForce GTX 1070 + CUDA8.0 + cuDNN5.1 + TensorFlow 最近在公司做深度学习相关的学习和实验,原来一直 ...

  7. C#码农的大数据之路 - 使用Ambari自动化安装HDP2.6(基于Ubuntu16.04)并运行.NET Core编写的MR作业

    准备主机 准备3台主机,名称作用如下: 昵称 Fully Qualified Domain Name IP 作用 Ubuntu-Parrot head1.parrot 192.168.9.126 Am ...

  8. Ubuntu16.04.1上搭建分布式的Redis集群

    为什么要集群: 通常为了,提高网站的响应速度,总是把一些经常用到的数据放到内存中,而不是放到数据库中,Redis是一个很好的Cache工具,当然了还有Memcached,这里只讲Redis.在我们的电 ...

  9. 2017年BackBox5和Ubuntu16.04.1国内更新源

    BackBox是基于Ubuntu的Linux发行版,因此,我们可以使用Ubuntu的更新源作为BackBox的更新源. 1.查看系统版本信息: 输入: uname -a 显示计算机及操作系统的有关信息 ...

  10. ubuntu16.04 部署配置LVS主从

    实验环境---ubuntu16.04 四台机器:10.211.55.13—55.16 具体实验环境配置如下: 10.211.55.102  LVS_VIP 10.211.55.13  LVS_MAST ...

随机推荐

  1. 从DeepNet到HRNet,这有一份深度学习“人体姿势估计”全指南

    从DeepNet到HRNet,这有一份深度学习"人体姿势估计"全指南 几十年来,人体姿态估计(Human Pose estimation)在计算机视觉界备受关注.它是理解图像和视频 ...

  2. ArcGIS Desktop的安装

    1.双击ArcGIS Desktop安装目录下的Setup.exe. 2.点击“下一步”. 3.选择“我接受许可协议(A)”,点击“下一步”. 4.选择“完全安装”,点击“下一步”. 5.点击“更改” ...

  3. Mybatis入门三

    一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: <?xml version="1 ...

  4. Vue里面提供的三大类钩子及两种函数

    在路由跳转的时候,我们需要一些权限判断或者其他操作.这个时候就需要使用路由的钩子函数. 定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数. 总体来讲vue里面提供了三大类钩子 ...

  5. 1006 Sign In and Sign Out (25 分)

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  6. Disruptor 基础篇

    Disruptor 基本概念 RingBuffer结构 Sequencer (生产.消费协调者) EventFactory & EventTranslator SequenceBarrier ...

  7. android的volley学习

    更简单的一种方式是在build.gradle中引入依赖[推荐这种方式] compile 'com.android.volley:volley:1.1.1' StringRequest的用法接下来我们看 ...

  8. 家庭记账本app进度之对于登录和注册两个界面点击按钮的相互跳转

    这次主要完成了两个两个android页面之间的跳转.从登录页面点击注册就会跳转到注册页面.在注册页面点击返回登录,这样就可以返回到登录界面.主要是这样的操作.其中遇到了一个困难主要是当点击按钮的时候, ...

  9. PyJWT 详解

    1.首先,我们需要先了解 JWT 的概念,所以我们先看pyjwt的官网 https://jwt.io/ 2.对于官方 JWT 有两篇博文写的不错分别如下: https://blog.csdn.net/ ...

  10. 如何将本地项目上传到gitee

    如何将本地项目上传到gitee不想废话,直入主题: 第一步:首先你得有一个gitee仓库(登录注册自己解决)友情提供: gitee官网地址. 首先:进入git额额官网(登录注册自己解决,没难度) 新建 ...