大家好,這是一個樹莓派和OpenCV的連載專題。
使用樹莓派與OpenCV實現姿態估計和面部特征點追蹤
使用樹莓派與OpenCV實現面部和運動追蹤的云臺系統
使用樹莓派和OpenCV實現手部識別與手指識別
使用樹莓派和OpenCV實時掃描并存儲二維碼
使用樹莓派和OpenCV實現物體與動物識別
使用樹莓派、攝像頭和OpenCV進行速度檢測
今天是第一部分:使用樹莓派與OpenCV實現姿態估計和面部特征點追蹤
如果大家對這個專題感興趣,記得關注樹莓派開發者,這樣你將會第一時間收到我們的內容更新通知。
考驗你英語聽力的時候到了,你可以選擇觀看視頻演示。
[更新——在OPEN-CV與新版樹莓派“Bullseye”操作系統完全兼容之前,我強烈建議現階段將先前的樹莓派“Buster”操作系統刷寫到Micro-SD卡上,以配合本指南使用——官方“Buster”鏡像下載鏈接在下方]
為了進一步探索樹莓派在人工智能領域的全面知識,我自然而然地邁出了下一步,即利用強大的樹莓派單板計算機研究姿態識別(人體關鍵點檢測)和面部遮罩技術。
你是否曾好奇過Snapchat濾鏡是如何工作的?答案就三個字——面部特征點識別。面部特征點識別(遮罩)與面部識別有何不同?主要有兩點實際差異。面部遮罩追蹤會在你的整個面部創建點和線段(因此它能準確知道你的眼睛相對于眉毛的位置),并且它只關注你的面部,別無他物。(而面部識別則會在你的頭部周圍畫一個框,并判定框內的任何東西都是面部。它不知道你的下巴在哪里,還會把你身后的背景也當作“人臉”。)另一方面,姿態估計則是利用機器學習模型,通過估計身體關鍵關節(稱為關鍵點)的空間位置,從圖像或視頻中估計人的姿態。
跟隨本指南,你將確切了解如何操作,從而在創客領域中建立一個適合你特定項目的類似系統。請參見以下指南內容:
你需要準備什么
初始設置與安裝流程
功能完備的姿態追蹤腳本
功能完備的面部遮罩腳本
接下來做什么(GPIO控制和其他應用)
在樹莓派“Buster”操作系統上設置Open-CV
下載腳本
以下是一張圖片,展示了在樹莓派“Buster”操作系統上運行姿態追蹤和面部遮罩軟件時的情景,使用的是樹莓派4 Model B、高質量攝像頭模塊和5毫米鏡頭。

在本頁底部,你可以找到將Open-CV安裝到樹莓派上的流程。這里探索的所有腳本都將使用Python編程語言(如果你需要,可以來參加Python研討會)。OpenCV和MediaPipe共同協作,使腳本得以運行。MediaPipe及其創建的TensorFlow使我們能夠實現姿態檢測和面部特征點檢測算法。MediaPipe擁有最強大的面部特征點數據集,可在樹莓派上運行。
你需要準備什么
以下是一份清單,列出了你需要快速搭建并運行本系統所需的組件。
樹莓派4 Model B(樹莓派提供的額外計算能力對這項任務非常有幫助,但此設置也適用于樹莓派3 Model B,只是速度會稍慢一些)
樹莓派高質量攝像頭和攝像頭鏡頭(你也可以使用樹莓派官方攝像頭模塊V2)
Micro SD卡
顯示器
HDMI線
鼠標和鍵盤
初始設置與安裝流程
將樹莓派作為臺式計算機連接,并連接到顯示器、鼠標和鍵盤。確保樹莓派攝像頭已正確安裝在插槽中,且排線方向正確,然后啟動下面將介紹的Open-CV安裝流程。完成此流程后,你將在全新版本的樹莓派“Buster”操作系統上安裝好Open-CV。然后,打開樹莓派配置菜單(通過左上角的菜單并滾動至首選項找到),并在接口選項卡下啟用攝像頭。啟用后,重啟樹莓派以使更改生效。設置位置請參見下圖。

完成上述步驟后,下一步是使用屏幕左上角的黑色按鈕打開一個新的終端。下面你可以看到在樹莓派“Buster”桌面上打開終端時的樣子,圖中有一個大箭頭指向用鼠標點擊以打開終端的圖標。
現在,我們將在終端窗口中逐行輸入以下命令以安裝必要的軟件包。當需要你繼續安裝這些軟件包時,請按鍵盤上的 | Y | 鍵。
sudo apt-getupdate&&sudo apt-getupgradesudo apt-getinstall python-opencv python3-opencv opencv-datasudo pip3 install mediapipe-rpi3sudo pip3 install mediapipe-rpi4sudo pip3 install gttssudo apt install mpg321
功能完備的姿態追蹤腳本
完成上述步驟后,讓我們開始吧。以下是我們將用于搭建姿態追蹤系統的腳本。請在本頁底部找到并下載它。運行時,它將識別人體。當識別人體后,它將在識別出的人體的重要關節和面部放置點。這些點也被稱為特征點,每個點都有關聯的X、Y坐標。這意味著,與樹莓派手部追蹤非常相似,你將能夠識別出某些關節是在其他關節的上方還是下方。這種變化可以用作計數器來追蹤特定動作。
#Import all important functionalityimportcv2importmediapipeasmp#Start cv2 video capturing through CSI portcap=cv2.VideoCapture(0)#Initialise Media Pipe Pose featuresmp_pose=mp.solutions.posempDraw=mp.solutions.drawing_utilspose=mp_pose.Pose()#Start endless loop to create video frame by frame Add details about video size and image post-processing to better identify bodieswhileTrue: ret,frame=cap.read() flipped=cv2.flip(frame,flipCode=1) frame1 = cv2.resize(flipped,(640,480)) rgb_img=cv2.cvtColor(frame1,cv2.COLOR_BGR2RGB) result=pose.process(rgb_img) #Print general details about observed body print(result.pose_landmarks)
#Uncomment below to see X,Y coordinate Details on single location in this case the Nose Location.
#try: # print('X Coords are', result.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].x * 640) # print('Y Coords are', result.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE].y * 480) #except: # pass
#Draw the framework of body onto the processed image and then show it in the preview window mpDraw.draw_landmarks(frame1,result.pose_landmarks,mp_pose.POSE_CONNECTIONS) cv2.imshow("frame",frame1)
#At any point if the | q | is pressed on the keyboard then the system will stop key = cv2.waitKey(1) &0xFF ifkey ==ord("q"): break
運行上述腳本時,打開的預覽窗口如下所示。它將在它認為能看到人體的地方創建一個框架并覆蓋上去。值得注意的是,此腳本還能識別你頭部上的面部和眼睛的大致位置。它還會向shell輸出一個表示可見度的數字(介于0和1之間)。如果只看到你的身體的一部分,那么這個可見度數字可能約為0.1。

與我們在《樹莓派手部識別》的這一部分中看到的如何識別并獲取人手上特定關節的實時X-Y數據點類似,我們也可以在這里對身體部位進行同樣的操作。請參見下圖,該圖展示了MediaPipe在代碼中如何對人體的每個部位進行標記和編號。因此,如果你想知道某個人的鼻子的確切X、Y坐標,你可以使用索引號 | 0 | 或通過其全名 | NOSE | 來引用。因此,如果你取上述腳本,取消注釋特定部分,然后保存并運行它,它將向shell輸出任何識別出的鼻子的X和Y坐標。有趣的是,它甚至似乎能在鼻子不在屏幕上時預測其位置。

功能完備的面部遮罩腳本
以下是我們將用于搭建面部遮罩系統的腳本。請在本頁底部找到并下載它。這將識別人臉,并在識別出的人臉上繪制大量點。這些點(也稱為特征點)都有關聯的X、Y坐標。這個深度學習系統擁有的特征點比68個面部特征點還要多(實際上有468個點),并且在樹莓派4 Model B上的幀率超過10 FPS。
importcv2importsys, timeimportmediapipe as mpmp_drawing= mp.solutions.drawing_utilsmp_face_mesh= mp.solutions.face_mesh# For static images:drawing_spec= mp_drawing.DrawingSpec(thickness=1, circle_radius=1)face_mesh= mp_face_mesh.FaceMesh(static_image_mode=True, max_num_faces=1, min_detection_confidence=0.5)defget_face_mesh(image): results= face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # Print and draw face mesh landmarks on the image. ifnot results.multi_face_landmarks: returnimage annotated_image= image.copy() forface_landmarks in results.multi_face_landmarks: #print(' face_landmarks:', face_landmarks) mp_drawing.draw_landmarks( image=annotated_image, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_CONTOURS, landmark_drawing_spec=drawing_spec, connection_drawing_spec=drawing_spec) #print('%d facemesh_landmarks'%len(face_landmarks.landmark)) returnannotated_image
font= cv2.FONT_HERSHEY_SIMPLEX cap= cv2.VideoCapture(0)if(cap.isOpened() == False): print("Unable to read camera feed")
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)whilecap.isOpened(): s= time.time() ret, img = cap.read() ifret == False: print('WebCAM Read Error') sys.exit(0)
annotated= get_face_mesh(img) e= time.time() fps=1/ (e - s) cv2.putText(annotated, 'FPS:%5.2f'%(fps), (10,50), font, fontScale =1, color = (0,255,0), thickness =1) cv2.imshow('webcam', annotated) key= cv2.waitKey(1) ifkey ==27: #ESC breakcap.release()
運行上述腳本時,如果它能看到人臉,那么實時預覽窗口如下所示。它將在它認為是一張臉的地方覆蓋上一個完整的映射框架。

接下來做什么(GPIO控制和其他應用)
你可以對這兩個腳本進行多種拓展。你可以“教”系統識別俯臥撐或肱二頭肌彎舉的動作(基于這些動作中哪些關節在上方和下方),然后使用姿態追蹤來記錄你做了多少次。你還可以根據可見度因素確保某人仍然在攝像頭前,如果他們試圖躲開攝像頭,系統可以觸發警報。你還可以創建一個“改善你的姿勢”提醒機器。每當你開始彎腰時,一個煩人的蜂鳴器就會響起,迫使你坐直。此外,如果你想從姿態追蹤系統中獲取更多三維數據,可以看看PoseNet架構。3D PoseNet可以從連接的2D姿態和深度特征中預測3D姿態。
面部遮罩腳本可以拓展以實現各種功能。虛擬主播(vtubers)歡呼吧,你可以創建自定義Snapchat濾鏡。你還可以使用此設置進行基本的情緒檢測。這樣,如果樹莓派檢測到你情緒低落,它可以播放你最喜歡的曲子來讓你振作起來!或者你可以創建一個防瞌睡檢測樹莓派系統以提高安全性。通過關注眼睛之間的距離(上下),你可以跟蹤自己有多困。無論你做什么,希望這能激發你創作一些有創意的樹莓派項目!
那么,面部特征點識別與面部識別有何不同呢?面部遮罩的感興趣區域要緊密和準確得多。面部遮罩只關注你的面部,別無他物。這意味著面部遮罩可以用來確定你頭部的方向,而面部識別只能以一定的置信度告訴你,在其邊界框內的某個地方有一張臉。因此,面部識別無法確定邊界框內哪些是背景,哪些是人臉。
在樹莓派“Buster”操作系統上設置OPEN-CV
以下是一個詳細流程,指導你在樹莓派上安裝Open-CV,以便與上面討論的姿態和面部遮罩追蹤腳本配合使用。很快,我將創建一個腳本/單獨的教程來簡化此流程。打開一臺運行在Micro-SD卡上的全新版本樹莓派“Buster”操作系統的樹莓派4 Model B,并將系統連接到互聯網。
通過按左上角的終端按鈕打開終端。將每個命令復制并粘貼到樹莓派的終端中,按Enter鍵,并等待其完成后再繼續下一個命令。如果提示“你想繼續嗎?(y/n)”,請按Y鍵,然后按Enter鍵繼續。
sudo apt-getupdate&&sudo apt-getupgrade
在運行下一組命令之前,我們必須擴展交換文件。為此,在終端中輸入以下行。
sudo nano /etc/dphys-swapfile
將 CONF_SWAPSIZE = 100 上的數字更改為 CONF_SWAPSIZE=2048。完成此操作后,按Ctrl-X、Y,然后按Enter鍵保存這些更改。此更改只是暫時的,完成此操作后你應該將其改回。為了使這些更改生效,我們必須通過向終端輸入以下命令來重啟交換文件。然后,我們將恢復正常輸入終端命令。
sudo apt-get install build-essential cmake pkg-configsudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devsudo apt-get install libxvidcore-dev libx264-devsudo apt-get install libgtk2.0-dev libgtk-3-devsudo apt-get install libatlas-base-dev gfortransudo pip3 install numpywget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zipwget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zipunzip opencv.zipunzip opencv_contrib.zipcd~/opencv-4.4.0/mkdirbuildcdbuildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.4.0/modules \ -D BUILD_EXAMPLES=ON ..make -j $(nproc)
這個∣make∣命令將需要超過一個小時來安裝,并且不會有任何指示表明還需要多長時間。它也可能會凍結顯示器。請耐心等待,它會正常工作的。一旦完成,你就完成了大部分工作。如果它在任何時候失敗,你會收到類似∣make:???[Makefileall]Error2∣的消息,只需重新輸入并輸入上面的行∣make?j(nproc) |。不要害怕,它會記住所有已經完成的工作,并從停止的地方繼續。一旦完成,我們將繼續輸入終端命令。
sudomake install && sudo ldconfigsudo reboot
原文地址:
https://core-electronics.com.au/guides/raspberry-pi/pose-and-face-landmark-raspberry-pi/
-
操作系統
+關注
關注
37文章
7343瀏覽量
128828 -
OpenCV
+關注
關注
33文章
651瀏覽量
44486 -
樹莓派
+關注
關注
122文章
2072瀏覽量
109971
發布評論請先 登錄
樹莓派上使用OpenCV和Python實現實時人臉檢測
【愛芯派 Pro 開發板試用體驗】人體姿態估計模型部署前期準備
樹莓派之球形追蹤
基于面部特征點定位的圖像人臉姿態估計方法
電賽總結之上位機(樹莓派python-opencv實時識別黑線)
利用opencv+openpose實現人體姿態檢測
用樹莓派 + OpenCV 打造人臉識別技術!

如何使用樹莓派+OpenCV實現姿態估計和面部特征點追蹤?
評論