开源项目推荐:Dlib C++ Libraries使用说明与内存泄漏问题解决(★firecat推荐★)

简介: 开源项目推荐:Dlib C++ Libraries使用说明与内存泄漏问题解决(★firecat推荐★)

Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习、深度学习、图像处理等模块的开发。


一、官网


http://dlib.net/


http://dlib.net/files/ 源码下载


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工程。使用默认配置即可,不修改任何参数。


image.png


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


相关文章
|
1月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
存储 C语言 C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
WK
|
7天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
25 1
|
21天前
|
存储 安全 Linux
【开源指南】用二叉树实现高性能共享内存管理
本文介绍了一种使用C++实现的共享内存管理方案,通过借鉴Android property的设计思路,采用二叉树结构存储键值对,提高了数据检索效率。该方案包括设置和获取接口,支持多进程/线程安全,并提供了一个简单的测试示例验证其有效性。
51 6
|
30天前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
89 21
|
18天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
21天前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
34 0
【C++打怪之路Lv6】-- 内存管理
|
26天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
207 3
|
1月前
|
存储 C语言 C++
【C/C++内存管理】——我与C++的不解之缘(六)
【C/C++内存管理】——我与C++的不解之缘(六)