开源项目推荐: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


相关文章
|
7月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
248 26
|
12月前
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
7月前
|
数据采集 编解码 人工智能
Gemma 3n正式版开源:谷歌全新端侧多模态大模型,2GB 内存就能跑,重点提升编码和推理能力!
6月底,Google正式开源发布了全新端侧多模态大模型 Gemma 3n!相较此前的预览版,最新的 Gemma 3n 完整版进一步提升性能表现,支持在 2GB 内存的硬件上本地运行,重点提升了编码和推理方面的能力。
881 1
|
8月前
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
151 1
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
579 68
|
存储 安全 Linux
【开源指南】用二叉树实现高性能共享内存管理
本文介绍了一种使用C++实现的共享内存管理方案,通过借鉴Android property的设计思路,采用二叉树结构存储键值对,提高了数据检索效率。该方案包括设置和获取接口,支持多进程/线程安全,并提供了一个简单的测试示例验证其有效性。
551 98
|
11月前
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
891 20
|
12月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
508 0
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。