【課程總結】Day13(下):人臉識別和MTCNN模型

前言

在上一章課程【課程總結】Day13(上):使用YOLO進行目標檢測,我們了解到目標檢測有兩種策略,一種是以YOLO為代表的策略:特征提取→切片→分類回歸;另外一種是以MTCNN為代表的策略:先圖像切片→特征提取→分類和回歸。因此,本章內容將深入了解MTCNN模型,包括:MTCNN的模型組成、模型訓練過程、模型預測過程等。

人臉識別

在展開了解MTCNN之前,我們對人臉檢測先做一個初步的梳理和了解。人臉識別細分有兩種:人臉檢測和人臉身份識別。

人臉檢測

簡述

人臉檢測是一個重要的應用領域,它通常用于識別圖像或視頻中的人臉,并定位其位置。

識別過程
  1. 輸入圖像:首先,將包含人臉的圖像輸入到人臉檢測模型中。
  2. 特征提取:深度學習模型將學習提取圖像中的特征,以便識別人臉。
  3. 人臉定位:模型通過在圖像中定位人臉的位置,通常使用矩形邊界框來框定人臉區域。
  4. 輸出結果:最終輸出包含人臉位置信息的結果,可以是邊界框的坐標或其他形式的標注。
輸入輸出
  • 輸入:一張圖像
  • 輸出:所有人臉的坐標框
應用場景
  • 表情識別:識別人臉的表情,如快樂、悲傷等。
  • 年齡識別:根據人臉特征推斷出人的年齡段。
  • 人臉表情生成:通過檢測到的人臉生成不同的表情。

人臉檢測特點

人臉檢測是目標檢測中最簡單的任務

  • 類別少
  • 人臉形狀比較固定
  • 人臉特征比較固定
  • 周圍環境一般比較好

人臉身份識別

簡述

人臉身份識別是指通過識別人臉上的獨特特征來確定一個人的身份。

識別過程

人臉錄入流程

  1. 數據采集:采集包含人臉的圖像數據集。
  2. 人臉檢測:使用人臉檢測算法定位圖像中的人臉區域。
  3. 人臉特征提取:通過深度學習模型提取人臉圖像的特征向量。
  4. 特征向量存儲:將提取到的特征向量存儲在向量數據庫中。

人臉驗證流程

  1. 人臉檢測:使用人臉檢測算法定位圖像中的人臉區域。
  2. 人臉特征提取:通過深度學習模型提取人臉圖像的特征向量。
  3. 人臉特征匹配:將輸入人臉的特征向量與向量數據庫中的特征向量進行匹配。
  4. 身份識別:根據匹配結果確定輸入人臉的身份信息。
應用領域
  • 安防監控:用于門禁系統、監控系統等,實現人臉識別進出控制。
  • 移動支付:通過人臉識別來進行身份驗證,實現安全的移動支付功能。
  • 社交媒體:用于自動標記照片中的人物,方便用戶管理照片。
  • 人機交互:實現人臉識別登錄、人臉解鎖等功能。

一般來說,一切目標檢測算法都可以做人臉檢測,但是由于通用目標檢測算法做人臉檢測太重了,所以會使用專門的人臉識別算法,而MTCNN就是這樣一個輕量級和專業級的人臉檢測網絡。

MTCNN模型

簡介

MTCNN(Multi-Task Cascaded Convolutional Neural Networks)是一種用于人臉檢測和面部對齊的神經網絡模型。

論文地址:https://arxiv.org/abs/1604.02878v1

模型結構
  • MTCNN采用了級聯結構,包括三個階段的深度卷積網絡,分別用于人臉檢測和面部對齊。
  • 每個階段都有不同的任務,包括人臉邊界框回歸、人臉關鍵點定位等。

這個級聯過程,相當于海選→淘汰賽→決賽的過程。

整體流程

上圖是論文中對于MTCNN整體過程的圖示,我們換一種較為容易易懂的圖示來理解整體過程:

  1. 先將圖片生成不同尺寸的圖像金字塔,以便識別不同大小的人臉。
  2. 將圖片輸入到P-net中,識別出可能包含人臉的候選窗口。
  3. 將P-net中識別的可能人臉的候選窗口輸入到R-net中,識別出更精確的人臉位置。
  4. 將R-net中識別的人臉位置輸入到O-net中,進行更加精細化識別,從而找到人臉區域。

備注:上圖引用自科普:什么是mtcnn人臉檢測算法

P-net:人臉檢測
  • 名稱:提議網絡(proposal network)
  • 作用:P網絡通過卷積神經網絡(CNN)對輸入圖像進行處理,識別出可能包含人臉的候選窗口,并對這些候選窗口進行邊界框的回歸,以更準確地定位人臉位置。
  • 特點
    • 純卷積網絡,無全鏈接(精髓所在
R-net:人臉對齊
  • 名稱:精修網絡(refine network)
  • 作用:R網絡通過分類器和回歸器對P網絡生成的候選窗口進行處理,進一步篩選出包含人臉的區域,并對人臉位置進行修正,以提高人臉檢測的準確性。
O-net:人臉識別
  • 名稱:輸出網絡(output network)
  • 作用:O網絡通過更深層次的卷積神經網絡處理人臉區域,優化人臉位置和姿態,并輸出面部關鍵點信息,為后續的面部對齊提供重要參考。
MTCNN用到的主要模塊
圖像金字塔

MTCNN的P網絡使用的檢測方式是:設置建議框,用建議框在圖片上滑動檢測人臉

由于P網絡的建議框的大小是固定的,只能檢測12*12范圍內的人臉,所以其不斷縮小圖片以適應于建議框的大小,當下一次圖像的最小邊長小于12時,停止縮放。

IOU

定義:IOU(Intersection over Union)是指交并比,是目標檢測領域常用的一種評估指標,用于衡量兩個邊界框(Bounding Box)之間的重疊程度。
兩種方式:

  • 交集比并集
  • 交集比最小集

O網絡iou值大于閾值的框被認為是重復的框會丟棄,留下iou值小的框,但是如果出現了下圖中大框套小框的情況,則iou值偏小也會被保留,是我們不想看到的,因此我們在O網絡采用了第二種方式的iou以提高誤檢率。

NMS(Non-Maximum Suppression,非極大值抑制)

定義
NMS是一種目標檢測中常用的技術,旨在消除重疊較多的候選框,保留最具代表性的邊界框,以提高檢測的準確性和效率。

工作原理
NMS的工作原理是通過設置一個閾值,比如IOU(交并比)閾值,對所有候選框按照置信度進行排序,然后從置信度最高的候選框開始,將與其重疊度高于閾值的候選框剔除,保留置信度最高的候選框。

  • 如上圖所示框出了五個人臉,置信度分別為0.98,0.83,0.75,0.81,0.67,前三個置信度對應左側的Rose,后兩個對應右側的Jack。
  • NMS將這五個框根據置信度排序,取出最大的置信度(0.98)的框分別和剩下的框做iou保留iou小于閾值的框(代碼中閾值設置的是0.3),這樣就剩下0.81和0.67這兩個框了。
  • 重復上面的過程,取出置信度(0.81)大的框和剩下的框做iou,保留iou小于閾值的框。這樣最后只剩下0.98和0.81這兩個人臉框了。
代碼實現

P-Net

import torch
from torch import nn"""P-Net
"""class PNet(nn.Module):def __init__(self):super().__init__()self.features_extractor = nn.Sequential(# 第一層卷積nn.Conv2d(in_channels=3, out_channels=10, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=10),nn.ReLU(),# 第一層池化nn.MaxPool2d(kernel_size=3,stride=2, padding=1),# 第二層卷積nn.Conv2d(in_channels=10, out_channels=16, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=16),nn.ReLU(),# 第三層卷積nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=32),nn.ReLU())# 概率輸出self.cls_out = nn.Conv2d(in_channels=32, out_channels=2, kernel_size=1, stride=1, padding=0)# 回歸量輸出self.reg_out = nn.Conv2d(in_channels=32, out_channels=4, kernel_size=1, stride=1, padding=0)def forward(self, x):print(x.shape)x = self.features_extractor(x)cls_out = self.cls_out(x)reg_out = self.reg_out(x)return cls_out, reg_out

R-Net

import torch
from torch import nnclass RNet(nn.Module):def __init__(self):super().__init__()self.feature_extractor = nn.Sequential(# 第一層卷積 24 x 24nn.Conv2d(in_channels=3, out_channels=28, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=28),nn.ReLU(),# 第一層池化 11 x 11nn.MaxPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=False),# 第二層卷積 9 x 9nn.Conv2d(in_channels=28, out_channels=48, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=48),nn.ReLU(),# 第二層池化 (沒有補零) 4 x 4nn.MaxPool2d(kernel_size=3, stride=2, padding=0, ceil_mode=False),# 第三層卷積 3 x 3nn.Conv2d(in_channels=48, out_channels=64, kernel_size=2, stride=1, padding=0),nn.BatchNorm2d(num_features=64),nn.ReLU(),# 展平nn.Flatten(),# 全連接層 [batch_size, 128]nn.Linear(in_features=3 * 3 * 64, out_features=128))# 概率輸出self.cls_out = nn.Linear(in_features=128, out_features=1)# 回歸量輸出self.reg_out = nn.Linear(in_features=128, out_features=4)def forward(self, x):x = self.feature_extractor(x)cls = self.cls_out(x)reg = self.reg_out(x)return cls, reg   

O-Net

import torch
from torch import nnclass ONet(nn.Module):def __init__(self):super().__init__()self.feature_extractor = nn.Sequential(# 第1層卷積 48 x 48nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, stride=1, padding=0),nn.BatchNorm2d(num_features=32),nn.ReLU(),# 第1層池化 11 x 11nn.MaxPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=False),# 第2層卷積 9 x 9nn.Conv2d(in_channels=32, out_channels=64, kernel_size=

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

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

相關文章

CountDownLatch 是 Java 中的一個同步輔助工具類

下面是一個使用 CountDownLatch 的案例分析,我們將通過一個簡單的示例來展示如何使用 CountDownLatch 來同步多個線程的操作。 ### 場景描述 假設我們有一個任務,需要從多個數據源(比如多個數據庫表或文件)中讀取數據&#xff0c…

使用jdk11運行javafx程序和jdk11打包jre包含javafx模塊

我們都知道jdk11是移除了javafx的,如果需要使用javafx,需要單獨下載。 這就導致我們使用javafx開發的桌面程序使用jdk11時提示缺少javafx依賴。但這是可以通過下面的方法解決。 一,使用jdk11運行javafx程序 我們可以通過設置vmOptions來使用jdk11運行javafx程序 1,添加j…

【RAG KG】GraphRAG開源:查詢聚焦摘要的圖RAG方法

前言 傳統的 RAG 方法在處理針對整個文本語料庫的全局性問題時存在不足,例如查詢:“數據中的前 5 個主題是什么?” 對于此類問題,是因為這類問題本質上是查詢聚焦的摘要(Query-Focused Summarization, QFS&#xff09…

嵌入式單片機,兩者有什么關聯又有什么區別?

在開始前剛好我有一些資料,是我根據網友給的問題精心整理了一份「嵌入式的資料從專業入門到高級教程」, 點個關注在評論區回復“666”之后私信回復“666”,全部無償共享給大家!!!使用單片機是嵌入式系統的…

iOS 國際化語言第一語言不支持時候默認語言強轉英文

對bundle擴展 直接貼代碼 .h文件 // // NSBundleKdLocalBundle.h // QooCam // // Created by bob bob on 2023/9/8.//#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGINinterface NSBundle (KdLocalBundle)end interface KdLocalBundle:NSBundleend interf…

CurrentHashMap巧妙利用位運算獲取數組指定下標元素

先來了解一下數組對象在堆中的存儲形式【數組長度&#xff0c;數組元素類型信息等】 【存放元素對象的空間】 Ma 基礎信息實例數據內存填充Mark Word,ClassPointer,數組長度第一個元素第二個元素固定的填充內容 所以我們想要獲取某個下標的元素首先要獲取這個元素的起始位置…

軟件工程常見知識點

下午收到字節日常實習的面試邀請&#xff0c;希望這次能有一個好的表現。言歸正傳&#xff0c;郵件中提到這些問題&#xff0c;我這邊借了書并查了網上的資料&#xff0c;做一個提前準備。 軟件工程核心概念&#xff1a; 如何從一個需求落實到一個系統設計&#xff1f; 經過我…

c++ primer plus 第15章友,異常和其他:異常,15.3.7 其他異常特性

c primer plus 第15章友&#xff0c;異常和其他&#xff1a;異常,15.3.7 其他異常特性 c primer plus 第15章友&#xff0c;異常和其他&#xff1a;異常,15.3.7 其他異常特性 文章目錄 c primer plus 第15章友&#xff0c;異常和其他&#xff1a;異常,15.3.7 其他異常特性 15.…

Sorted Set 類型命令(命令語法、操作演示、命令返回值、時間復雜度、注意事項)

Sorted Set 類型 文章目錄 Sorted Set 類型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

線程池案例

秒殺 需求 10個禮物20個客戶搶隨機10個客戶獲取禮物&#xff0c;另外10無法獲取禮物 任務類 記得給共享資源加鎖 public class MyTask implements Runnable{// 禮物列表private ArrayList<String> gifts ;// 用戶名private String username;public MyTask( String user…

android Dialog全屏沉浸式狀態欄實現

在Android中&#xff0c;創建沉浸式狀態欄通常意味著讓狀態欄背景與應用的主題顏色一致&#xff0c;并且讓對話框在狀態欄下面顯示&#xff0c;而不是浮動。為了實現這一點&#xff0c;你可以使用以下代碼片段&#xff1a; 1、實際效果圖&#xff1a; 2、代碼實現&#xff1a;…

揭秘GPT-4o:未來智能的曙光

引言 近年來&#xff0c;人工智能&#xff08;AI&#xff09;的發展突飛猛進&#xff0c;尤其是自然語言處理&#xff08;NLP&#xff09;領域的進步&#xff0c;更是引人注目。在這一背景下&#xff0c;OpenAI發布的GPT系列模型成為了焦點。本文將詳細探討最新的模型GPT-4o&a…

Unity海面效果——6、反射和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿趙。 上一篇的結束時&#xff0c;海面效果已經做成這樣了&#xff1a; 這個Shader的復雜程度已經比較高了&#xff1a; 不過還有一些美中不足的地方。 1、 海平面沒有反射到天空球 2、 在近岸邊看得到水底的部分&#xff0c;水…

JVM調優:深入理解與實戰指南

引言 Java虛擬機&#xff08;JVM&#xff09;作為Java應用程序的運行環境&#xff0c;其性能直接影響到應用程序的響應速度、吞吐量和穩定性。JVM調優是Java開發者必須掌握的一項關鍵技能&#xff0c;它能夠幫助我們更好地利用系統資源&#xff0c;提升應用程序的性能。本文將…

一些關于C++的基礎知識

引言&#xff1a;C兼容C的大部分內容&#xff0c;但其中仍有許多小細節的東西需要大家注意 一.C的第一個程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看這個是否感覺一頭霧水…

數據挖掘——matplotlib

matplotlib概述 Mat指的是Matlab&#xff0c;plot指的是畫圖&#xff0c;lib即library&#xff0c;顧名思義&#xff0c;matplotlib是python專門用于開發2D圖表的第三方庫&#xff0c;使用之前需要下載該庫&#xff0c;使用pip命令即可下載。 pip install matplotlib1、matpl…

elasticsearch SQL:在Elasticsearch中啟用和使用SQL功能

?博主首頁 &#xff1a; 「碼到三十五」 &#xff0c;同名公眾號 :「碼到三十五」&#xff0c;wx號 : 「liwu0213」 ?博主專欄 &#xff1a; <mysql高手> <elasticsearch高手> <源碼解讀> <java核心> <面試攻關> ?博主的話 &#xff1a…

服務注冊Eureka

目錄 一、背景 1、概念 2、CAP 理論 3、常見的注冊中心 二、Eureka 三、搭建 Eureka Server 1、搭建注冊中心 四、服務注冊 五、服務發現 六、Eureka 和 Zooper 的區別 一、背景 1、概念 遠程調用就類似于一種通信 例如&#xff1a;當游客與景區之間進行通信&…

代碼隨想錄算法訓練營第六十三天 | prim算法、kruskal算法、復習

53. 尋寶 — prim算法 題目鏈接&#xff1a;https://kamacoder.com/problempage.php?pid1053 文檔講解&#xff1a;https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html 思路 本題是最小生成樹的模板題&#xff0c;最小生成樹可以使用 prim算法&#xf…

bash shell 重定向輸入和輸出

shell 提供的重定向操作符 操作符作用>將命令的輸出發到一個文件中如果文件存在&#xff0c;則新的文件數據會覆蓋已經存在的文件>>將命令的輸出追加到一有文件如果文件不存在&#xff0c;則創建新的文件<將文件內容重定向到命令<<內聯輸入重定向(inline in…