libfacedetection是基於SSD進行魔改,而DBFace是基於MobileNetV3進行改進。
- 一、libfacedetection
- 二、DBFace
- 三、libfacedetection網絡結構圖
一、libfacedetection
鏈接:https://github.com/ShiqiYu/libfacedetection
訓練代碼:https://github.com/ShiqiYu/libfacedetection.train (用到nvidia-dali,不能在win下使用)
於老師這個項目,牛就牛在,他可以轉為純C++代碼,不依賴任何第三方庫,檢測速度在128x96的輸入上,在i7的CPU上可以達到1929幀/秒,在樹莓派這種嵌入式設備上,也可以達到116幀/秒;而在常規的VGA分辨率(640x480)輸入下,在CPU上也可以達到72幀/秒,可以說是非常優秀了。下表是該項目的評測指標,分別有單線程和多線程的耗時和速度。
模型結構也比較簡單,就是一個輕量級的 SSD 架構,共四個定位層,而且借鑒了RetinFace的關鍵點方法,可以同時回歸5個關鍵點。模型體積只有232萬,體積僅有3.34M
面是於老師的文章中敘述的libfacedetection的特點:
-
卷積操作無浮點計算,算法基本全是8位整數操作。
-
采用AVX512/AVX2/NEON指令提速。
-
代碼更加簡短和簡潔,只有一千多行代碼。
-
代碼不依賴任何其他第三方庫,只要平台能編譯C++則可使用。
-
項目License采用3-Clause BSD License,可以商業應用!
今晚,於老師開源的是該模型的訓練代碼,下面我們一起分析一下該訓練框架。這個人臉檢測模型,於老師一共更新了三版,再加上今天開源的訓練代碼,一共四篇文章,我們先把這四篇官方微信文章列一下:
通過查看於老師開源的訓練代碼,我們可以看到該模型是一個SSD類型的目標檢測模型,一共有四個檢測分之,Backbone網絡共16層,模型非常輕量級,
不過該模型使用一個PriorBox層生成anchor,可以做到任意大小的輸入。這點我們在后面也會借鑒過去。
網絡結構如下圖所示,該模型是在下降8、16、32、64倍后的四個尺度的特征圖上接入分類定位層,四個層每個點的anchor數目分別為3、2、2、3,所有anchor的長寬比分別為1:1。
定位層 | 下降倍數 | anchor大小 |
一 | 8 | 10, 16, 24 |
二 | 16 | 32, 48 |
三 | 32 | 64, 96 |
四 | 64 | 128, 192, 256 |
該網絡共有參數232萬,可以說比較輕量級了。在RetinaFace中,作者也同樣對每個人臉同時回歸了五個關鍵點。於老師這里的做法與RetinaNet一樣,也是對每個anchor在回歸cx、cy、dw、dh四個bounding box偏移量時,額外再增加10個節點的輸出,分別對應五個關鍵點的cx、cy偏移量。
另外,模型在推理的時候,也將Batch Norm層的參數融合進了卷積層,從而實現一定量的網絡加速。關於BN層融合,筆者后面會寫一篇文章簡單介紹一下。
二、DBFace
1.3M 的輕量級高精度的關鍵點人臉檢測模型 DBFace,並手把手教你如何在自己的電腦端進行部署和測試運行,運行時bug解決。前段時間DBFace人臉檢測庫橫空出世,但是當時這個人臉識別模型是7M大小,幾乎可以識別出世界最大自拍中的所有人像。DBFace出自國內人工智能公司深蘭科技(DeepBlue),這個模型的創建者正是這個公司的兩位“高手”-Libia和Wish,而最近,高手就是高手,兩位大佬對模型進行了再升級,現在這個模型的大小僅僅只有1.3M。
DBFace的網絡結構
DBFace的初衷設計就是為了設計成一款輕量級的人臉檢測器,能夠在邊緣計算上有效的使用,為了讓處理更加簡潔、高效、對小目標的檢測效果也好,選擇 CenterNet(基於中心點的方法預測目標,稱為:CenterNet,)結構做檢測任務,采用MoblienetV3做Backbone。我相信大家在這里已經暈了吧,不知道什么是CenterNet和MoblienetV3,因為這不是幾句話能說清楚的,需要大家明白卷積的知識,在知道這之后,還需要去讀這個論文,啃代碼,可能才能理解個七八分吧。
相對於MoblienetV2,MoblienetV3在其基礎上新增了SE、Hard-Swish Activation等模塊,在兼顧infence速度的同事提升網絡性能。
對於任務頭的設計,大佬引入了SSH的DetectModule和ContextMoudle,經試驗驗證該模塊能有效的提升DBFace算法的檢出性能,這里涉及到卷積、池化中的最大值池,對模型進行的整合。
對於上采樣設計,作者采用Upsample + Conv + Act的方式,即上采樣 + 卷積 + 激活函數Activation,從圖中可以看到有激活函數Relu。
損失函數Loss的定義
整個網絡由三個部分的Loss組成:
- 熱力圖HeatMap損失 - (CenterNet網絡中熱力圖誤差損失)
- 位置坐標偏移量(Bounding Box)損失 - (檢測邊界框誤差損失)
- 關鍵點(Landmark)損失 - (人臉關鍵點誤差損失)
對於一個模型來說,網絡結構和損失函數、以及數據集是最重要的,這里作者並沒有開源自己的數據集,我們可以利用工具來標記屬於自己的數據集,這里給大家介紹一個關鍵點標記的軟件CasiaLabeler
三、libfacedetection網絡結構圖
參考:https://mp.weixin.qq.com/s?__biz=MzIyMDY2MTUyNg==&mid=2247483818&idx=1&sn=12e14dfd5154b35f14575d876785da76&chksm=97c9d3d3a0be5ac5a4e5cb05b23dd90bb73d57c2b3be6a70a139d8c28391a6185ec6297b6da0&scene=21#wechat_redirect
https://zhuanlan.zhihu.com/p/183203043
https://blog.csdn.net/weixin_45192980/article/details/106485602