Dlib介绍
Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。
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算法
- 一个大整数对象
- 一个随机数对象
- 图形模型推理算法
- 图像处理
- 线程
- 网络通信
- 图形用户界面
- 数据压缩和完整性检查算法
- 测试
- 其他通用功能
1 环境配置
下载最新版源码。
编译过程需要用到cmake,注意安装cmake的过程需要添加环境变量。
解压源代码,然后通过命令行进入源码目录,输入四条指令
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019" -T host=x64
cmake --build .
我们所创建的build文件夹下面有一个dlib_project.sln文件,即为VS工程文件。以管理员身份打开,解决方案配置为release+x64,然后依次生解决方案下面的ALL_BUILD、dlib、INSTALL
新建VS工程,右键项目名称->属性(快捷键Shift+F4),先将配置改为Release模式,然后编辑VC++目录。
在包含目录中添加C:\Program Files (x86)\dlib_project\include
在引用目录和库目录中添加C:\Program Files (x86)\dlib_project\lib
添加引用库文件:dlib19.24.0_release_32bit_msvc1916.lib
至此,dlib的环境便配置完成。
2 face_detection_ex
在dlib的解压包中,有一个examples文件夹,里面提供了dlib的一些案例。接下来将参考其中的face_detection_ex.cpp来写下我们的学习代码。
#include <iostream>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
using namespace dlib;
using namespace std;
int main(int argc, char** argv)
{
auto detector = get_frontal_face_detector();
auto path = "D:\\CS\\dlib-19.22\\examples\\faces\\2007_007763.jpg"; //此为examples中的示例图片
image_window win; //声明一个展示图象的window
array2d<unsigned char> img; //声明一个表示灰度图像的矩阵
load_image(img, path); //通过路径加载图像
pyramid_up(img);
std::vector<rectangle> dets = detector(img); //存储人脸矩阵
cout << "number of faces detected:" << dets.size() << endl;
win.clear_overlay(); //清除缓存
win.set_image(img); //设置图像
win.add_overlay(dets, rgb_pixel(255, 0, 0)); //添加一个overlay
system("pause");
}
结果如图所示
上述大部分代码都可以无痛阅读,但仍旧有几点需要说明的地方。
get_frontal_face_detector是通过经典的HOG(方向梯度直方图)特征而构建的一个线性分类器。
pyramid_up即上采样,由于我们的脸部检测器的尺寸是固定的,所以对图像进行上采样,意味着可以检测到更小的人脸。
3 video_tracking_ex.cpp
这个示例用于展示目标跟踪的功能,在video_frames文件夹下是一组被拆分的视频图像,本代码就是要对图像中的果汁盒进行跟踪。
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/dir_nav.h>
#include <Windows.h>
using namespace dlib;
using namespace std;
int main()
{
auto path = "D:\\CS\\dlib-19.22\\examples\\video_frames";
// Get the list of video frames.
std::vector<file> files = get_files_in_directory_tree(path, match_ending(".jpg"));
std::sort(files.begin(), files.end());
array2d<unsigned char> img;
load_image(img, files[0]); //加载第一帧
correlation_tracker tracker; //创建tracker
//下面所创建的矩形,对果汁盒进行了框选
tracker.start_track(img, centered_rect(point(93, 110), 38, 86));
image_window win;
for (unsigned long i = 1; i < files.size(); ++i)
{
load_image(img, files[i]);
tracker.update(img); //根据图像,对tracker进行更新
win.set_image(img);
win.clear_overlay();
win.add_overlay(tracker.get_position());
Sleep(100);
}
}