Python 實現人臉檢測並不難,50 行代碼搞定!

2022-02-07 Python編程棧

現在的人臉識別技術已經得到了非常廣泛的應用,支付領域、身份驗證、美顏相機裡都有它的應用。用iPhone的同學們應該對下面的功能比較熟悉

iPhone的照片中有一個「人物」的功能,能夠將照片裡的人臉識別出來並分類,背後的原理也是人臉識別技術。

這篇文章主要介紹怎樣用Python實現人臉檢測。人臉檢測是人臉識別的基礎。人臉檢測的目的是識別出照片裡的人臉並定位面部特徵點,人臉識別是在人臉檢測的基礎上進一步告訴你這個人是誰。

好了,介紹就到這裡。接下來,開始準備我們的環境。

準備工作

本文的人臉檢測基於dlib,dlib依賴Boost和cmake,所以首先需要安裝這些包,以Ubuntu為例:

$ sudo apt-get install build-essential cmake$ sudo apt-get install libgtk-3-dev$ sudo apt-get install libboost-all-dev

我們的程序中還用到numpy,opencv,所以也需要安裝這些庫:

$ pip install numpy$ pip install scipy$ pip install opencv-python$ pip install dlib

人臉檢測基於事先訓練好的模型數據,從這裡可以下到模型數據

http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

下載到本地路徑後解壓,記下解壓後的文件路徑,程序中會用到。

dlib的人臉特徵點

上面下載的模型數據是用來估計人臉上68個特徵點(x, y)的坐標位置,這68個坐標點的位置如下圖所示:

我們的程序將包含兩個步驟:

人臉檢測代碼

我們先來定義幾個工具函數:

def rect_to_bb(rect): x = rect.left() y = rect.top() w = rect.right() - x h = rect.bottom() - y return (x, y, w, h)

這個函數裡的rect是dlib臉部區域檢測的輸出。這裡將rect轉換成一個序列,序列的內容是矩形區域的邊界信息。

def shape_to_np(shape, dtype="int"):

coords = np.zeros((68, 2), dtype=dtype)

for i in range(0, 68):

coords[i] = (shape.part(i).x, shape.part(i).y)

return coords

這個函數裡的shape是dlib臉部特徵檢測的輸出,一個shape裡包含了前面說到的臉部特徵的68個點。這個函數將shape轉換成Numpy array,為方便後續處理。

def resize(image, width=1200):
r = width * 1.0 / image.shape[1]
dim = (width, int(image.shape[0] * r))
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
return resized

這個函數裡的image就是我們要檢測的圖片。在人臉檢測程序的最後,我們會顯示檢測的結果圖片來驗證,這裡做resize是為了避免圖片過大,超出屏幕範圍。

接下來,開始我們的主程序部分

import sys
import numpy as np
import dlib
import cv2
if len(sys.argv) < 2:
sys.exit(1)
image_file = sys.argv[1]
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

我們從sys.argv[1]參數中讀取要檢測人臉的圖片,接下來初始化人臉區域檢測的detector和人臉特徵檢測的predictor。shape_predictor中的參數就是我們之前解壓後的文件的路徑。

image = cv2.imread(image_file)
image = resize(image, width=1200)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rects = detector(gray, 1)

在檢測特徵區域前,我們先要檢測人臉區域。這段代碼調用opencv加載圖片,resize到合適的大小,轉成灰度圖,最後用detector檢測臉部區域。因為一張照片可能包含多張臉,所以這裡得到的是一個包含多張臉的信息的數組rects。

for (i, rect) in enumerate(rects):
shape = predictor(gray, rect)
shape = shape_to_np(shape)
(x, y, w, h) = rect_to_bb(rect)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image, "Face #{}".format(i + 1), (x - 10, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
for (x, y) in shape:
cv2.circle(image, (x, y), 2, (0, 0, 255), -1)
cv2.imshow("Output", image)
cv2.waitKey(0)

對於每一張檢測到的臉,我們進一步檢測臉部的特徵(鼻子、眼睛、眉毛等)。對於臉部區域,我們用綠色的框在照片上標出;對於臉部特徵,我們用紅色的點標出來。

最後我們把加了檢測標識的照片顯示出來,waitKey(0)表示按任意鍵可退出程序。

測試

接下來是令人興奮的時刻,檢驗我們結果的時刻到來了。

原始圖片:

程序識別效果圖片:

可以看到臉部區域被綠色的長方形框起來了,臉上的特徵(鼻子,眼睛等)被紅色點點標識出來了。

是不是很簡單?

乾貨分享

有乾貨,猛戳下面的閱讀原文↓↓↓ 據說點」好看2019一定加薪!!

相關焦點

  • 10行代碼實現python人臉識別
    而且現在各大廠商也都提供了人臉識別的API接口供我們調用,可以說幾行代碼就可以完成人臉識別。但是人臉識別的根本還是基於圖像處理。在Python中最強大的圖像處理庫就是OpenCV。OpenCV簡介OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上。
  • 藉助攝像頭在Python中實現人臉檢測
    本篇博客是《25行Python代碼完成人臉識別》的後續,閱讀前請確認你已經看過了前篇。正如前篇所提,我們可以輕鬆地把在圖像中的人臉檢測技術通過攝像頭在視頻中運用——這正是本文將詳細介紹的。在評論區提問前請注意:1. 不要略過本文直接運行代碼。不僅要能正確運行,你還要明白如何調試代碼。2.
  • 用Python進行人臉識別「包括原始碼」
    Python可以從圖像或視頻中檢測和識別你的臉。人臉檢測與識別是計算機視覺領域的研究熱點之一。
  • 人臉識別簡介(使用Python代碼)
    本文就是如何構建人臉識別器的一則指南,在文章中,首先我們會介紹這項技術的基本原理,然後用一個簡單案例演示如何用Python來實現。在理解人臉識別的工作原理之前,我們先來看看什麼是特徵向量。機器學習算法的本質是將數據集中的所有樣本作為輸入,從數據中學習「知識」,簡而言之,算法會遍歷數據並識別數據中的模式。以
  • 使用Python+OpenCV+Dlib實現人臉檢測與人臉特徵關鍵點識別
    今天,我們將學習如何檢測圖像中的人臉並提取面部特徵
  • 畢業設計| 樹莓派3B+與opencv3+PyQt5實現人臉識別門禁系統
    就是opencv-python庫中有的,opencv-conteib-python庫中都有,opencv-contrib-python庫中有的opencv-python庫中不一定有。安裝opencv-contrib-python庫就行了理論上,我沒試過,可以試試,不然就兩個都安裝吧,反正不大。◆ 樹莓派上1)裝系統,網上很多教程,自己搞定。
  • 50行Python代碼實現經典遊戲,不僅是划水神器,更是學習利器!
    那麼,今天要介紹的這款Python項目就可以輕鬆實現你成為遊戲開發者的想法,實現前面提到的這些經典遊戲只需要50-100代碼即可完成。但是,free-python-games這個項目讓我眼前一亮,終於找到了一個合適的Python學習項目。當年,它對於成年人同樣適用、有價值。我之所以介紹這款項目,不單單是它實現了讓人回到童年的經典遊戲。更重要的原因是它能夠作為一個Python學習、鍛鍊探索和理解能力的一款好工具。
  • 用dlib實現人臉識別的技巧
    很多人都認為人臉識別是一項非常難以實現的工作,看到名字就害怕,然後心懷忐忑到網上一搜,看到網上N頁的教程立馬就放棄了。這些人裡包括曾經的我自己。其實如果如果你不是非要深究其中的原理,只是要實現這一工作的話,人臉識別也沒那麼難。今天我們就來看看如何在40行代碼以內簡單地實現人臉識別。
  • Python實現人臉口罩檢測!這玩意太強大了啊!
    由於疫情的影響,人臉口罩檢測系統的開發成為很多人爭相開發的一種算法。很多公司或者個人都開源了他們很多的代碼或者SDK。
  • 人臉檢測實戰終極:使用 OpenCV 和 Python 進行人臉對齊
    然後,我們將創建一個示例驅動程序 Python 腳本來接受輸入圖像、檢測人臉並對齊它們。最後,我們將回顧我們使用 OpenCV 過程進行人臉對齊的結果。實現面部矯正器面部對齊算法本身基於 Mastering OpenCV with Practical Computer Vision Projects (Baggio, 2012) 的第 8 章,如果您有 C++ 背景或興趣,我強烈推薦它。本書在 GitHub 上提供了開放訪問的代碼示例。
  • Python實現手勢識別
    ,python基本語法,圖像處理基礎知識。最終實現結果:獲取視頻(攝像頭)這部分沒啥說的,就是獲取攝像頭。)cv2.destroyAllWindows()膚色檢測這裡使用的是橢圓膚色檢測模型在RGB空間裡人臉的膚色受亮度影響相當大,所以膚色點很難從非膚色點中分離出來,也就是說在此空間經過處理後,膚色點是離散的點,中間嵌有很多非膚色,這為膚色區域標定(人臉標定、眼睛等)帶來了難題。
  • 1 行 Python 代碼幹了妹子一天的工作
    表格為替代品):於是我馬上想到了pandas,想著這麼強大的函數肯定有這個功能,於是我開始翻閱資料,沒想到還真找到了,而且僅用三行代碼就搞定了,驚的朋友直呼python牛批下面個大家詳細介紹一下整個過程1.正確讀取表格首先按照傳統的方式讀表格:import pandas as pddata1 = pd.read_excel('高中生數量.xlsx'
  • OpenCV人臉識別之一:數據收集和預處理
    本系列人臉識別文章用的是opencv2,最新版的opencv3.2的代碼請參考文章:《OpenCV之識別自己的臉——C++源碼放送》;《人臉識別源碼運行指南》(小編附在文末)前段時間對人臉檢測進行了一些嘗試:人臉檢測(C++/Python)(http://www.jianshu.com/p/504c081d7397)但是檢測和識別是不同的,檢測解決的問題是圖片中有沒有人臉;而識別解決的問題是
  • 太強了,1行python代碼幹了妹子一天的工作
    於是我馬上想到了pandas,想著這麼強大的函數肯定有這個功能,於是我開始翻閱資料,沒想到還真找到了,而且僅用三行代碼就搞定了,驚的朋友直呼python牛批發現索引列沒有被識別,產生了Unnamed: 0列,所以我們應該把第一列設置為索引列,代碼如下:import pandas
  • 百度飛槳口罩人臉檢測與識別模型再升級,視頻教學帶你實戰
    2月13日《百度開源業內首個口罩人臉檢測及分類模型》文章中介紹,該模型可以有效檢測在密集人流區域中攜帶和未攜戴口罩的所有人臉,同時判斷是否佩戴口罩。在技術討論群裡,廣大開發者針對口罩人臉檢測與分類模型的技術應用展開了充分的討論,有些開發者實戰反饋,模型在實際場景下還是有一些提升空間。
  • 【附完整代碼:AI實戰】動手編寫人臉識別
    、美顏,甚至支付寶還推出了刷臉支付、建設銀行還實現了刷臉取錢……,可見人臉識別的用處非常廣。 接下來將在之前我們搭建好的AI基礎環境上(見文章:手把手教你搭建AI基礎環境),實現人臉識別模型。使用OpenCV檢測人臉,先加載OpenCV的人臉檢測分類器代碼如下:# 1、使用 opencv 檢測人臉#
  • 手把手教你運用Python實現進階版人臉識別
    使用到的庫:dlib+Opencvpython版本:3.8編譯環境:Jupyter Notebook (Anaconda3)首選抓取多張圖片,從中獲取特徵數據集和平均特徵值然後寫入csv文件 -  計算特徵數據集的歐式距離作對比:首先使用Opencv庫將攝像頭中的人臉框出來,再將攝像頭中採取到的人臉特徵值與數據集中的每個人的特徵均值作對比
  • 動手實操 | 如何用 Python 實現人臉識別,證明這個楊冪是那個楊冪?
    人臉特徵提取的步驟真正的人臉識別需要很多的知識,大體上粗略的可以分為以下步驟:  1.人臉檢測(從圖片中找到人臉):返回人臉位置和大小的參數  2.人臉特徵定位:一般 69 點或者 106 個點對人臉的特徵定位,技術上有 Adaboost&haar,以及 MSRA 的 alignment。  3.人臉特徵歸一化(幾何歸一/灰度歸一):前者對圖像進行仿射變化使得不同的臉可以進行比對,後者則能使圖像展現更多的細節以及減弱光線光照的應用。  4.特徵提取-特徵後期融合。
  • python3+dlib人臉識別及情緒分析
    由於人感情的複雜性,這些表情確實不能完完全全的代表一個人內心深處的情緒波動,如要提高判斷的準確性,則需要心率檢測、語音處理等綜合評價。1、安裝VS2015,因為最新版的dlib-19.10需要這個版本的vscode2、安裝opencv(whl方式安裝):從pythonlibs下載需要的版本whl文件,比如(opencv_python?
  • 瀏覽器控制臺7行代碼的人臉識別
    今天要講的是調用face-api.js來識別上面的美女face-api.js是github上的一個人臉識別庫,支持前端識別。網上有不少這方面的教程,不過大都千篇一律,新手想照著做的話還是有很大的難度。大噴噴打算放棄編程工具,用chrome瀏覽器的控制臺一行行敲出這個人臉識別,同時帶大家踩踩會遇到的坑。