選自GitHub,專案作者:Shiqi Yu,參與:肖清。

總是被各種依賴環境蹂躪?看看這個 C++編寫的跨平臺人臉檢測專案,電腦手機都可執行!

專案地址:

https://

github。com/ShiqiYu/libf

acedetection

人臉檢測可廣泛應用於人機互動、安防監控、社交娛樂等領域,具有很強的實用價值,因此受到廣泛關注與研究。在眾多人臉檢測方法中,使用卷積神經網路進行檢測是目前較為流行的方法之一。然而在我們使用別人開源的專案時經常需要安裝各種各樣的依賴環境,不同的依賴環境在不同硬體平臺或作業系統中支援程度不一樣,增加了專案跨平臺遷移的難度。

本文介紹的是一個使用卷積神經網路進行人臉檢測的開源專案,它最大的亮點是能夠在所有支援 C/C++的平臺上編譯執行。作者將預訓練的 CNN 模型轉換為靜態變數後儲存到了 C 檔案裡,使得該專案不需要任何其他依賴項(當然 OpenCV 還是需要的),僅僅只需要一個 C++編譯器,就能在任何一個平臺甚至嵌入式系統上編譯並執行該專案。

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

尤其吸引人的是該專案使用 C++編寫且支援 AVX2,在 i7 的 CPU 上就能跑出喪心病狂的 1000FPS!下圖為專案作者給出的檢測效果示例。

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

可以看到該專案不僅檢測速度非常快,檢測精度也很不錯。於是,機器之心也上手測試了一番。

專案實測

我們在 Ubuntu 18。04 下測試這個人臉檢測專案的效果。首先先使用一張相對簡單的合照進行測試,其總共有 15 個人,解析度為 970x546,檢測結果如下圖所示:

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

可以看到它準確的識別出了圖片中所有的人像,在 CPU 上僅耗時 133ms 且置信度都為 99%。下圖為加上 bounding box 後的檢測效果圖:

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

下面我們提高一下難度,使用一張開掛民族的圖片測試一下效果。它也幾乎把所有火車頭上正面的面孔都識別出來了,火車車身上的人像沒有識別出來,可能是因為那些人像實在是太小太密集的緣故。

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

編譯過程

該專案編譯需要 OpenCV,如果缺少 OpenCV 在使用 cmake 生成 makefile 時會報如下錯誤:

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

我們首先使用 wget

https://

github。com/opencv/openc

v/archive/3。4。0。tar。gz

下載 OpenCV 3。4。0 的原始碼,緊接著安裝編譯 OpenCV 需要的相關依賴項:

apt-get install build-essential

apt-get install cmake git libgtk2。0-dev pkg-config libavcodec-dev libavformat-dev libswscale-devadd-apt-repository “deb http://security。ubuntu。com/ubuntu xenial-security main”

apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

安裝完依賴項之後我們將 OpenCV 的壓縮包解壓到當前目錄下:

tar xvzf 3。4。0。tar。gz

為了避免在編譯時將原始碼檔案弄亂,我們新建一個名為 linuxidcbuild 的資料夾,在其下進行 OpenCV 的編譯與安裝:

mkdir linuxidcbuild

cd linuxidcbuild/

cmake 。。/opencv-3。4。0 -DWITH_GTK_2_X=ON -DCMAKE_INSTALL_PREFIX=/usr/local

在生成 makefile 的過程中可能會出現卡在下圖的情況,

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

這是由於 ippicv 下載不成功導致的,在以下連結手動下載系統對應的 ippicv 版本

https://

github。com/opencv/openc

v_3rdparty/tree/ippicv/master_20170822/ippicv

之後使用 vim opencv-3。4。0/3rdparty/ippicv/ippicv。cmake 修改 OpenCV 的編譯配置檔案,將如下內容

https://

raw。githubusercontent。com

/opencv/opencv_3rdparty/

${IPPICV_COMMIT}/ippicv/ ”

修改為我們剛存放 ippicv 的目錄。再重新執行一次 cmake 。。/opencv-3。4。0 -DWITH_GTK_2_X=ON -DCMAKE_INSTALL_PREFIX=/usr/local,當出現下圖的內容時說明成功生成了 makefile。

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

接下來我們執行 make 進行對 OpenCV 的編譯:

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

這裡編譯的過程相對比較漫長,大約需要 20 分鐘左右,消耗時間根據不同電腦配置會有所區別。當出現下圖所示內容時說明編譯完成

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

之後使用 make install 進行安裝,

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

安裝成功後會出現如圖所示介面:

僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測專案

以上即完成對 OpenCV 的安裝。安裝完成後使用 vim /etc/ld。so。conf。d/opencv。conf 對其進行配置,在檔案中加入/usr/local/lib 後儲存退出。

使用 vim /etc/bash。bashrc 新增環境變數,在文末加入 export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig,使用 source /etc/bash。bashrc 讓新的環境變數生效。這樣就配置好了 OpenCV,之後使用如下命令編譯該專案:

git clone https://github。com/ShiqiYu/libfacedetectioncd libfacedetectionmkdir build; cd build; cmake 。。; make

專案編譯完成後會在 build 目錄下生成對應可執行檔案,可使用如下命令執行:

。/detect-image-demo 。。/images/test。png

雖然看似操作非常複雜,但實際上主要就是編譯 OpenCV,其它模組都可以直接在專案中完成編譯。最後,就可以愉快地使用這個極速人臉檢測模型了。