Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习、深度学习、图像处理等模块的开发。
一、官网
http://dlib.net/compile.html 编译说明
https://github.com/davisking/dlib
二、教程
https://blog.csdn.net/Dawnfox/article/details/77282246 win10之dlib安装过程(c++调用库,非python版)
https://blog.csdn.net/yiyuehuan/article/details/70667318 Dlib相关问题
https://jingyan.baidu.com/article/48b37f8d0461831a6464889c.html Dlib机器学习库的安装和使用
三、我个人的VS2015环境配置(Dlib v19.1版本之后必须要VS2015才能编译)
1、使用CMake转换生成VS2015工程。使用默认配置即可,不修改任何参数。
2、VS2015打开Dlib 程。点击dlib属性页。需要注意的地方有两处。
(1)配置属性》c/c++》常规中的附加包含目录,需要添加dlib解压文件dlib目录中external中的libjpeg,libpng,zlib三个文件目录
D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libjpeg
D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libpng
D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\zlib
(2)配置属性》c/c++》预处理器中的预处理器定义。需要注意是否存在
DLIB_JPEG_SUPPORT
DLIB_PNG_SUPPORT
DLIB_JPEG_STATIC
(3)Debug和Release分别编译,生成dlibd.lib和dlib.lib
3、VS2015新建新建Win32控制台应用工程,测试dlib库是否可以用。
(1)把Dlib源码包拷贝到Win32 exe工程。
(2)Win32 exe工程,配置属性》c/c++》常规中的附加包含目录
..\dlib-19.17
..\dlib-19.17\dlib\external\libjpeg
..\dlib-19.17\dlib\external\libpng
..\dlib-19.17\dlib\external\zlib
注意,千万不要包含..\dlib-19.17\dlib,否则会报错:
***\dlib\dlib-19.4\dlib\dlib_include_path_tutorial.txt(1): fatal error C1189: #error: “Don’t put the dlib folder in your include path”
(3)Win32 exe工程,配置属性》c/c++》预处理器中的预处理器定义,添加:
DLIB_JPEG_SUPPORT
DLIB_PNG_SUPPORT
DLIB_JPEG_STATIC
(4)Win32 exe工程,配置属性》链接器》常规中的附加库目录。添加dlib.lib所在文件目录
..\Dlib-19.17\Win32
(5)Win32 exe工程,配置属性》链接器》输入的附加依赖项。添加dlibd.lib和dlib.lib。
(6)如果在链接(编译一般不会有问题)的时候出现下面的问题
error LNK2001: 无法解析的外部符号 USER_ERROR__missing_dlib_all_source_cpp_file__OR__inconsistent_use_of_DEBUG_or_ENABLE_ASSERTS_preprocessor_directives
那么就需要将 dlib/all/source.cpp 该文件添加到Win32 exe项目中,注意要以添加现有项的方式直接选取该文件。
若没有出现上面的问题,则一般不需要添加该文件。
添加soure.cpp,编译会报错:
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”
解决办法是:鼠标右键soure.cpp,属性,不使用预编译头
4、如何使用SQLite,官网下载https://www.sqlite.org/download.html,sqlite-amalgamation-3280000.zip
解压,自己新建工程编译成静态库,请参考:https://blog.csdn.net/starelegant/article/details/72822308
然后把sqlite3.h拷贝到路径\Dlib-19.17\dlib\sqlite即可。
修改\Dlib-19.17\dlib\sqlite.h头文件
#include <sqlite3.h>//原来
#include "sqlite3.h" //firecat修改后
5、把\dlib-19.17\tools\visual_studio_natvis\dlib.natvis拷贝到
C:\Users\<用户名>\Documents\Visual Studio 2015\Visualizers
四、MFC建立项目,发现内存泄漏
使用windbg可以检测到:
1b55c8d SmartDispenser!operator new+0x0000000d
1826e7e SmartDispenser!dlib::threads_kernel_shared::thread_pool+0x0000008e
1539eb0 SmartDispenser!dlib::unregister_thread_end_handler<dlib::logger::global_data>+0x00000040
15c6e5a SmartDispenser!dlib::logger::global_data::~global_data+0x0000005a
16557cb SmartDispenser!dlib::logger::global_data::`scalar deleting destructor'+0x0000002b
15c8b51 SmartDispenser!dlib::logger::~logger+0x000000e1
1bf6968 SmartDispenser!dlib::logger_helper_stuff::`dynamic atexit destructor for 'log''+0x00000028
我提交的问题:https://github.com/davisking/dlib/issues/1784
解决方法:https://github.com/davisking/dlib/blob/master/dlib/threads/threads_kernel_shared.cpp#L78
说白了就是Dlib-19.17\dlib\threads\threads_kernel_shared.cpp,把变量值修改一下:
//do_not_ever_destruct = true;
do_not_ever_destruct = false; //firecat,Detected memory leaks
五、Dlib主要功能
主要特点
文档丰富
与许多开源项目不同的是,Dlib为每个类和功能提供了完整和精确的文档。同时它还有调试模式,可以帮助你检查使用某个函数的先决条件。启用此功能后,它将捕获由于错误地调用函数或以不正确的方式使用对象而导致的绝大多数错误。
提供了许多示例程序(非常有用的示例!)
我认为文档是函数库最重要的部分。因此,如果您发现任何未记录的内容,不清楚或已过时的文档,请告诉原作者,作者会及时修复它。
高质量的广泛兼容的代码
好的单元测试覆盖率。代码的单元测试行与库代码行之比约为1到4。
该库在MS Windows,Linux和Mac OS X系统上定期进行测试。事实上,它可以在任何POSIX系统上运行,并且已经在Solaris,HPUX和BSD上使用。
没有其他软件包依赖。只需要通过开箱即用的操作系统提供的底层API。
在使用库之前,不需要安装或配置步骤。有关详细信息,请参阅 如何编译页面。
所有操作系统特定的代码都被隔离在尽可能小的操作系统抽象层中。库的其余部分要么在OS抽象层之上分层,要么是纯ISO标准C ++。
机器学习算法
深度学习Deep Learning
传统的基于SMO的支持向量机用于分类(classification) 和 回归(regression)
用于大规模分类 和回归的Reduced-rank methods
用于分类 和回归的推荐相关向量机(Relevance vector machine)
通用多类分类(multiclass classification)工具
一个多类SVM(Multiclass SVM)
解决与结构支持向量机(structural support vector machines)相关的优化问题的工具 。
用于序列标记(sequence labeling)的结构SVM工具
用于解决分配问题(assignment problems)的结构SVM工具
用于图像中物体检测(object detection)的结构SVM工具以及用于物体检测的更强大(但更慢)的深度学习工具(deep learning tools for object detection)。
用于标记图中节点的结构SVM工具(labeling nodes)
一个大规模的SVM-Rank实现
在线核RLS回归(kernel RLS regression)算法
在线SVM分类(SVM classification)算法
半确定度量学习(Semidefinite Metric Learning)
在线核化的质心估计器(centroid estimator) /新颖检测器和离线支持矢量一类分类器(one-class classification)
聚类算法:线性 或核k-means, Chinese Whispers聚类和 Newman聚类。
径向基函数网络(Radial Basis Function Networks)
多层感知器(Multi layer perceptrons)
数值计算算法
使用表达式模板技术实现的快速矩阵对象,并且在可用时能够使用BLAS和LAPACK库。
为矩阵对象定义了许多线性代数和数学运算,如 奇异值分解, 转置, 三角函数等。
使用共轭梯度, BFGS和 L-BFGS 技术的通用非约束非线性优化算法
Levenberg-Marquardt用于求解非线性最小二乘问题
通过BOBYQA算法进行箱约束无导数优化
的的实现割平面算法优化(Optimized Cutting Plane Algorithm)
Several quadratic program solvers
用于求解最优分配和 最小切割/最大流动问题的组合优化工具 以及用于查找most probable parse tree的CKY算法
一个大整数对象
一个随机数对象
图形模型推理算法
加入树算法在贝叶斯网络中进行精确推理。
吉布斯采样马尔可夫链monte carlo算法用于贝叶斯网络中的近似推断。
在链式结构, Potts或 一般因子图中执行MAP推断的例程 。
图像处理
用于读取和 保存常见图像格式的例程。
各种像素类型之间的自动颜色空间转换
常见的图像操作,如边缘检测和形态学操作
SURF, HOG和FHOG 特征提取算法。
用于图像中的对象检测的工具,包括 正面人脸检测和 对象姿势估计。
高质量的人脸识别
线程
该库提供了一个可移植且简单的线程API
用于线程间和进程间通信的消息传递管道
一个计时器对象,能够生成按时间间隔排列的事件
线程对象
线程函数
循环并行
面向未来的thread_pool
网络通信
该库提供了一个可移植且简单的TCP套接字API
帮助您制作基于TCP的服务器的对象
iostream和streambuf 对象,使TCP套接字能够与C ++ iostreams库互操作
一个简单的HTTP服务器对象,可用于将Web服务器嵌入到应用程序中
用于线程间和进程间通信的消息传递管道
用于使用批量同步并行(BSP)计算模型实现算法的工具
图形用户界面
该库提供了一个便携且简单的核心GUI API
在核心GUI API的基础上实现了许多小部件
与许多其他GUI工具包不同,整个dlib GUI工具包是线程安全的
数据压缩和完整性检查算法
CRC 32对象
MD5功能
代表数据压缩 算法部分的各种抽象对象。包括许多形式的PPM算法。
测试
在流行的Java日志记录器log4j之后的线程安全日志记录器对象
模块化的单元测试框架
各种断言宏对测试前置条件很有用
其他通用功能
一个类型安全的对象,用于在大小字节排序之间进行转换
一个命令行解析器,能够使用各种参数和选项分析和验证命令行
一个XML解析器
可以执行base64转换的对象
许多容器类
序列化支持
许多实现不同内存池策略的内存管理器对象
一个工具,可以让您轻松地从MATLAB调用C ++
---
C++库大全
https://github.com/fffaraz/awesome-cpp