ubuntu16.04-交叉编译-SeetaFaceEngine-master
2024-09-07 11:44:21
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,并解压
- 下载链接:https://github.com/seetaface/SeetaFaceEngine
- 解压:unzip 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全部交叉编译成功
- 你的点赞,便是我的动力!!!
最新文章
- C# 开源框架
- (转载)Sumblime Text 2 常用插件以及安装方法
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
- 关于Plupload结合上传插件jquery.plupload.queue的使用
- 深入浅出话VC++(2)——MFC的本质
- android ArrayAdapter BaseAdapter SimpleAdapter使用讲解
- 数组去重算法,quickSort
- MYSQL自动备份策略的选择
- SQL日志文件的作用
- lenky的个人站点 ----LINUX 内核进程
- Linux下BMP文件不能正常读取问题的解决办法
- Python,PyCharm2017安装教程,包含注册码
- MySQL优化特定类型的查询
- JavaBean找到项目下的文件这里是\WEB-INF\classes\下面的属性文件
- WPF DEV gridcontrol 自定义计算列(TotalSummary)
- 理解npm、nvm、nodejs之间的关系
- 【DWM1000】 code 解密8一 TAG接收blink response 信号
- [UI] 01 - CSS
- python中RabbitMQ的使用(路由键)
- 【代码笔记】iOS-只让textField使用键盘通知