python實(shí)現(xiàn)人臉識(shí)別代碼
從實(shí)時(shí)視頻流中識(shí)別出人臉區(qū)域,從原理上看,其依然屬于機(jī)器學(xué)習(xí)的領(lǐng)域之一,本質(zhì)上與谷歌利用深度學(xué)習(xí)識(shí)別出貓沒有什么區(qū)別。程序通過大量的人臉圖片數(shù)據(jù)進(jìn)行訓(xùn)練,利用數(shù)學(xué)算法建立建立可靠的人臉特征模型,如此即可識(shí)別出人臉。幸運(yùn)的是,這些工作OpenCV已經(jīng)幫我們做了,我們只需調(diào)用對(duì)應(yīng)的API函數(shù)即可,先給出代碼:
#-*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(window_name) #視頻來源,可以來自一段已存好的視頻,也可以直接來自USB攝像頭 cap = cv2.VideoCapture(camera_idx) #告訴OpenCV使用人臉識(shí)別分類器 classfier = cv2.CascadeClassifier("/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml") #識(shí)別出人臉后要畫的邊框的顏色,RGB格式 color = (0, 255, 0) while cap.isOpened(): ok, frame = cap.read() #讀取一幀數(shù)據(jù) if not ok: break #將當(dāng)前幀轉(zhuǎn)換成灰度圖像 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點(diǎn)數(shù) faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32)) if len(faceRects) > 0: #大于0則檢測到人臉 for faceRect in faceRects: #單獨(dú)框出每一張人臉 x, y, w, h = faceRect cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2) #顯示圖像 cv2.imshow(window_name, frame) c = cv2.waitKey(10) if c & 0xFF == ord('q'): break #釋放攝像頭并銷毀所有窗口 cap.release() cv2.destroyAllWindows() if __name__ == '__main__': if len(sys.argv) != 2: print("Usage:%s camera_id\r\n" % (sys.argv[0])) else: CatchUsbVideo("識(shí)別人臉區(qū)域", int(sys.argv[1]))
先看一下程序輸出結(jié)果:
程序正確的識(shí)別出了我的臉,加上空白行不到50行代碼,還是很簡單的。當(dāng)然,絕大部分的工作OpenCV已經(jīng)默默地替我們做了,所以我們用起來才這么簡單。關(guān)于代碼有幾個(gè)地方需要重點(diǎn)交代,首先就是人臉分類器這行:
#告訴OpenCV使用人臉識(shí)別分類器 classfier = cv2.CascadeClassifier("/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml")
這行代碼指定OpenCV選擇使用哪種分類器(注意,一定習(xí)慣分類這個(gè)說法,ML的監(jiān)督學(xué)習(xí)研究的就是各種分類問題),OpenCV提供了多種分類器:
上圖為我的電腦上安裝的OpenCV3.2提供的所有分類器,有識(shí)別眼睛的(甚至包括左右眼),有識(shí)別身體的,有識(shí)別笑臉的,甚至還有識(shí)別貓臉的,有興趣的可以逐個(gè)試試。關(guān)于人臉識(shí)別,OpenCV提供多個(gè)分類器選擇使用,其中haarcascade_frontalface_alt_tree.xml是最嚴(yán)格的分類器,光線、帶個(gè)帽子都有可能識(shí)別不出人臉。其它的稍微好點(diǎn),default那個(gè)識(shí)別最寬松,某些情況下我家里的燈籠都會(huì)被識(shí)別成人臉;)。另外安裝環(huán)境不同,分類器的安裝路徑也有可能不同,請?jiān)诎惭b完OpenCV后根據(jù)分類器的實(shí)際安裝路徑修改代碼。另外再多說一句,如果我們想構(gòu)建自己的分類器,比如檢測火焰(火災(zāi)報(bào)警)、汽車(確定路口汽車數(shù)量),我們依然可以使用OpenCV訓(xùn)練構(gòu)建,詳細(xì)說明參見OpenCV的官方文檔。
接下來解釋如下幾行代碼:
#人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點(diǎn)數(shù) faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32)) if len(faceRects) > 0: #大于0則檢測到人臉 for faceRect in faceRects: #單獨(dú)框出每一張人臉 x, y, w, h = faceRect cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
其中classfier.detectMultiScale()即是完成實(shí)際人臉識(shí)別工作的函數(shù),該函數(shù)參數(shù)說明如下:
grey:要識(shí)別的圖像數(shù)據(jù)(即使不轉(zhuǎn)換成灰度也能識(shí)別,但是灰度圖可以降低計(jì)算強(qiáng)度,因?yàn)闄z測的依據(jù)是哈爾特征,轉(zhuǎn)換后每個(gè)點(diǎn)的RGB數(shù)據(jù)變成了一維的灰度,這樣計(jì)算強(qiáng)度就減少很多)
scaleFactor:圖像縮放比例,可以理解為同一個(gè)物體與相機(jī)距離不同,其大小亦不同,必須將其縮放到一定大小才方便識(shí)別,該參數(shù)指定每次縮放的比例
minNeighbors:對(duì)特征檢測點(diǎn)周邊多少有效點(diǎn)同時(shí)檢測,這樣可避免因選取的特征檢測點(diǎn)太小而導(dǎo)致遺漏
minSize:特征檢測點(diǎn)的最小值
對(duì)同一個(gè)畫面有可能出現(xiàn)多張人臉,因此,我們需要用一個(gè)for循環(huán)將所有檢測到的人臉都讀取出來,然后逐個(gè)用矩形框框出來,這就是接下來的for語句的作用。Opencv會(huì)給出每張人臉在圖像中的起始坐標(biāo)(左上角,x、y)以及長、寬(h、w),我們據(jù)此就可以截取出人臉。其中,cv2.rectangle()完成畫框的工作,在這里我有意識(shí)的外擴(kuò)了10個(gè)像素以框出比人臉稍大一點(diǎn)的區(qū)域。cv2.rectangle()函數(shù)的最后兩個(gè)參數(shù)一個(gè)用于指定矩形邊框的顏色,一個(gè)用于指定矩形邊框線條的粗細(xì)程度。
好了,人臉識(shí)別的事說清楚了,下一篇該講講如何準(zhǔn)備訓(xùn)練數(shù)據(jù)了,只有訓(xùn)練數(shù)據(jù)足夠多,我們的程序才能識(shí)別出這是誰,而不是無論青紅皂白框個(gè)人臉就完事。
總結(jié)
以上就是本文關(guān)于python實(shí)現(xiàn)人臉識(shí)別代碼的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:python通過socket實(shí)現(xiàn)多個(gè)連接并實(shí)現(xiàn)ssh功能詳解、Python基礎(chǔ)練習(xí)之用戶登錄實(shí)現(xiàn)代碼分享、Python入門之三角函數(shù)全解【收藏】等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!
- Python基于Opencv來快速實(shí)現(xiàn)人臉識(shí)別過程詳解(完整版)
- Python 40行代碼實(shí)現(xiàn)人臉識(shí)別功能
- python使用opencv進(jìn)行人臉識(shí)別
- 用Python實(shí)現(xiàn)簡單的人臉識(shí)別功能步驟詳解
- 10分鐘學(xué)會(huì)使用python實(shí)現(xiàn)人臉識(shí)別(附源碼)
- 20行python代碼實(shí)現(xiàn)人臉識(shí)別
- Python實(shí)現(xiàn)人臉識(shí)別
- Python實(shí)現(xiàn)人臉識(shí)別的詳細(xì)圖文教程
相關(guān)文章
Pandas實(shí)現(xiàn)自定義Excel格式并導(dǎo)出多個(gè)sheet表
pandas默認(rèn)整合XlsxWriter驅(qū)動(dòng),可以自動(dòng)化處理excel操作,并提供公式、設(shè)置單元格格式、可視化分析圖片等操作,本文就來和大家詳細(xì)聊聊2023-05-05Python Numpy學(xué)習(xí)之索引及切片的使用方法
數(shù)組中的元素可以通過索引以及切片的手段進(jìn)行訪問或者修改,和列表的切片操作一樣。本文將詳細(xì)為大家介紹一下Python中的科學(xué)計(jì)算庫-Numpy的索引及切片的使用方法2022-01-01python尋找list中最大值、最小值并返回其所在位置的方法
今天小編就為大家分享一篇python尋找list中最大值、最小值并返回其所在位置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06Flask框架運(yùn)用Ajax實(shí)現(xiàn)輪詢動(dòng)態(tài)繪圖
Ajax是異步JavaScript和XML可用于前后端交互,本文將通過Ajax輪詢獲取后端的數(shù)據(jù),前臺(tái)使用echart繪圖庫進(jìn)行圖形的生成與展示,最后實(shí)現(xiàn)動(dòng)態(tài)監(jiān)控內(nèi)存利用率的這個(gè)功能,需要的可以參考一下2022-11-11Django權(quán)限設(shè)置及驗(yàn)證方式
這篇文章主要介紹了Django權(quán)限設(shè)置及驗(yàn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05python BlockingScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn)
這篇文章主要介紹了python BlockingScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)根據(jù)字段將記錄分組操作示例
這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)根據(jù)字段將記錄分組操作,結(jié)合實(shí)例形式分析了itertools.groupby()函數(shù)針對(duì)字典進(jìn)行分組操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-03-03