自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

超有趣!手把手教你用Python實現(xiàn)實時“人臉檢測”

原創(chuàng)
開發(fā) 后端 開發(fā)工具
Instagram 的聯(lián)合創(chuàng)始人兼首席技術(shù)官 Mike Kreiger 說:“計算機視覺和機器學(xué)習(xí)其實已開始流行起來,但是對于大多數(shù)人來說,計算機看了圖像后看到了什么這方面還是比較模糊?!?/div>

【51CTO.com原創(chuàng)稿件】Instagram 的聯(lián)合創(chuàng)始人兼首席技術(shù)官 Mike Kreiger 說:“計算機視覺和機器學(xué)習(xí)其實已開始流行起來,但是對于大多數(shù)人來說,計算機看了圖像后看到了什么這方面還是比較模糊。”

近年來,計算機視覺這個神奇的領(lǐng)域已漸成氣候。該技術(shù)在世界各地已有廣泛的應(yīng)用,而我們才開了個頭!

我在這個領(lǐng)域最喜歡的事情之一是我們的社區(qū)擁抱開源這個概念。連各大科技巨頭也愿意與每個人分享新的突破和創(chuàng)新,以便這項技術(shù)不會成為“有錢人的玩物”。

人臉檢測就是這樣一種技術(shù),它在實際用例下?lián)碛袕V泛的潛在用途(如果使用得當(dāng)且符合倫理道德)。在本文中我將介紹如何使用開源工具構(gòu)建一種功能強大的人臉檢測算法。

人臉檢測大有前景的應(yīng)用

讓我舉幾個表明人臉檢測技術(shù)在普遍使用的典例。我確信你肯定在某個時候碰到過這些用例,只是沒有意識到幕后使用了什么技術(shù)!

比如,F(xiàn)acebook 把圖像手動標(biāo)記換成了為上傳到平臺的每張圖片建議自動生成的標(biāo)記。

Facebook 使用一種簡單的人臉檢測算法來分析圖像中人臉的像素,并將其與相關(guān)用戶進行比較。

我們將學(xué)習(xí)如何自行構(gòu)建一個人臉檢測模型,但在深入介紹這方面的技術(shù)細(xì)節(jié)之前,不妨討論另外幾個用例。

我們習(xí)慣于使用最新的“人臉解鎖”功能解鎖手機。這是表明如何使用人臉檢測技術(shù)來保持個人數(shù)據(jù)安全性的一個很小的例子。

同樣技術(shù)可以在更大的規(guī)模內(nèi)予以實現(xiàn),使攝像頭能夠捕捉圖像、檢測人臉。

在廣告、醫(yī)療保健和銀行等行業(yè),有另外幾個鮮為人知的人臉檢測應(yīng)用。在大多數(shù)公司或甚至在許多會議中,你需要攜帶身份證件才能進入。

但如果我們能找到一種方法,不需要攜帶任何身份證件就能進入,將會怎么樣?

人臉檢測有助于使這個過程流暢簡單。人只要看一眼攝像頭,它就會自動檢測要不要允許他/她進入。

人臉檢測的另一個值得關(guān)注的應(yīng)用是可以計算參加活動(比如會議或音樂會)的人數(shù)。

我們安裝了一個可以捕獲參與者圖像并為我們提供總?cè)藬?shù)的攝像頭,而不是手動計算參與者。這有助于使整個過程自動化,并節(jié)省大量手動工作。是不是覺得很有用?

在本文中我將著重介紹人臉檢測的實際應(yīng)用,簡單介紹其中的算法是如何工作的。

如何使用手頭開源工具實現(xiàn)人臉檢測

你已了解了人臉檢測技術(shù)的潛在應(yīng)用場景,不妨看看我們?nèi)绾问褂檬诸^的開源工具來實現(xiàn)這項技術(shù)。

具體就本文而言,這是我使用和推薦使用的軟硬件:

  • 用來在聯(lián)想 E470 ThinkPad 筆記本電腦(酷睿 i5 第 7 代)上構(gòu)建實時人臉檢測系統(tǒng)的網(wǎng)絡(luò)攝像頭(羅技 C920)。

你還可以在其他任何適當(dāng)?shù)南到y(tǒng)上使用筆記本電腦的內(nèi)置攝像頭或閉路電視攝像頭用于實時視頻分析,而不是采用我使用的這套設(shè)置。

  • 使用 GPU 進行更快速的視頻處理始終是額外好處。
  • 在軟件方面,我們使用了已安裝所有必備軟件的 Ubuntu 18.04 操作系統(tǒng)。

不妨更深入一點地探討這幾點,確保在構(gòu)建人臉檢測模型之前已正確設(shè)置好了一切。

第 1 步:硬件設(shè)置

你要做的第一件事是檢查網(wǎng)絡(luò)攝像頭是否設(shè)置正確。Ubuntu 中的一個簡單技巧是查看設(shè)備是否已被操作系統(tǒng)注冊。

可以按照下列步驟來操作:

  • 將網(wǎng)絡(luò)攝像頭連接到筆記本電腦之前,進入到命令提示符并輸入 ls /dev/video*,檢查所有已連接的視頻設(shè)備。這會輸出顯示已連接到系統(tǒng)的視頻設(shè)備。
  • 連接網(wǎng)絡(luò)攝像頭,并再次運行上述命令。如果網(wǎng)絡(luò)攝像頭已成功連接,命令會顯示一個新設(shè)備。
  • 可以做的另一件事是使用任何網(wǎng)絡(luò)攝像頭軟件來檢查網(wǎng)絡(luò)攝像頭是否正常工作。你可以在 Ubuntu 中使用“Cheese”來執(zhí)行這番操作。

這里我們可以看到網(wǎng)絡(luò)攝像頭已正確設(shè)置。硬件方面就是這些!

第 2 步:軟件設(shè)置

①安裝 Python

本文中的代碼是用 Python 版本 3.5 構(gòu)建的。雖然有多種方法來安裝 Python,但我建議使用 Anaconda,這是最流行的數(shù)據(jù)科學(xué) Python 發(fā)行版。

這是系統(tǒng)中安裝 Anaconda 的鏈接:

  1. https://www.anaconda.com/download 

②安裝 OpenCV

OpenCV(開源計算機視覺)是一個旨在構(gòu)建計算機視覺應(yīng)用程序的庫。它有許多用于圖像處理任務(wù)的預(yù)編寫函數(shù)。

想安裝 OpenCV,對庫進行 pip 安裝:

  1. pip3 install opencv-python 

③安裝 face_recognition API

最后,我們將使用 face_recognition,這號稱是世界上最簡單的面向 Python 的人臉識別 API。

想安裝它,請運行下列命令:

  1. pip install dlib 
  2. pip install face_recognition 

深入了解實現(xiàn)方式

現(xiàn)在你已設(shè)置好了系統(tǒng),終于可以深入了解實際的實現(xiàn)方式。首先,我們將迅速構(gòu)建程序,然后對其分解以了解我們所做的工作。

先創(chuàng)建一個文件 face_detector.py,然后拷貝如下所示的代碼:

  1. # import libraries 
  2. import cv2 
  3. importface_recognition 
  4.  
  5. # Get a reference towebcam 
  6. video_capture =cv2.VideoCapture("/dev/video1"
  7.  
  8. # Initialize variables 
  9. face_locations = [] 
  10.  
  11. while True
  12.     # Grab a single frame of video 
  13.     ret, frame = video_capture.read() 
  14.  
  15.     # Convert the image from BGR color (whichOpenCV uses) to RGB color (which face_recognition uses) 
  16.     rgb_frame = frame[:, :, ::-1] 
  17.  
  18.     # Find all the faces in the current frameof video 
  19.     face_locations =face_recognition.face_locations(rgb_frame) 
  20.  
  21.     # Display the results 
  22.     for topright, bottom, left inface_locations: 
  23.         # Draw a box around the face 
  24.         cv2.rectangle(frame, (lefttop),(right, bottom), (0, 0, 255), 2) 
  25.  
  26.     # Display the resulting image 
  27.     cv2.imshow('Video', frame) 
  28.  
  29.     # Hit 'q' on the keyboard to quit! 
  30.     if cv2.waitKey(1) & 0xFF == ord('q'): 
  31.         break 
  32.  
  33. # Release handle tothe webcam 
  34. video_capture.release() 
  35. cv2.destroyAllWindows() 

然后,輸入以下命令,運行該 Python 文件:

  1. python face_detector.py 

如果一切正常,會彈出一個新窗口,實時人臉檢測在運行中。

總結(jié)一下,這是我們上述代碼執(zhí)行的操作:

  • 首先,我們定義了將進行視頻分析的硬件。
  • 此后,我們實時捕捉視頻,逐幀捕捉。
  • 然后,我們處理每幀,并提取圖像中所有人臉的位置。
  • 最后,我們以視頻形式渲染這些幀以及人臉位置。

是不是很簡單?如果你想了解更具體的細(xì)節(jié),我已在每個代碼部分中包含注釋。你可以隨時返回查看。

人臉檢測的用例

樂趣并不僅限于此!我們能做的另一件很酷的事情就是圍繞上述代碼構(gòu)建完整的用例。而且你無需從頭開始,我們只要對代碼進行幾處小小的改動即可。

比如說,假設(shè)你想構(gòu)建一個基于攝像頭的自動系統(tǒng)來實時跟蹤說話人的位置。根據(jù)其位置,系統(tǒng)轉(zhuǎn)動攝像頭,以便說話人始終在視頻的中間。

我們該如何解決這個問題?第一步是構(gòu)建識別視頻中一個人或多個人的系統(tǒng),并關(guān)注說話人的位置。

不妨看看我們?nèi)绾螌崿F(xiàn)這一點。為了本文需要,我從 Youtube 上下載了一段視頻(https://youtu.be/A_-KqX-RazQ),視頻中有個人在 2017 年 DataHack 峰會上講話。

首先,我們導(dǎo)入必要的庫:

  1. import cv2 
  2. importface_recognition 

然后,閱讀視頻并獲取長度:

  1. input_movie =cv2.VideoCapture("sample_video.mp4"
  2. length = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT)) 

之后,我們創(chuàng)建一個擁有所需分辨率和幀速率的輸出文件,與輸入文件類似。

加載說話人的示例圖像以便在視頻中識別他:

  1. image =face_recognition.load_image_file("sample_image.jpeg"
  2. face_encoding =face_recognition.face_encodings(image)[0] 
  3.  
  4. known_faces = [ 
  5. face_encoding, 

這一切都已完成,現(xiàn)在我們運行一個循環(huán),它將執(zhí)行以下操作:

  • 從視頻中提取幀。
  • 找到所有人臉,并識別它們。
  • 創(chuàng)建一個新視頻,將原始幀與標(biāo)注的說話人人臉位置相結(jié)合。

不妨看看這個代碼:

  1. # Initialize variables 
  2. face_locations = [] 
  3. face_encodings = [] 
  4. face_names = [] 
  5. frame_number = 0 
  6.  
  7. while True
  8.     # Grab a single frame of video 
  9.     ret, frame = input_movie.read() 
  10.     frame_number += 1 
  11.  
  12.     # Quit when the input video file ends 
  13.     if not ret: 
  14.         break 
  15.  
  16.     # Convert the image from BGR color (whichOpenCV uses) to RGB color (which face_recognition uses) 
  17.     rgb_frame = frame[:, :, ::-1] 
  18.  
  19.     # Find all the faces and face encodings inthe current frame of video 
  20.     face_locations =face_recognition.face_locations(rgb_frame, model="cnn"
  21.     face_encodings =face_recognition.face_encodings(rgb_frame, face_locations) 
  22.  
  23.     face_names = [] 
  24.     for face_encoding in face_encodings: 
  25.         # See if the face is a match for theknown face(s) 
  26.         match =face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.50) 
  27.  
  28.         name = None 
  29.         if match[0]: 
  30.             name = "Phani Srikant" 
  31.  
  32.         face_names.append(name
  33.  
  34.     # Label the results 
  35.     for (topright, bottom, left), name inzip(face_locations, face_names): 
  36.         if not name
  37.             continue 
  38.  
  39.         # Draw a box around the face 
  40.         cv2.rectangle(frame, (lefttop),(right, bottom), (0, 0, 255), 2) 
  41.  
  42.         # Draw a label with a name below theface 
  43.         cv2.rectangle(frame, (left, bottom -25), (right, bottom), (0, 0, 255), cv2.FILLED) 
  44.         font = cv2.FONT_HERSHEY_DUPLEX 
  45.         cv2.putText(frame, name, (left + 6,bottom - 6), font, 0.5, (255, 255, 255), 1) 
  46.  
  47.     # Write the resulting image to the outputvideo file 
  48.     print("Writing frame {} /{}".format(frame_number, length)) 
  49.     output_movie.write(frame) 
  50.  
  51. All done! 
  52. input_movie.release() 
  53. cv2.destroyAllWindows() 

然后代碼會給出這樣的輸出:

人臉檢測真是了不起的本領(lǐng)。

結(jié)論

恭喜!你現(xiàn)在知道如何為許多潛在用例構(gòu)建人臉檢測系統(tǒng)了。深度學(xué)習(xí)是非常迷人的領(lǐng)域,我很期望下一步的方向。

我們在本文中學(xué)習(xí)了如何利用開源工具構(gòu)建具有實際用途的實時人臉檢測系統(tǒng)。

 

我鼓勵各位構(gòu)建眾多這樣的應(yīng)用,并自己試一試。相信我,你能學(xué)到好多東西,而且蠻有意思。

【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】

責(zé)任編輯:武曉燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2017-10-27 10:29:35

人臉識別UbuntuPython

2017-10-29 21:43:25

人臉識別

2021-08-09 13:31:25

PythonExcel代碼

2021-12-11 20:20:19

Python算法線性

2022-10-19 14:30:59

2021-05-10 06:48:11

Python騰訊招聘

2021-03-23 09:05:52

PythonExcelVlookup

2021-02-02 13:31:35

Pycharm系統(tǒng)技巧Python

2021-02-10 09:34:40

Python文件的壓縮PyCharm

2021-02-06 14:55:05

大數(shù)據(jù)pandas數(shù)據(jù)分析

2011-03-28 16:14:38

jQuery

2021-02-04 09:00:57

SQLDjango原生

2022-08-04 10:39:23

Jenkins集成CD

2021-04-01 09:02:38

Python小說下載網(wǎng)絡(luò)爬蟲

2021-05-17 21:30:06

Python求均值中值

2009-04-22 09:17:19

LINQSQL基礎(chǔ)

2021-01-21 09:10:29

ECharts柱狀圖大數(shù)據(jù)

2021-01-08 10:32:24

Charts折線圖數(shù)據(jù)可視化

2021-09-02 08:56:48

JavaBMIHashSet

2020-11-13 08:17:48

App(滑動切換)
點贊
收藏

51CTO技術(shù)棧公眾號