日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

MTCNN

發(fā)布時間:2024/9/5 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 MTCNN 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MTCNN,multi task convolutional neural network,多任務(wù)卷積神經(jīng)網(wǎng)絡(luò);

它同時實現(xiàn)了人臉檢測和關(guān)鍵點識別,關(guān)鍵點識別也叫人臉對齊;

檢測和對齊是很多其他人臉應(yīng)用的基礎(chǔ),如人臉識別,表情識別;

網(wǎng)絡(luò)特點:

1. 級聯(lián)網(wǎng)絡(luò)

2. 在線困難樣本選擇 online hard sample dining

3. 速度非常快,可做實時檢測

MTCNN 主體架構(gòu)為 3 個逐級遞進(jìn)的級聯(lián)網(wǎng)絡(luò),分別稱為P-Net、R-Net、O-Net,P-Net 快速生成粗略候選框,R-Net 進(jìn)行過濾得到高精度候選框,O-Net 生成邊界框和關(guān)鍵點坐標(biāo);

如圖

注意上圖是 測試過程,訓(xùn)練過程略有不同

網(wǎng)絡(luò)解析

MTCNN 網(wǎng)絡(luò)的形象理解

三個級聯(lián)網(wǎng)絡(luò),我們可以理解為面試過程,

HR 面試為 P-Net,HR 面試不能太嚴(yán)格,因為這樣會漏掉很多合適的人選,故 P-Net 是一個簡單的網(wǎng)絡(luò);

HR 面試完畢后,把通過的簡歷傳給 技術(shù),技術(shù)面試為 R-Net,技術(shù)面基本就能確定人選是否被錄用,只是薪資可能無法確定,故 R-Net 基本就確定了是否為人臉,只是關(guān)鍵點沒有指定;

技術(shù)面試完畢后,把通過的簡歷傳給 boss,boss 面為終面,輸出是否錄用及薪資;

圖像金字塔

將樣本進(jìn)行等比例的多次縮放,目的是為了檢測不同大小的人臉;

縮放比例一般為 0.7-0.8 之間,如果縮放比例太大,會導(dǎo)致小人臉檢測不到,如果太小,圖片過大,效率降低;

最小的圖片要大于 12x12,因為 P-Net 的輸入為 12;

P-Net

全稱 Proposal Netwrok,通過一個簡單的網(wǎng)絡(luò)快速得到粗略的建議框;

它是一個全卷積網(wǎng)絡(luò),輸出分為 3 部分:是否為人臉(2)、建議框的 左上右下坐標(biāo)(4)、人臉關(guān)鍵點(5個點*(x,y)=10);

上圖最后的輸出為 方框,因為他是卷積,而 R-Net、O-Net 的輸出為長條,因為他是全連接;

訓(xùn)練階段:雖然是全卷積網(wǎng)絡(luò),但是輸入仍需 resize 到 12x12;

測試階段:無需 resize 到 12x12,而是把圖像金字塔輸入網(wǎng)絡(luò);

R-Net

全稱 Refine Network,主要作用是去除大量非人臉建議框

它的輸入是 P-Net 的輸出;

網(wǎng)絡(luò)最后加上了一個全連接層;

O-Net

全稱 Output Network,這一步對 建議框進(jìn)行最終修正,并且對關(guān)鍵點進(jìn)行回歸;

它的輸入是 R-Net 的輸出;

網(wǎng)絡(luò)多了一個卷積層和全連接層;

損失函數(shù)

人臉類別為 交叉熵

邊框和 關(guān)鍵點都是 均方差

由于在訓(xùn)練時不是每一步都計算所有損失,因此用下式統(tǒng)一了模型的損失函數(shù)

N 表示樣本數(shù);

α 表示任務(wù)權(quán)重,在整個模型中,我們始終最關(guān)注是不是人臉,故它的權(quán)重最大,一直為 1,邊框回歸是在識別為人臉的建議框上做的,故權(quán)重小于人臉,一直為 0.5,在 P-Net 和 R-Net 中,關(guān)鍵點的回歸幾乎不需要,權(quán)重很小,在 O-Net 中,人臉和邊框都差不多了,好好把關(guān)鍵點識別一下,權(quán)重變大;

β 取值 0,1,如果輸入為非人臉,只計算 人臉部分的損失,邊框和關(guān)鍵點不計算;

模型訓(xùn)練

MTCNN 的訓(xùn)練還是比較麻煩的,需要串行地訓(xùn)練 三個網(wǎng)絡(luò)    【據(jù)說可以并行,沒試過,只是每個網(wǎng)絡(luò)的訓(xùn)練數(shù)據(jù)不同】

首先明確以下幾點:

作者采用的數(shù)據(jù)集為 wider face 邊框 和 Celeba 關(guān)鍵點

訓(xùn)練三個網(wǎng)絡(luò)都需要四種數(shù)據(jù)

positive:正樣本,與 ground truth IOU > 0.65 的 bbox;
negative:負(fù)樣本,與ground truth IOU < 0.3 的 bbox;
part:部分臉,0.4 < 與 ground truth IOU < 0.65 的 bbox;
landmark:關(guān)鍵點;

三種 任務(wù) 所需數(shù)據(jù)不同

分類任務(wù):只需要 positive 和 negative;
回歸任務(wù):只需要 positive 和 part;
對齊任務(wù):只需要 landmark;

P-Net 訓(xùn)練

第一步,生成數(shù)據(jù)集

隨機(jī)裁剪 不同 size 的正方形 bbox,計算與 GT 的 IOU,獲取以下訓(xùn)練集:

negative1:獲取 50 個,真的隨機(jī)裁剪;
negative2:獲取5 個,在人臉附近裁剪,保證 偏移量 < 裁剪框 size,這樣 bbox 與 人臉 的 IOU 是大于 0 的;
positive and part:共約 20 個,在人臉附近裁剪;
landmark:每個人臉區(qū)域附近生成10個框框,根據(jù)iou,保存有效的框框,隨機(jī)進(jìn)行翻轉(zhuǎn)flip,或者旋轉(zhuǎn)rotate,旋轉(zhuǎn) + 翻轉(zhuǎn),中的1步或幾步進(jìn)行數(shù)據(jù)增強(qiáng);

把這些 裁剪 的圖片縮放成 12x12 大小;

第二步,生成 label

positive 的 label 有兩部分,是否為人臉,bbox 的坐標(biāo);

  // 如果是人臉,label 為 1;

part 的 label 也是兩部分,是否為人臉,bbox 的坐標(biāo);

  // 如果是人臉,label 為 -1,;

negative 的 label 只有一部分,是否為人臉;

landmark 的坐標(biāo)也是兩部分,是否為人臉,關(guān)鍵點坐標(biāo);

  // 如果是人臉,label 為 -2;

label 中所有 坐標(biāo)都是 偏移量 offset

為什么要用 offset?

首先 offset 是個很小的值,方便我們做回歸,容易學(xué)習(xí),其次 offset 是個相對位置,bbox 左上角 相對于 ground truth 左上角的偏移量,根據(jù)偏移量我們很容易獲取它在原圖的位置;

如何計算 offset?

positive 和 part 的 offset 計算方式如下,

假設(shè)真實 label 的坐標(biāo)為 [x1,y1,x2,y2],裁剪框的坐標(biāo)為 [xa,ya,xb,yb],那么裁剪框的 size = xb-xa = yb-ya,那么 offset 為

offset_xa = (x1-xa) / size

offset_ya = (y1-ya) / size

offset_xb = (x2-xb) / size

offset_yb = (y2-yb) / size

為什么是 x1-xa,而不是 xa-x1?為什么是 bbox 的 size,不是 gt 的 size?

首先 offset 是我們的 label,那么網(wǎng)絡(luò)的輸出就是我們預(yù)測的 offset,我們需要拿預(yù)測的 offset 計算出它在原圖的坐標(biāo),offset 需要乘以一個 size,然后 加上 一個 x ;

而 size 我們只有 預(yù)測出來的 bbox 的 size 啊,真實的 size 根本沒有啊,特別是 test 階段,所以 size 是 bbox 的 size;

然后 加上 一個 x 得到 另一個 x,需要得到的是 gt 的 x,所以加上的只能是 bbox 的 x 了;

offset 圖解

landmark 的 offset 計算同理與 bbox;

第三步,輸入樣本,計算 loss

注意,每種 loss 需要不同的數(shù)據(jù)集,我們可以選擇 分別輸入 各種數(shù)據(jù)集,

如 先 輸入 positive 和 negative 用作 分類任務(wù),此時 回歸 loss 都是 0 就行了,然后 再 輸入 bbox 樣本,此時 分類 loss 都是 0 就行了;

但這種做法感覺怪怪的;

更好的做法是,把所有樣本 打亂,隨機(jī)輸入各種樣本,然后根據(jù) label [0 1 -1 -2] 來判斷是哪種樣本,從而計算對應(yīng)的 loss 即可;

在計算 loss 時,作者提出了一種 在線困難樣本選擇的 方法,其實很簡單,就是把 所有 loss 排序,取前面一部分大的 loss,后面小的 直接舍棄,具體參考我的博客ohem

第四步,NMS,這一步可有可無,有的話可大大減少計算量

R-Net 訓(xùn)練

與 P-Net 的隨機(jī)裁剪不同,R-Net 是把 P-Net 輸出的 bbox 在原圖上進(jìn)行裁剪,從而根據(jù)與 ground truth 的 IOU 得到 各種樣本;

其他與 P-Net 相同;

O-Net 訓(xùn)練

把 R-Net 的輸出作為 裁剪框,其他與 P-Net 相同;

模型應(yīng)用

MTCNN 不僅可以做人臉檢測,也可以做其他檢測,如交通流檢測,人流檢測;

它與 Yolo 的區(qū)別在于,Yolo 是多目標(biāo)檢測,MTCNN 是多個單目標(biāo)檢測,MTCNN 在單目標(biāo)檢測領(lǐng)域要優(yōu)于 Yolo;

參考資料:

https://blog.csdn.net/qq_36782182/article/details/83624357  MTCNN工作原理

https://blog.csdn.net/u014380165/article/details/78906898  MTCNN算法及代碼筆記

https://blog.csdn.net/weixin_44791964/article/details/103530206

https://zhuanlan.zhihu.com/p/58825924    知乎總是最詳細(xì)

https://zhuanlan.zhihu.com/p/64989774

https://blog.csdn.net/sinat_28731575/article/details/80330631

https://www.cnblogs.com/helloworld0604/p/9808795.html    訓(xùn)練

https://zhuanlan.zhihu.com/p/72308496  訓(xùn)練講得很清楚的教程

https://www.zhihu.com/collection/231012127

總結(jié)

以上是生活随笔為你收集整理的MTCNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。