人脸识别-入门学习
基于opencv,face_recognition和dlib的人臉識別的入門學習
近期課程學習了一些入門級別的人臉識別技術實現,所以借此機會整理整理
何為人臉識別
1.人臉識別,是基于人的臉部特征信息進行身份識別的一種生物識別技術。用攝像機或攝像頭采集含有人臉的圖像或視頻流,并自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。
2.人臉識別系統根據輸入的圖片,識別出人物信息,應用到不同的任務場景中。具體,這個復雜的人臉識別系統負責哪些工作呢?
opencv
通過命令pip3 install opencv-python快速安裝
然后由于我使用的是macos
在macos系統中,需要將haarcascade_frontalface_default.xml的路徑找到并寫入代碼中。
一般路徑:"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml"
demo
import cv2def detect(filename):face_cascade = cv2.CascadeClassifier('/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml')#加載haar數據img=cv2.imread(filename)#加載圖片,讀進來直接是BGR格式gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#cv2.cvtColor(p1,p2) 是顏色空間轉換函數,p1是需要轉換的圖片,p2是轉換成何種格式。#cv2.COLOR_BGR2GRAY 將BGR格式轉換成灰度圖faces = face_cascade.detectMultiScale(gray, 1.3, 5)# 識別圖像中的人臉,返回所有人臉的矩形框向量組# scaleFactor=1.3 為了檢測到不同大小的目標,通過scalefactor參數把圖像長寬同時按照一定比例1.3逐步縮小,# 然后檢測,這個參數設置的越大,計算速度越快,但可能會錯過了某個大小的人臉。# minNeighbors=5 構成檢測目標的相鄰矩形的最小個數,此處設置為5for(x,y,w,h) in faces:img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#在圖像中畫上矩形框cv2.imshow('Person Detected!',img)cv2.waitKey(0)cv2.destroyAllWindows()#顯示結果if __name__ == '__main__':detect('1.jpeg')識別結果
可以看到,雖然有一些人臉能夠被正確識別到,但還是有一些人臉(例如側臉)不能夠識別,甚至有一些錯誤的識別。這就要求我們使用更高級的算法來識別人臉
face_recognition
GitHub項目:face_recognition
- 該項目目前star數超過3萬,是GitHub上最主流的人臉識別工具包之一。
- Face_recognition主要參考了OpenFace項目以及谷歌的facenet。
- 世界上最簡潔的人臉識別庫,可以使用Python和命令行工具提取、識別、操作人臉。
- 本項目的人臉識別是基于業內領先的C++開源庫dlib中的深度學習模型,用Labeled Faces in the Wild人臉數據集進行測試,有高達99.38%的準確率。但對小孩和亞洲人臉的識別準確率尚待提升。
安裝dlib和face_recognition
在安裝dlib時,可能會因為沒有安裝依賴包而出現錯誤,所以在安裝dlib之前,我們先用brew安裝openblas和cmake
demo
import face_recognition import cv2def detect(filename):image=face_recognition.load_image_file(filename)#加載圖片到imageface_locations_noCNN=face_recognition.face_locations(image)#Returns an array of bounding boxes of human faces in a image#A list of tuples of found face locations in css (top, right, bottom, left) order#因為返回值的順序是這樣子的,因此在后面的for循環里面賦值要注意按這個順序來print("face_location_noCNN:")print(face_locations_noCNN)face_num2=len(face_locations_noCNN)print("I found {} face(s) in this photograph.".format(face_num2))# 到這里為止,可以觀察兩種情況的坐標和人臉數,一般來說,坐標會不一樣,但是檢測出來的人臉數應該是一樣的# 也就是說face_num1 = face_num2; face_locations_useCNN 和 face_locations_noCNN 不一樣org=cv2.imread(filename)img=cv2.imread(filename)#cv2.imshow(filename,img) #顯示原始圖片for i in range(0,face_num2):top=face_locations_noCNN[i][0]right=face_locations_noCNN[i][1]bottom=face_locations_noCNN[i][2]left=face_locations_noCNN[i][3]start=(left,top)end=(right,bottom)color=(0,255,255)thickness=2cv2.rectangle(org,start,end,color,thickness)#cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → None#img:圖片 pt1&pt2:矩形的左上角和右下角 color:矩形邊框的顏色(rgb) thickness:參數表示矩形邊框的厚度cv2.imshow("no cnn",org)cv2.waitKey(0)cv2.destroyAllWindows()# # use CNN # face_locations_useCNN = face_recognition.face_locations(image,model='cnn') # model – Which face detection model to use. “hog” is less accurate but faster on CPUs. # “cnn” is a more accurate deep-learning model which is GPU/CUDA accelerated (if available). The default is “hog”.# print("face_location_useCNN:") # print(face_locations_useCNN) # face_num1=len(face_locations_useCNN) # print(face_num1) # The number of faces# for i in range(0,face_num1): # top = face_locations_useCNN[i][0] # right = face_locations_useCNN[i][1] # bottom = face_locations_useCNN[i][2] # left = face_locations_useCNN[i][3] # # start = (left, top) # end = (right, bottom) # # color = (0,255,255) # thickness = 2 # cv2.rectangle(img, start, end, color, thickness) # opencv 里面畫矩形的函數# # Show the result # cv2.imshow("useCNN",img)if __name__ =='__main__':detect('1.png')識別結果
可以看到,相比較第一次識別的結果,這一次的準確度提高了,但是在這次識別中,側臉依舊無法識別,所以我們要找到人臉特征點。
人臉特征點
Dlib有專門的函數和模型,能夠實現人臉68個特征點的定位。
找到特征點后,就可以通過圖像的幾何變換(仿射、旋轉、縮放),使各個特征點對齊(將眼睛、嘴等部位移到相同位置)。
下載和安裝
需要下載包:shape_predictor_68_face_landmarks.dat
并添加到路徑"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages"中(Mac用戶)
demo
import cv2 import dlibdef detect(filename):img=cv2.imread(filename)gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#人臉分類器detector=dlib.get_frontal_face_detector()#獲取人臉檢測器predictor=dlib.shape_predictor(r"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/shape_predictor_68_face_landmarks.dat")#dets保存的是圖像中人臉的矩形框,可以有多個dets=detector(gray,1)for face in dets:shape=predictor(img,face)# 尋找人臉的68個標定點# 遍歷所有點,打印出其坐標,并圈出來for pt in shape.parts():pt_pos=(pt.x,pt.y)cv2.circle(img,pt_pos,2,(0,255,0),1)cv2.imshow("image",img)cv2.waitKey(0)cv2.destroyAllWindows()if __name__=='__main__':detect('1.png')
雖然這次依舊沒有能夠把側臉識別出,這說明了我們的算法依然待提升,但是成功將幾個人臉的特征點提取出來了,這也為我們之后對人臉進行對齊等操作提供了數據。
總結
- 上一篇: CCPC-Wannafly Comet
- 下一篇: asp人脸识别,asp刷脸识别接口代码,