人臉識別代碼_10行代碼實現人臉識別

什么是人臉識別

人臉識別,是基于人的臉部特征信息進行身份識別的一種生物識別技術。用攝像機或攝像頭采集含有人臉的圖像或視頻流,并自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。

目前的人臉識別技術已經非常成熟了,還發展成3D人臉識別。而且現在各大廠商也都提供了人臉識別的API接口供我們調用,可以說幾行代碼就可以完成人臉識別。但是人臉識別的根本還是基于圖像處理。在Python中最強大的圖像處理庫就是OpenCV。

OpenCV簡介

OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。OpenCV可用于開發實時的圖像處理、計算機視覺以及模式識別程序。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。

OpenCV基本使用

安裝

pip install opencv-python  # 基礎庫pip install opencv-contrib-python  # 擴展庫pip install opencv-python-headless

讀取圖片

讀取和顯示圖片是最基本的操作了,OpenCV當中使用imread和imshow實現該操作

import cv2 as cv# 讀取圖片,路徑不能含有中文名,否則圖片讀取不出來image = cv.imread('1111.jpg')# 顯示圖片cv.imshow('image', image)# 等待鍵盤輸入,單位是毫秒,0表示無限等待cv.waitKey(0)# 因為最終調用的是C++對象,所以使用完要釋放內存cv.destroyAllWindows()
f01379cbdbaf9cc5c4c3febe78852694.png

將圖片轉為灰度圖

OpenCV中數百中關于不同色彩控件之間轉換的方法。目前最常用的有三種:灰度、BGR、HSV。

  • 灰度色彩空間是通過去除彩色信息來講圖片轉換成灰階,灰度圖會大量減少圖像處理中的色彩處理,對人臉識別很有效。
  • BGR每個像素都由一個三元數組來表示,分別代碼藍、綠、紅三種顏色。python中還有一個庫PIL,讀取的圖片通道是RGB,其實是一樣的,只是顏色順序不一樣
  • HSV,H是色調,S是飽和度,V是黑暗的程度
    將圖片轉換為灰度圖
import cv2 as cv# 讀取圖片,路徑不能含有中文名,否則圖片讀取不出來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表示無限等待cv.waitKey(0)# 因為最終調用的是C++對象,所以使用完要釋放內存cv.destroyAllWindows()
7ebd40cfd000dc87a96606d3ca15e86e.png

繪制矩形

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()
3cb46d8721021ea99cd9a9851f7314a2.png

人臉檢測

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

  • scaleFactor: 指定每個圖像比例縮小多少圖像
  • minNeighbors: 指定每個候選矩形必須保留多少個鄰居,值越大說明精度要求越高
  • minSize:檢測到的最小矩形大小
  • maxSize: 檢測到的最大矩形大小

檢測圖片中人臉

import osimport cv2 as cvdef face_detect_demo(image):    # 將圖片轉換為灰度圖    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)    # 加載特征數據    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)# 讀取圖片,路徑不能含有中文名,否則圖片讀取不出來image = cv.imread('2222.jpg')face_detect_demo(image)# 顯示圖片cv.imshow('image', image)# 等待鍵盤輸入,單位是毫秒,0表示無限等待cv.waitKey(0)# 因為最終調用的是C++對象,所以使用完要釋放內存cv.destroyAllWindows()
2afe246ad613d6ebce3d195c57035078.png

采用默認參數,檢測人臉數據不全,需要調整detectMultiScale函數的參數,調整為faces = face_detector.detectMultiScale(gray, scaleFactor=1.02, minNeighbors=3)

2c9d25f7f24485f44c7ce8a81e7d8889.png


我們發現除了檢測到人臉數據,還有一些其他的臟數據,這個時候可以打印檢測出的人臉數據位置和大小

faces = face_detector.detectMultiScale(gray, scaleFactor=1.02, minNeighbors=3)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)
b767741ccaf4d34ed01f4388cfa9011e.png

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

080c6a5a8b258cb4e1bf6aa0a9139c96.png

檢測視頻中人臉

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

import cv2 as cv# 人臉檢測def face_detect_demo(image):    try:        # 將圖片轉換為灰度圖        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)        # 加載特征數據        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('人臉識別.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()
8fb0f597edf6259fbed32428e06aeeb9.gif

這個我們是做的人臉識別,怎么把愛好都識別了,這么先進嗎?很顯然這不太符合我們的要求,愛好只能藏在心里,你給我檢測出來就不行了。所以我們必須要進行優化處理。OpenCV為我們提供了一個機器學習的小模塊,我們可以訓練它,讓它只識別我們需要的部分,不要亂猜測。

訓練數據

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

獲取訓練集

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

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

使用LBPH訓練模型

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')# 訓練recognizer = cv.face.LBPHFaceRecognizer_create()recognizer.train(faces, np.array(ids))# 保存訓練特征recognizer.write('trains/trains.yml')

基于LBPH的人臉識別

LBPH將檢測到的人臉分為小單元,并將其與模型中的對應單元進行比較,對每個區域的匹配值產生一個直方圖。調整后的區域中調用predict函數,該函數返回兩個元素的數組,第一個元素是所識別的個體標簽,第二個元素是置信度評分。所有的算法都有一個置信度評分閾值,置信度評分用來衡量圖像與模型中的差距,0表示完全匹配。LBPH有一個好的識別參考值要低于50。基本步驟為:

  • cv.VideoCapture讀取視頻
  • Haar算法檢測人臉數據
  • 基于LBPH訓練集得到準確人臉數據,并輸出標記此人是誰
  • 按置信度取準確度高的人臉標記出來
import osimport cv2 as cvdef face_detect_demo(image):    try:        global number        # 將圖片轉換為灰度圖        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)        # 加載特征數據        faces = face_detector.detectMultiScale(gray, scaleFactor=1.02, minNeighbors=3)        for x, y, w, h in faces:            # 獲取置信度,大于80表示取值錯誤            _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('人臉識別.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__':    # 加載訓練數據文件    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()
217ac680d4990b266770a0bd911ad0e2.gif

總結

通過上面一步步的學習,你是不是對OpenCV人臉識別有個基本的認識了呢?但是我們也看到了,整個人臉識別的主要算法還是基于Haar,而且準確度并不是特別高,主要是會檢測出很多非人臉的數據。LBPH是讓我們給某個人臉進行標記,告訴我們他是誰,并沒有提高實際的檢測準確度。現在機器學習是非常火爆的,基于OpenCV的機器學習人臉識別也精確度也很高,下次我們在來對比幾種機器學習人臉識別的庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533868.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ticketvalidationexception票根不符合目標服務_如何在有效降低企業倉儲成本的同時不降低企業的總體服務質量目標水平?...

對于企業而言&#xff0c;如何降低倉儲成本&#xff0c;同時要保證物流總成本最低和不降低企業的總體服務質量和目標水平的前提下進行&#xff0c;常見的措施有以下幾點&#xff1a;一用“先進先出方式&#xff0c;減少倉儲物的保管風險。”先進先出是儲存管理的準則之一&#…

matlab編程 英文翻譯,MATLAB編程,MATLAB programming,音標,讀音,翻譯,英文例句,英語詞典...

Image:114994698204558.jpgmatlabmatlab是矩陣實驗室(matrix laboratory)之意。除具備卓越的數值計算能力外&#xff0c;它還提供了專業水平的符號計算&#xff0c;文字處理&#xff0c;可視化建模仿真和實時控制等功能。matlab的基本數據單位是矩陣&#xff0c;它的指令表達式…

python進群_Manim-python 進群問題之解答

事情起因人閑下來的時候總想找點事情做&#xff01;這不&#xff0c;昨天考完試后在B站上逛&#xff0c;不小心進入了學習區&#xff0c;在00后學長那里看到了一個視頻。鏈接如下&#xff1a;具有美感的傅里葉級數居然還能夠畫畫&#xff01;&#xff01;&#xff01;這讓我一個…

python科學計算_可視化圖解Python科學計算包NumPy

NumPy包是python生態系統中數據分析、機器學習和科學計算的主力。 它極大地簡化了向量和矩陣的操作。Python的一些主要軟件包依賴于NumPy作為其基礎架構的基礎部分&#xff08;例如scikit-learn、SciPy、pandas和tensorflow&#xff09;。我們將介紹一些使用NumPy的主要方法&am…

php 導出excel 特殊字符,PHPEXCEL導出,存在特殊字符遇到的問題

[13] > Array([payment_success_at] >[user_name] > ?.琳琳?[remarks] >[product_name] > 香菇[sku_name] > 斤[product_property] > 斤[price_original] > 5.50[price_current] > 5.50[consignee] > ?.琳琳?)以上代碼中用戶名中存在特殊符號…

win10任務欄怎么還原到下面_詳解:新版 WIN 10 V2004 任務欄和開始菜單全透明

是不是很酷炫&#xff1f;繼續往下看&#xff0c;你也可以簡單做到導語本文將告訴你如何借助一個小工具&#xff0c;將最新版 WIN 10 開始菜單和任務欄設置成全透明&#xff0c;以獲得超酷的視覺體驗。安裝和設置都很簡單&#xff0c;關鍵是一定要找到適合 WIN 10 版本的 Start…

php是靜態語言,Thinkphp靜態緩存多語言切換

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓1.首先判斷用戶有無手動指定語言2.從session中獲得當前語言3.session里面沒有則從cookie里面去取4.若是cookie里沒有&#xff0c;則根據IP段判斷5.若不在指定ip范圍內&#xff0c;自動偵測瀏覽器語言首先我們在Common/Conf/tags.ph…

10.8.8.8檸檬wifi網頁登錄_基于企業郵箱進行wifi實名認證的方案

之前我們介紹過如何用釘釘認證和企業微信認證來實現企業內部的實名上網認證。此外郵箱認證也是企業進行wifi實名認證的一個有效手段。因為很多企業都給員工開通了企業郵箱&#xff0c;直接讓員工輸入郵箱賬號和密碼進行認證上網。配置、使用和維護都相對比較簡單。本文我將介紹…

用pycharm寫python老是提示錯誤_python pycharm錯誤集錦

url:http://www.cnblogs.com/hinimix/p/8016859.html1, this list creation could be rewritten as a list literal預先定義了一個listlist1 [1,2,3,4] #這么用好比list1 [1,2,3] #這么用不好list1.append(4)此時會出現該提示解決鏈接&#xff1a;https://stackoverflow.com/…

php tire樹,Immutable.js源碼之List 類型的詳細解析(附示例)

本篇文章給大家帶來的內容是關于Immutable.js源碼之List 類型的詳細解析(附示例)&#xff0c;有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對你有所幫助。一、存儲圖解我以下面這段代碼為例子&#xff0c;畫出這個List的存儲結構&#xff1a;let myL…

nodejs missing script: dev_nodejs深入學習系列之v8基礎篇

V8這個概念大家都不陌生了&#xff0c;那么你動手編譯過V8源碼嗎&#xff1f;編譯后有嘗試去了解V8背后的一些概念嗎&#xff1f;如果沒有&#xff0c;那么也不用心慌&#xff0c;下文將跟大家一一解釋這些東西。在編譯V8之前我們先要了解一個東西-構建系統1、構建系統1.1、構建…

cmos存儲器中存放了_天津大學姚建銓院士,張雅婷副教授JMCC:具有寬光譜調控特性的阻變存儲器...

【引言】存儲器是計算機中數據存放的主要介質。隨著5G時代到來&#xff0c;帶動人工智能、物聯網、智慧城市等應用市場發展并向存儲器提出多樣化需求&#xff0c;加上傳統存儲器市場價格變化等因素&#xff0c;新型存儲器將在市場發揮越來越重要的作用。因此具有存儲密度更高&a…

matlab轉差頻率控制,轉差頻率控制的異步電機調速系統的研究

1 引言交流變頻調速的方法是異步電機最有發展前途的調速方法。隨著電力電子技術、計算機技術和自動控制技術的不斷發展&#xff0c;交流電機變頻調速已經逐步取代直流電機調速&#xff0c;并經歷了采用電壓頻率協調控制、轉差頻率控制、矢量控制以及直接轉矩控制的發展過程。其…

python中標識符的命名規則_Python——標識符的命名規則

01 Python語言的特點 python的語言特點有很多&#xff0c;我們這里只講一點&#xff0c;python是一門面向對象的語言&#xff0c;即一切皆對象&#xff08;Linux中有一句是&#xff1a;一切皆文件&#xff09;&#xff0c;括號內的只是打個比方&#xff0c;不懂也沒事&#xff…

python內置對象是什么_Python內置對象類型之數字類型

Python中有6種內置對象類型整數、浮點數–Number字符串–String列表–List元組–Tuple字典–Dictionary集合–Set不可變類型&#xff1a;Number、String、Tuple可變類型&#xff1a;List、Dictionary、Set知識點&#xff1a;變量和對象的關系–引用變量的使用數字類型的常見使用…

oracle的exp和imp,oracle exp和imp

--1.exp和imp的輸入都是名字和值對&#xff1a;如&#xff1a;exp parameter_namevalue 或exp parameter_name(value1,value2,value3..)--2.exp和imp都支持helpy選項。命令格式為:exp/imp helpy--3.exp中的參數:參數名稱 默認值 含義 建議compress Y 不壓縮導出數據的內容 comp…

python案例實操_用案例實操學習Python ,培養編程邏輯思維

案例一&#xff1a; A、B、C、D、E 五人在某天夜里合伙去捕魚&#xff0c;到第二天凌晨時都疲憊不堪&#xff0c;于是各自找地方睡覺。 日上三桿 A 第一個醒來&#xff0c;他將魚分為五份&#xff0c;把多余的一條魚扔掉&#xff0c;拿走自己的一份。 B 第二個醒來&#xff0c;…

oracle錯誤1327,Oracle中的PGA監控報警分析(r11筆記第97天)

最近接到一個數據庫報警&#xff0c;讓我頗有些意外&#xff0c;這是一個PGA相關的報警。聽起來感覺是應用端的資源調用出了問題。報警內容大體如下&#xff1a;報警內容: PGA Alarm on alltest------------------------------------報警級別: PROBLEM------------------------…

python控制臺清屏_Python Shell 怎樣清屏?

啟動Python有兩種方式&#xff0c;分別為“Windows命令行窗口”和“IDLE” “命令行窗口”下可以通過如下兩種方法&#xff1a; 1. import subprocess subprocess.call("clear") # linux/mac subprocess.call("cls", shellTrue) # windows 執行完次命令后&…

python卸載opencv包_Ubuntu16.04卸載opencv2.4.9并安裝opencv3.2.0+contrib

本文為作者原創&#xff0c;轉載請注明出處(http://www.cnblogs.com/mar-q/)by 負赑屃需要用到opencv中的surf和sift算法&#xff0c;機器上只有opencv3.2&#xff0c;沒有擴展包&#xff0c;于是就去GitHub和官網看了下&#xff0c;沒想到8月剛出了3.3&#xff0c;一個激動就想…