1. 程式人生 > >Dlib 人臉Landmark檢測速度優化

Dlib 人臉Landmark檢測速度優化

本人知乎號:Ngxin

-----------------------------------------------------------------------------------------------

本博文旨在記錄自己在做dlib人臉landmark檢測時如何提高檢測速度,以及在此過程中碰到的一些其他問題,若欠妥,歡迎交流指正,轉載請註明出處,謝謝!

-----------------------------------------------------------------------------------------------

背景:

Dlib是建立在OpenCV基礎上的一個計算機視覺庫,很多方面在一定程度上優於OpenCV的效果,比如人臉檢測,人臉關鍵點提取,其檢測準確率比OpenCV更高,魯棒性也更好,但是隨之犧牲的是計算時間以及硬體資源。最近在做疲勞檢測的過程中需要用到人臉68個關鍵點檢測,首先想到的是OpenCV和Dlib,由於在以前的專案上見識到兩者效果的差距,果斷採用Dlib進行開發,但在進行的過程中也是碰到了各種問題,最主要的是特徵點檢測時視訊會卡頓的非常嚴重,經分析,最終確定了是dlib檢測的時候佔用太多計算量,程式碼體現在官方文件中的

std::vector<rectangle> faces = detector(cimg);

detector會造成dlib檢測速度過慢,導致呼叫攝像頭進行關鍵點檢測時會卡頓的非常嚴重,因此,提高檢測速度刻不容緩。

軟硬體環境:

筆記本:聯想T470

系統環境:Ubuntu 16.04

cpu:英特爾i5-6300U

記憶體:8g

顯示卡:Nvidia-940

IDE:Clion

Dlib:19.10 OpenCV:3.3.1

解決:

1:首先自然的想到將RGB圖片轉換成灰度圖片,減少計算量,dlib 官方提供的example採用的是Dlib格式的圖片,如果你採用OpenCV格式的圖片作為引數傳遞會提示引數不匹配的錯誤,程式碼傳送門請點選下面的連結。

關於Dlib的圖片格式轉換以及Dlib與OpenCV圖片格式之間的互相轉換,請參考我的另一篇博文dlib與opencv圖片轉換。轉換成功後再次執行,發現並沒有什麼卵用,速度依舊慢的跟蝸牛一般,然後尋思另一條解決道路,這便有了第二點。

2:由於第一點並沒有解決問題,便仔細看了一下官方程式碼,請注意一下幾句話,看不明白的請自行有道翻譯。

Finally, note that the face detector is fastest when compiled with at least
    SSE2 instructions enabled.  So if you are using a PC with an Intel or AMD
    chip then you should enable at least SSE2 instructions.  If you are using
    cmake to compile this program you can enable them by using one of the
    following commands when you create the build project:
        cmake path_to_dlib_root/examples -DUSE_SSE2_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_SSE4_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_AVX_INSTRUCTIONS=ON
    This will set the appropriate compiler options for GCC, clang, Visual
    Studio, or the Intel compiler.  If you are using another compiler then you
    need to consult your compiler's manual to determine how to enable these
    instructions.  Note that AVX is the fastest but requires a CPU from at least
    2011.  SSE4 is the next fastest and is supported by most current machines.

看到這的時候,心裡涼了一大截,都怪自己圖方便,簡單的幾句程式碼就把dlib給裝了,現在想想,做任何事都不能急啊,扎心。我第一次採用的原始碼編譯安裝Dlib,使用Dlib需要先安裝OpenCV,關於這兩個的安裝請參考我的博文或請自行谷歌點選開啟連結

我這裡安裝會與博文中有一點點小的區別,建議原始碼安裝前請自己閱讀原始碼中的README, 我第一次採用的安裝語句如下:

cd dlib
mkdir build
make
make install

雖然能安裝好Dlib,但是這樣安裝的後果就是我之所以寫這篇博文的導火線。這樣安裝會導致Dlib進行關鍵點檢測的時候速度異常的慢。

參考官方文件及如下網站(該網站可能需要 fan *qiang)點選開啟連結

發現了問題的所在,總結如下:

Dlib原Paper指出 landmark detector能達到1000FPS的速度,但是你不可能達到這樣的速度,因為在檢測特徵點之前首先需要檢測人臉,這會花費至少幾十毫秒(請各位大佬指正這句話翻譯是否正確:takes a few 10s of milliseconds),但是使用一些優化措施能輕鬆的達到30FPS。

注意到
        cmake path_to_dlib_root/examples -DUSE_SSE2_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_SSE4_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_AVX_INSTRUCTIONS=ON

AVX模式是最快的一種編譯方式,但是這可能只適合支援AVX的CPU電腦,檢視電腦是否支援AVX,若支援請把該模式開啟,檢視是否支援,請在終端輸入以下語句:

cat /proc/cpuinfo

找到flags部分,如果其中輸出有AVX表明支援AVX模式,同時編譯的時候建議開啟SSE4。

解除安裝第一次裝的Dlib後我採用以下的語句原始碼編譯Dlib:

cd dlib
mkdir build
cmake .. -DCMAKE_INSTALL_PREFIX="你指定的dlib安裝路徑" -DUSE_AVX_INSTRUCTION=ON -DUSE_SSE4_INSTRUCTIONS=ON
cmake --build . --config Release --target install
sudo make install

config release是為了開啟release模式,大部分預設的是debug模式,關於VS以及QT下如何將debug模式換成release請參考以下圖片



在Clion下開啟release: File->Settings->Build,Execution->CMake->Build type,將Debug模式換成Release模式即可。或者請參考:點選開啟連結


需要注意的幾點:

1:原始碼安裝的時候請儘量使用--prefix,指定安裝路徑,這樣你在解除安裝軟體的時候只需刪除路徑下的安裝包即可,移植的時候把安裝包拷貝到另一臺電腦即成功(前提是系統相同),這點是我在解除安裝第一次安裝的Dlib的時候踩過的坑,參考網站上各種方法,比如在原始碼下使用make uninstall解除安裝也都無濟於事,智慧自己手動在原先預設安裝的位置刪除各種檔案,還存在刪錯了的可能,所以強烈建議安裝的時候指明安裝路徑,同時在安裝前最好看一下readme檔案。

2:安裝DLib時可能提示你安裝 BLAS library,按照提示安裝即可。

*** No BLAS library found so using dlib's built in BLAS. However, if you ***
*** install an optimized BLAS such as OpenBLAS or the Intel MKL your code ***
*** will run faster. On Ubuntu you can install OpenBLAS by executing: ***
*** sudo apt-get install libopenblas-dev liblapack-dev ***
*** Or you can easily install OpenBLAS from source by downloading the ***
*** source tar file from http://www.openblas.net, extracting it, and ***
*** running: ***
*** make; sudo make install ***

後記:

此次使用Dlib學習到了很多經驗,包括安裝的一些注意事項,以及Dlib與OpenCV圖片格式轉換問題。按照以上思路整理後,在此執行程式碼,你會發現速度會變得非常和諧優雅,不會出現卡頓的現象,純手打,以後有想到的再補充,同時歡迎指正!

參考連結:

相關推薦

Dlib 人臉Landmark檢測速度優化

本人知乎號:Ngxin-----------------------------------------------------------------------------------------------本博文旨在記錄自己在做dlib人臉landmark檢測時如何提高

opencv+dlib人臉關鍵點檢測cpp版

#include <opencv2/opencv.hpp> #include <dlib/opencv.h> #include <dlib/image_processing/frontal_face_detector.h> #includ

【OpenCV】Dlib人臉關鍵點檢測順序

dlib19.2 只可以使用VS2015update3進行cmake,不然會提示你c++11特性不能夠支援,導致編譯不通過。 - 人臉關鍵點檢測關鍵程式碼 Mat ProcessFace

Dlib人臉特徵點檢測速度優化

最近在做人臉先關的研究,人臉識別其實有很多部分組成,每一個環節都關係到整體的效果。因為主要精力在識別這塊,前面的人臉檢測以及特徵點的提取就沒有花費太多精力,開始時使用的dlib提供的介面進行人臉對齊。效果是不錯,但是缺點也非常明顯,dlib的人臉檢測實在太慢,3

Dlib人臉檢測及關鍵點描述的python實現

首先,安裝dlib、skimage前;先安裝libboost sudo apt-get install libboost-python-dev cmake 接下來到dlib官網dlib.net下載最新的dlib版本(我下的是dlib-19.7),進入檔案所在

dlib 人臉特徵點檢測

人臉特徵點檢測(Facial landmark detection),即人臉特徵點定位、人臉對齊,是在人臉檢測的基礎上進行的,對人類臉上的特徵點(嘴角、眼角等)進行定位。 人臉特徵點檢測有諸多用途: 改善人臉識別:通過人臉特徵點檢測將人臉對齊到平均臉,對齊後的人臉影象識別演算法更加有效

dlib 人臉檢測

採用經典的梯度方向直方圖(HOG特徵)提取+線性分類器+影象金字塔+滑動視窗的人臉檢測方法。該方法速度快,只能檢測80*80或更大的人臉,但可以通過影象上取樣來檢測更小的人臉。與OpenCV的人臉檢測相比,召回率更高,誤檢率更低,且人臉框更準確,檢測速度同樣很快。 程式碼實現: import

Opencv與dlib聯合進行人臉關鍵點檢測與識別

前言 依賴庫:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不記錄如何配置,重點在實現上。使用libfacedetection實現人臉區域檢測,聯合dlib標記人臉特徵點,最後使用opencv的FaceRecogniz

Opencv與dlib聯合進行人臉關鍵點檢測與識別【轉】

來自:http://blog.csdn.net/mr_curry/article/details/51994497 前言 依賴庫:OpenCV 2.4.9 /dlib 19.0/libfacedetection  本篇不記錄如何配置,重點在演算法實現上。使用libf

Dlib人臉檢測+對齊

1,dlib庫的安裝 準備工具: 開始編譯, 這裡,需要使用cmake編譯2個東東,一個是dlib的庫,生成vs可以使用的.sln工程,另一個就是examples,同樣生成vs可以使用的.sln工程。 where is the source code 和where t

opencv聯合dlib人臉檢測例子

原始碼比較簡潔,雜餘資訊全部去掉,原始碼中已經做了中文註釋。本例子是用opencv載入影象,然後呼叫dlib進行人臉檢測,得到人臉所在區域以及特徵點,最後還是用opencv描繪人臉特徵點。 例子原始碼以及解釋: #include <dlib/ima

提升HTML5的性能體驗系列之五 webview啟動速度優化及事件順序解析

執行時間 很快 runt 代碼 模式 本地 技術 apk loaded webview加載時有5個事件。觸發順序為loading、titleUpdate、rendering、rendered、loaded。webview開始載入頁面時觸發loading,載入過程中如果&am

Entity Framework的啟動速度優化

映射 自帶 1-1 man 同時 找到 優化 http target 剛開始的時候沒有太在意,但是隨著系統的發布,這種初次請求,或者閑置若幹時間後第一次請求的漫長等待使得App的體驗很差,很多時候App加載好半天數據都沒過來。如果前端沒處理好,還會導致App的假死。所以就花

圖像的局部墑速度優化

空間 大於 ges 一個點 加法 歸一化 檢測 很大的 紋理 1、香農墑定義 信息論大師香農給出了信息隨機性的度量,稱為信息墑。信息的隨機性越大,信息墑就越大。假定事件s1,s2,s3……sn,它們出現的概率為p(s1),p(s2)……p(sn),則每個事件的平均不確定性用

webpack打包速度優化

logs compress nts spl 壓縮 clas true 線程 uglifyjs 打包速度優化 Webpack 默認提供的 UglifyJS 插件,由於采用單線程壓縮,速度頗慢 ;推薦采用 webpack-parallel-uglify-plugin 插件,其做

webpack常用loader和plugin及打包速度優化

div es2017 .cn 圖片 打包 web class load ima 優化 或 webpack常用loader和plugin及打包速度優化

SmileyFace——基於OpenCV的人臉人眼檢測、面部識別程序

tro 識別 open HR tps 應用 動態 框圖 顯示 項目地址 https://github.com/guoyaohua/SmileyFace 開發環境 Visual Studio 2010 MFC + OpenCV 功能描述 靜態圖像人臉檢測 視頻人臉追蹤檢測

Windows-速度優化的幾個方面

mage inf 分享圖片 style info HR col nbsp div One. Win+R - > cmd- > msconfig 禁用不需要的啟動項! Two. 關閉一些視覺選項 Three. 設置應用啟動快捷鍵 Win

TX2上yolov3精度和速度優化方向

RR tensor 不必要 lov CA 源代碼 尺寸 和數 方向 速度優化的方向:1、減少輸入圖片的尺寸, 但是相應的準確率可能會有所下降2、優化darknet工程源代碼(去掉一些不必要的運算量或者優化運算過程)3、剪枝和量化yolov3網絡(壓縮模型---> 減枝

前端頁面加載速度優化---Ngnix之GZIP壓縮

文件的 header 寫上 反向代理 實現 怎麽 加載 stat 前端 gzip on; #開啟Gzip gzip_static on;#是否開啟gzip靜態資源 #nginx對於靜態文件的處理模塊,該模塊可以讀取預先壓縮的gz文件,這樣可以減少每次請求進行gzip壓縮的