用Python寫個簡單但強大的人臉識別系統

2020-12-02 TechWeb

face_recognition是一個強大、簡單、易上手的人臉識別開源項目,並且配備了完整的開發文檔和應用案例,特別是兼容樹莓派系統。 face_recognition一經開源發布就得到的廣泛的熱捧,使用簡單,功能強大成為其非常顯著的標籤。face_recognition對於公司或者是一些工程實踐性的應用場景來說是非常好用好上手的利器,不需要你有太多的理論基礎就可以比較輕鬆地去完成一個識別項目,所以今天我們專門來講解一下。

首先,face_recognition項目開源地址在這裡:

https://github.com/ageitgey/face_recognition

網上有比較完整的API說明以及實例應用,我這裡就不多去說明了。首先,使用face_recognition需要安裝,可以通過 pip 完成。如果安裝遇到報錯可參考:

https://yishuihancheng.blog.csdn.net/article/details/102679177

安裝完成後就可以使用了,在編碼前可以通過簡單的測試來檢驗是否安裝成功,如下所示:

成功安裝後,就可以進入使用了。

1、定位圖像中的人臉

def demoFunc():      '''      在一張包含人臉的圖片中圈出來人臉      '''      image = face_recognition.load_image_file("test.jpg")      face_locations = face_recognition.face_locations(image)      for one in face_locations:             y0, x1, y1, x0=one          cv2.rectangle(image, pt1=(x0, y0), pt2=(x1, y1), color=(0, 0, 255), thickness=3)      cv2.imshow('aaa', image)      if cv2.waitKey(0) & 0xFF == ord('q'):          cv2.destroyAllWindows() 

從網上隨便找了一張圖片,如下所示:

定位結果如下所示:

感覺還是很強大的,當然了,在我實踐的過程中也發現了部分圖像識別檢測人臉失敗的問題,這個畢竟不是一個百分之百的問題,face_recognition更像是一個基礎框架,幫助我們更加高效地去構建自己的人臉識別的相關應用。

2、切割圖像中的每個人臉保存本地

def demoFunc():      '''      圖片中人臉截圖保存      '''      img = cv2.imread("test.jpg")      image = face_recognition.load_image_file("test.jpg")      face_locations = face_recognition.face_locations(image)  #(top, right, bottom, left)      for i in range(len(face_locations)):          y0, x1, y1, x0 = face_locations[i]          cropped = img.crop((x0,y0,x1,y1))  # (left, upper, right, lower)  左上角  右下角          cropped.save(str(i)+"_.jpg")         cropped.show() 

使用的原始圖像同上,結果如下所示:

五張人臉都檢測成功,並且保存成功,這裡主要是要注意一些face_locations這個函數的返回結果,返回的子列表中每個子列表包含4個元素,分別是單張人臉圖像的左上頂點和右下頂點坐標,主要需要注意的是這四個參數的順序,我給出來的結果中(x0,y0)表示左上頂點的坐標,(x1,y1)表示右下頂點的坐標。

3、將圖像中的每個人臉編碼成一個128維的向量

def demoFunc():      '''      將圖片中的每張人臉編碼成一個128維長度的向量      '''      image = face_recognition.load_image_file("cl.jpg")      face_locations = face_recognition.face_locations(image)  #(top, right, bottom, left)       face_encodings = face_recognition.face_encodings(image, face_locations)  #將單個人臉數據轉化為一個128維的向量      for one in face_encodings:          print('one: ',one) 

進行到這裡就不得不去講一下face_recognition的一些應用原理,下面是我的一些總結,如有不當歡迎指教。

face_recognition模塊人臉識別應用實現的原理:

(1) 給定想要識別的人臉的圖片並對其進行編碼(每個人只需要一張),並將這些不同的人臉編碼構建成一個列表。編碼其實就是將人臉圖片映射成一個128維的特徵向量。

(2) 計算圖像向量之間的相似度根據閾值或者是容錯度來決定是否是同一個人

(3) 輸出識別結果標籤。

毫不誇張地說,face_recognition整個的核心就在於這一塊的向量化處理中,輸入的每一張人臉圖像都會被轉化為一個128維的特徵向量進行存儲,128維特徵向量的生成也是一個算法在裡面的感興趣的話可以去查一下深入了解一下,我這裡就不展開了,之後的人臉識別就轉化為了兩個人臉圖像之間向量相似度的問題了。

這裡使用一張成龍大哥的圖像來進行測試,原始圖像如下所示:

向量化結果如下:

如果自己想要構建自己的個性化應用的話一般會選擇在這裡進行改造,首先就是需要保存這裡的特徵向量。

4、輸入兩張人臉圖像,判斷是否是同一個人

def demoFunc(one_pic='c1.jpg',two_pic='c2.jpg'):      '''      給定兩張圖片,判斷是否是同一個人      '''      chenglong = face_recognition.load_image_file(one_pic)      unknown_image = face_recognition.load_image_file(two_pic)      biden_encoding = face_recognition.face_encodings(chenglong)[0]      unknown_encoding = face_recognition.face_encodings(unknown_image)[0]      results = face_recognition.compare_faces([biden_encoding], unknown_encoding)      print('results: ',results)      return results[0] 

這裡其實跟上面第三部分的有點相似,這部分是建立在第三部分基礎上的只不過是自帶了compare_faces這個相似度計算接口,這裡其實可以自己去實現替換的。

同樣,使用了兩張成龍大哥的圖像來進行測試,原始圖像如下所示:

測試結果如下:

5、臉部關鍵點識別和標註

def demoFunc(pic_path='cl.jpg'):      '''      臉部關鍵點識別、標註      '''      image = face_recognition.load_image_file(pic_path)      face_landmarks_list = face_recognition.face_landmarks(image)      print("I found {} face(s) in this photograph.".format(len(face_landmarks_list)))      pil_image = Image.fromarray(image)      d = ImageDraw.Draw(pil_image)      for face_landmarks in face_landmarks_list:          for facial_feature in face_landmarks.keys():              print("The {} in this face has the following points: {}".format(facial_feature, face_landmarks[facial_feature]))          for facial_feature in face_landmarks.keys():              d.line(face_landmarks[facial_feature], width=5)      pil_image.show() 

臉部的關鍵點包括:鼻子、嘴巴、眼睛、眉毛等,這裡還是用的上面成龍大哥的圖片,下面的結果輸出:

6、化妝

這部分是建立在第五部分基礎上的,得到的面部的特徵以後就可以進行自動化妝了,下面是具體的實現:

def demoFunc(pic_path="haiwang.jpg"):      '''      化妝      '''      image = face_recognition.load_image_file(pic_path)      face_landmarks_list = face_recognition.face_landmarks(image)      pil_image = Image.fromarray(image)      for face_landmarks in face_landmarks_list:          demo = ImageDraw.Draw(pil_image, 'RGBA')          demo.polygon(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 128))          demo.polygon(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 128))         demo.line(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 150), width=2)          demo.line(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 150), width=2)          demo.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128))          demo.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))          demo.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=2)          demo.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=2)          demo.polygon(face_landmarks['left_eye'], fill=(255, 255, 255, 30))          demo.polygon(face_landmarks['right_eye'], fill=(255, 255, 255, 30))          demo.line(face_landmarks['left_eye'] + [face_landmarks['left_eye'][0]], fill=(0, 0, 0, 110), width=2)          demo.line(face_landmarks['right_eye'] + [face_landmarks['right_eye'][0]], fill=(0, 0, 0, 110), width=2)          pil_image.show() 

這裡使用海王的一張圖片來進行測試,原始圖像如下所示:

處理後結果如下:

還可以是這樣的:

7、基於face_recognition構建自己的簡單人臉識別應用

上面介紹了很多face_recognition的應用,這裡才是最重要的內容我覺得是這樣的,基於已有的功能來實現我們自己的個性化應用,我這裡只是簡單的拋磚引玉,給出來自己的最最簡單的實現:

def faceRecognitionDemo(picDir='data/', test_pic='test.png'):      '''      基於 face_recognition 構建人臉識別模塊      '''      pic_list=os.listdir(picDir)      for one_pic in pic_list:          one_pic_path=picDir+one_pic          one_res=demo6(one_pic=one_pic_path,two_pic=test_pic)          one_name=one_pic.split('.')[0].strip()          if one_res:              print('This Person is: ', one_name)              break          else:              print('This Person is not: ', one_name) 

data文件夾數據截圖如下:

test.png內容如下:

結果輸出如下:

當然了,實時計算肯定當前的計算方式不能滿足的,這個只是一個最簡單的應用而已,只想在這裡拋磚引玉,這裡是通過調用了face_recognition接口的形式來完成相似判定的工作的,還有一種非常常見的辦法就是在得到人臉圖像的128維特徵向量之後就可以將人臉識別問題轉化為基於機器學習模型的一個簡單分類問題了,比如:SVM、RF、GBDT等都可以非常出色地完成上面的任務。

好了本文就到這裡結束了,歡迎交流!

 

相關焦點

  • 基於python+OpenCV模塊的人臉識別定位技術
    本文將基於OpenCV模塊,在windows作業系統上,利用python語言,進行人臉識別技術的研究。當然OpenCV的應用領域很廣,除了人臉識別之外,它還支持圖像分割、動作識別、視頻處理等技術。代碼分析下面我們對代碼進行分析,代碼如圖所示:一共不超過15行,當然這是建立在別人已有的數據上做的,如果自己寫的話,不會這麼簡單,我們這只是調用了別人的接口,而這個接口是開源的,共享的。代碼第1行導入opencv模塊。
  • 怎樣用3分鐘搭建 Python 人臉識別系統
    Face Recognition 使用的是 C++ 開源庫 dlib 通過深度學習模型構建的先進人臉識別系統,可通過 Python 接口或命令行工具對圖片中的人臉進行識別。
  • Python實現識別圖片中的所有人臉並顯示出來
    使用Python3實現識別圖片中的所有人臉並顯示出來,代碼如下:
  • 用python識別驗證碼
    今天,我們就簡單的說下,怎麼用python來處理驗證碼。(注意:我所有的python相關的文章用的都是python3。)準備工作1、tesseract-ocr軟體Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。
  • Python驗證碼識別:利用pytesser識別簡單圖形驗證碼
    ,涉及到計算機圖形學,機器學習,機器視覺,人工智慧等等高深領域……簡單地說,計算機圖形學的主要研究內容就是研究如何在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與算法。http://pythonware.com/products/pil/註:官網提供的安裝包是32位的,63位系統請前往這裡 http://www.lfd.uci.edu/~gohlke/pythonlibs/#pillow 下載替代包pillow。
  • 開箱即用的人臉識別算法大盤點
    從上面的流程可以看到,一個真正work的人臉識別系統,是包含多個流程的。在多數場合,中間還需要加一個"活體檢測"的步驟,也就是判斷人臉是真的人臉,還是別人拿照片或者視頻錄像假冒的;如果你是從視頻中檢測人臉,還需要加一個"人臉質量分"判斷,也就是判斷一個視頻序列中哪個人臉質量最好,然後將最好的這個人臉送入到人臉識別系統。
  • 濱州陽信縣工地人臉識別柵欄門系統多少錢
    而門禁系統在安全的居住環境中起到的重要作用得到越來越多的重視。目前國內的門禁系統以卡類設備、指紋設備或密碼設置為主。這些識別方式都要求人員近距離操作,當使用者雙手被佔用時則顯得極不方便,同時也帶來卡片或密碼丟失、遺忘,複製以及用的隱患和成本高的問題。而指紋識別,被網上叫座的了「密碼」,更加讓人覺得恐慌不安。
  • 探討人臉識別支付在AFC系統的應用
    繼二維碼支付、NFC支付在AFC系統應用之後,作為生物識別的人臉識別支付在AFC系統應用的需求,又一次被提了出來。  人臉識別是基於人的臉部特徵信息進行身份識別的一種生物識別技術,結合了計算機圖形學、可視化技術、機器學習、模式識別、專家系統、數字圖像處理等多種專業技術。  人臉識別技術在銀行、超市、安保等行業應用廣泛,但是在地鐵AFC行業尚未大規模採用。
  • 人臉識別系統的幾個過程淺析
    人臉識別(FaceRecognition,FR)是一種基於人的臉部特徵信息進行身份識別的一種生物識別技術。用攝像機或攝像頭採集含有人臉的圖像或視頻流,並自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。
  • 人臉識別技術原理與實現方式
    從細分產業來看,視頻監控是構建安防系統中的核心,在中國的安防產業中所佔市場份額最大。而人臉識別在視頻監控領域具有相當的優勢,應用前景廣闊。人臉檢測   人臉檢測算法繁多,我們採用由粗到精的高效方式,即先用計算量小的特徵快速過濾大量非人臉窗口圖像,然後用複雜特徵篩選人臉。這種方式能快速且高精度的檢測出正臉(人臉旋轉不超過45度)。該步驟旨在選取最佳候選框,減小非人臉區域的處理,從而減小後續人臉校準及比對的計算量。
  • 人臉識別系統應用優勢及組成
    一、人臉識別、人臉識別系統技術現狀   隨著科技的發展和技術的提高,很多公眾場所公司園區企業等出入口控制朝著智能安全高效管理方向發展,比如安裝部署出入門禁系統,通道閘機等,其中門禁系統中跟多趨向採用生物識別技術如人臉識別、人臉識別。
  • 人臉識別技術系統在「天網工程」的應用解決方案
    )等一系列基於人臉識別技術的應用系統。這些系統主要採用人臉檢測算法、人臉跟蹤算法、人臉質量評分算法以及人臉識別算法;專門針對人員監控、排查與檢索,是視頻分析、運動跟蹤、人臉檢測和識別技術在安防領域的全新綜合應用。人臉識別功能根據人臉數據的來源可以分為兩個方面:靜態人臉比對功能(人臉大庫檢索)和動態人臉比對功能(人員卡口黑名單實時比對)。
  • 人臉識別、虹膜識別驚豔東北大學,全國首個自動監考上線
    這種自動監考系統不僅全程答題在計算機上完成,徹底實現了無紙化考試,而且融合了當前最先進的人臉識別、虹膜識別等生物識別技術,可謂是智慧校園「殺手級」黑科技了。同時也是天誠盛業人臉識別、虹膜識別技術在構建智慧校園領域的一次重大突破!
  • 人臉識別系統過程主要有以下幾點?
    人臉識別系統一般分為以下三步:1.首先建立人臉的面像檔案。即用攝像機採集單位人員的人臉的面像文件或取他們的照片形成面像文件,並將這些面像文件生成面紋(Faceprint)編碼貯存起來。即用攝像機捕捉的當前出入人員的面像,或取照片輸入,並將當前的面像文件生成面紋編碼。
  • 人臉識別技術原理與工程實踐(10個月人臉識別領域實戰總結)
    前兩年,很多機場安檢都開始用上了人臉驗證;今年4月,很多一、二線城市的火車站也開通了「刷臉進站」的功能;北京的一些酒店開始使用人臉識別技術來做身份驗證。2 人臉識別應用場景(識別)我們再來看看幾個場景。第一個是刷臉的自動售貨機。當我第一次看到這個機器的時候就有個疑問:」現在人臉識別算法已經做到萬無一失了嗎,認錯人,扣錯錢怎麼辦?」
  • 揭秘:人臉識別系統能否識別雙胞胎呢?
    隨著人臉識別技術的應用場景越來越廣泛,不僅提高了工作效率,同時也較人工識別準確度大大提高。因為一些肉眼無法識別的特徵,機器卻能準確識別。然而,這並不是說,機器就能完全取代人工,比如,當人臉識別門禁監控系統遇上雙胞胎的時候,會發生什麼樣的事呢?能正確否識別出雙胞胎呢?
  • 好用≠濫用,人臉識別的公共應用邊界在哪裡?
    簡單來說,園區單方面更改合同,實屬違約,但人臉識別,可以正當使用;也就是說未來野生動物世界僅只保留「年卡刷臉」這一種入園方式,那麼年卡用戶也就沒有其他選擇了。「刷臉」入園,有沒有好處呢?現在指紋就能識別遊客身份,防止年卡被冒用,那麼,再來一套刷臉技術,實在不符合收集公民個人信息的「必要原則」和「最小夠用」標準。顯然,杭州野生動物世界成為這場人工智慧風口上的「趕時髦者」;指紋識別系統雖然好用,但略顯老套,人臉識別可是又先進又好用,所以,園方在忘記了還有一大批消費者還有指紋系統使用權的時候,就主動為消費者切換了這套刷臉系統。
  • 人臉識別系統的人臉辨認涉及哪些難點?
    目前,我國人臉識別技術取得一定進步,在各產業逐步實現初步應用,其中以身份驗證、支付、行政破案等等方面尤為突出,在我國市場已經開始普及,進入刷臉時代,大部分人對新興技術仍然保持開放和接受的態度,因此越來越多人響應趨勢和體驗使用。
  • 採用人臉識別訪客系統有什麼好處?
    打開APP 採用人臉識別訪客系統有什麼好處?   如今大部分登記部門都已選用人臉識別訪客來代替以往的手寫登記,人臉識別訪客一出現就迅速在市場中鋪設蔓延。那麼,人臉識別訪客的好,到底體現在哪裡呢?   以往人們採用手寫登記進行來訪者管理,雖然登記簿設置的填寫分類很全面,但常常有訪客為了方便而敷衍了事,再者就是字跡潦草,後期翻閱難以去辨認。
  • 人臉識別行業分析
    人臉識別,是基於人的臉部特徵信息進行身份識別的一種生物識別技術。通常採用攝像機或攝像頭採集含有人臉的圖像或視頻流,並自動在圖像中檢測和跟蹤人臉。人臉識別系統主要包括四個組成部分,分別為人臉圖像採集及檢測、人臉識別預處理、人臉圖像特徵提取以及匹配與識別。人臉識別與其它生物識別技術相比,優勢在於非接觸性、非侵擾性、硬體基礎完善、可拓展性。