訂閱
糾錯(cuò)
加入自媒體

一文了解如何使用Opencv簡(jiǎn)化面部地標(biāo)檢測(cè)

介紹今天我們將使用 OpenCV 和 MediaPipe 來(lái)檢測(cè)圖像中的468 個(gè)面部地標(biāo)。

OpenCV 是用于計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)和圖像處理的跨平臺(tái)開(kāi)源庫(kù),我們可以使用它來(lái)開(kāi)發(fā)實(shí)時(shí)計(jì)算機(jī)視覺(jué)應(yīng)用程序。它主要用于圖像或視頻處理以及分析,包括對(duì)象檢測(cè)、面部檢測(cè)等。

面部地標(biāo)用于定位和表示面部的重要區(qū)域,例如:嘴巴眼睛眉毛鼻子下頜線等應(yīng)用面部地標(biāo)有許多應(yīng)用,例如:換臉如果我們?cè)趦蓮埐煌哪樕瞎烙?jì)了面部地標(biāo)特征點(diǎn),我們可以將一張臉與另一張臉對(duì)齊,然后我們可以將一張臉克隆到另一張臉上。

面部變形面部地標(biāo)可用于通過(guò)對(duì)齊可變形的面部來(lái)生成中間圖像。

頭部姿勢(shì)估計(jì)一旦我們知道了一些面部地標(biāo)點(diǎn),那么我們也可以估計(jì)頭部的姿勢(shì)。

MediaPipe Face Mesh即使在移動(dòng)設(shè)備上,MediaPipe Face Mesh 也可以實(shí)時(shí)估計(jì) 468 個(gè) 3D 面部地標(biāo)。通過(guò)應(yīng)用機(jī)器學(xué)習(xí) (ML) 來(lái)推斷 3D 表面幾何形狀,它只需要單個(gè)相機(jī)輸入,而無(wú)需專(zhuān)用的深度傳感器。它提供了更好的實(shí)時(shí)性能。面部地標(biāo)模型3D 面部地標(biāo)模型使用遷移學(xué)習(xí),并在具有不同目標(biāo)的網(wǎng)絡(luò)上進(jìn)行訓(xùn)練:該網(wǎng)絡(luò)預(yù)測(cè)合成渲染數(shù)據(jù)上的 3D 地標(biāo)坐標(biāo)。由此產(chǎn)生的網(wǎng)絡(luò)在現(xiàn)實(shí)世界的數(shù)據(jù)上表現(xiàn)得相當(dāng)好。3D 地標(biāo)網(wǎng)絡(luò)將輸入作為裁剪的視頻幀,而無(wú)需額外的深度輸入。

該模型輸出 3D 點(diǎn)的位置,在輸入中合理對(duì)齊。幾何管線幾何管線是一個(gè)關(guān)鍵組件,它估計(jì) 3D Metric 空間內(nèi)的幾何對(duì)象。在每一幀上,分別執(zhí)行以下步驟:得到Metric 3D空間坐標(biāo),即將面部地標(biāo)屏幕坐標(biāo)轉(zhuǎn)換為Metric 3D空間坐標(biāo)。面部姿態(tài)變換矩陣被估計(jì)為來(lái)自標(biāo)準(zhǔn)面部度量界標(biāo)的剛性線性映射,然后將其發(fā)送到運(yùn)行時(shí)面部度量界標(biāo)中,以最小化兩者之間的差異。運(yùn)行時(shí)面部度量地標(biāo)創(chuàng)建一個(gè)面部網(wǎng)格。讓我們來(lái)實(shí)現(xiàn)它首先,讓我們檢查我們的網(wǎng)絡(luò)攝像頭 ID 是否工作正常,并在輸出屏幕上打印每秒幀數(shù) (fps)。import cv2
import time
cap = cv2.VideoCapture(0)
pTime = 0
while True:
success, img = cap.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cTime = time.time()
fps = 1/(cTime-pTime)
pTime = cTime
cv2.putText(img, f'FPS:{int(fps)}', (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Test", img)
cv2.waitKey(1)
如果你有網(wǎng)絡(luò)攝像頭,它應(yīng)該會(huì)打開(kāi)一個(gè)窗口,否則你可以在“VideoCapture”功能中指定視頻路徑而不是零。在左上角,你可以看到 FPS(變化),如下所示。

現(xiàn)在讓我們創(chuàng)建一個(gè)新的 python 文件并開(kāi)始創(chuàng)建我們的面部地標(biāo)檢測(cè)模塊。安裝所需的模塊。pip install opencv-python
pip install mediapipe
import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0)
pTime = 0
NUM_FACE = 2
mpDraw = mp.solutions.drawing_utils
mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh(max_num_faces=NUM_FACE)
drawSpec = mpDraw.DrawingSpec(thickness=1, circle_radius=1)
在上面的代碼中,我們從網(wǎng)絡(luò)攝像頭獲取輸入,變量“NUM_FACE”表示有多少面部要從幀中檢測(cè)和定位面部地標(biāo)。要繪制面部點(diǎn),我們使用 'mpDraw' 變量。我們將使用“mp.solutions.face_mesh”來(lái)創(chuàng)建面部網(wǎng)格。為了控制連接線和點(diǎn)的粗細(xì),我們將使用“drawSpec”。while True:
   success, img = cap.read()
   imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
   results = faceMesh.process(imgRGB)
   if results.multi_face_landmarks:
       for faceLms in results.multi_face_landmarks:
           mpDraw.draw_landmarks(img, faceLms,mpFaceMesh.FACE_CONNECTIONS, drawSpec, drawSpec)
for id,lm in enumerate(faceLms.landmark):
print(lm)
ih, iw, ic = img.shape
x,y = int(lm.x*iw), int(lm.y*ih)
# uncomment the below line to see the 468 facial landmark
# cv2.putText(img, str(id), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 255, 0), 1)
print(id, x,y)
cTime = time.time()
fps = 1/(cTime-pTime)
pTime = cTime
cv2.putText(img, f'FPS:{int(fps)}', (20,70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)
cv2.imshow("Test", img)
cv2.waitKey(1)
然后在 while 循環(huán)中讀取幀并將幀轉(zhuǎn)換為 RGB,將該圖像傳遞給“ *faceMesh.process()”,*然后在面部繪制檢測(cè)到的地標(biāo)。為了看到468 個(gè)面部地標(biāo),取消對(duì)for loop 中的“cv2.putText()”函數(shù)的注釋。語(yǔ)句 ' print (id, x, y)'將打印出 id 和坐標(biāo)。然后輸出如下。

現(xiàn)在為了創(chuàng)建一個(gè)模塊,以便我們可以在不同的項(xiàng)目中使用它,首先我們需要?jiǎng)?chuàng)建一個(gè)包含函數(shù)的類(lèi)。import cv2
import mediapipe as mp
import time
NUM_FACE = 2
class FaceLandMarks():
   def __init__(self, staticMode=False,maxFace=NUM_FACE, minDetectionCon=0.5, minTrackCon=0.5):
       self.staticMode = staticMode
       self.maxFace =  maxFace
       self.minDetectionCon = minDetectionCon
       self.minTrackCon = minTrackCon
       self.mpDraw = mp.solutions.drawing_utils
       self.mpFaceMesh = mp.solutions.face_mesh
       self.faceMesh = self.mpFaceMesh.FaceMesh(self.staticMode, self.maxFace, self.minDetectionCon, self.minTrackCon)
       self.drawSpec = self.mpDraw.DrawingSpec(thickness=1, circle_radius=1)
   def findFaceLandmark(self, img, draw=True):
       self.imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
       self.results = self.faceMesh.process(self.imgRGB)
       faces = []
       if self.results.multi_face_landmarks:
           for faceLms in self.results.multi_face_landmarks:
               if draw:
                   self.mpDraw.draw_landmarks(img, faceLms, self.mpFaceMesh.FACE_CONNECTIONS, self.drawSpec, self.drawSpec)
               face = []
               for id, lm in enumerate(faceLms.landmark):
                   # print(lm)
                   ih, iw, ic = img.shape
                   x, y = int(lm.x * iw), int(lm.y * ih)
                   #cv2.putText(img, str(id), (x,y), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0,255,0), 1)
                   #print(id, x, y)
                   face.a(chǎn)ppend([x,y])
               faces.a(chǎn)ppend(face)
       return img, faces
def main():
   cap = cv2.VideoCapture(0)
   pTime = 0
   detector = FaceLandMarks()
   while True:
       success, img = cap.read()
       img, faces = detector.findFaceLandmark(img)
       if len(faces)!=0:
           print(len(faces))
       cTime = time.time()
       fps = 1 / (cTime - pTime)
       pTime = cTime
       cv2.putText(img, f'FPS:{int(fps)}', (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
       cv2.imshow("Test", img)
       cv2.waitKey(1)
if __name__ == "__main__":
   main()

結(jié)論

在上面的代碼中,函數(shù)名稱是*“findFaceLandmarks”,它檢測(cè)面部地標(biāo)并執(zhí)行與上述相同的功能。類(lèi)“FaceLandMarks()”* 取靜態(tài)模式中,面部的最大數(shù)量和最小檢測(cè)置信度和最小的跟蹤置信度。然后創(chuàng)建 main 函數(shù)來(lái)運(yùn)行代碼。

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)