當前位置:
首頁 > 知識 > 想要訓練專屬人臉識別模型?先掌握構建人臉數據集的三種絕招

想要訓練專屬人臉識別模型?先掌握構建人臉數據集的三種絕招

雷鋒網 AI 研習社按,隨著深度學習的發展,很多技術已經落地,成為我們每天都能接觸到的產品,人臉識別就是其中之一。人臉識別的應用範圍很廣,涉及上下班打卡、門禁、設備登錄、機場、公共區域的監控等多個領域。

我們可以自己訓練定製化的人臉識別模型,但在訓練模型識別圖片或視頻中的人臉之前,最重要的一個步驟是收集人臉數據集。如果使用已經設計好的公開數據集,比如 Labeled Faces in the Wild(LFW),這時候最難的一部分工作已經完成了,大家可以直接使用各種模型創造自己的人臉識別應用。

但是對於大多數人來說,我們想要識別的並不是目前開源的人臉數據集中的人臉,而是我們自己、朋友、家人、同事等等的臉。為了實現這個目標,我們需要收集自己想要識別的人臉,並按照某種方式處理好它們。這個過程通常被稱為人臉登記,我們將用戶作為一個樣本『登記』或者『註冊』到我們的數據集中。下面會介紹三種方法進行人臉登記,大家可以根據自己的情況選擇最合適的方法。


如何創建定製的人臉識別數據集

首先我將介紹使用 OpenCV 和一顆攝像頭來檢測視頻流中的人臉,並將帶有人臉的圖像幀保存到硬碟上。接下來我會列舉幾種用程序自動從網上下載人臉圖片的方法。最後,我們將討論人工收集圖像,以及在什麼情況下這種方法是合適的。

現在開始構建一個人臉識別數據集吧!


方法 1:通過 OpenCV 和攝像頭登記人臉

該方法適用於:

1. 構建一個某區域內的人臉識別系統

2. 對於目標人臉,能夠找到特定的人並收集他們的人臉圖像

這樣的系統適用於公司、學校或者其他組織,在這裡人們會每天不定時的出現。

為了得到這些人的人臉樣本,我們會在一個房間內放置好電腦和攝像機,通過攝像機捕捉目標人臉在攝像畫面中的人臉信息,將並包含人臉的圖像幀保存到硬碟中。

收集不同條件下的目標人臉樣本可能會需要幾天或幾周的時間,這樣能使得人臉數據集足夠豐富,很好地表示不同狀態下的人臉,保證訓練出來模型有足夠的魯棒性,收集的人臉包括:

不同亮度下的人臉

每天不同時候,不同光線角度下的人臉

不同表情和情緒狀態下的人臉

接下來我們更進一步,寫一個簡單的 Python 腳本來構建人臉識別數據集,這個腳本會做如下工作:

連接並控制攝像頭

檢測人臉

將包含人臉的圖像幀寫入硬碟

打開一個叫 build_face_dataset.py 的 Python 腳本,首先導入一些必要的庫,包括 OpenCV 和 imutils

1# import the necessary packages

2fromimutils.videoimportVideoStream

3importargparse

4importimutils

5importtime

6importcv2

7importos

可以參考這篇文章安裝 OpenCV(https://www.pyimagesearch.com/opencv-tutorials-resources-guides/):

imutils 可以通過 pip 安裝:pip install --upgrade imutils

如果使用的是 Python 虛擬環境,不要忘記使用 workon 命令

現在環境已經配置好了,接下來討論兩個必要的命令行參數:

9# construct theargumentparserandparse the arguments

10ap = argparse.ArgumentParser()

11ap.add_argument("-c","--cascade", required=True,

12help="path to where the face cascade resides")

13ap.add_argument("-o","--output", required=True,

14help="path to output directory")

15args= vars(ap.parse_args())

命令行參數可以通過 argparse 庫在運行時解析,這個庫是包含在 Python 安裝中的。

我們有兩個命令行參數:

--cascade:硬碟中的 Haar cascade 文件路徑,用於 OpenCV 檢測人臉

--output:輸出的文件路徑。人臉圖像將會被保存到該路徑中,因此最好按照人名將人臉分類保存,比如將『John Smith』的人臉圖像保存到 dataset/john_smith 的路徑下

接下來載入人臉的 Haar cascade 文件並初始化視頻流:

17# load OpenCV"s Haar cascade for face detection from disk

18 detector = cv2.CascadeClassifier(args["cascade"])

19

20# initialize the video stream, allow the camera sensor to warm up,

21# and initialize the total number of example faces written to disk

22# thus far

23print("[INFO] starting video stream...")

24 vs = VideoStream(src=0).start()

25# vs = VideoStream(usePiCamera=True).start()

26 time.sleep(2.0)

27 total = 0

在第 18 行,我們載入了 OpenCV 的 Haar 人臉檢測器 detector。 這個 detector 將會在接下來每幀的循環中檢測人臉;在 24 行會初始化並開啟視頻流 VideoStreem;如果使用的是樹莓派的話,注釋掉第 24 行的代碼,使用第 25 行的代碼;第 26 行讓攝像頭先熱個身,暫停兩秒鐘;這一段代碼也初始化了 total 計數器來表示保存的人臉圖片的數量。

接下來,就開始對視頻流的每幀圖像進行處理:

29# loop over the frames from the video stream

30whileTrue:

31# grab the frame from the threaded video stream, clone it, (just

32# in case we want to write it to disk), and then resize the frame

33# so we can apply face detection faster

34frame = vs.read()

35orig = frame.copy()

36frame = imutils.resize(frame, width=400)

37

38# detect faces in the grayscale frame

39rects = detector.detectMultiScale(

40cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), scaleFactor=1.1,

41minNeighbors=5, minSize=(30,30))

42

43# loop over the face detections and draw them on the frame

44for(x, y, w, h)inrects:

45cv2.rectangle(frame, (x, y), (x + w, y + h), (,255,),2)

在第 30 行, 開始循環(循環在『q』鍵被按下之後結束);34-36 行,捕捉一幀畫面:frame,創建一個copy,改變大小。

接下來就是人臉檢測了!

使用 detectMultiScale 方法在每幀畫面中檢測人臉,這個函數需要如下參數:

image:一個灰度圖像

scaleFactor:指定在每個維度圖像尺寸減少的比例

minNeighbor:該參數指定候選的檢測框數量,以保證檢測是有效的

minSize:最小的人臉圖像尺寸

在某些特殊場景下,可能需要精調這些參數以減少 false positive 的數量或提高人臉的檢測率,但是對於一些普通的人臉檢測任務來說,這些參數就可以很好的工作了。

其實也還有一些其他更好的方法檢測人臉,比如在之前的文章中提到過,可以使用預訓練好的深度學習模型來檢測人臉。但是本文里提到的使用 OpenCV 的方法的優點是無需調參,而且速度非常快。

人臉檢測的結果被保存在一個 rects 的列表中(矩形檢測框)。為了將這些矩形畫在圖像上,在 44、45 行中遍歷所有矩形框,並將他們畫在圖片上。

最後一步就是將檢測框顯示在屏幕上,以及解決按鍵退出的問題:

48# show the output frame

49cv2.imshow("Frame", frame)

50key = cv2.waitKey(1) &xFF

51

52#ifthe `k` key was pressed,writethe *original* frametodisk

53#sowe canlaterprocess itanduse itforface recognition

54ifkey == ord("k"):

55p= os.path.sep.join([args["output"],"{}.png".format(

56str(total).zfill(5))])

57cv2.imwrite(p, orig)

58total +=1

59

60#ifthe `q` key was pressed,breakfrom the loop

61elif key == ord("q"):

62break

第 48 行執行將該幀圖像顯示在屏幕上,第 49 行執行捕捉鍵盤指令

『k』、『q』鍵盤指令對應不同的命令:

k:保留該幀圖像並保存到硬碟中(53-56 行),同時增加 total 計數器。對每個想要保存的圖像幀,都需要按『k』來保存。為了能夠更好地訓練模型,最好要保存不同角度、人臉在畫面不同位置、帶/不帶眼鏡的圖像。

q:退出循環,退出腳本

最後,將保存的圖片數量列印到屏幕上,並清空緩存:

64#printthe total faces savedanddoabit of cleanup

65print("[INFO] {} face images stored".format(total))

66print("[INFO] cleaning up...")

67cv2.destroyAllWindows()

68vs.stop()

接下來,只需在終端里運行如下命令就可以了:

$pythonbuild_face_dataset.py--cascade haarcascade_frontalface_default.xml

--output dataset/adrian

[INFO] starting video stream...

[INFO]6face images stored

[INFO] cleaningup...

這裡推薦將每個人的人臉數據保存在數據集下的一個子文件夾內,這樣能夠保證數據集條理清晰,易於管理。


方法 2:使用程序自動下載人臉圖片

在這種場景下,我們並不需要真的找到那個人拍攝圖片,只要他們經常出現在網上,我們能夠在網上找到足夠多的圖片即可,這樣就可以寫腳本,通過各個平台的 API 下載這些圖片了。

具體使用哪些 API 主要取決於想要收集的人的人臉信息,比如一個人經常在 Twitter 或者 Instagram 上發自拍,那麼我們就可以使用這些平台的 API 來抓取圖片。

還可以使用 Google 和 Bing 等搜索引擎來抓取:

在這篇博文中,可以找到使用 Google Images 手動或者使用腳本來下載圖片的方法。

另一個更好的方法就是使用 Bing 的圖片搜索 API,這樣能夠全自動下載圖像,具體方法參見這篇博文。

使用 Bing 圖片搜索 API,我們能夠從侏羅紀公園和侏羅紀世界這兩部電影的海報中下載 218 張 Alan Grant 的臉部圖片。下面展示了通過 Bing 圖片搜索 API 下載演員 Owen Grady 的臉部圖片的代碼:

1 $ mkdir dataset/owen_grady

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

使用這種方法下載幾個人的人臉圖像之後,我們看看整個數據集長什麼樣

1 $ tree jp_dataset --filelimit 10

2 jp_dataset

3 ├── alan_grant [22 entries]

4 ├── claire_dearing [53 entries]

5 ├── ellie_sattler [31 entries]

6 ├── ian_malcolm [41 entries]

7 ├── john_hammond [36 entries]

8 └── owen_grady [35 entries]

9

10 6 directories, 0 files

只要 20 分鐘左右(包括手動挑出錯誤圖像的時間),就能夠做好一個侏羅紀公園的人臉數據集了。


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

最後一個方法就是全手動收集人臉數據集,這是最不推薦的方法。這種方法顯然是最繁瑣的,而且需要大量時間。但是在某些特殊情況下,可能不得不使用這些方法。

手動收集的話,通常需要:

你需要手動將這些結構圖片保存到硬碟上,通常只有需要收集少量圖片的時候才使用這種方法。


總結

在本篇博文中,一共回顧了構建自有人臉數據集的三種方法,具體選擇哪種方法取決於你想要用這個數據集來做什麼。

如果你想要構建一個某一區域內的人臉識別系統,例如用於教室、公司或者其他組織的人臉識別系統,最好的方法是將需要識別的人請到一個房間里,通過第一種方法在攝像頭的視頻流中收集人臉數據。

如果你想要構建一個包含公眾人物、明星、運動員等的人臉識別系統,那麼可能只能夠在網上收集到他們的圖像。在這種情況下,最好的方法是使用各平台的 API 自動下載樣本圖片(方法 2)

最後,如果要收集的人並沒有公開社交賬號,或者社交賬號上很少發布圖片,那就可能需要手動收集並管理數據集了(方法 3)。這種方法顯然是最繁瑣的,但是在某些情況下,可能不得不這樣做。

所有代碼和必要的庫都可以在原博文中下載到,只需填寫你的郵箱地址即可~

viapyimagesearch

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

CCF-GAIR 2018 在即,

AI 研習社送福利了!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

如何從數據挖掘比賽中脫穎而出?快來 get 阿里媽媽廣告演算法賽亞軍套路吧!
聽小米講人工智慧,「小米之夜」重磅來襲!

TAG:AI研習社 |