利用python進行識別相似圖片(二)
來自: https://segmentfault.com/a/1190000004500523
前言
和網上各種 首先你要有一個女朋友 的系列一樣,想進行人臉判斷, 首先要有臉 ,
只要能靠確定人臉的位置,那么進行兩張人臉是否相似的操作便迎刃而解了。
所以本篇文章著重講述如何利用openCV定位人臉。
上一篇文章的地址:
安裝openCV
在進行下一步操作時,我們需要安裝openCV,本來安裝openCV的步驟跟平常安裝其他模塊一樣,而然由于python的歷史原因(用過都懂……),弄得一點都不友好。
的目錄下,根據自己的情況,選擇 x86 , x64 下的 cv2.pyd 放到你python的安裝目錄的
\Lib\site-packages\ 下。
進入 這個網站 ,下載openCV相關 whl 文件,例如
opencv_python-3.1.0-cp35-none-win_amd64.whl然后再對應目錄下使用 pip install opencv_python-3.1.0-cp35-none-win_amd64.whl 命令即可
安裝完成后,可以在python的命令行下測試。
import cv2
如果沒有報錯的話,恭喜你安裝成功。
不過 無論是哪個版本的用戶,在python上使用openCV都需要先安裝numpy 這個模塊。
人臉識別的原理
opencv的人臉識別是基于了 haar特征 ,關于什么叫 haar特征 ,足以開另外一篇文章說明了,礙于篇幅,這里不做介紹。
opencv提供已經訓練好的數據寫成了xml文件,放在了 opencv\sources\data\haarcascades 的目錄下。
如果只是安裝了 opencv_python-3.1.0-cp35-none-win_amd64.whl 的,可以在我的github上,下載 cvdata 里面的內容
,地址會在文章底部給出。
除了人臉識別的數據外,還有人眼,上半身,下半身……等人體特征的數據,觀察xml文件的命名,不難見名知義。
接下來會介紹如何利用這個已經訓練好的數據,如果仍對 haar 模型感興趣,可以參考以下地址。
如何使用訓練好的數據
先講關于openCV基本的一些操作。全部具體代碼,請查看我的github。
讀入一張圖片
cv2.imread(path)
如果你用 type() 把其返回值的類型是 numpy.ndarray 。
而同樣, numpy.asarray(Image) 返回的亦是 numpy.ndarray 對象,為什么強調這兩點?
-
cv2.imread(path) 不能讀取中文路徑,若路徑中含有中文字符,其會返回 None
-
在后面的操作中,包括是切割圖片(人臉部分),再進行局部哈希,比較相似度,
等等都是用 Image 對象進行操作,如果再用 Image.open() 讀入圖片未免顯得麻煩。
所以干脆統一用 Image.open() 打開圖片,再用 numpy.asarray(Image) 轉化即可。
需要注意有一個不同的地方是雖然其返回的也是三維數組,但在第三維,即某個坐標下的 RGB 值,兩個矩陣的順序是反的,但只要另外編寫一個小函數將其反轉即可。
載入xml數據
face_cascade = cv2.CascadeClassifier(xml_path)
將圖片灰度化
if img.ndim == 3: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray = img # 如果img維度為3,說明不是灰度圖,先轉化為灰度圖gray,如果不為3,也就是2,原圖就是灰度圖
img是之前讀入的三維數組,雖然灰度圖可以用 Image 對象的 convert('L') 完成,但由于不確定
opencv的處理方法是否和該方法一樣,所以還是用opencv自己的方法進行處理比較好。
獲取人臉坐標
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(10,10),flags=cv2.CASCADE_SCALE_IMAGE)
-
scale_factor:被檢測對象的尺度變化。尺度越大,越容易漏掉檢測的對象,但檢測速度加快;尺度越小,檢測越細致準確,但檢測速度變慢。
-
min_neighbors:數值越大,檢測到對象的條件越苛刻;反之檢測到對象的條件越寬松;
-
minSize:檢測對象的大小
該方法返回的是一個列表,每個列表元素是長度為四的元組,分別臉部的左上角的x,y值,臉部區域的寬度和高度。
下一步操作
通過上述的方法,我們就已經獲取到人臉的位置,下一步你可以通過 ImageDraw `對象進行繪圖,框出人臉的位置。
同樣,你也可以使用 Image 的 crop 方法把人臉部分提取出來,然后進行局部哈希,
通過上一篇文章提及的算法,比較兩者的相似度。
兩種操作分別在我的github中實現了,請參考我的github中 face1.py ,和 face2.py 兩個python文件。
寫一只具有識別能力的圖片爬蟲
在上一篇文章中,我說了會應用這些算法做成以只具有識別能力的圖片爬蟲,然現在我也確實是在做但考慮到作為核心的圖片識別和人臉識別的部分我已經寫成文章分享出來,其余部分就是想寫其他爬蟲一樣而已,所以我決定看看這兩篇文章的反響后再決定是否繼續該系列,把圖片爬蟲的制作過程和大家分享一下。
總結
鑒于個人實力有限,本文未能詳細說明人臉識別的原理,但總結了如何利用已經訓練好的數據進行人臉識別,希望能幫到有需要的朋友。
如有不足之處,歡迎提出。
本文涉及內容的詳細代碼在下面的github地址。
歡迎star,也歡迎給意見