大家好,接下來會為大家開一個樹莓派5和YOLO的連載文章。
內容包括四個部分:
在樹莓派5上使用YOLO進行物體和動物識別-入門指南
在樹莓派5上開啟YOLO人體姿態估計識別之旅
YOLO物體檢測在樹莓派AI Hat+上 | 如何編寫自定義Python代碼
YOLO姿態估計在樹莓派AI Hat+上 | 編寫自定義Python代碼
今天是第二部分:樹莓派5上使用YOLO進行人體姿態估計識別之旅
如果大家對這個專題感興趣,記得關注樹莓派開發者,這樣你將會第一時間收到我們的內容更新通知。
你是否曾想涉足計算機視覺領域?那么在樹莓派這樣一款低功耗、便攜式的硬件設備上嘗試如何?
在本指南中,我們將在樹莓派5上,借助OpenCV和YOLO姿態估計模型家族進行相關設置。我們將探討一些可用的不同YOLO模型,以及如何優化這些模型以獲得更流暢的幀率(FPS),還會介紹如何使用模型生成的關鍵點數據,以便將姿態估計應用到你的下一個項目中。這是我們近期制作的最有趣的指南之一,讓我們開始吧!
對于需要相關資料的外部讀者,這里是我們的項目代碼壓縮文件夾,其中包含運行姿態估計所需的所有腳本。
考驗你英語聽力的時候到了,你可以選擇觀看視頻演示。
目錄:
所需物品
硬件組裝
安裝樹莓派操作系統
設置虛擬環境并安裝YOLO
運行姿態估計
更換YOLO模型
提高處理速度
太空入侵者演示及后續方向
致謝
項目壓縮文件下載
太空入侵者演示
要跟隨本指南進行操作,你需要準備以下物品:
樹莓派5 - 4GB或8GB型號均可。雖然理論上也可以在樹莓派4上完成,但速度遠于樹莓派5,體驗不佳,因此我們未在樹莓派4上進行測試。
樹莓派攝像頭 - 我們使用的是攝像頭模塊V3
轉接線 - 樹莓派5配備的是不同尺寸的CSI攝像頭線,而你的攝像頭可能配備的是較舊的較粗線,因此請仔細檢查。攝像頭模塊V3肯定需要轉接線
散熱方案 - 我們使用的是主動散熱器(計算機視覺會讓你的樹莓派達到性能極限)
Micro SD卡 - 容量至少為16GB
顯示器和Micro-HDMI轉HDMI線
鼠標和鍵盤
*所需物品可以直接聯系我們進行購買。
硬件組裝
硬件組裝過程相對簡單。將線纜較粗的一端連接到攝像頭,較細的一端連接到樹莓派5。這些連接器上有一個標簽 - 將其抬起,然后將線纜插入插槽。確保線纜插入整齊后,將標簽壓回原位以固定線纜。
注意,這些連接器只能以一個方向插入,且較為脆弱,因此請避免過度彎曲(稍微彎曲一點沒問題)。
安裝樹莓派操作系統
首先,我們需要將樹莓派操作系統安裝到Micro SD卡上。使用樹莓派成像工具,選擇樹莓派5作為設備,樹莓派操作系統(64位)作為操作系統,以及你的MicroSD卡作為存儲設備。
下載樹莓派操作系統:https://www.raspberrypi.com/software/
注意:將樹莓派操作系統安裝到MicroSD卡上會清除卡上的所有數據。
下載并安裝操作系統可能需要幾分鐘時間。安裝完成后,將卡插入樹莓派并啟動。樹莓派將進行首次安裝設置,請確保將其連接到互聯網。
設置虛擬環境并安裝庫
隨著2023年Bookworm操作系統的推出,我們現在需要使用虛擬環境(或venv),因為它們是在樹莓派上提供一個獨立的空間,我們可以在其中進行實驗而不會損害樹莓派操作系統或其他項目。本指南提供了所有所需的命令和說明,但如果你需要幫助,虛擬環境有其自己的指南。
要創建虛擬環境,請打開一個新的終端窗口并輸入:
python3 -m venv--system-site-packagesyolo_pose
創建venv后,我們可以通過輸入以下命令進入:
執行上述操作后,你會在綠色文本的左側看到虛擬環境的名稱 - 這意味著我們正在其中正確工作。如果你需要重新進入此環境(例如,如果你關閉了終端窗口,你將退出環境),只需再次輸入上述source命令即可。
現在,我們處于虛擬環境中,可以開始安裝所需的軟件包。首先,通過輸入以下三行命令確保PIP(Python軟件包管理器)是最新的:
sudoapt updatesudo apt install python3-pip -ypip install -U pip
然后,使用以下命令安裝Ultralytics軟件包:
pip install ultralytics[export]
Ultralytics的優秀團隊是最新YOLO模型的主要開發者和維護者之一。他們的這個軟件包將承擔大部分繁重的工作,并安裝OpenCV以及我們運行YOLO所需的所有基礎設施。
此過程還將安裝大量其他軟件包,因此可能會失敗。如果你的安裝失敗(會顯示一大片紅色文本),只需再次輸入Ultralytics安裝命令,它應該會繼續。在極少數情況下,可能需要重復輸入安裝命令幾次。
安裝完成后,重啟樹莓派。如果你想成為高級用戶,可以在shell中輸入:
reboot
我們還有一件事要做,那就是設置Thonny以使用我們剛剛創建的虛擬環境。Thonny是我們將運行所有代碼的程序,我們需要讓它從同一個venv中運行,以便它可以訪問我們安裝的庫。
首次打開Thonny時,它可能處于簡化模式,你會在右上角看到“切換到常規模式”。如果存在此選項,請點擊它并關閉Thonny以重新啟動。
現在,通過選擇“運行”>“配置解釋器”進入解釋器選項菜單。在“Python可執行文件”選項下,有一個帶三個點的按鈕。選擇它并導航到我們剛剛創建的虛擬環境中的Python可執行文件。
該文件位于home/pi/yolo_pose/bin下,在此文件中,你需要選擇名為“python3”的文件。點擊確定,你現在將在此venv中工作。
無論何時打開Thonny,它都將自動在此環境中運行。你可以通過從同一解釋器選項菜單中“Python可執行文件”下的下拉菜單中選擇它來更改工作環境。如果你想退出虛擬環境,請選擇bin/python3選項。
運行姿態估計
現在,我們已經安裝了所需的庫,并且Thonny正在虛擬環境中運行,我們可以運行姿態估計腳本了。繼續并將項目壓縮文件夾解壓到桌面等方便的位置。
在那里,你將找到我們將使用的第一個腳本“pose demo.py”。在Thonny中打開它并點擊綠色的大運行按鈕。首次運行此腳本時,它可能會自動安裝一些額外所需的內容,幾秒鐘后,你應該會看到一個預覽窗口出現,其中正在運行你的姿態估計。
此時應該會發生幾件事。首先,YOLO將嘗試檢測人類,如果識別到一個人,它會在其周圍繪制一個方框,并在頂部顯示置信度評分。重要的是,它將在它認為你身體的一些關鍵部位放置點(這些點稱為關鍵點),并在這些點之間繪制線條以估計人的姿態和方向。右上角還將顯示此腳本運行的FPS(我們稍后將提高它)。
就這樣!通過這幾個簡單的步驟,我們已經讓樹莓派運行姿態估計了!
更換YOLO模型
到目前為止,我們一直在運行YOLO11,而這個Ultralytics軟件包的美妙之處在于,我們只需在代碼中替換一行即可完全更改模型。我們可以使用它來運行更高級的YOLO11模型,甚至是舊模型。你只需要更改設置中的這一行:
# Load our YOLO11 modelmodel= YOLO("yolo11n-pose.pt")
此行當前使用的是nano模型,它是YOLO11中最小、功能最弱但速度最快的模型。我們可以通過更改“11”后面的單個字母來更改此行以運行此模型的不同尺寸版本,如下所示。如果你將此行更改為另一個模型尺寸并運行它,腳本將自動下載新模型(對于較大的模型,可能達到數百MB)。
這些模型之間的差異在于姿態估計性能和FPS之間的權衡。模型越大,它越擅長估計可能未被攝像頭捕捉到的身體部位,以及更復雜的角度和畫面中有更多人的幀,但你可能只能期望每10秒處理一幀!我們將在下一步中提高它。
另一方面,nano模型運行速度最快,未經優化時約能達到1.5 FPS,但它沒有較大模型的處理能力。對于姿態估計,大多數情況下nano模型就足夠了,因為它通常能滿足你的需求,但如果你需要更強大的功能,請繼續增大模型尺寸以滿足你的需求。
在此行中,我們還可以更改正在運行的YOLO版本。如果你想,可以回退到舊模型,或者利用新模型。本指南最終會過時,如果Ultralytics發布了YOLO13,你應該只需將此行更改為以下內容即可開始使用更新的YOLO版本:
# Load our YOLO11 modelmodel= YOLO("yolo13n-pose.pt")
另外請注意,一些較舊的YOLO模型名稱中包含“v”。例如,YOLO8稱為:
# Load our YOLO11 modelmodel= YOLO("yolov8n-pose.pt")
提高處理速度
我們可以采取兩種方法來提高樹莓派上的FPS,而最有效的方法是將模型轉換為稱為NCNN的格式。這是一種更優化以在樹莓派等基于ARM的處理器上運行的模型格式。打開名為“ncnn conversion.py”的腳本,你將找到以下內容:
fromultralyticsimportYOLO# Load a YOLO11n PyTorch modelmodel = YOLO("yolo11n-pose.pt")# Export the model to NCNN formatmodel.export(format="ncnn", imgsz=640) # creates 'yolov11n-pose_ncnn_model'
要使用此腳本,首先指定你想要轉換的模型。這使用我們在上一節中討論的相同命名約定。然后,指定模型格式“ncnn”作為輸出格式以及分辨率。目前保持默認的640。首次運行此腳本時,它將下載更多所需的內容,但實際轉換應該只需幾秒鐘。
完成后,在腳本所在的文件夾中,你將找到一個名為“yolo11n-pose_ncnn_model”之類的新文件夾。復制此文件名并返回到我們之前的演示腳本。
現在,你需要通過將模型行更改為它剛剛創建的文件夾的名稱來告訴腳本使用我們創建的模型。它應該如下所示:
# Load our YOLO11 modelmodel= YOLO("yolo11n-pose_ncnn_model")
如果你運行腳本,它應該與之前完全一樣地工作,但由于NCNN轉換,FPS提高了4倍。
我們可以做的另一件事來提高FPS是降低處理分辨率。這是我們將運行YOLO模型的分辨率,像素越少意味著處理每幀所需的時間越少。
雖然轉換為NCNN是免費的FPS提升,但降低分辨率確實會犧牲一些能力。較低的分辨率會略微降低姿態估計的準確性(雖然不太明顯),并且它最大的影響是降低了可以估計姿態的距離。默認分辨率為640時,范圍相當遠,因此我們可以適當降低一點。
為此,請打開我們剛剛使用的NCNN轉換腳本并在以下行中指定你想要的分辨率:
# Export the model to NCNN formatmodel.export(format="ncnn", imgsz=320) # creates 'yolov11n-pose_ncnn_model'
注意:這必須是32的倍數。因此,你不能將其設置為300,但可以設置為320。
我們發現,160到320范圍內的分辨率在性能和速度之間取得了良好的平衡。
運行轉換代碼,它將導出具有所需分辨率的模型。這樣做也會覆蓋任何之前導出的同名模型。
在演示腳本中,確保你像之前一樣指定了NCNN模型。還有一件重要的事情我們必須做,那就是告訴腳本要向模型輸入什么分辨率。在while true循環中,你將找到以下行。確保它與模型的分辨率匹配,對于此示例,我們導出的是320:
# Run YOLO model on the captured frame and store the results results= model.predict(frame, imgsz =320)
如果一切順利,你應該會看到FPS再次顯著提高。根據需要調整此分辨率,但請記住:
它必須是32的倍數
你必須更改主腳本中的名稱以使用導出的模型
你必須將主腳本中的分辨率設置為與模型匹配
太空入侵者演示及后續方向
現在,我們的姿態估計已經運行,并且達到了合適的FPS,讓我們看看如何利用這些關鍵點做些什么。模型輸出的所有數據都存儲在“results”變量中。繼續并打開名為“keypoint acquisition.py”的腳本。此腳本與之前的演示腳本幾乎相同,只是在頂部添加了以下函數:
defget_keypoint_position(keypoint_num, axis='x'): """ Keypoint reference: 0: nose 5: left_shoulder 10: right_wrist 15: left_ankle 1: left_eye 6: right_shoulder 11: left_hip 16: right_ankle 2: right_eye 7: left_elbow 12: right_hip 3: left_ear 8: right_elbow 13: left_knee 4: right_ear 9: left_wrist 14: right_knee """ ifnot0<= keypoint_num <=?16:? ? ? ? raise?ValueError("Keypoint number must be between 0 and 16")? ? if?axis.lower()?not?in?['x',?'y']:? ? ? ? raise?ValueError("Axis must be 'x' or 'y'")? ? # Get the keypoint data? ? keypoint = results[0].keypoints.xyn[0][keypoint_num]? ? # Return x or y coordinate based on axis parameter? ? return?keypoint[0].item()?if?axis.lower() ==?'x'?else?keypoint[1].item()
此函數接受兩個輸入:你想要使用的關鍵點和你想在屏幕上獲取的其x或y坐標。然后,它將接受此請求并從函數中提取該數據以輸出。它還包含一個映射參考,說明關鍵點編號對應于身體上的哪個點。如果我們想調用函數來查找鼻子(關鍵點0)的位置以及它在x軸上的位置,我們將使用以下行:
nose_x= get_keypoint_position(0,'x')
這將返回鼻子在x軸上的相對位置,因此它將是一個0到1之間的數字。0將在屏幕的最左側,1將在屏幕的最右側。如果我們獲取的是y軸,它也將返回一個數字,其中0是屏幕的頂部,1是屏幕的底部。運行腳本是獲得對此的直觀理解的最好方法。
這是YOLO運行姿態估計與將其應用到我們的項目中的橋梁,因為我們現在有一個Python腳本可以跟蹤身體特定部位的位置并返回其在攝像頭中的位置。作為一個可能的示例,我們(大致)創建了名為“space invaders.py”的腳本。這是關鍵點獲取腳本的修改版本,它使用鼻子在x軸上的位置來控制一個簡單的太空入侵者游戲。運行此腳本并玩一玩!
這是使用一個名為Pygame的酷炫庫制作的,但不幸的是,這不是一個關于如何使用Pygame的教程。我們也沒有手動編寫此代碼,而是咨詢了一位Pygame專家,你也可以訪問他。像ChatGPT和Claude這樣的大型語言模型在編寫此類代碼方面很有經驗,我們只是將關鍵點獲取代碼和一些文本要求它制作一個太空入侵者游戲粘貼在一起,它就為我們輸出了這段代碼。你可以做同樣的事情,但用于其他簡單游戲,如打磚塊和貪吃蛇!
很有可能它不會一次就完美,你可能會遇到錯誤,或者它可能太慢,或者顏色可能不對。但你可以簡單地要求它修復這個問題,它會盡力解決。它還可以分解并教你代碼的工作原理,就像你問一個人一樣。
你還可以做的不僅僅是控制視頻游戲,你還可以使用這些點來控制硬件,如伺服電機、馬達和電磁閥。或者你可以發揮創意,跟蹤肩膀的位置并制作一個引體向上或俯臥撐計數器。
無論你的項目是什么,你現在都有一個樹莓派,它可以分析視頻源,尋找人類,并輸出那個人身體上點的位置。而且我們能夠在我們謙遜的小樹莓派上運行所有這些功能,這確實是一項了不起的成就。
如果你用這個制作了什么酷炫的東西,或者你需要任何幫助,請在我們的論壇上專門為本指南發布的帖子下方留言。
致謝
首先,我們要感謝OpenCV和COCO庫的眾多貢獻者、開發者和維護者。現代計算機視覺領域的許多成果都建立在他們的努力之上。
我們還要感謝Joseph Redmon和Ultralytics開發并維護了許多這里使用的YOLO模型。它們是非常強大的模型,能夠在樹莓派等低功耗硬件上運行,這絕非易事!
-
計算機
+關注
關注
19文章
7663瀏覽量
90800 -
樹莓派
+關注
關注
121文章
2009瀏覽量
107471
發布評論請先 登錄
RS Components攜手樹莓派創始人開啟中國之旅
如何在Arm虛擬硬件的虛擬樹莓派4上完成圖像識別應用的部署
完整指南:如何使用樹莓派5、Hailo AI Hat、YOLO、Docker進行自定義數據集訓練?

評論