如何構建自定義人臉識別數據集

選自pyimagesearch,做者:Adrian Rosebrock,機器之心編譯。html

本文介紹了構建自定義人臉識別數據集的三種方法:使用 OpenCV 和 webcam 工具收集人臉圖像數據;以編程的方式下載人臉圖像;手動收集人臉圖像。

在接下來的幾篇博文中,做者將帶領你們訓練一個「計算機視覺+深度學習」的模型來執行人臉識別任務。可是,要想訓練出可以識別圖像或視頻流中人臉的模型,咱們首先得收集人臉圖像的數據集。python

若是你使用的是「Labeled Faces in the Wild」(LFW)這樣預先準備好的數據集,那麼你能夠不用進行這項困難的工做了。你可使用咱們下一篇博文中的方法建立本身的人臉識別應用。web

然而,對於大多數人來講,咱們但願識別出的人臉每每不包含在任何現有數據集中,例如:咱們本身的、朋友的、家人或者同事的人臉圖像。編程

爲了完成這個任務,咱們須要收集咱們想要識別的人臉樣本,而且以某種方式量化它們。api

這個過程一般被稱爲「人臉識別註冊」(facial recognition enrollment)。咱們稱之爲「註冊」是由於在這個過程當中,咱們會將用戶註冊、登記爲咱們的數據集和應用中的一個真人樣本。bash

本文將介紹註冊過程的第一步:建立自定義人臉識別數據集。網絡


如何建立自定義人臉識別數據集ide

本教程中,咱們將介紹 3 種建立自定義人臉識別數據集的方法。第一種方法使用 OpenCV 和 webcam 工具完成兩個任務:(1)在視頻中檢測出人臉;(2)將人臉圖像或視頻幀的樣本保存到磁盤上。函數

第二種方法將討論如何以編程的方式下載人臉圖像。工具

最後,咱們將討論如何手動收集人臉圖像,以及這種方法什麼時候是適用的。

讓咱們開始構建人臉識別數據集吧!


方法 1:經過 OpenCV 和 webcam 進行人臉註冊

圖 1:經過使用 OpenCV 和 webcam,咱們能夠檢測出視頻流中的人臉,而且將樣本存儲到磁盤上。這個過程可用於建立一個本地人臉識別數據集。

這種方法適用於如下狀況:

1. 你要建立一個」能現場使用的」人臉識別系統;

2. 你須要擁有接觸特定人的物理途徑,以收集他們的人臉圖像數據。

這樣的系統尤爲適用於公司、學校或者其餘人們天天親自出如今現場的組織。

爲了收集這些人的人臉圖像樣本,咱們可能須要將他們置於一個特殊的房間中,房間中事先安裝好了視頻攝影機,用於:(1)檢測視頻流中人臉的 (x, y) 座標;(2)將包含用戶人臉的視頻幀寫入磁盤。咱們可能甚至須要好幾天或者幾周的時間執行上述操做,以收集下列幾種狀況下的人臉樣本:

  • 不一樣的光照條件
  • 一天中不一樣的時間
  • 不一樣的情緒和情感狀態

經過收集不一樣狀況下的人臉樣本,咱們能夠建立一個更加多樣化、更具表明性的特定用戶人臉圖像數據集。

接下來,咱們使用一個簡單的 Python 腳本構建自定義人臉識別數據集。這個 Python 腳本能夠完成如下任務:

1. 鏈接到咱們的 webcam;

2. 檢測人臉;

3. 將包含人臉的視頻幀寫入磁盤。

想要獲取本文中使用的代碼,請滾動到本文的「Downloads」部分。

準備好以後,請打開 build_face_dataset.py 文件,而後咱們來一步一步解讀這份代碼:

在 2-7 行中,咱們導入了所需程序包。尤爲是咱們所須要的 Opencv 和 imutils 包。安裝 Opencv 的方法請參考我提供的這篇安裝指南(www.pyimagesearch.com/opencv-tuto…)。而 imutils 包則能夠很容易地經過 pip 工具進行安裝或升級:

$ pip install --upgrade imutils
複製代碼

若是你使用的是 Python 虛擬環境,請不要忘記使用 workon 命令!

環境安裝好以後,咱們接下來將討論兩個須要用到的命令行參數:

命令行參數會在運行時被一個名爲 argparse 的程序包(這個程序包會在安裝 Python 環境時被自動安裝)解析。若是你對於 argparse 和命令行參數不太熟悉,我強烈推薦你迅速瀏覽這篇博文(www.pyimagesearch.com/2018/03/12/…)。

咱們有兩個須要用到的命令行參數:

  • --cascade:哈爾級聯(Haar cascade)文件在磁盤上的路徑。
  • --output:輸出文件夾的路徑。人臉圖像會被存儲在這個文件夾中,所以我推薦你用人臉主人的名字來命名這個文件夾。例如,若是你收集的是「John Smith」的人臉圖像,你能夠將全部的圖片存放在 dataset/john_smith 文件夾中。

下面,咱們將加載人臉的哈爾級聯文件而且初始化視頻流:

在第 18 行中,咱們加載了 OpenCV 的哈爾級聯 detector。這個 detector 會在接下來的逐幀循環中完成繁重的任務。

咱們在第 24 行初始化並開始咱們的視頻流。

注意:若是你使用的是樹莓派,請註釋掉第 24 行,而且取消第 25 行的註釋。

爲了讓攝像頭預熱,咱們簡單地將程序暫停 2 秒(第 26 行)。

咱們還初始化了一個計數器 total,用於表示在磁盤上存儲的人臉圖像數量(第 27 行)。

如今讓咱們在視頻流上進行逐幀循環:

在第 30 行中,咱們開始循環(按下「q」鍵則退出循環)。

從這一行起,咱們獲取了一個視頻幀 frame,建立了該幀的一個副本,而且改變了圖像的尺寸(第 34-36 行)。

如今,是時候執行人臉檢測了!

咱們可使用 detectMultiScale 方法檢測視頻幀 frame 中的人臉。該函數須要用到下列參數:

  • image:一個灰度圖;
  • scaleFactor:指定在每一個尺度上,圖像縮小多少;
  • minNeighbor:爲了保證檢測的有效性,該參數指定每個候選矩形邊界框須要有多少相鄰的檢測點;
  • minSize:可能的最小圖片尺寸。

不幸的是,有時咱們須要對這種方法進行調優,以消除誤判或者檢測出一張完整的人臉,可是對於「近距離」拍攝的人臉圖像的檢測來講,這些參數是一個很好的起點。

話雖如此,你是否也在尋找一種更加先進、更加可靠的方法呢?在以前的博文中(www.pyimagesearch.com/2018/02/26/…),我用 OpenCV 和深度學習實現了人臉檢測。你能夠經過文章中使用了預訓練模型的深度學習方法很容易地更新本文中的腳本。該方法的好處是,不用調參而且訓練十分快。

這種人臉識別方法的結果是一個 rects(矩形邊界框)列表。在第 4四、45 行中,咱們在 rects 上進行循環,而且在幀上畫出矩形邊框,以方便展現。

最後一步,咱們將在循環中進行兩個工做:(1)在屏幕上展現視頻幀;(2)處理按鍵響應。具體代碼以下:

在第 48 行中,咱們在屏幕上展現了視頻幀,接下來在第 49 行中獲取了鍵入值。

根據按下的是「k」仍是「q」,咱們會:

  • 若是按下「k」鍵,咱們將保留視頻幀並將它存儲到磁盤上(第 53-56 行),而且增長表示獲取到的總幀數的計數器 total(第 58 行)。咱們須要在想保留的每一幀處按下「k」鍵。我建議保留不一樣角度、不一樣的幀區域、戴/不戴眼鏡等不一樣狀況下拍攝的人臉圖像。
  • 若是按下「q」鍵,則退出循環,準備退出腳本(quit)。

若是沒有按下任何鍵,咱們就回到循環的開頭,從視頻流中獲取一幀。

最終咱們將在終端上打印出最終存儲的圖像數量,並進行清理:

如今讓咱們運行腳本,收集人臉圖像吧!

請確保你已經從本文的「Downloads」部分下載了代碼和哈爾級聯。

在你的終端設備中執行下列命令:

$ python build_face_dataset.py --cascade haarcascade_frontalface_default.xml \
    --output dataset/adrian
[INFO] starting video stream...
[INFO] 6 face images stored
[INFO] cleaning up...
複製代碼
如何構建自定義人臉識別數據集_騰訊視頻​

在運行完腳本以後,咱們發現有 6 張圖像被存儲到了 dataset 文件夾的 adrian 子文件夾中:

$ ls dataset/adrian
00000.png    00002.png   00004.png
00001.png    00003.png   00005.png
複製代碼

我建議將人臉圖像樣本存在以圖像所屬人的名字命名的子文件夾中。

經過這種方式能夠強化你的自定義人臉識別數據集的組織結構。


方法 2:經過編程下載人臉圖像

圖 2:另外一種構建人臉識別數據集的方法(若是此人是公衆人物,或者在網絡上出現過),是經過一個腳本在谷歌上進行圖像搜索,或者使用一個利用了 Bing 圖像搜索 API 的 Python 腳本。


若是你不能在現場拍攝一我的的圖像,或者他們是在網絡上存在感很強的公衆人物(在某種程度上),你能夠經過各類平臺上的 API 以編程的方式下載他們的人臉圖像樣本。選擇哪一種 API 很大程度上取決於你想要收集的是誰的人臉圖像。

例如,若是一我的一直在 Twitter 或 Instagram 上發帖,你可能想要用其中一種(或者其餘的)社交網絡 API 獲取人臉圖像。

另外一種選擇是,使用像谷歌或 Bing 這樣的搜索引擎:

  • 使用這篇文章中的方法(www.pyimagesearch.com/2017/12/04/…),你可使用谷歌圖像「Google Images」手動+編程地爲給定的查詢下載示例圖像。
  • 在我看來,一個更好的選擇多是,使用 Bing 的圖像搜索 API,它是徹底自動化的且不須要手動干預。我在這篇文章中實現了這個全自動化方法(www.pyimagesearch.com/2018/04/09/…)。

使用後一種方法,我能夠從《侏羅紀公園》和《侏羅紀世界》中下載 218 張人臉圖像。

經過 Bing 圖像搜索 API 下載 Owen Grady 的人臉圖像的命令示例以下:

$ mkdir dataset/owen_grady
$ python search_bing_api.py --query "owen grady" --output dataset/owen_grady
複製代碼

如今讓咱們來看整個數據集(刪除不包含該人物人臉的圖像後):

$ tree jp_dataset --filelimit 10
jp_dataset
├── alan_grant [22 entries]
├── claire_dearing [53 entries]
├── ellie_sattler [31 entries]
├── ian_malcolm [41 entries]
├── john_hammond [36 entries]
└── owen_grady [35 entries]

6 directories, 0 files
複製代碼

在短短 20 多分鐘內(包括刪除誤判樣本的時間),我就能收集到《侏羅紀公園》/《侏羅紀世界》的自定義人臉數據集:

圖 3:經過 Python 和 Bing 圖像搜索 API 以編程的方式建立出的人臉識別數據集示例。圖中是《侏羅紀公園》系列電影中的六我的物。


方法 3:手動收集人臉圖像

圖 4:手動下載人臉圖像是最不可取的選項,但你不應忘記它。當一我的並不常常在網絡上出現,或者圖像沒有標籤時,你可使用這種方法。


最後一種建立自定義人臉識別數據集的方法也是最不可取的一種,是手動尋找並存儲人臉圖像樣本。

這種方法顯然是最乏味的,且須要耗費最多的人工工做時間——一般咱們更喜歡「自動化」的解決方案,可是在某些狀況下,你不得不付諸人工。

使用此方法,你須要手動檢查:

  • 搜索引擎的搜索結果(例如,谷歌和 Bing)
  • 社交網絡資料(Facebook、Twitter、Instagram、SnapChat 等)
  • 圖片分享服務(Google Photos、Flickr 等)

而後手動將這些圖像存儲到磁盤上。

在這些場景下,用戶一般具有某種類型的公開資料,可是比以編程的方式用爬蟲爬到的圖像要少得多。


PyImageSearch Gurus(免費)示範課程

圖 5:在 PyImageSearch Gurus 課程(www.pyimagesearch.com/pyimagesear…)中,你將學會構建人臉識別安防系統。當一個未經受權的入侵者坐在你的桌前時,它會經過文本消息(包含圖像)提醒你。


總結

本文介紹了三種爲人臉識別任務建立自定義人臉數據集的方法。

你具體會選擇哪一種方法徹底取決於你本身的人臉識別應用。

若是你正在構建一個「現場」的人臉識別系統,例如用於教室、公司或其餘組織的人臉識別系統,你可能會讓用戶進入專門用於收集示例人臉圖像的房間,而後在那裏繼續從視頻流中捕獲人臉圖像 (方法 1)。

另外一方面,若是你正在構建一個包含公衆人物、名人、運動員等的人臉識別系統,那麼在網上可能有他們足夠多的人臉圖像樣本。在這種狀況下,你能夠利用現有的 API 以編程方式下載人臉圖像樣本 (方法 2)。

最後,若是你試圖識別的面孔在網上沒有公開的我的資料(或者我的資料很是有限),你可能須要手動收集和管理人臉數據集 (方法 3)。這顯然是最人工、最繁瑣的方法,但在某些狀況下,若是你想識別某些面孔,可能須要使用這種方法。

原文連接:www.pyimagesearch.com/2018/06/11/…

相關文章
相關標籤/搜索