wordpress虛擬主機企業(yè)關(guān)鍵詞優(yōu)化最新報價
1、人臉識別
人臉識別是一種技術(shù),通過檢測、跟蹤和識別人臉上的關(guān)鍵特征,以確認人臉的身份。它通常用于安保系統(tǒng)、身份驗證、社交媒體和人機交互等領(lǐng)域。
人臉識別技術(shù)的基本原理是先通過圖像處理和計算機視覺算法,提取人臉的特征點和特征描述。然后將這些特征與事先錄入的人臉數(shù)據(jù)庫進行比對,以確定人臉的身份。
在人臉識別技術(shù)中,一般包含以下步驟:人臉檢測、人臉對齊、特征提取和特征匹配。人臉檢測是指在圖像或視頻中檢測到人臉的位置;人臉對齊是為了使得人臉特征點在后續(xù)處理中更容易提取;特征提取是指將人臉圖像轉(zhuǎn)換為具有辨識度的特征向量;特征匹配是將提取出的特征與數(shù)據(jù)庫中的特征進行比對。
目前人臉檢測的方法主要有兩大類:基于知識和基于統(tǒng)計。
- 基于知識的方法:主要利用先驗知識將人臉看作器官特征的組合,根據(jù)眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之間的幾何位置關(guān)系來檢測人臉。主要包括模板匹配、人臉特征、形狀與邊緣、紋理特性、顏色特征等方法。
- 基于統(tǒng)計的方法:將人臉看作一個整體的模式——二維像素矩陣,從統(tǒng)計的觀點通過大量人臉圖像樣本構(gòu)造人臉模式空間,根據(jù)相似度量來判斷人臉是否存在。主要包括主成分分析與特征臉、神經(jīng)網(wǎng)絡(luò)方法、支持向量機、隱馬爾可夫模型、Adaboost算法等。
人臉識別技術(shù)的應(yīng)用非常廣泛,包括但不限于身份識別、門禁系統(tǒng)、公安系統(tǒng)、智能手機解鎖、相冊分類、人機交互等。隨著深度學(xué)習(xí)的快速發(fā)展,人臉識別技術(shù)的準確率和效果得到了顯著提升,越來越多的領(lǐng)域開始應(yīng)用這項技術(shù)。然而,人臉識別技術(shù)也涉及到一些隱私和安全問題,需要合理的使用和管理。
2、OpenCV之Haar級聯(lián)檢測器
人臉識別在OpenCV上也有專門的算法實現(xiàn),OpenCV使用基于Haar特征的級聯(lián)分類器,對級聯(lián)分類器進行特定的訓(xùn)練可以使OpenCV自帶的檢測器在檢測時的結(jié)果更加準確。這里的檢測器即OpenCV包中的haarcascades文件夾下的XML文件。這些文件可以檢測靜止的圖像或攝像頭中得到的人臉。
opencv中內(nèi)置了已經(jīng)訓(xùn)練好的級聯(lián)人臉、眼睛、嘴部等檢測器,以.XML格式存儲,可以將它們應(yīng)用于圖片及實時視頻流的檢測。opencv的人臉檢測級聯(lián)檢測器是最穩(wěn)定和準確的,但在許多情況下眼睛檢測和嘴巴檢測的效果要差上許多。如果要對眼睛和嘴巴進行檢測,可以嘗試python、dlib、opencv工作流,它的效果更好、速度更快。
Haar級聯(lián)算法是OpenCV最流行的目標檢測算法,主要優(yōu)點是速度快,盡管許多算法(如HOG+線性SVM、SSDs、更快的R-CNN、YOLO等等)比Haar級聯(lián)算法更精確。但如果需要純粹的速度,就是無法打敗OpenCV的Haar cascades。Haar級聯(lián)的缺點是容易出現(xiàn)假陽性檢測,應(yīng)用于推理/檢測時需要進行參數(shù)調(diào)整。
haarcascade_frontalface_default.xml:檢測面部
haarcascade_eye.xml:檢測左眼和右眼
haarcascade_smile.xml:檢測面部是否存在嘴部
haarcascade_eye_tree_eyeglasses.xml:檢測是否帶墨鏡
haarcascade_frontalcatface.xml:檢測貓臉
haarcascade_frontalcatface_extended.xml:檢測貓臉延伸
haarcascade_frontalface_alt.xml:檢測人臉屬性
haarcascade_frontalface_alt_tree.xml
haarcascade_frontalface_alt2.xml
haarcascade_fullbody.xml:檢測全身
haarcascade_lefteye_2splits.xml:檢測左眼
haarcascade_licence_plate_rus_16stages.xml:檢測證件
haarcascade_lowerbody.xml:檢測下半身
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml:檢測右眼
haarcascade_russian_plate_number.xml:檢測俄羅斯字母車牌號
haarcascade_upperbody.xml:檢測上半身
3、在檢測的人臉上繪制矩形
import cv2 as cvdef StaticDetect(filename):"""靜態(tài)圖像"""# 創(chuàng)建一個級聯(lián)分類器 加載一個 .xml 分類器文件. 它既可以是Haar特征也可以是LBP特征的分類器.face_cascade = cv.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')# 加載圖像img = cv.imread(filename)# 轉(zhuǎn)換為灰度圖gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 進行人臉檢測,傳入scaleFactor,minNeighbors,分別表示人臉檢測過程中每次迭代時圖像的壓縮率以及# 每個人臉矩形保留近似數(shù)目的最小值# 返回人臉矩形數(shù)組faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)for (x, y, w, h) in faces:# 在原圖像上繪制矩形img = cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)cv.namedWindow('Face Detected!')cv.imshow('Face Detected!', img)# 使程序停留,等待任意鍵按下,參數(shù)表示停留的時間,0表示無限長k = cv.waitKey(0)# 按下ESC鍵(ASCII碼為27)后,銷毀所有窗口,終止程序if k == 27:cv.destroyAllWindows()if __name__ == '__main__':filename = 'face.png'StaticDetect(filename)
單人和多人臉均可檢測。
4、MediaPipe
Mediapipe 由 Google Research 于 2020 年推出,旨在為計算機視覺研究人員和開發(fā)者提供一個易于使用、高性能的框架。Mediapipe 提供了多種預(yù)訓(xùn)練模型和算法,涵蓋了人臉檢測、手勢識別、姿態(tài)估計等領(lǐng)域。
MediaPipe是用于構(gòu)建多模態(tài)(例如視頻、音頻或任何時間序列數(shù)據(jù))、跨平臺(即eAndroid、IOS、web、邊緣設(shè)備)應(yīng)用ML管道的框架。
以上2個模塊都可以實現(xiàn)人臉檢測,經(jīng)過在樹莓派上的實驗發(fā)現(xiàn),使用MediaPipe較OpenCV速度快,本文將利用MediaPipe實現(xiàn)檢測人臉功能,并將檢測到的人臉圖像保存下來。
5、實驗代碼
本實驗將檢測到人臉信息,并將實時檢測到的圖像保存到image文件夾內(nèi),以時間戳命名,每秒一個文件。
"""
Face Detection Module
By: Computer Vision Zone
Website: https://www.computervision.zone/
"""import cv2,os,time
import mediapipe as mp
from datetime import datetimeclass FaceDetector:"""Find faces in realtime using the light weight model provided in the mediapipelibrary."""def __init__(self, minDetectionCon=0.5):""":param minDetectionCon: Minimum Detection Confidence Threshold"""self.minDetectionCon = minDetectionConself.mpFaceDetection = mp.solutions.face_detectionself.mpDraw = mp.solutions.drawing_utilsself.faceDetection = self.mpFaceDetection.FaceDetection(self.minDetectionCon)def findFaces(self, img, draw=True):"""Find faces in an image and return the bbox info:param img: Image to find the faces in.:param draw: Flag to draw the output on the image.:return: Image with or without drawings.Bounding Box list."""imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)self.results = self.faceDetection.process(imgRGB)bboxs = []if self.results.detections:for id, detection in enumerate(self.results.detections):bboxC = detection.location_data.relative_bounding_boxih, iw, ic = img.shapebbox = int(bboxC.xmin * iw), int(bboxC.ymin * ih), \int(bboxC.width * iw), int(bboxC.height * ih)cx, cy = bbox[0] + (bbox[2] // 2), \bbox[1] + (bbox[3] // 2)bboxInfo = {"id": id, "bbox": bbox, "score": detection.score, "center": (cx, cy)}bboxs.append(bboxInfo)if draw:img = cv2.rectangle(img, bbox, (255, 0, 255), 2)cv2.putText(img, f'{int(detection.score[0] * 100)}%',(bbox[0], bbox[1] - 20), cv2.FONT_HERSHEY_PLAIN,2, (255, 0, 255), 2)return img, bboxsdef Timestamp_Get():now = datetime.now()datetime_str = now.strftime('%Y-%m-%d %H:%M:%S').replace(':','-').replace(' ','_')datetime_str = datetime_str+'.jpg'return datetime_strdef main():cap = cv2.VideoCapture(0)detector = FaceDetector()file_path='./image'while True:success, img = cap.read()img, bboxs = detector.findFaces(img)if bboxs:time.sleep(0.02)if bboxs:# bboxInfo - "id","bbox","score","center"center = bboxs[0]["center"]cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)file_name = os.path.join(file_path,Timestamp_Get())cv2.imwrite(file_name,img)time.sleep(1)cv2.imshow("Image", img)if cv2.waitKey(20) == ord('q'):breakcap.release()cv2.destroyAllWindows()elif cv2.waitKey(20) == ord('s'):time.sleep(1)file_name = os.path.join('./image',Timestamp_Get())cv2.imwrite(file_name,img)print(file_name+'保存成功')time.sleep(1)if __name__ == "__main__":main()
(1)人臉檢測類FaceDetector的findFaces方法可以檢測人臉在整個圖像的位置,經(jīng)試驗,不光是人臉,人手也可以被檢測。還有檢測的概率,以及人臉的中心像素點的位置。
(2)Timestamp_Get,獲取當(dāng)前的時間戳,作為文件名保存。
file_name = os.path.join(file_path,Timestamp_Get()) cv2.imwrite(file_name,img)
(3)人臉檢測的情況可能會出現(xiàn)誤檢、抖動的情況,我們通過得分和消抖來進行局部調(diào)整。
score的類型是google._upb._message.RepeatedScalarContainer,它
?是 Protocol Buffers 中的一個內(nèi)部類,用于表示重復(fù)的標量值(即,一個數(shù)組)。要將此容器轉(zhuǎn)換為浮點數(shù)列表,再轉(zhuǎn)成float
這樣檢測目標低于60%概率的人臉就不會被保存。
(4)該程序支持自動保存,也支持手動保存。
隨便在手機上找個美女試試效果吧