前言
这是一篇以“踩坑”为驱动的文章,如果直接使用pip install dlib安装,那么就会引用到对C++编译的Cmake和boost,如果还使用了win系统,还会涉及到visual studio和winSdk等各个方面,以及各种库的版本问题。显然上述南辕北辙。如果在python环境下涉及到库的安装最好使用已经编译的包*.whl,这种方式是较为合理的,也很简洁。
1.dlib简介
Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。详情见文末所附内容。
2.获取渠道
这是官方的下载通道https://pypi.org/project/dlib/#files,值得注意的是需要下载对应自己python版本的包。
个人渠道dlib-19.21.99-cp38-cp38-win_amd64.whl适用于py3.8
个人渠道dlib-19.6.0-cp36-cp36m-win_amd64.whl适用于py3.6
3.python安装whl
在与此文件夹同级下打开cmd 执行pip install *.whl即可。
4.dlib的使用目标检测
dlib
中的函数 find_candidate_object_locations()
能够识别指定的图片,并把可能存在目标的对象找出来。实现方法基于 Koen van de Sande 的论文 Segmentation as Selective Search for Object Recognition by Koen E. A. van de Sande, et al.。这个方法可以快速找到候选目标的区域,我们可以使用这些区域进行后续操作。
示例代码 如下:
import dlib
image_file = 'test1.jpg'
img = dlib.load_rgb_image(image_file)
# Locations of candidate objects will be saved into rects
rects = []
dlib.find_candidate_object_locations(img, rects, min_size=500)
print("number of rectangles found {}".format(len(rects)))
for k, d in enumerate(rects):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
k, d.left(), d.top(), d.right(), d.bottom()))
代码中, 函数 load_rgb_image(...)
接受一个文件名称,然后返回 numpy 数组对象,这个作为 find_candidate_object_locations(...)
函数的输入。函数 find_candidate_object_locations(...)
第二个参数 rects
为列表,保存找到候选推向所在的区域,第三个参数 min_size
表示找到的区域大小不应该小于指定的像素值。
附:详细特点
文档丰富
- 与许多开源项目不同的是,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 特征提取算法。(可惜木有SIFT和ORB)
- 用于图像中的对象检测的工具,包括 正面人脸检测和 对象姿势估计。
- 高质量的人脸识别
线程
- 该库提供了一个可移植且简单的线程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 ++