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 C++ Library - webcam_face_pose_ex.cpp

Speeding up Dlib's Facial Landmark Detector

What is cmake equivalent of 'configure --prefix=DIR && make all install '?

Ubuntu 16.04開啓dlib對於AVX或者CUDA的支持

Ubuntu下dlib庫編譯安裝 - actonton - 博客園

Compiling dlib on OS X

CLion 2016.3.2 EAP: CMake configurations, project templates and GCC6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章