Python 中的人臉檢測項目 [只需 5 個簡單步驟]

已發表: 2020-09-01

對象識別和人臉檢測可能是計算機視覺最流行的應用。 該技術在安全和社交媒體等各個行業中都有應用。 所以我們正在通過 Python 構建一個人臉檢測項目。

請注意,您應該熟悉 Python、OpenCV 和 NumPy 編程。 它將確保您在處理此項目時不會感到困惑。 讓我們開始吧。

我們分享了兩種執行人臉識別的方法。 第一個使用 Python 的人臉識別庫,而另一個使用 OpenCV 和 NumPy。 查看我們的數據科學計劃以了解更多信息。

目錄

使用 Python 的“人臉識別”進行人臉識別

檢測人臉的最簡單方法可能是使用Python 中的人臉識別庫 它在 LFW 數據庫中的準確率為 99.38%。 使用它非常簡單,不需要太多努力。 此外,該庫有一個專用的“face_recognition”命令,用於識別圖像中的人臉。

如何使用人臉識別

您可以使用“face_locations”命令區分圖像中的人臉:

導入人臉識別

image = face_recognition.load_image_file(“your_file.jpg”)

face_locations = face_recognition.face_locations(圖像)

它還可以識別面孔並將其與姓名相關聯:

導入人臉識別

known_image = face_recognition.load_image_file(“modi.jpg”)

unknown_image = face_recognition.load_image_file(“unknown.jpg”)

modi_encoding = face_recognition.face_encodings(known_image)[0]

unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

結果 = face_recognition.compare_faces([modi_encoding], unknown_encoding)

圖片包含“納倫德拉·莫迪”

通過將它與其他庫組合,您可以使用此庫執行許多其他操作。 我們現在將討論使用 Python 中的其他著名庫執行人臉識別,特別是 OpenCV 和 NumPy。

閱讀更多: Python NumPy 教程:通過示例學習 Python Numpy

Python中的人臉檢測項目

在這個項目中,我們使用 OpenCV 和 NumPy 進行了人臉檢測和識別。 我們使用過 Raspberry Pi,但您也可以將它與其他系統一起使用。 您只需稍微修改代碼即可在其他設備(例如 Mac 或 Windows PC)上使用它。

這個項目的一些功勞歸功於Marcelo Rovai

第 1 步:安裝庫

首先,您應該安裝所需的庫、OpenCV 和 NumPy。 您可以通過以下方式輕鬆安裝它:

點安裝 opencv-python

點安裝 opencv-contrib-python

要在您的系統中安裝 NumPy,請使用與上述相同的命令並將 'opencv-python' 替換為 'numpy':

點安裝 numpy

第 2 步:檢測人臉

現在,您必須配置您的相機並將其連接到您的系統。 相機應正常工作以避免人臉檢測出現任何問題。

在我們的相機識別我們之前,它首先必須檢測面部。 我們將使用 Haar Cascade 分類器進行人臉檢測。 它主要是一種對象檢測方法,您可以通過負片和正片圖像訓練級聯函數,之後它就能夠檢測其他照片中的對象。

在我們的例子中,我們希望我們的模型能夠檢測人臉。 OpenCV 帶有一個訓練器和一個檢測器,因此使用 Haar Cascade 分類器相對更適合這個庫。 您也可以創建分類器來檢測其他圖像。

這是代碼:

將 numpy 導入為 np

導入簡歷2

faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')

上限 = cv2.VideoCapture(0)

cap.set(3,640) # 設置寬度

cap.set(4,480) # 設置高度

而真:

ret, img = cap.read()

img = cv2.flip(img, -1)

灰色 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(

灰色的,

比例因子=1.2,

minNeighbors=5,

minSize=(20, 20)

)

對於面中的 (x,y,w,h):

cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

roi_gray = 灰色[y:y+h, x:x+w]

roi_color = img[y:y+h, x:x+w]

cv2.imshow('視頻',img)

k = cv2.waitKey(30) & 0xff

if k == 27: # 按 'ESC' 退出

休息

帽釋放()

cv2.destroyAllWindows()

第 3 步:收集數據

現在您的模型可以識別人臉,您可以對其進行訓練,使其開始識別圖片中的人臉。 為此,您必須為其提供多張您希望它記住的面孔的照片。

這就是為什麼我們將從收集照片開始創建數據集的原因。 在收集到必要的圖像後,為每個人添加 ID,這樣模型就知道將什麼臉與什麼 ID 相關聯。 從一個人的圖像開始,至少添加 10-20 個。 使用不同的表達方式來獲得最有效的結果。

創建一個用於將用戶 ID 添加到圖像的腳本,這樣您就不必每次都手動執行此操作。 如果您想將模型用於多個面,該腳本至關重要。

向世界頂尖大學學習機器學習課程獲得碩士、Executive PGP 或高級證書課程以加快您的職業生涯。

第 4 步:訓練

創建人物圖像數據集後,您必須訓練模型。 您將圖片提供給您的 OpenCV 識別器,它最終會創建一個名為“trainer.yml”的文件。

在此階段,您只需向模型提供圖像及其 ID,以便模型熟悉每個圖像的 ID。 完成模型訓練後,我們可以對其進行測試。

這是代碼:

導入簡歷2

將 numpy 導入為 np

從 PIL 導入圖像

導入操作系統

# 人臉圖像數據庫路徑

路徑 = '數據集'

識別器 = cv2.face.LBPHFaceRecognizer_create()

檢測器 = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”);

# 獲取圖像和標籤數據的函數

def getImagesAndLabels(路徑):

imagePaths = [os.path.join(path,f) for f in os.listdir(path)]

faceSamples=[]

身份證= []

對於 imagePaths 中的 imagePath:

PIL_img = Image.open(imagePath).convert('L') # 灰度

img_numpy = np.array(PIL_img,'uint8')

id = int(os.path.split(imagePath)[-1].split(“.”)[1])

面孔=檢測器.detectMultiScale(img_numpy)

對於面中的 (x,y,w,h):

faceSamples.append(img_numpy[y:y+h,x:x+w])

ids.append(id)

返回 faceSamples,ids

print (“\n [INFO] 訓練面孔。這需要幾秒鐘。等待......”)

面孔,ids = getImagesAndLabels(路徑)

識別器.train(面孔,np.array(ids))

# 將模型保存到 trainer/trainer.yml

識別器.write('trainer/trainer.yml')

# 打印訓練的人臉數量並結束程序

print(“\n [INFO] {0} 人臉訓練。退出程序”.format(len(np.unique(ids))))

學習:人臉識別中的 MATLAB 應用:代碼、描述和語法

步驟#5:開始識別

現在您已經訓練了模型,我們可以開始測試模型了。 在本節中,我們為 ID 添加了名稱,以便模型可以顯示它識別的各個用戶的名稱。

該模型無法識別人。 它預測它檢測到的人臉是否與其數據庫中存在的人臉匹配。 我們的模型顯示了人臉與其數據庫中存在的人臉匹配程度的百分比。 它的準確性在很大程度上取決於您正在測試的圖像和您添加到數據庫中的圖片(您訓練模型的圖像)。

這是代碼:

導入簡歷2

將 numpy 導入為 np

導入操作系統

識別器 = cv2.face.LBPHFaceRecognizer_create()

識別器.read('trainer/trainer.yml')

cascadePath = “haarcascade_frontalface_default.xml”

faceCascade = cv2.CascadeClassifier(cascadePath);

字體 = cv2.FONT_HERSHEY_SIMPLEX

#啟動id計數器

編號 = 0

# 與 id 相關的名稱:例如 ==> upGrad: id=1 等

名稱= ['無',upGrad',我','朋友','Y','X']

# 初始化並開始實時視頻捕獲

cam = cv2.VideoCapture(0)

cam.set(3, 640) # 設置視頻寬度

cam.set(4, 480) # 設置視頻高度

# 定義被識別為人臉的最小窗口大小

minW = 0.1*cam.get(3)

minH = 0.1*cam.get(4)

而真:

ret, img =cam.read()

img = cv2.flip(img, -1) # 垂直翻轉

灰色 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(

灰色的,

比例因子 = 1.2,

minNeighbors = 5,

minSize = (int(minW), int(minH)),

)

for(x,y,w,h) 在面中:

cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)

id,置信度=recognizer.predict(灰色[y:y+h,x:x+w])

# 如果置信度小於 100 ==> “0” : 完美匹配

如果(置信度 < 100):

id = 名稱[id]

信心=“{0}%”。格式(輪(100 - 信心))

別的:

id = “未知”

信心=“{0}%”。格式(輪(100 - 信心))

cv2.putText(

圖像,

字符串(id),

(x+5,y-5),

字體,

1、

(255,255,255),

2

)

cv2.putText(

圖像,

str(信心),

(x+5,y+h-5),

字體,

1、

(255,255,0),

1

)

cv2.imshow('相機',img)

k = cv2.waitKey(10) & 0xff # 按 'ESC' 退出視頻

如果 k == 27:

休息

# 進行清理

print(“\n [INFO] 退出程序並進行清理”)

cam.release()

cv2.destroyAllWindows()

我們已經用 Python 完成了人臉檢測項目。 您現在知道如何創建檢測和識別人臉的機器學習模型。 請務必與我們分享您的結果!

學習:面向初學者的 TensorFlow 對象檢測教程

了解有關機器學習的更多信息

我們希望您喜歡這個人臉檢測項目。 如果您想讓它更具挑戰性,您可以在數據集中添加多個面孔並相應地訓練您的模型。 您還可以將它與其他庫結合起來,並將項目擴展為其他東西,例如程序的人臉檢測安全系統!

如果您有興趣了解有關機器學習的更多信息,請查看 IIIT-B 和 upGrad 的機器學習和 AI 執行 PG 計劃,該計劃專為工作專業人士設計,提供 450 多個小時的嚴格培訓、30 多個案例研究和作業、IIIT -B 校友身份,5 個以上實用的實踐頂點項目和頂級公司的工作協助。

哪種數學方法用於人臉識別?

人臉識別計算量大,經常被用作機器學習算法和目標檢測方法的準確性測試。 一般來說,在大多數情況下,都遵循經典的數學方法——歐幾里得距離。 應用幾何變換以找到兩組之間最接近的歐幾里得距離。 歐幾里得距離需要將代表兩個圖像的點的兩個向量之間的差的平方相加。 有關歐幾里德距離算法的更多詳細信息,請參閱這篇研究論文。

人臉檢測是如何工作的?

人臉檢測是在數字圖像或視頻中檢測人臉或多個人臉的過程。 人臉檢測是人臉識別的一個子過程,但該術語通常是指基於圖像的人臉識別,其中僅使用圖像中人臉的位置來識別或驗證一個人,而人臉識別還創建了他們獨特的模型人臉,然後與目標人臉匹配。 人臉檢測不同於人臉識別,因為人臉識別是從數字圖像或視頻源中識別或驗證人的自動化過程。

人臉識別面臨哪些挑戰?

這裡討論了面部識別的一些挑戰。 面部識別系統中涉及的算法非常複雜,這使得它們高度不一致。 面部識別系統很容易被環境和光照變化、不同的姿勢,甚至長相相似的人所欺騙。 面部識別系統需要非常高的計算能力,這就是面部識別系統主要用於高端智能手機和筆記本電腦的原因。 面部識別系統可能會在單個幀中檢測到多個錯誤匹配。 軟件必須確定用戶打算做什麼,這對軟件來說不是一件容易的事。