用25行Python代碼實現人臉識別,真牛逼

在本文中,我們將看到一種使用Python和開放源碼庫開始人臉識別的非常簡單的方法。

OpenCV

OpenCV是最流行的計算機視覺庫。最初是用C/C++編寫的,現在它提供了Python的API。

OpenCV使用機器學習算法來搜索圖片中的面孔。因為臉是如此複雜,沒有一個簡單的測試可以告訴你它是否找到了一張臉。相反,有成千上萬的小模式和特徵必須匹配。這些算法將識別人臉的任務分解為數千個較小的、適合大小的任務,每個任務都很容易解決。這些任務也稱為分類器.


用25行Python代碼實現人臉識別,真牛逼

這裡要注意:不管你是剛學Python還是想找python高薪工作,記住:項目開發經驗永遠是核心,如果你沒有python入門到高級實戰視頻教程,可以關注我,後臺私信我 ‘py’ 自動獲取最新python教程資料!還有老司機解答哦!

對於臉像這樣的東西,可能有6000個或更多的分類器,所有這些都必須匹配才能檢測到人臉(當然,在錯誤限制範圍內)。但問題就在這裡:對於人臉檢測,算法從圖片的左上角開始,向下移動到小塊數據中,查看每個塊,不斷地問:“這是一張臉嗎?…這是張臉嗎?…這是張臉嗎?“由於每個塊有6000或更多的測試,您可能需要進行數百萬的計算,這將使您的計算機陷入癱瘓。

為了避免這種情況,OpenCV使用級聯。

就像一系列瀑布一樣,OpenCV級聯將人臉檢測問題分解為多個階段。對於每個塊,它做了一個非常粗糙和快速的測試。如果通過,它會進行稍微詳細的測試,依此類推。該算法可能有30到50個這樣的階段或級聯,只有當所有階段都通過時,它才能檢測到一張臉。

它的優點是,大多數圖片在最初的幾個階段會返回一個負值,這意味著算法不會浪費時間來測試它上的所有6000個特性。現在可以實時進行人臉檢測,不用花上幾個小時。

實踐中的級聯

雖然這個理論聽起來很複雜,但在實踐中卻相當容易。級聯本身只是一堆XML文件,其中包含用於檢測對象的OpenCV數據。你用你想要的級聯初始化你的代碼,然後它為你做工作。

由於人臉檢測是如此常見的情況,OpenCV附帶了許多內置的級聯,用於檢測從臉到眼睛、手到腿的所有東西。對於非人類的事物,甚至還有級聯。例如,如果你經營一家香蕉店,想追蹤偷香蕉的人,為此造了一個!

安裝OpenCV

首先,您需要找到正確的安裝文件你的操作系統.

我發現安裝OpenCV是這項任務中最困難的部分。如果出現奇怪的無法解釋的錯誤,可能是由於庫衝突、32/64位差異等原因造成的。我發現只使用Linux虛擬機並從頭安裝OpenCV是最簡單的。

安裝完成後,可以通過觸發Python會話並鍵入:

<code>

import

cv2>>>/<code>

>>>

如果你沒有任何錯誤,你可以繼續下一部分。

理解方法

讓我們來分析一下實際的代碼,可以從這網站https://github.com/shantnu/FaceDetect/下載這些代碼。獲取face_detect.py腳本、abba.png pic和haarcascade_frontalface_default.xml

<code>/<code>

首先將圖像和串級名稱作為命令行參數傳遞。我們將使用ABBA圖像以及默認級聯來檢測OpenCV提供的面孔。

<code>/<code>

現在我們創建這個級聯並用我們的臉級聯初始化它。這會將臉級聯加載到內存中,這樣就可以使用了。記住,級聯只是一個XML文件,它包含用於檢測面孔的數據。

<code>/<code>

在這裡,我們讀取圖像並將其轉換為灰度。OpenCV中的許多操作都是以灰度形式完成的。

<code>/<code>

這個函數檢測實際的外觀,是代碼的關鍵部分,所以讓我們來看看下面的選項:

  1. 這個detectMultiScale功能是一個檢測對象的通用函數。因為我們叫它在面部級聯,這就是它檢測到的。
  2. 第一個選項是灰度圖像。
  3. 第二個是scaleFactor...因為有些臉可能離攝像機更近,所以看起來比後面的臉要大。比例因子對此進行補償。
  4. 該檢測算法使用移動窗口檢測物體。minNeighbors定義在當前對象聲明找到的臉之前,在當前對象附近檢測到多少個對象。minSize同時,給出每個窗口的大小。

注:我取了這些字段常用的值。在現實生活中,您將嘗試不同的窗口大小、比例因子等值,直到找到最適合您的值為止。

該函數返回一個矩形列表,其中它認為它找到了一張臉。接下來,我們將循環到它認為它發現了什麼東西的地方。

<code>

print

"Found {0} faces!"

.format(len(faces)) /<code>

此函數返回4個值:x和y矩形的位置,以及矩形的寬度和高度(w , h).

使用這些值繪製一個矩形。rectangle()功能。


<code>

cv2

.imshow

(

"Faces found"

, image)

cv2

.waitKey

(

0

)/<code>

最後,我們顯示圖像,等待用戶按下鍵。

檢查結果

讓我們根據ABBA的照片進行測試:

<code>$ python face_detect.py abba.png haarcascade_frontalface_default.xml/<code>

用25行Python代碼實現人臉識別,真牛逼

用25行Python代碼實現人臉識別,真牛逼

這起作用了。再來一張照片怎麼樣:

用25行Python代碼實現人臉識別,真牛逼

用25行Python代碼實現人臉識別,真牛逼

那個…不是一張臉。我們再試一次。我更改了參數,發現設置scaleFactor把錯誤的臉去掉了。

用25行Python代碼實現人臉識別,真牛逼

What?

第一張照片是用高質量的相機拍的。第二個似乎是從遠處拿來的,可能是用手機拍的。這就是為什麼scaleFactor必須修改。正如我說過的,你必須在逐個案例的基礎上設置算法,以避免誤報。

但是,由於這是基於機器學習,結果永遠不會是100%的準確性。在大多數情況下,您將獲得足夠好的結果,但有時算法會將不正確的對象識別為Faces。最後注意:不管你是剛學Python還是想找python高薪工作,記住:項目開發經驗永遠是核心,如果你沒有python入門到高級實戰視頻教程,可以關注我,後臺私信我 ‘py’ 自動獲取最新python教程資料!還有老司機解答哦!

本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。


分享到:


相關文章: