超有趣!手把手教你用Python實(shí)現(xiàn)實(shí)時(shí)“人臉檢測(cè)”
原創(chuàng)【51CTO.com原創(chuàng)稿件】Instagram 的聯(lián)合創(chuàng)始人兼首席技術(shù)官 Mike Kreiger 說(shuō):“計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)其實(shí)已開(kāi)始流行起來(lái),但是對(duì)于大多數(shù)人來(lái)說(shuō),計(jì)算機(jī)看了圖像后看到了什么這方面還是比較模糊。”
近年來(lái),計(jì)算機(jī)視覺(jué)這個(gè)神奇的領(lǐng)域已漸成氣候。該技術(shù)在世界各地已有廣泛的應(yīng)用,而我們才開(kāi)了個(gè)頭!
我在這個(gè)領(lǐng)域最喜歡的事情之一是我們的社區(qū)擁抱開(kāi)源這個(gè)概念。連各大科技巨頭也愿意與每個(gè)人分享新的突破和創(chuàng)新,以便這項(xiàng)技術(shù)不會(huì)成為“有錢(qián)人的玩物”。
人臉檢測(cè)就是這樣一種技術(shù),它在實(shí)際用例下?lián)碛袕V泛的潛在用途(如果使用得當(dāng)且符合倫理道德)。在本文中我將介紹如何使用開(kāi)源工具構(gòu)建一種功能強(qiáng)大的人臉檢測(cè)算法。
人臉檢測(cè)大有前景的應(yīng)用
讓我舉幾個(gè)表明人臉檢測(cè)技術(shù)在普遍使用的典例。我確信你肯定在某個(gè)時(shí)候碰到過(guò)這些用例,只是沒(méi)有意識(shí)到幕后使用了什么技術(shù)!
比如,F(xiàn)acebook 把圖像手動(dòng)標(biāo)記換成了為上傳到平臺(tái)的每張圖片建議自動(dòng)生成的標(biāo)記。
Facebook 使用一種簡(jiǎn)單的人臉檢測(cè)算法來(lái)分析圖像中人臉的像素,并將其與相關(guān)用戶進(jìn)行比較。
我們將學(xué)習(xí)如何自行構(gòu)建一個(gè)人臉檢測(cè)模型,但在深入介紹這方面的技術(shù)細(xì)節(jié)之前,不妨討論另外幾個(gè)用例。
我們習(xí)慣于使用最新的“人臉解鎖”功能解鎖手機(jī)。這是表明如何使用人臉檢測(cè)技術(shù)來(lái)保持個(gè)人數(shù)據(jù)安全性的一個(gè)很小的例子。
同樣技術(shù)可以在更大的規(guī)模內(nèi)予以實(shí)現(xiàn),使攝像頭能夠捕捉圖像、檢測(cè)人臉。
在廣告、醫(yī)療保健和銀行等行業(yè),有另外幾個(gè)鮮為人知的人臉檢測(cè)應(yīng)用。在大多數(shù)公司或甚至在許多會(huì)議中,你需要攜帶身份證件才能進(jìn)入。
但如果我們能找到一種方法,不需要攜帶任何身份證件就能進(jìn)入,將會(huì)怎么樣?
人臉檢測(cè)有助于使這個(gè)過(guò)程流暢簡(jiǎn)單。人只要看一眼攝像頭,它就會(huì)自動(dòng)檢測(cè)要不要允許他/她進(jìn)入。
人臉檢測(cè)的另一個(gè)值得關(guān)注的應(yīng)用是可以計(jì)算參加活動(dòng)(比如會(huì)議或音樂(lè)會(huì))的人數(shù)。
我們安裝了一個(gè)可以捕獲參與者圖像并為我們提供總?cè)藬?shù)的攝像頭,而不是手動(dòng)計(jì)算參與者。這有助于使整個(gè)過(guò)程自動(dòng)化,并節(jié)省大量手動(dòng)工作。是不是覺(jué)得很有用?
在本文中我將著重介紹人臉檢測(cè)的實(shí)際應(yīng)用,簡(jiǎn)單介紹其中的算法是如何工作的。
如何使用手頭開(kāi)源工具實(shí)現(xiàn)人臉檢測(cè)
你已了解了人臉檢測(cè)技術(shù)的潛在應(yīng)用場(chǎng)景,不妨看看我們?nèi)绾问褂檬诸^的開(kāi)源工具來(lái)實(shí)現(xiàn)這項(xiàng)技術(shù)。
具體就本文而言,這是我使用和推薦使用的軟硬件:
- 用來(lái)在聯(lián)想 E470 ThinkPad 筆記本電腦(酷睿 i5 第 7 代)上構(gòu)建實(shí)時(shí)人臉檢測(cè)系統(tǒng)的網(wǎng)絡(luò)攝像頭(羅技 C920)。
你還可以在其他任何適當(dāng)?shù)南到y(tǒng)上使用筆記本電腦的內(nèi)置攝像頭或閉路電視攝像頭用于實(shí)時(shí)視頻分析,而不是采用我使用的這套設(shè)置。
- 使用 GPU 進(jìn)行更快速的視頻處理始終是額外好處。
- 在軟件方面,我們使用了已安裝所有必備軟件的 Ubuntu 18.04 操作系統(tǒng)。
不妨更深入一點(diǎn)地探討這幾點(diǎn),確保在構(gòu)建人臉檢測(cè)模型之前已正確設(shè)置好了一切。
第 1 步:硬件設(shè)置
你要做的第一件事是檢查網(wǎng)絡(luò)攝像頭是否設(shè)置正確。Ubuntu 中的一個(gè)簡(jiǎn)單技巧是查看設(shè)備是否已被操作系統(tǒng)注冊(cè)。
可以按照下列步驟來(lái)操作:
- 將網(wǎng)絡(luò)攝像頭連接到筆記本電腦之前,進(jìn)入到命令提示符并輸入 ls /dev/video*,檢查所有已連接的視頻設(shè)備。這會(huì)輸出顯示已連接到系統(tǒng)的視頻設(shè)備。
- 連接網(wǎng)絡(luò)攝像頭,并再次運(yùn)行上述命令。如果網(wǎng)絡(luò)攝像頭已成功連接,命令會(huì)顯示一個(gè)新設(shè)備。
- 可以做的另一件事是使用任何網(wǎng)絡(luò)攝像頭軟件來(lái)檢查網(wǎng)絡(luò)攝像頭是否正常工作。你可以在 Ubuntu 中使用“Cheese”來(lái)執(zhí)行這番操作。
這里我們可以看到網(wǎng)絡(luò)攝像頭已正確設(shè)置。硬件方面就是這些!
第 2 步:軟件設(shè)置
①安裝 Python
本文中的代碼是用 Python 版本 3.5 構(gòu)建的。雖然有多種方法來(lái)安裝 Python,但我建議使用 Anaconda,這是最流行的數(shù)據(jù)科學(xué) Python 發(fā)行版。
這是系統(tǒng)中安裝 Anaconda 的鏈接:
- https://www.anaconda.com/download
②安裝 OpenCV
OpenCV(開(kāi)源計(jì)算機(jī)視覺(jué))是一個(gè)旨在構(gòu)建計(jì)算機(jī)視覺(jué)應(yīng)用程序的庫(kù)。它有許多用于圖像處理任務(wù)的預(yù)編寫(xiě)函數(shù)。
想安裝 OpenCV,對(duì)庫(kù)進(jìn)行 pip 安裝:
- pip3 install opencv-python
③安裝 face_recognition API
最后,我們將使用 face_recognition,這號(hào)稱是世界上最簡(jiǎn)單的面向 Python 的人臉識(shí)別 API。
想安裝它,請(qǐng)運(yùn)行下列命令:
- pip install dlib
- pip install face_recognition
深入了解實(shí)現(xiàn)方式
現(xiàn)在你已設(shè)置好了系統(tǒng),終于可以深入了解實(shí)際的實(shí)現(xiàn)方式。首先,我們將迅速構(gòu)建程序,然后對(duì)其分解以了解我們所做的工作。
先創(chuàng)建一個(gè)文件 face_detector.py,然后拷貝如下所示的代碼:
- # import libraries
- import cv2
- importface_recognition
- # Get a reference towebcam
- video_capture =cv2.VideoCapture("/dev/video1")
- # Initialize variables
- face_locations = []
- while True:
- # Grab a single frame of video
- ret, frame = video_capture.read()
- # Convert the image from BGR color (whichOpenCV uses) to RGB color (which face_recognition uses)
- rgb_frame = frame[:, :, ::-1]
- # Find all the faces in the current frameof video
- face_locations =face_recognition.face_locations(rgb_frame)
- # Display the results
- for top, right, bottom, left inface_locations:
- # Draw a box around the face
- cv2.rectangle(frame, (left, top),(right, bottom), (0, 0, 255), 2)
- # Display the resulting image
- cv2.imshow('Video', frame)
- # Hit 'q' on the keyboard to quit!
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
- # Release handle tothe webcam
- video_capture.release()
- cv2.destroyAllWindows()
然后,輸入以下命令,運(yùn)行該 Python 文件:
- python face_detector.py
如果一切正常,會(huì)彈出一個(gè)新窗口,實(shí)時(shí)人臉檢測(cè)在運(yùn)行中。
總結(jié)一下,這是我們上述代碼執(zhí)行的操作:
- 首先,我們定義了將進(jìn)行視頻分析的硬件。
- 此后,我們實(shí)時(shí)捕捉視頻,逐幀捕捉。
- 然后,我們處理每幀,并提取圖像中所有人臉的位置。
- 最后,我們以視頻形式渲染這些幀以及人臉位置。
是不是很簡(jiǎn)單?如果你想了解更具體的細(xì)節(jié),我已在每個(gè)代碼部分中包含注釋。你可以隨時(shí)返回查看。
人臉檢測(cè)的用例
樂(lè)趣并不僅限于此!我們能做的另一件很酷的事情就是圍繞上述代碼構(gòu)建完整的用例。而且你無(wú)需從頭開(kāi)始,我們只要對(duì)代碼進(jìn)行幾處小小的改動(dòng)即可。
比如說(shuō),假設(shè)你想構(gòu)建一個(gè)基于攝像頭的自動(dòng)系統(tǒng)來(lái)實(shí)時(shí)跟蹤說(shuō)話人的位置。根據(jù)其位置,系統(tǒng)轉(zhuǎn)動(dòng)攝像頭,以便說(shuō)話人始終在視頻的中間。
我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題?第一步是構(gòu)建識(shí)別視頻中一個(gè)人或多個(gè)人的系統(tǒng),并關(guān)注說(shuō)話人的位置。
不妨看看我們?nèi)绾螌?shí)現(xiàn)這一點(diǎn)。為了本文需要,我從 Youtube 上下載了一段視頻(https://youtu.be/A_-KqX-RazQ),視頻中有個(gè)人在 2017 年 DataHack 峰會(huì)上講話。
首先,我們導(dǎo)入必要的庫(kù):
- import cv2
- importface_recognition
然后,閱讀視頻并獲取長(zhǎng)度:
- input_movie =cv2.VideoCapture("sample_video.mp4")
- length = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))
之后,我們創(chuàng)建一個(gè)擁有所需分辨率和幀速率的輸出文件,與輸入文件類似。
加載說(shuō)話人的示例圖像以便在視頻中識(shí)別他:
- image =face_recognition.load_image_file("sample_image.jpeg")
- face_encoding =face_recognition.face_encodings(image)[0]
- known_faces = [
- face_encoding,
- ]
這一切都已完成,現(xiàn)在我們運(yùn)行一個(gè)循環(huán),它將執(zhí)行以下操作:
- 從視頻中提取幀。
- 找到所有人臉,并識(shí)別它們。
- 創(chuàng)建一個(gè)新視頻,將原始幀與標(biāo)注的說(shuō)話人人臉位置相結(jié)合。
不妨看看這個(gè)代碼:
- # Initialize variables
- face_locations = []
- face_encodings = []
- face_names = []
- frame_number = 0
- while True:
- # Grab a single frame of video
- ret, frame = input_movie.read()
- frame_number += 1
- # Quit when the input video file ends
- if not ret:
- break
- # Convert the image from BGR color (whichOpenCV uses) to RGB color (which face_recognition uses)
- rgb_frame = frame[:, :, ::-1]
- # Find all the faces and face encodings inthe current frame of video
- face_locations =face_recognition.face_locations(rgb_frame, model="cnn")
- face_encodings =face_recognition.face_encodings(rgb_frame, face_locations)
- face_names = []
- for face_encoding in face_encodings:
- # See if the face is a match for theknown face(s)
- match =face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.50)
- name = None
- if match[0]:
- name = "Phani Srikant"
- face_names.append(name)
- # Label the results
- for (top, right, bottom, left), name inzip(face_locations, face_names):
- if not name:
- continue
- # Draw a box around the face
- cv2.rectangle(frame, (left, top),(right, bottom), (0, 0, 255), 2)
- # Draw a label with a name below theface
- cv2.rectangle(frame, (left, bottom -25), (right, bottom), (0, 0, 255), cv2.FILLED)
- font = cv2.FONT_HERSHEY_DUPLEX
- cv2.putText(frame, name, (left + 6,bottom - 6), font, 0.5, (255, 255, 255), 1)
- # Write the resulting image to the outputvideo file
- print("Writing frame {} /{}".format(frame_number, length))
- output_movie.write(frame)
- # All done!
- input_movie.release()
- cv2.destroyAllWindows()
然后代碼會(huì)給出這樣的輸出:
人臉檢測(cè)真是了不起的本領(lǐng)。
結(jié)論
恭喜!你現(xiàn)在知道如何為許多潛在用例構(gòu)建人臉檢測(cè)系統(tǒng)了。深度學(xué)習(xí)是非常迷人的領(lǐng)域,我很期望下一步的方向。
我們?cè)诒疚闹袑W(xué)習(xí)了如何利用開(kāi)源工具構(gòu)建具有實(shí)際用途的實(shí)時(shí)人臉檢測(cè)系統(tǒng)。
我鼓勵(lì)各位構(gòu)建眾多這樣的應(yīng)用,并自己試一試。相信我,你能學(xué)到好多東西,而且蠻有意思。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】






