Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习、深度学习、图像处理等模块的开发。
相比于深度学习库而言,dlib内部更多的是封装了很多传统机器学习计算函数,例如回归分析、支撑向量机、聚类,开箱即用,对外提供了C++和python两种接口。在工程实践中,dlib通常和OpenCV结合使用,OpenCV提供图像处理算法,dlib提供机器学习算法。
Dlib是一个包含机器学习算法的C++开源工具包。Dlib可以帮助您创建很多复杂的机器学习方面的软件来帮助解决实际问题。
一、官网
Index of /files 源码下载
dlib C++ Library 编译说明
https://github.com/davisking/dlib
二、教程
win10之dlib安装过程(c++调用库,非python版)_Dawnfox的博客-CSDN博客 win10之dlib安装过程(c++调用库,非python版)
Dlib相关问题_YiYueHuan的博客-CSDN博客 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,官网下载SQLite Download Page,sqlite-amalgamation-3280000.zip
解压,自己新建工程编译成静态库,请参考:VS2015编译SQLite3 动态链接库DLL和静态库Lib_IceCreHaker的博客-CSDN博客
然后把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算法
- 一个大整数对象
- 一个随机数对象
- 图形模型推理算法
- 图像处理
- 线程
- 网络通信
- 图形用户界面
- 数据压缩和完整性检查算法
- 测试
- 其他通用功能
---
C++库大全
https://github.com/fffaraz/awesome-cpp
C++常用机器学习库
https://www.cnblogs.com/oliver2022/p/16609478.html
mlpack
https://github.com/mlpack/mlpack
mlpack 是一个 C++ 的机器学习库,它重点在于其扩展性、高速性和易用性。它的目的是让新用户通过简单、一致的 API 使用机器学习,同时为专业用户提供 C++ 的高性能和最大灵活性。他的性能超出大量类似的机器学习库,如 WEKA、Shogun、MATLAB、mlpy 及 sklearn,这一对比工作可以参考文献 [1]。
mlpack 含有丰富的文档和教程,可以参考项目主页。教程中包含的算法有:近邻搜索(NeighborSearch)、范围搜索(RangeSearch)、线性回归(LinearRegression)、欧几里德最小生成树(The Euclidean Minimum Spanning Tree)、K - 均值(K-Means)、FastMKS(Fast max-kernel search)等。
mlpack 提供了大量的类或 API 供程序调用,同时还提供了很多可执行程序供不懂 C++ 的用户使用。这些可执行文件包括:allkfn, allknn, emst, gmm, hmm_train, hmm_loglik, hmm_viterbi, hmm_generate, kernel_pca, kmeans, lars, linear_regression, local_coordinate_coding, mvu, nbc, nca, pca, radical, sparse_coding。