中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

如何構(gòu)建自定義人臉識(shí)別數(shù)據(jù)集

2018-06-28    來源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用
本文介紹了構(gòu)建自定義人臉識(shí)別數(shù)據(jù)集的三種方法:使用 OpenCV 和 webcam 工具收集人臉圖像數(shù)據(jù);以編程的方式下載人臉圖像;手動(dòng)收集人臉圖像。

在接下來的幾篇博文中,作者將帶領(lǐng)大家訓(xùn)練一個(gè)「計(jì)算機(jī)視覺+深度學(xué)習(xí)」的模型來執(zhí)行人臉識(shí)別任務(wù)。但是,要想訓(xùn)練出能夠識(shí)別圖像或視頻流中人臉的模型,我們首先得收集人臉圖像的數(shù)據(jù)集。

如果你使用的是「Labeled Faces in the Wild」(LFW)這樣預(yù)先準(zhǔn)備好的數(shù)據(jù)集,那么你可以不用進(jìn)行這項(xiàng)困難的工作了。你可以使用我們下一篇博文中的方法創(chuàng)建自己的人臉識(shí)別應(yīng)用。

然而,對(duì)于大多數(shù)人來說,我們希望識(shí)別出的人臉往往不包含在任何現(xiàn)有數(shù)據(jù)集中,例如:我們自己的、朋友的、家人或者同事的人臉圖像。

為了完成這個(gè)任務(wù),我們需要收集我們想要識(shí)別的人臉樣本,并且以某種方式量化它們。

這個(gè)過程通常被稱為「人臉識(shí)別注冊(cè)」(facial recognition enrollment)。我們稱之為「注冊(cè)」是因?yàn)樵谶@個(gè)過程中,我們會(huì)將用戶注冊(cè)、登記為我們的數(shù)據(jù)集和應(yīng)用中的一個(gè)真人樣本。

本文將介紹注冊(cè)過程的第一步:創(chuàng)建自定義人臉識(shí)別數(shù)據(jù)集。

如何創(chuàng)建自定義人臉識(shí)別數(shù)據(jù)集

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

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

最后,我們將討論如何手動(dòng)收集人臉圖像,以及這種方法何時(shí)是適用的。

讓我們開始構(gòu)建人臉識(shí)別數(shù)據(jù)集吧!

方法 1:通過 OpenCV 和 webcam 進(jìn)行人臉注冊(cè)

 

 

圖 1:通過使用 OpenCV 和 webcam,我們可以檢測(cè)出視頻流中的人臉,并且將樣本存儲(chǔ)到磁盤上。這個(gè)過程可用于創(chuàng)建一個(gè)本地人臉識(shí)別數(shù)據(jù)集。

這種方法適用于以下情況:

1. 你要?jiǎng)?chuàng)建一個(gè)」能現(xiàn)場(chǎng)使用的」人臉識(shí)別系統(tǒng);

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

這樣的系統(tǒng)尤其適用于公司、學(xué)校或者其他人們每天親自出現(xiàn)在現(xiàn)場(chǎng)的組織。

為了收集這些人的人臉圖像樣本,我們可能需要將他們置于一個(gè)特殊的房間中,房間中事先安裝好了視頻攝影機(jī),用于:(1)檢測(cè)視頻流中人臉的 (x, y) 坐標(biāo);(2)將包含用戶人臉的視頻幀寫入磁盤。我們可能甚至需要好幾天或者幾周的時(shí)間執(zhí)行上述操作,以收集下列幾種情況下的人臉樣本:

不同的光照條件
一天中不同的時(shí)間
不同的情緒和情感狀態(tài)

通過收集不同情況下的人臉樣本,我們可以創(chuàng)建一個(gè)更加多樣化、更具代表性的特定用戶人臉圖像數(shù)據(jù)集。

接下來,我們使用一個(gè)簡(jiǎn)單的 Python 腳本構(gòu)建自定義人臉識(shí)別數(shù)據(jù)集。這個(gè) Python 腳本可以完成以下任務(wù):

1. 連接到我們的 webcam;
2. 檢測(cè)人臉;
3. 將包含人臉的視頻幀寫入磁盤。

想要獲取本文中使用的代碼,請(qǐng)滾動(dòng)到本文的「Downloads」部分。

準(zhǔn)備好之后,請(qǐng)打開 build_face_dataset.py 文件,然后我們來一步一步解讀這份代碼:

 

 

在 2-7 行中,我們導(dǎo)入了所需程序包。尤其是我們所需要的 Opencv 和 imutils 包。安裝 Opencv 的方法請(qǐng)參考我提供的這篇安裝指南(https://www.pyimagesearch.com/opencv-tutorials-resources-guides/)。而 imutils 包則可以很容易地通過 pip 工具進(jìn)行安裝或升級(jí):

$ pip install --upgrade imutils

如果你使用的是 Python 虛擬環(huán)境,請(qǐng)不要忘記使用 workon 命令!

環(huán)境安裝好之后,我們接下來將討論兩個(gè)需要用到的命令行參數(shù):

 

 

命令行參數(shù)會(huì)在運(yùn)行時(shí)被一個(gè)名為 argparse 的程序包(這個(gè)程序包會(huì)在安裝 Python 環(huán)境時(shí)被自動(dòng)安裝)解析。如果你對(duì)于 argparse 和命令行參數(shù)不太熟悉,我強(qiáng)烈推薦你迅速瀏覽這篇博文(https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/)。

我們有兩個(gè)需要用到的命令行參數(shù):

--cascade:哈爾級(jí)聯(lián)(Haar cascade)文件在磁盤上的路徑。

--output:輸出文件夾的路徑。人臉圖像會(huì)被存儲(chǔ)在這個(gè)文件夾中,因此我推薦你用人臉主人的名字來命名這個(gè)文件夾。例如,如果你收集的是「John Smith」的人臉圖像,你可以將所有的圖片存放在 dataset/john_smith 文件夾中。

下面,我們將加載人臉的哈爾級(jí)聯(lián)文件并且初始化視頻流:

 

 

在第 18 行中,我們加載了 OpenCV 的哈爾級(jí)聯(lián) detector。這個(gè) detector 會(huì)在接下來的逐幀循環(huán)中完成繁重的任務(wù)。

我們?cè)诘?24 行初始化并開始我們的視頻流。

注意:如果你使用的是樹莓派,請(qǐng)注釋掉第 24 行,并且取消第 25 行的注釋。

為了讓攝像頭預(yù)熱,我們簡(jiǎn)單地將程序暫停 2 秒(第 26 行)。

我們還初始化了一個(gè)計(jì)數(shù)器 total,用于表示在磁盤上存儲(chǔ)的人臉圖像數(shù)量(第 27 行)。

現(xiàn)在讓我們?cè)谝曨l流上進(jìn)行逐幀循環(huán):

 

 

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

從這一行起,我們獲取了一個(gè)視頻幀 frame,創(chuàng)建了該幀的一個(gè)副本,并且改變了圖像的尺寸(第 34-36 行)。

現(xiàn)在,是時(shí)候執(zhí)行人臉檢測(cè)了!

我們可以使用 detectMultiScale 方法檢測(cè)視頻幀 frame 中的人臉。該函數(shù)需要用到下列參數(shù):

image:一個(gè)灰度圖;
scaleFactor:指定在每個(gè)尺度上,圖像縮小多少;
minNeighbor:為了保證檢測(cè)的有效性,該參數(shù)指定每一個(gè)候選矩形邊界框需要有多少相鄰的檢測(cè)點(diǎn);

minSize:可能的最小圖片尺寸。
不幸的是,有時(shí)我們需要對(duì)這種方法進(jìn)行調(diào)優(yōu),以消除誤判或者檢測(cè)出一張完整的人臉,但是對(duì)于「近距離」拍攝的人臉圖像的檢測(cè)來說,這些參數(shù)是一個(gè)很好的起點(diǎn)。

話雖如此,你是否也在尋找一種更加先進(jìn)、更加可靠的方法呢?在之前的博文中(https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/),我用 OpenCV 和深度學(xué)習(xí)實(shí)現(xiàn)了人臉檢測(cè)。你可以通過文章中使用了預(yù)訓(xùn)練模型的深度學(xué)習(xí)方法很容易地更新本文中的腳本。該方法的好處是,不用調(diào)參并且訓(xùn)練十分快。

這種人臉識(shí)別方法的結(jié)果是一個(gè) rects(矩形邊界框)列表。在第 44、45 行中,我們?cè)?rects 上進(jìn)行循環(huán),并且在幀上畫出矩形邊框,以方便展示。

最后一步,我們將在循環(huán)中進(jìn)行兩個(gè)工作:(1)在屏幕上展示視頻幀;(2)處理按鍵響應(yīng)。具體代碼如下:

 

 

在第 48 行中,我們?cè)谄聊簧险故玖艘曨l幀,接下來在第 49 行中獲取了鍵入值。

根據(jù)按下的是「k」還是「q」,我們會(huì):

如果按下「k」鍵,我們將保留視頻幀并將它存儲(chǔ)到磁盤上(第 53-56 行),并且增加表示獲取到的總幀數(shù)的計(jì)數(shù)器 total(第 58 行)。我們需要在想保留的每一幀處按下「k」鍵。我建議保留不同角度、不同的幀區(qū)域、戴/不戴眼鏡等不同情況下拍攝的人臉圖像。

如果按下「q」鍵,則退出循環(huán),準(zhǔn)備退出腳本(quit)。

如果沒有按下任何鍵,我們就回到循環(huán)的開頭,從視頻流中獲取一幀。

最終我們將在終端上打印出最終存儲(chǔ)的圖像數(shù)量,并進(jìn)行清理:

 

 

現(xiàn)在讓我們運(yùn)行腳本,收集人臉圖像吧!

請(qǐng)確保你已經(jīng)從本文的「Downloads」部分下載了代碼和哈爾級(jí)聯(lián)。

在你的終端設(shè)備中執(zhí)行下列命令:

$ 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...

 

 

在運(yùn)行完腳本之后,我們發(fā)現(xiàn)有 6 張圖像被存儲(chǔ)到了 dataset 文件夾的 adrian 子文件夾中:

$ ls dataset/adrian
00000.png 00002.png 00004.png
00001.png 00003.png 00005.png

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

通過這種方式可以強(qiáng)化你的自定義人臉識(shí)別數(shù)據(jù)集的組織結(jié)構(gòu)。

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

 

 

圖 2:另一種構(gòu)建人臉識(shí)別數(shù)據(jù)集的方法(如果此人是公眾人物,或者在網(wǎng)絡(luò)上出現(xiàn)過),是通過一個(gè)腳本在谷歌上進(jìn)行圖像搜索,或者使用一個(gè)利用了 Bing 圖像搜索 API 的 Python 腳本。

如果你不能在現(xiàn)場(chǎng)拍攝一個(gè)人的圖像,或者他們是在網(wǎng)絡(luò)上存在感很強(qiáng)的公眾人物(在某種程度上),你可以通過各種平臺(tái)上的 API 以編程的方式下載他們的人臉圖像樣本。選擇哪種 API 很大程度上取決于你想要收集的是誰的人臉圖像。

例如,如果一個(gè)人一直在 Twitter 或 Instagram 上發(fā)帖,你可能想要用其中一種(或者其他的)社交網(wǎng)絡(luò) API 獲取人臉圖像。

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

使用這篇文章中的方法(https://www.pyimagesearch.com/2017/12/04/how-to-create-a-deep-learning-dataset-using-google-images/),你可以使用谷歌圖像「Google Images」手動(dòng)+編程地為給定的查詢下載示例圖像。

在我看來,一個(gè)更好的選擇可能是,使用 Bing 的圖像搜索 API,它是完全自動(dòng)化的且不需要手動(dòng)干預(yù)。我在這篇文章中實(shí)現(xiàn)了這個(gè)全自動(dòng)化方法(https://www.pyimagesearch.com/2018/04/09/how-to-quickly-build-a-deep-learning-image-dataset/)。

使用后一種方法,我可以從《侏羅紀(jì)公園》和《侏羅紀(jì)世界》中下載 218 張人臉圖像。

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

$ mkdir dataset/owen_grady
$ python search_bing_api.py --query "owen grady" --output dataset/owen_grady

現(xiàn)在讓我們來看整個(gè)數(shù)據(jù)集(刪除不包含該人物人臉的圖像后):

 

 

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

 

 

圖 3:通過 Python 和 Bing 圖像搜索 API 以編程的方式創(chuàng)建出的人臉識(shí)別數(shù)據(jù)集示例。圖中是《侏羅紀(jì)公園》系列電影中的六個(gè)人物。

方法 3:手動(dòng)收集人臉圖像

 

 

圖 4:手動(dòng)下載人臉圖像是最不可取的選項(xiàng),但你不該忘記它。當(dāng)一個(gè)人并不經(jīng)常在網(wǎng)絡(luò)上出現(xiàn),或者圖像沒有標(biāo)簽時(shí),你可以使用這種方法。

最后一種創(chuàng)建自定義人臉識(shí)別數(shù)據(jù)集的方法也是最不可取的一種,是手動(dòng)尋找并存儲(chǔ)人臉圖像樣本。

這種方法顯然是最乏味的,且需要耗費(fèi)最多的人工工作時(shí)間——通常我們更喜歡「自動(dòng)化」的解決方案,但是在某些情況下,你不得不付諸人工。

使用此方法,你需要手動(dòng)檢查:

搜索引擎的搜索結(jié)果(例如,谷歌和 Bing)
社交網(wǎng)絡(luò)資料(Facebook、Twitter、Instagram、SnapChat 等)
圖片分享服務(wù)(Google Photos、Flickr 等)
然后手動(dòng)將這些圖像存儲(chǔ)到磁盤上。

在這些場(chǎng)景下,用戶通常具備某種類型的公開資料,但是比以編程的方式用爬蟲爬到的圖像要少得多。

PyImageSearch Gurus(免費(fèi))示范課程

 

 

圖 5:在 PyImageSearch Gurus 課程(https://www.pyimagesearch.com/pyimagesearch-gurus/)中,你將學(xué)會(huì)構(gòu)建人臉識(shí)別安防系統(tǒng)。當(dāng)一個(gè)未經(jīng)授權(quán)的入侵者坐在你的桌前時(shí),它會(huì)通過文本消息(包含圖像)提醒你。

總結(jié)

本文介紹了三種為人臉識(shí)別任務(wù)創(chuàng)建自定義人臉數(shù)據(jù)集的方法。

你具體會(huì)選擇哪種方法完全取決于你自己的人臉識(shí)別應(yīng)用。

如果你正在構(gòu)建一個(gè)「現(xiàn)場(chǎng)」的人臉識(shí)別系統(tǒng),例如用于教室、公司或其他組織的人臉識(shí)別系統(tǒng),你可能會(huì)讓用戶進(jìn)入專門用于收集示例人臉圖像的房間,然后在那里繼續(xù)從視頻流中捕獲人臉圖像 (方法 1)。

另一方面,如果你正在構(gòu)建一個(gè)包含公眾人物、名人、運(yùn)動(dòng)員等的人臉識(shí)別系統(tǒng),那么在網(wǎng)上可能有他們足夠多的人臉圖像樣本。在這種情況下,你可以利用現(xiàn)有的 API 以編程方式下載人臉圖像樣本 (方法 2)。

最后,如果你試圖識(shí)別的面孔在網(wǎng)上沒有公開的個(gè)人資料(或者個(gè)人資料非常有限),你可能需要手動(dòng)收集和管理人臉數(shù)據(jù)集 (方法 3)。這顯然是最人工、最繁瑣的方法,但在某些情況下,如果你想識(shí)別某些面孔,可能需要使用這種方法。

原文鏈接:https://www.pyimagesearch.com/2018/06/11/how-to-build-a-custom-face-recognition-dataset/

標(biāo)簽: Google 代碼 谷歌 腳本 搜索 搜索引擎 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:數(shù)據(jù)科學(xué)20個(gè)最好的Python庫(kù)

下一篇:將會(huì)改變?nèi)藗儗?duì)大數(shù)據(jù)增長(zhǎng)看法的10個(gè)圖表