DLIB在嵌入式上编译总结
来源:互联网 发布:php超市会员管理系统 编辑:程序博客网 时间:2024/05/24 03:19
前言
在海思3536上移植DLIB库,用arm-hisiv300-linux-g++编译器。
DLIB编译
在DLIB下建Build目录,进入。编译脚本如下:
cmake .. -DCMAKE_CXX_COMPILER:FILEPATH=arm-hisiv300-linux-g++ -DCMAKE_C_COMPILER:FILEPATH=arm-hisiv300-linux-gcc -DCMAKE_BUILD_TYPE:STRING=RELEASE -DHISIV300=1 -DDLIB_USE_BLAS=1 -DDLIB_USE_LAPACK=1
-DDLIB_USE_BLAS=1:寻找OPENBLAS,详细后面说明。
-DHISIV300=1:因为我在同一份代码里面除了交叉编译以外,还用VS2015编译WINDOWS版本,便于调试。HISIV300用来区分是否嵌入式交叉编译,在根CMakeLists.txt里的脚本如下:
cmake_minimum_required(VERSION 2.8.12)if (HISIV300) message("configure hisiv300") #add_compile_options(-mcpu=cortex-a7 -mfloat-abi=softfp -mno-unaligned-access -fno-aggressive-loop-optimizations) add_compile_options(-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations) #add_compile_options(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations) add_compile_options(-D_GLIBCXX_USE_C99)endif()add_subdirectory(dlib)
也尝试各种浮点编译选项,最后用的这是性能最好的。
因为DLIB编译需要C++11,HISIV300编译器对C++11支持还不是很好,要修改如下:
加-D_GLIBCXX_USE_C99这个宏解决std::to_string等函数找不到的问题。
添加如下声明:
#ifndef _WIN32#define DLIB_USE_BLASnamespace std{ double round(double f); float erfc(float f);}#endif
这两个接口声明找不到,也试了TR1宏,没搞定,就直接声明了。
- exception_ptr很多接口链接时找不到,只能自己实现
#ifdef LINUX#include <exception>namespace std{ namespace __exception_ptr { exception_ptr::exception_ptr() :_M_exception_object(0) {} exception_ptr::~exception_ptr() {} exception_ptr::exception_ptr(const exception_ptr& e) :_M_exception_object(e._M_exception_object) {} exception_ptr& exception_ptr::operator=(const exception_ptr& e) { _M_exception_object = e._M_exception_object; return *this; } void exception_ptr::swap(exception_ptr& e) { void* tmp = _M_exception_object; _M_exception_object = e._M_exception_object; e._M_exception_object = tmp; } } //__thread exception_ptr g_cur_e; exception_ptr current_exception() { return exception_ptr(); } void rethrow_exception(exception_ptr e) { throw std::exception(); }}#endif
openblas编译
-DDLIB_USE_BLAS=1查找OPENBLAS库,用来优化矩阵运行。下面开始编译OPENBLAS库。
make TARGET=ARMV7 ARM_SOFTFP_ABI=1 HOSTCC=gcc CC=arm-hisiv300-linux-gcc NOFORTRAN=1
打开OPENMP开关作用不是很大,OPENBLAS默认2个线程工作。如果改成4个性能会变的很差,不确定原因。
将编译后的.a,改成libopenblas.a。修改DLIB查找openblas库的路径。
在dlib/cmake_utils/cmake_find_blas.txt,做如下修改:
set(extra_paths /usr/lib64 /usr/lib64/atlas-sse3 /usr/lib64/atlas-sse2 /usr/lib64/atlas /usr/lib /usr/lib/atlas-sse3 /usr/lib/atlas-sse2 /usr/lib/atlas /usr/lib/openblas-base /opt/OpenBLAS/lib ~/code/dlib $ENV{OPENBLAS_HOME}/lib )
tcmalloc编译
用来优化内存分配。
下载gperftools代码,先运行./autogen.sh,可能需要安装autoreconf、libtool连个工具。
然后:
./configure CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --host=arm-linux CFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations" CXXFLAGS="-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations" --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
生成后的.a为libtcmalloc_minimal.a,可以改成libtcmalloc.a。
生成可执行文件时,在所有链接的.a的最后面加入“-ltcmalloc”。
总结
这一波优化,在3536上,450*600分辨率的图片,特征提取用时170ms/张,而人脸检测用时300ms/张。
- DLIB在嵌入式上编译总结
- 【%Dlib%】Dlib在VS2013上的配置方法
- 【dlib】Dlib编译安装
- Dlib在VS2013上的配置方法
- Dlib简介及在windows7 vs2013编译过程
- 机器学习库Dlib在VS2015上的安装教程
- mysql5.1.51在嵌入式开发板上的移植总结
- windows下编译dlib
- dlib的编译
- Dlib编译与搭建
- dlib-android编译
- Dlib的编译
- dlib 01 dlib vs2015 编译 win10
- ubuntu上安装dlib
- windows上安装dlib
- 对于嵌入式交叉编译总结
- Webkit在Windows上编译时的错误总结
- STM32F10x_StdPeriph_Lib_V3.5.0在Keil上编译遇到的问题总结
- deepmind_lab 运行文件bspc 依赖的东西如下
- Python+selenium
- 最速下降算法-matlab源码
- Parallels Desktop13 for Mac(PD虚拟机) V13.2.0中文破解版
- tomact环境
- DLIB在嵌入式上编译总结
- linux中shell变量$#,$@,$0,$1,$2等的含义解释
- 程序设计入门3 韩信点兵问题
- html 文字、图片水平无限滚动
- JDK1.5新特性之---增强for循环
- 深度学习: 从 RoIPooling 到 RoIAlign
- 深度学习第四课第三周
- 软件工程:结对编程
- visual studio 报错 :process with id 'XXXX' is not running