Keras框架:人臉檢測-mtcnn思想及代碼

人臉檢測-mtcnn

概念:

MTCNN,英文全稱是Multi-task convolutional neural network,中文全稱是多任務卷積神經網絡, 該神經網絡將人臉區域檢測與人臉關鍵點檢測放在了一起。
從工程實踐上,MTCNN是一種檢測速度和準確率都很不錯的算法,算法的推斷流程有一定的啟發性。
在這里插入圖片描述
總體可分為P-Net、R-Net、和O-Net三層網絡結構。
在這里插入圖片描述

流程:

1.由原始圖片和PNet生成預測的bounding boxes。
2.輸入原始圖片和PNet生成的bounding box,通過RNet,生成校正后的bounding box。
3.輸入原始圖片和RNet生成的bounding box,通過ONet,生成校正后的bounding box和人臉面部輪 廓關鍵點。
在這里插入圖片描述
在這里插入圖片描述
MTCNN主要包括三層網絡:

  1. 第一層P-Net將經過卷積,池化操作后輸出分類(對應像素點是否存在人臉)和回歸(回歸 box)結果。
  2. 第二層網絡將第一層輸出的結果使用非極大抑制(NMS)來去除高度重合的候選框,并將這些 候選框放入R-Net中進行精細的操作,拒絕大量錯誤框,再對回歸框做校正,并使用NMS去除 重合框,輸出分支同樣兩個分類和回歸。
  3. 最后將R-Net輸出認為是人臉的候選框輸入到O-Net中再一次進行精細操作,拒絕掉錯誤的框, 此時輸出分支包含三個分類:
    a. 是否有人臉:2個輸出;
    b. 回歸:回歸得到的框的起始點的xy坐標和框的長寬,4個輸出;
    c. 人臉特征點定位:5個人臉特征點的xy坐標,10個輸出。

注:三段網絡都有NMS,但是所設閾值不同。

1、構建圖像金字塔

首先對圖片進行Resize操作,將原始圖像縮放成不同的尺度,生成圖像金字塔。然后將不同尺度的圖 像送入到這三個子網絡中進行訓練,目的是為了可以檢測到不同大小的人臉,從而實現多尺度目標檢測。
構建方式是通過不同的縮放系數factor分別對圖片的h和w進行縮放,每次縮小為原來的factor大小。
注意:縮小后的長寬最小不可以小于12。
在這里插入圖片描述
為什么需要對圖片做“金字塔”變換?
圖片中的人臉的尺度有大有小,讓識別算法不被目標尺度影響一直是個挑戰。
MTCNN使用了圖像金字塔來解決目標多尺度問題,即把原圖按照一定的比例(如0.709),多次等比 縮放得到多尺度的圖片,很像個金字塔。
P-NET的模型是用單尺度(1212)的圖片訓練出來的。推理的時候,縮小后的長寬最小不可以小于12。
對多個尺度的輸入圖像做訓練,訓練是非常耗時的。因此通常只在推理階段使用圖像金字塔,提高算法的精度。
設置合適的最小人臉尺寸和縮放因子為什么可以優化計算效率?
? factor是指每次對邊縮放的倍數。
? 第一階段會多次縮放原圖得到圖片金字塔,目的是為了讓縮放后圖片中的人臉與P-NET訓練時候的圖片尺度(12px * 12px)接近。
? 引申優化項:先把圖像縮放到一定大小,再通過factor對這個大小進行縮放。可以減少計算量。
? minsize是指你認為圖片中需要識別的人臉的最小尺寸(單位:px)。
? 注:代碼中使用的是“引申優化項“的策略。
在這里插入圖片描述
圖例:如果待測圖片1200px
1200px,想要讓縮放后的尺寸接近模型訓練圖片的尺度(12px*12px)。
縮放因子為什么官方選擇0.709?
? 圖片金字塔縮放時,如果默認把寬,高都變為原來的1/2,縮放后面積變為原來的1/4;
? 如果認為1/4的縮放幅度太大,你會怎么辦?—把面積縮放為原來的1/2。
? 這是很直觀的想法,所以這里的縮放因子0.709 ≈ sqrt(2)/2,這樣寬高變為原來的sqrt(2)/2, 面積就變為原來的1/2。
? 從實際意義上看,factor應該設置為小于1。
圖像金字塔的缺點:
慢。

  1. 第一,生成圖片金字塔慢;
  2. 第二,每種尺度的圖片都需要輸入進模型,相當于執行了多次的模型推理流程。

2、P-Net(Proposal Network)

其基本的構造是一個全卷積網絡。對上一步構建完成的圖像金字塔,通過一個FCN(全卷積網絡) 進行初步特征提取與標定邊框。
在這里插入圖片描述
MTCNN算法可以接受任意尺度的圖片,為什么?
? 因為第一階段的P-NET是一個全卷積網絡(Fully Convolutional Networks)。
? 卷積、池化、非線性激活都是一些可以接受任意尺度矩陣的運算,但全連接運算是需要規定輸入。 如果網絡中有全連接層,則輸入的圖片尺度(一般)需固定;如果沒有全連接層,圖片尺度可以是任 意的。
? 在推理的時候,測試圖像中人臉區域的尺度未知。但是因為P網結構是固定的,當輸入圖為1212時, 輸出的恰好是11的5通道特征圖,所以可以把p網整體看做一個1212的卷積核在圖片上從左上方開 始,取步長stride=2,依次做滑窗操作。——>所以,當剛開始圖很大的時候,1212的框可能只是 框住了一張大臉上的某個局部如眼睛、耳朵、鼻子。當該圖不斷縮至很小的時候(圖像金字塔), 12*12的框能對其框住的也越來越全,直至完全框住了整張臉。
在這里插入圖片描述

? 3次卷積和1次池化操作后,原來12123的矩陣變為1132
? 利用這個1132的向量,再通過一個112的卷積,得到了”是否是人臉”的分類結果
? 我們令輸入圖片矩陣為A,卷積核在原圖矩陣A上滑動,把每個12123區域的矩陣都計算成該區域有 無人臉的得分,最后可以得到一個二維矩陣為S,S每個元素的值是[0, 1]的數,代表有人臉的概率。即 A通過一系列矩陣運算,變化到S。
P-Net的輸出:

  1. 網絡的第一部分輸出是用來判斷該圖像是否存在人臉,輸出向量大小1x1x2,也就是兩個值。
  2. 網絡的第二部分給出框的精確位置,即邊框回歸:P-Net輸入的12×12的圖像塊可能并不是完美的 人臉框的位置,如有的時候人臉并不正好為方形,有可能12×12的圖像偏左或偏右,因此需要輸出 當前框位置相對完美的人臉框位置的偏移。這個偏移大小為1×1×4,即表示框左上角的橫坐標的相 對偏移,框左上角的縱坐標的相對偏移、框的寬度的誤差、框的高度的誤差。
  3. 網絡的第三部分給出人臉的5個關鍵點的位置。5個關鍵點分別對應著左眼的位置、右眼的位置、 鼻子的位置、左嘴巴的位置、右嘴巴的位置。每個關鍵點需要兩維來表示,因此輸出是向量大小 為1×1×10。

舉例:
一張7070的圖,經過P網絡全卷積后,輸出為(70-2)/2 -2 -2 =30,即一個5通道的3030的特征 圖。這就意味著該圖經過p的一次滑窗操作,得到了30*30=900個建議框,而每個建議框對應1個置 信度cond與4個偏移量offset。再經nms(非極大值抑制:通過iou,把不是極大值的值全都殺掉)把 cond大于設定的閾值0.6對應的建議框保留下來,將其對應的offset經邊框回歸操作,得到在原圖中 的坐標信息,即得到符合p網的這些建議框了。之后再傳給R網。

3、R-Net(Refine Network):

從網絡圖可以看到,只是由于該網絡結構和P-Net網絡結構有差異,多了一個全連接層,所以會取得更好的抑制false-positive的作用。在輸入R-Net之前,都需要縮放到24x24x3,網絡的輸出與P- Net是相同的,R-Net的目的是為了去除大量的非人臉框。

4、O-Net(Output Network):

該層比R-Net層又多了一層卷積層,所以處理的結果會更加精細。輸入的圖像大小48x48x3,輸出包括N個邊界框的坐標信息,score以及關鍵點位置。

總結:

從P-Net到R-Net,再到最后的O-Net,網絡輸入的圖像越來越大,卷積層的通道數越來越多,網絡的深度(層數)也越來越深,因此識別人臉的準確率應該也是越來越高的。

實現:

MTCNN人臉檢測的訓練數據可以從http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/地址下載。該數據集有32,203張圖片,共有93,703張臉被標記。
在這里插入圖片描述

完整代碼在資源中。
實現結果如下:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389454.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中格式化字符串_Python中所有字符串格式化的指南

python中格式化字符串Strings are one of the most essential and used datatypes in programming. It allows the computer to interact and communicate with the world, such as printing instructions or reading input from the user. The ability to manipulate and form…

Javassist實現JDK動態代理

提到JDK動態代理,相信很多人并不陌生。然而,對于動態代理的實現原理,以及如何編碼實現動態代理功能,可能知道的人就比較少了。接下一來,我們就一起來看看JDK動態代理的基本原理,以及如何通過Javassist進行模…

數據圖表可視化_數據可視化如何選擇正確的圖表第1部分

數據圖表可視化According to the World Economic Forum, the world produces 2.5 quintillion bytes of data every day. With so much data, it’s become increasingly difficult to manage and make sense of it all. It would be impossible for any person to wade throug…

Keras框架:實例分割Mask R-CNN算法實現及實現

實例分割 實例分割(instance segmentation)的難點在于: 需要同時檢測出目標的位置并且對目標進行分割,所以這就需要融合目標檢測(框出目標的位置)以及語義分割(對像素進行分類,分割…

機器學習 缺陷檢測_球檢測-體育中的機器學習。

機器學習 缺陷檢測🚩 目標 (🚩Objective) We want to evaluate the quickest way to detect the ball in a sport event in order to develop an Sports AI without spending a million dollars on tech or developers. Quickly we find out that detec…

莫煩Pytorch神經網絡第二章代碼修改

import torch import numpy as np""" Numpy Torch對比課程 """ # #tensor與numpy格式數據相互轉換 # np_data np.arange(6).reshape((2,3)) # print(np_data) # # torch_data torch.from_numpy(np_data) # print(\n,torch_data) # # tensor2ar…

自定義字符類

當 VC不使用MFC,無法使用屬于MFC的CString,為此自定義一個,先暫時使用,后續完善。 頭文件: #pragma once#define MAX_LOADSTRING 100 // 最大字符數class CString {public:char *c_str, cSAr[MAX_LOADSTRING];WCHAR *w…

使用python和javascript進行數據可視化

Any data science or data analytics project can be generally described with the following steps:通常可以通過以下步驟來描述任何數據科學或數據分析項目: Acquiring a business understanding & defining the goal of a project 獲得業務理解并定義項目目…

Android 事件處理

事件就是用戶對圖形的操作,在android手機和平板電腦上,主要包含物理按鍵事件和觸摸屏事件兩類。物理按鍵事件包含:按下、抬起、長按等;觸摸屏事件主要包含按下、抬起、滾動、雙擊等。 在View中提供了onTouchEvent()方法&#xff0…

莫煩Pytorch神經網絡第三章代碼修改

3.1Regression回歸 import torch import torch.nn.functional as F from torch.autograd import Variable import matplotlib.pyplot as plt""" 創建數據 """x torch.unsqueeze(torch.linspace(-1,1,100),dim1) y x.pow(2) 0.2*torch.rand(x…

為什么餅圖有問題

介紹 (Introduction) It seems as if people are split on pie charts: either you passionately hate them, or you are indifferent. In this article, I am going to explain why pie charts are problematic and, if you fall into the latter category, what you can do w…

New Distinct Substrings(后綴數組)

New Distinct Substrings&#xff08;后綴數組&#xff09; 給定一個字符串&#xff0c;求不相同的子串的個數。\(n<50005\)。 顯然&#xff0c;任何一個子串一定是后綴上的前綴。先&#xff08;按套路&#xff09;把后綴排好序&#xff0c;對于當前的后綴\(S_i\)&#xff0…

Android dependency 'com.android.support:support-v4' has different version for the compile (26.1.0...

在項目中加入react-native-camera的時候 出現的錯誤. 解決方案: 修改 implementation project(:react-native-camera)為 implementation (project(:react-native-camera)) {exclude group: "com.android.support"}查看原文 Could not find play-services-basement.aa…

先知模型 facebook_使用Facebook先知進行犯罪率預測

先知模型 facebookTime series prediction is one of the must-know techniques for any data scientist. Questions like predicting the weather, product sales, customer visit in the shopping center, or amount of inventory to maintain, etc - all about time series …

莫煩Pytorch神經網絡第四章代碼修改

4.1CNN卷積神經網絡 import torch import torch.nn as nn from torch.autograd import Variable import torch.utils.data as Data import torchvision import matplotlib.pyplot as pltEPOCH 1 BATCH_SIZE 50 LR 0.001 DOWNLOAD_MNIST False #如果數據集已經下載到…

github gists 101使代碼共享漂亮

If you’ve been going through Medium, looking at technical articles, you’ve undoubtedly seen little windows that look like the below:如果您一直在閱讀Medium&#xff0c;并查看技術文章&#xff0c;那么您無疑會看到類似于以下內容的小窗口&#xff1a; def hello_…

loj #6278. 數列分塊入門 2

題目 題解 區間修改&#xff0c;詢問區間小于c的個數。分塊排序&#xff0c;用vector。至于那個塊的大小&#xff0c;好像要用到均值不等式 我不太會。。。就開始一個個試&#xff0c;發現sizsqrt(n)/4時最快&#xff01;&#xff01;&#xff01;明天去學一下算分塊復雜度的方…

基于Netty的百萬級推送服務設計要點

1. 背景1.1. 話題來源最近很多從事移動互聯網和物聯網開發的同學給我發郵件或者微博私信我&#xff0c;咨詢推送服務相關的問題。問題五花八門&#xff0c;在幫助大家答疑解惑的過程中&#xff0c;我也對問題進行了總結&#xff0c;大概可以歸納為如下幾類&#xff1a;1&#x…

莫煩Pytorch神經網絡第五章代碼修改

5.1動態Dynamic import torch from torch import nn import numpy as np import matplotlib.pyplot as plt# torch.manual_seed(1) # reproducible# Hyper Parameters INPUT_SIZE 1 # rnn input size / image width LR 0.02 # learning rateclass…

鮮為人知的6個黑科技網站_6種鮮為人知的熊貓繪圖工具

鮮為人知的6個黑科技網站Pandas is the go-to Python library for data analysis and manipulation. It provides numerous functions and methods that expedice the data analysis process.Pandas是用于數據分析和處理的Python庫。 它提供了加速數據分析過程的眾多功能和方法…