一、人臉識別
人臉識別是一門比較成熟的技術。
它的身影隨處可見,刷臉支付,信息審核,監(jiān)控搜索,人臉打碼等。
更多的時候,它是方便了我們的生活,足不出戶,就可以實現(xiàn)各種 APP 的實名認證,信息審核。
一些公司,也都有對內部員工開放的刷臉支付系統(tǒng),不用帶手機,不用帶工卡,帶著一張或美麗或帥氣的臉龐,就可以在公司內部「買買買,刷刷刷」。
二、人臉打碼
除了這些常規(guī)操作,還可以對視頻里的特定人物進行打碼。
對于視頻,人工后期的逐幀處理,打碼任務無疑是個「體力活」。
但如果結合臉識別技術,那這個任務就會簡單很多。
本文從原理出發(fā),講解人臉識別技術的視頻打碼應用。
過濾視頻的敏感人物,就這么簡單!
三、人臉識別技術
人臉識別技術包涵了多種算法,整個流程大致如下:
??? 使用檢測技術,檢測出人臉位置。
??? 使用 landmark 技術,檢測出人臉關鍵點。
??? 根據(jù)人臉位置和人臉關鍵點,裁剪出人臉區(qū)域,并根據(jù)關鍵點將人臉圖片進行矯正,得到「標準臉」。
??? 計算「標準臉」的人臉特征向量。
??? 與「人臉庫」的人臉特征向量比對,計算向量的距離,找到最接近的人,輸出人臉識別結果。
1、人臉檢測
輸入:原始的可能含有人臉的圖像。
輸出:人臉位置的 bounding box。
這一步一般我們稱之為“人臉檢測”(Face Detection),人臉檢測算法,可以使用的庫有很多,例如 OpenCV、dlib、face_recognition、RetianFace、CenterFace 等等。
太多了,數(shù)不過來。
當然,自己用 yolo 、ssd 這類經(jīng)典的檢測算法,自己實現(xiàn)一個也是可以的。
2、人臉裁剪及矯正
輸入:原始圖像 + 人臉位置 bounding box。
輸出:“校準”過的只含有人臉的圖像。
這一步需要使用 landmark 算法,檢測人臉中的關鍵點,然后根據(jù)這些關鍵點對人臉做對齊校準。
所謂的關鍵點,就是下圖所示的綠色的點,通常是眼角的位置、鼻子的位置、臉的輪廓點等等。
有了這些關鍵點后,我們就可以把人臉“校準”,或者說是“對齊”。
解釋就是原先人臉可能比較歪,這里根據(jù)關鍵點,使用仿射變換將人臉統(tǒng)一“擺正”,盡量去消除姿勢不同帶來的誤差。這一步我們一般叫 Face Alignment 。
3、人臉特征
輸入:校準后的單張人臉圖像。
輸出:一個向量表示。
這一步就是使用深度卷積網(wǎng)絡,將輸入的人臉圖像,轉換成一個向量的表示。這個向量就是人臉的特征,例如:
這密密麻麻的 128 維的向量,就是一張人臉的特征,你也可以叫做人臉的編碼。
提取特征這種事,卷積神經(jīng)網(wǎng)絡很在行。
舉個例子,VGG16 是深度學習中一個比較簡單的基本模型。
輸入卷積神經(jīng)網(wǎng)絡的是圖像,經(jīng)過一系列卷積后,全連接分類得到類別概率。
整個過程是這樣的:
其實,卷積神經(jīng)網(wǎng)絡不斷的進行卷積,下采樣,這就是一個提取特征的過程,最后通過全鏈接層得到類別概率。
人臉特征提取,我們也可以這么操作。我們可以去掉全連接層,用計算的特征(一般就是卷積層的最后一層,e.g. 圖中的conv5_3)來當作提取的特征進行計算。
與分類任務不同的是,最后使用的 loss 損失函數(shù)是不同的。
在理想的狀況下,我們希望“向量表示”之間的距離就可以直接反映人臉的相似度:
??? 對于同一個人的人臉圖像,對應的向量的歐幾里得距離應該比較小。
??? 對于不同人的人臉圖像,對應的向量之間的歐幾里得距離應該比較大。
所以,每個人臉的類別中心,應該盡可能遠一些,這樣才能用于區(qū)別不同的人。
人臉常用的 loss 有 center loss 、 arcface loss 等。
人臉識別類似于,細粒度的分類。
訓練過分類任務的,應該都知道。
訓練人和豬的二分類,很好訓練,因為人和豬的特征差別很明顯。
但訓練男人和女人的二分類,就要難一些,因為男人和女人的特征很相近。
為了更好區(qū)分男人和女人,就需要使用類別中心間距大的損失函數(shù)。
人臉識別,更是一種細粒度的區(qū)分,都是人,但你要區(qū)分出張三、李四、王二麻。
4、人臉識別
人臉識別,一般是需要建立一個「檢索庫」。
簡單解釋一下,我們要識別張三、李四、王二麻。
那么,我們就要選張三、李四、王二麻每個人的 10 張(自己定)圖片。
然后使用我們訓練好的人臉特征模型,提取每個人的人臉特征。
這樣每個人,就都有 10 個人臉特征了,這就是一個「檢索庫」。
需要識別的圖片,提取人臉特征后,依次與檢索庫已有的人臉特征去比對,投票選出最接近的人。
四、人臉打碼
人臉識別技術原理清楚了,我們就可以使用這個技術,給仝卓打碼。
可以看到,人臉識別技術涉及到的算法較多,自己依次實現(xiàn)是需要時間的。
但這,難不倒身為優(yōu)秀「調包俠」的我。
開源的第三方庫有很多,比如 mediapipe。
里面集成了人臉檢測、人臉識別等接口。
使用人臉識別技術,對這一小段視頻,給人臉進行打碼。
整理一下思路:
首先,我們使用 opencv 這類的程序處理視頻,只能處理畫面,不能處理聲音。
所以,需要先將音頻保存,再將處理好的視頻和音頻進行合成,這樣既保證了畫面打碼,又保證了聲音還在。
這塊可以使用mediapipe實現(xiàn)。
視頻演示:
基于深度學習mediapipe的人臉打碼人臉模糊教程pyqt文章來源:http://www.zghlxwxcb.cn/news/detail-432482.html
import cv2
import mediapipe as mp
class FaceDetector:
def __init__(self):
self.mp_face_detection = mp.solutions.face_detection
self.mp_drawing = mp.solutions.drawing_utils
def rectangle(self, image, mosaic_level):
success = False
cv2.imwrite('middle_pic/before_handle.jpg', image)
with self.mp_face_detection.FaceDetection(
min_detection_confidence=0.5) as face_detection:
# Flip the image horizontally for a later selfie-view display, and convert
# the BGR image to RGB.
# image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# To improve performance, optionally mark the image as not writeable to
# pass by reference.
image.flags.writeable = False
results = face_detection.process(image)
# Draw the face detection annotations on the image.
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detections:
for detection in results.detections:
h, w, c = image.shape
xmin = int(detection.location_data.relative_bounding_box.xmin * w)
ymin = int(detection.location_data.relative_bounding_box.ymin * h)
width = int(detection.location_data.relative_bounding_box.width * w)
height = int(detection.location_data.relative_bounding_box.height * h)
xmax = xmin + width
ymax = ymin + height
if xmax > w:
width = w - xmin
if ymax > h:
height = h - ymin
self.do_mosaic(image, xmin, ymin, width, height, int(mosaic_level * 0.2 * width))
# 畫矩形框
# image = cv2.rectangle(image, (xmin, ymin), (xmin + width, ymin + height), (0, 255, 0), 2)
success = True
cv2.imwrite('middle_pic/after_handle.jpg', image)
return image, success
# 正規(guī)馬賽克
def do_mosaic(self, img, x, y, w, h, neighbor):
"""
:param rgb_img
:param int x : 馬賽克左頂點
:param int y: 馬賽克左頂點
:param int w: 馬賽克寬
:param int h: 馬賽克高
:param int neighbor: 馬賽克每一塊的寬
"""
for i in range(0, h, neighbor):
for j in range(0, w, neighbor):
rect = [j + x, i + y]
color = img[i + y][j + x].tolist() # 關鍵點1 tolist
left_up = (rect[0], rect[1])
x2 = rect[0] + neighbor - 1 # 關鍵點2 減去一個像素
y2 = rect[1] + neighbor - 1
if x2 > x + w:
x2 = x + w
if y2 > y + h:
y2 = y + h
right_down = (x2, y2)
cv2.rectangle(img, left_up, right_down, color, -1) # 替換為為一個顏值值
return img
后續(xù)又加入登陸注冊功能:
文章來源地址http://www.zghlxwxcb.cn/news/detail-432482.html
項目下載:https://download.csdn.net/download/babyai996/87731913
到了這里,關于基于深度學習mediapipe的人臉打碼人臉模糊教程pyqt5界面附源碼的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!