0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是人臉識(shí)別?如何使用10行代碼實(shí)現(xiàn)人臉識(shí)別

Wildesbeast ? 來(lái)源:今日頭條 ? 作者:Python集結(jié)號(hào) ? 2020-04-06 12:17 ? 次閱讀

什么是人臉識(shí)別

人臉識(shí)別,是基于人的臉部特征信息進(jìn)行身份識(shí)別的一種生物識(shí)別技術(shù)。用攝像機(jī)或攝像頭采集含有人臉的圖像或視頻流,并自動(dòng)在圖像中檢測(cè)和跟蹤人臉,進(jìn)而對(duì)檢測(cè)到的人臉進(jìn)行臉部識(shí)別的一系列相關(guān)技術(shù),通常也叫做人像識(shí)別、面部識(shí)別。

目前的人臉識(shí)別技術(shù)已經(jīng)非常成熟了,還發(fā)展成3D人臉識(shí)別。而且現(xiàn)在各大廠商也都提供了人臉識(shí)別的API接口供我們調(diào)用,可以說(shuō)幾行代碼就可以完成人臉識(shí)別。但是人臉識(shí)別的根本還是基于圖像處理。在Python中最強(qiáng)大的圖像處理庫(kù)就是OpenCV。

OpenCV簡(jiǎn)介

OpenCV是一個(gè)基于BSD許可(開(kāi)源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。OpenCV可用于開(kāi)發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺(jué)以及模式識(shí)別程序。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法。

OpenCV基本使用

安裝

pip install opencv-python # 基礎(chǔ)庫(kù)pip install opencv-contrib-python # 擴(kuò)展庫(kù)pip install opencv-python-headless

讀取圖片

讀取和顯示圖片是最基本的操作了,OpenCV當(dāng)中使用imread和imshow實(shí)現(xiàn)該操作

import cv2 as cv# 讀取圖片,路徑不能含有中文名,否則圖片讀取不出來(lái)image = cv.imread(‘1111.jpg’)# 顯示圖片cv.imshow(‘image’, image)# 等待鍵盤輸入,單位是毫秒,0表示無(wú)限等待cv.waitKey(0)# 因?yàn)樽罱K調(diào)用的是C++對(duì)象,所以使用完要釋放內(nèi)存cv.destroyAllWindows()

將圖片轉(zhuǎn)為灰度圖

OpenCV中數(shù)百中關(guān)于不同色彩控件之間轉(zhuǎn)換的方法。目前最常用的有三種:灰度、BGR、HSV。

灰度色彩空間是通過(guò)去除彩色信息來(lái)講圖片轉(zhuǎn)換成灰階,灰度圖會(huì)大量減少圖像處理中的色彩處理,對(duì)人臉識(shí)別很有效。

BGR每個(gè)像素都由一個(gè)三元數(shù)組來(lái)表示,分別代碼藍(lán)、綠、紅三種顏色。python中還有一個(gè)庫(kù)PIL,讀取的圖片通道是RGB,其實(shí)是一樣的,只是顏色順序不一樣

HSV,H是色調(diào),S是飽和度,V是黑暗的程度

將圖片轉(zhuǎn)換為灰度圖

import cv2 as cv# 讀取圖片,路徑不能含有中文名,否則圖片讀取不出來(lái)image = cv.imread(‘1111.jpg’)# cv2讀取圖片的通道是BGR,# PIL讀取圖片的通道是RGB# code選擇COLOR_BGR2GRAY,就是BGR to GRAYgray_image = cv.cvtColor(image, code=cv.COLOR_BGR2GRAY)# 顯示圖片cv.imshow(‘image’, gray_image)# 等待鍵盤輸入,單位是毫秒,0表示無(wú)限等待cv.waitKey(0)# 因?yàn)樽罱K調(diào)用的是C++對(duì)象,所以使用完要釋放內(nèi)存cv.destroyAllWindows()

繪制矩形

image = cv.imread(‘1111.jpg’)x, y, w, h = 50, 50, 80, 80# 繪制矩形cv.rectangle(image, (x, y, x+w, y+h), color=(0, 255, 0), thickness=2)# 繪制圓形cv.circle(image, center=(x + w//2, y + h//2), radius=w//2, color=(0, 0, 255), thickness=2)cv.imshow(‘image’, image)cv.waitKey(0)cv.destroyAllWindows()

人臉檢測(cè)

人臉檢測(cè)實(shí)際上是對(duì)圖像提取特征,Haar特征是一種用于實(shí)現(xiàn)實(shí)時(shí)人臉跟蹤的特征。每個(gè)Haar特征都描述了相鄰圖像區(qū)域的對(duì)比模式。比如邊、定點(diǎn)和細(xì)線都能生成具有判別性的特征。OpenCV給我們提供了Haar特征數(shù)據(jù),在cv2/data目錄下,使用特征數(shù)據(jù)的方法def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)

scaleFactor: 指定每個(gè)圖像比例縮小多少圖像

minNeighbors: 指定每個(gè)候選矩形必須保留多少個(gè)鄰居,值越大說(shuō)明精度要求越高

minSize:檢測(cè)到的最小矩形大小

maxSize: 檢測(cè)到的最大矩形大小

檢測(cè)圖片中人臉

import osimport cv2 as cvdef face_detect_demo(image): # 將圖片轉(zhuǎn)換為灰度圖 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 加載特征數(shù)據(jù) face_detector = cv.CascadeClassifier(os.path.join(cv.data.haarcascades, ‘haarcascade_frontalface_default.xml’)) faces = face_detector.detectMultiScale(gray) for x, y, w, h in faces: cv.rectangle(image, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)# 讀取圖片,路徑不能含有中文名,否則圖片讀取不出來(lái)image = cv.imread(‘2222.jpg’)face_detect_demo(image)# 顯示圖片cv.imshow(‘image’, image)# 等待鍵盤輸入,單位是毫秒,0表示無(wú)限等待cv.waitKey(0)# 因?yàn)樽罱K調(diào)用的是C++對(duì)象,所以使用完要釋放內(nèi)存cv.destroyAllWindows()

采用默認(rèn)參數(shù),檢測(cè)人臉數(shù)據(jù)不全,需要調(diào)整detectMultiScale函數(shù)的參數(shù),調(diào)整為faces = face_detector.detectMultiScale(gray, scaleFactor=1.02, minNeighbors=3)

我們發(fā)現(xiàn)除了檢測(cè)到人臉數(shù)據(jù),還有一些其他的臟數(shù)據(jù),這個(gè)時(shí)候可以打印檢測(cè)出的人臉數(shù)據(jù)位置和大小

faces = face_detector.detectMultiScale(gray, scaleFactor=1.02, minNeighbors=3)for x, y, w, h in faces: print(x, y, w, h) # 打印每一個(gè)檢測(cè)到的數(shù)據(jù)位置和大小 cv.rectangle(image, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2)

從大小中我們看到最大的兩個(gè)矩形,剛好是人臉數(shù)據(jù),其余都是臟數(shù)據(jù),那么繼續(xù)修改函數(shù)參數(shù)faces = face_detector.detectMultiScale(gray, scaleFactor=1.02, minNeighbors=3, minSize=(80, 80))

檢測(cè)視頻中人臉

視頻就是一張一張的圖片組成的,在視頻的幀上面重復(fù)這個(gè)過(guò)程就能完成視頻中的人臉檢測(cè)了。視頻讀取OpenCV為我們提供了函數(shù)VideoCapture,參數(shù)可以是視頻文件或者0(表示調(diào)用攝像頭)

import cv2 as cv# 人臉檢測(cè)def face_detect_demo(image): try: # 將圖片轉(zhuǎn)換為灰度圖 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 加載特征數(shù)據(jù) face_detector = cv.CascadeClassifier(os.path.join(cv.data.haarcascades, ‘haarcascade_frontalface_default.xml’)) faces = face_detector.detectMultiScale(gray) for x, y, w, h in faces: print(x, y, w, h) cv.rectangle(image, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2) except Exception as e: passcap = cv.VideoCapture(‘人臉識(shí)別.mp4’)while cap.isOpened(): flag, frame = cap.read() face_detect_demo(frame) cv.imshow(‘result’, frame) if ord(‘q’) == cv.waitKey(5): breakcap.realse()cv.destroyAllWindows()

這個(gè)我們是做的人臉識(shí)別,怎么把愛(ài)好都識(shí)別了,這么先進(jìn)嗎?很顯然這不太符合我們的要求,愛(ài)好只能藏在心里,你給我檢測(cè)出來(lái)就不行了。所以我們必須要進(jìn)行優(yōu)化處理。OpenCV為我們提供了一個(gè)機(jī)器學(xué)習(xí)的小模塊,我們可以訓(xùn)練它,讓它只識(shí)別我們需要的部分,不要亂猜測(cè)。

訓(xùn)練數(shù)據(jù)

訓(xùn)練數(shù)據(jù)就是我們把一些圖片交給訓(xùn)練模型,讓模型熟悉她,這樣它就能更加準(zhǔn)確的識(shí)別相同的圖片。訓(xùn)練的數(shù)據(jù)一般我們可以從網(wǎng)上搜索:人臉識(shí)別數(shù)據(jù)庫(kù),或者從視頻中保存美幀的數(shù)據(jù)作為訓(xùn)練集。所有的人臉識(shí)別算法在他們的train()函數(shù)中都有兩個(gè)參數(shù):圖像數(shù)組和標(biāo)簽數(shù)組。這些標(biāo)簽標(biāo)示進(jìn)行識(shí)別時(shí)候的人臉I(yè)D,根據(jù)ID可以知道被識(shí)別的人是誰(shuí)。

獲取訓(xùn)練集

從視頻中每隔5幀截取一個(gè)圖片,保存成圖片

import cv2cap = cv2.VideoCapture(‘人臉識(shí)別.mp4’)number = 100count = 1while cap.isOpened() and number 》 0: flag, frame = cap.read() if not flag: break if count % 5 == 0: # 按照視頻圖像中人臉的大體位置進(jìn)行裁剪,只取人臉部分 img = frame[70:280, 520:730] cv2.imwrite(‘data/{}.png’.format(number), img) number -= 1 count += 1cap.release()cv2.destroyAllWindows()

使用LBPH訓(xùn)練模型

def getImageAndLabels(path_list): faces = [] ids = [] image_paths = [os.path.join(path_list, f) for f in os.listdir(path_list) if f.endswith(‘.png’)] face_detector = cv.CascadeClassifier(os.path.join(cv.data.haarcascades, ‘haarcascade_frontalface_default.xml’)) for image in image_paths: img = cv.imread(image) gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray) _id = int(os.path.split(image)[1].split(‘。’)[0]) for x, y, w, h in faces: faces.append(gray[y:y+h, x:x+w]) ids.append(_id) return faces, idsfaces, ids = getImageAndLabels(‘data’)# 訓(xùn)練recognizer = cv.face.LBPHFaceRecognizer_create()recognizer.train(faces, np.array(ids))# 保存訓(xùn)練特征recognizer.write(‘trains/trains.yml’)

基于LBPH的人臉識(shí)別

LBPH將檢測(cè)到的人臉?lè)譃樾卧?,并將其與模型中的對(duì)應(yīng)單元進(jìn)行比較,對(duì)每個(gè)區(qū)域的匹配值產(chǎn)生一個(gè)直方圖。調(diào)整后的區(qū)域中調(diào)用predict函數(shù),該函數(shù)返回兩個(gè)元素的數(shù)組,第一個(gè)元素是所識(shí)別的個(gè)體標(biāo)簽,第二個(gè)元素是置信度評(píng)分。所有的算法都有一個(gè)置信度評(píng)分閾值,置信度評(píng)分用來(lái)衡量圖像與模型中的差距,0表示完全匹配。LBPH有一個(gè)好的識(shí)別參考值要低于50?;静襟E為:

cv.VideoCapture讀取視頻

Haar算法檢測(cè)人臉數(shù)據(jù)

基于LBPH訓(xùn)練集得到準(zhǔn)確人臉數(shù)據(jù),并輸出標(biāo)記此人是誰(shuí)

按置信度取準(zhǔn)確度高的人臉標(biāo)記出來(lái)

import osimport cv2 as cvdef face_detect_demo(image): try: global number # 將圖片轉(zhuǎn)換為灰度圖 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 加載特征數(shù)據(jù) faces = face_detector.detectMultiScale(gray, scaleFactor=1.02, minNeighbors=3) for x, y, w, h in faces: # 獲取置信度,大于80表示取值錯(cuò)誤 _id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) if confidence 《 80: cv.rectangle(image, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=2) except Exception as e: passdef check_face(): cap = cv.VideoCapture(‘人臉識(shí)別.mp4’) while cap.isOpened(): flag, frame = cap.read() if not flag: break face_detect_demo(frame) cv.imshow(‘img’, frame) cv.waitKey(2) cv.destroyAllWindows()if __name__ == ‘__main__’: # 加載訓(xùn)練數(shù)據(jù)文件 recognizer = cv.face.LBPHFaceRecognizer_create() recognizer.read(‘trains/trains.yml’) face_detector = cv.CascadeClassifier(os.path.join(cv.data.haarcascades, ‘haarcascade_frontalface_default.xml’)) check_face()

總結(jié)

通過(guò)上面一步步的學(xué)習(xí),你是不是對(duì)OpenCV人臉識(shí)別有個(gè)基本的認(rèn)識(shí)了呢?但是我們也看到了,整個(gè)人臉識(shí)別的主要算法還是基于Haar,而且準(zhǔn)確度并不是特別高,主要是會(huì)檢測(cè)出很多非人臉的數(shù)據(jù)。LBPH是讓我們給某個(gè)人臉進(jìn)行標(biāo)記,告訴我們他是誰(shuí),并沒(méi)有提高實(shí)際的檢測(cè)準(zhǔn)確度?,F(xiàn)在機(jī)器學(xué)習(xí)是非常火爆的,基于OpenCV的機(jī)器學(xué)習(xí)人臉識(shí)別也精確度也很高,下次我們?cè)趤?lái)對(duì)比幾種機(jī)器學(xué)習(xí)人臉識(shí)別的庫(kù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4587

    瀏覽量

    92499
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3112

    瀏覽量

    48658
  • 人臉識(shí)別
    +關(guān)注

    關(guān)注

    76

    文章

    4002

    瀏覽量

    81673
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    樹(shù)莓派做人臉識(shí)別

    基于云服務(wù)平臺(tái)的人臉識(shí)別1、設(shè)備樹(shù)莓派2、USB攝像頭。2、要求l使用USB攝像頭抓拍(可以使用各種開(kāi)源軟件,也可以自己編程)臉部照片;l使用人臉識(shí)別的云服務(wù)平臺(tái)(可選擇FACECOR
    發(fā)表于 08-07 23:19

    人臉識(shí)別

    注冊(cè)u(píng)sername和人臉圖片,您可以使用這個(gè)功能自己實(shí)現(xiàn)一個(gè)小規(guī)模的人臉識(shí)別系統(tǒng),比如明星臉識(shí)別、家庭成員
    發(fā)表于 02-22 12:09

    人臉識(shí)別技術(shù)原理解析

    `  人臉識(shí)別到底是什么?  人臉識(shí)別,是視覺(jué)模式識(shí)別的一個(gè)細(xì)分問(wèn)題,也大概是最難解決的一個(gè)問(wèn)題。 其實(shí)我們?nèi)嗣繒r(shí)每刻都在進(jìn)行視覺(jué)模式
    發(fā)表于 12-23 23:17

    智能人臉抓拍機(jī)人臉識(shí)別

    1,智能人臉識(shí)別算法2,人臉抓拍對(duì)比,支持人臉跟蹤,人臉制動(dòng)過(guò)濾3,支持?jǐn)?shù)字寬動(dòng)態(tài),3D降噪功能4,支持DC 12V/24V/POE供電5,
    發(fā)表于 09-19 12:33

    LabVIEW人臉識(shí)別設(shè)計(jì)

    系統(tǒng)與試卷,公布綜合成績(jī)3、挑戰(zhàn)成功學(xué)員在3-5個(gè)工作日之內(nèi)即可收到退款【課程介紹】本課程主要以LabVIEW視覺(jué)和第三方開(kāi)源深度學(xué)習(xí)庫(kù),實(shí)現(xiàn)人臉識(shí)別功能。人臉
    發(fā)表于 04-28 10:00

    人臉識(shí)別會(huì)改變什么

    導(dǎo)語(yǔ):人臉識(shí)別已經(jīng)在我們生活中隨處可見(jiàn),但人臉識(shí)別將會(huì)給我們生活帶來(lái)便利的同時(shí),也會(huì)重新改寫(xiě)我們社交的本質(zhì),以及引發(fā)隱私、公平等方面的道德討論。2017年9月的《經(jīng)濟(jì)學(xué)人》雜志就
    發(fā)表于 07-16 06:26

    什么是人臉識(shí)別技術(shù)

    什么是人臉識(shí)別技術(shù)人臉識(shí)別技術(shù)特點(diǎn)人臉識(shí)別技術(shù)流程人臉
    發(fā)表于 03-03 06:17

    人臉識(shí)別的全部源代碼

    Google Glass-- 谷歌眼鏡核心源碼人臉識(shí)別的全部源代碼(在Visual C++6.0下可以運(yùn)行識(shí)別)l智能分析接口(支持車牌識(shí)別
    發(fā)表于 08-06 07:21

    RV1126基于虹軟人臉識(shí)別算法實(shí)現(xiàn)指南

    1、RV1126基于虹軟人臉識(shí)別算法實(shí)現(xiàn)的示例使用教程示例(rkmedia_vi_arc_rtsp_test.cc) 使用 CORE-1126-JD4 配套的 os04a10 攝像頭進(jìn)
    發(fā)表于 06-08 15:51

    人臉識(shí)別沒(méi)那么難,1命令就能實(shí)現(xiàn)

    現(xiàn)在人臉識(shí)別那么火,各大手機(jī)廠商也是爭(zhēng)先在自己的手機(jī)上加入這種技術(shù)。那么,人臉識(shí)別技術(shù)真的很難嗎,其實(shí)不是的。下面告訴你如何用1命令
    發(fā)表于 10-27 16:13 ?2667次閱讀
    <b class='flag-5'>人臉</b><b class='flag-5'>識(shí)別</b>沒(méi)那么難,1<b class='flag-5'>行</b>命令就能<b class='flag-5'>實(shí)現(xiàn)</b>

    用dlib實(shí)現(xiàn)人臉識(shí)別的技巧

    很多人都認(rèn)為人臉識(shí)別是一項(xiàng)非常難以實(shí)現(xiàn)的工作,看到名字就害怕,然后心懷忐忑到網(wǎng)上一搜,看到網(wǎng)上N頁(yè)的教程立馬就放棄了。這些人里包括曾經(jīng)的我自己。其實(shí)如果如果你不是非要深究其中的原理,只是要實(shí)現(xiàn)
    的頭像 發(fā)表于 11-01 16:45 ?2.7w次閱讀

    如何用40代碼實(shí)現(xiàn)人臉識(shí)別?

    Dlib里面有人臉檢測(cè)器,有訓(xùn)練好的人臉關(guān)鍵點(diǎn)檢測(cè)器,也有訓(xùn)練好的人臉識(shí)別模型。
    的頭像 發(fā)表于 07-15 09:16 ?4743次閱讀

    人臉識(shí)別技術(shù)原理與實(shí)現(xiàn)方式

    隨著大數(shù)據(jù)時(shí)代的到來(lái),“人臉”也將成為數(shù)據(jù)的一部分,人臉識(shí)別如何實(shí)現(xiàn)?本文將為大家從人臉檢測(cè)、人臉
    發(fā)表于 02-05 11:16 ?2w次閱讀
    <b class='flag-5'>人臉</b><b class='flag-5'>識(shí)別</b>技術(shù)原理與<b class='flag-5'>實(shí)現(xiàn)</b>方式

    人臉識(shí)別是什么_人臉識(shí)別技術(shù)原理

    人臉識(shí)別是什么,人臉識(shí)別技術(shù)原理是如何的,它又是若何一步步實(shí)現(xiàn)的,人臉
    發(fā)表于 09-27 15:49 ?5572次閱讀
    <b class='flag-5'>人臉</b><b class='flag-5'>識(shí)別</b>是什么_<b class='flag-5'>人臉</b><b class='flag-5'>識(shí)別</b>技術(shù)原理

    基于python代碼人臉識(shí)別實(shí)例

    基于python代碼的一個(gè)人臉識(shí)別的實(shí)例,完整的實(shí)例,本人在pycharm中實(shí)測(cè)通過(guò),是一個(gè)很基礎(chǔ)的入門級(jí)的人臉檢測(cè)和識(shí)別。
    發(fā)表于 07-18 11:11 ?13次下載