天天看點

開源項目推薦: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工程。使用預設配置即可,不修改任何參數。

開源項目推薦:Dlib C++ Libraries使用說明與記憶體洩漏問題解決(★firecat推薦★)

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++》預處理器中的預處理器定義,添加:

(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

繼續閱讀