去后廠村開游戲廳吧!基于PP-TinyPose的簡(jiǎn)易體感游戲開發(fā)框架
項(xiàng)目簡(jiǎn)介
近年來(lái),隨著虛擬現(xiàn)實(shí)技術(shù)和計(jì)算機(jī)圖形學(xué)技術(shù)的迅猛發(fā)展,越來(lái)越多的體感游戲在市場(chǎng)上出現(xiàn)并受到歡迎。要讓體感游戲具備良好的表現(xiàn),就需要使用大量的傳感器,甚至需要使用高性能的計(jì)算機(jī)和圖形處理器。這不僅會(huì)增加游戲的成本,還會(huì)影響游戲的流暢性和操作體驗(yàn)。因此,如何在不使用傳感器的情況下,實(shí)現(xiàn)高性能的體感游戲開發(fā)成為了一個(gè)頗具難度的問(wèn)題。
為了解決這個(gè)問(wèn)題,本文提出了基于關(guān)鍵點(diǎn)檢測(cè)模型和攝像頭的體感游戲開發(fā)方案。其中,PP-TinyPose 模型是飛槳推出的人體檢測(cè)算法,它可以快速、準(zhǔn)確地檢測(cè)出人體關(guān)鍵點(diǎn),從而實(shí)現(xiàn)人體的實(shí)時(shí)跟蹤和動(dòng)作捕捉。而通過(guò)飛槳推理部署工具 FastDeploy,可以將 PP-TinyPose 模型與推理引擎相結(jié)合,實(shí)現(xiàn)高效的推理部署,從而讓游戲可以在僅使用 USB 攝像頭的情況下,流暢地運(yùn)行在一般電腦上。
當(dāng)前已經(jīng)開發(fā)完畢的小游戲包括:
基于 pp-tinypose 的體感貪吃蛇游戲
https://aistudio.baidu.com/aistudio/projectdetail/4672452
基于 pp-tinypose 的體感飆車避障游戲
https://aistudio.baidu.com/aistudio/projectdetail/5686677
本文綜合了上述項(xiàng)目的開發(fā)經(jīng)驗(yàn),介紹了一個(gè)簡(jiǎn)易的體感游戲開發(fā)框架,可以在該框架的基礎(chǔ)上輕松自制基于攝像頭和關(guān)鍵點(diǎn)檢測(cè)模型的體感小游戲。
源碼鏈接:
Liyulingyue/PaddleGames: Some games based on paddlepaddle (github.com)
項(xiàng)目使用模型及工具
01 PP-TinyPose 模型
PP-TinyPose 模型是飛槳目標(biāo)檢測(cè)套件 PaddleDetection 針對(duì)移動(dòng)端設(shè)備優(yōu)化的實(shí)時(shí)關(guān)鍵點(diǎn)檢測(cè)模型,其可以流暢地在移動(dòng)端設(shè)備上執(zhí)行多人姿態(tài)估計(jì)任務(wù)。結(jié)合輕量化檢測(cè)網(wǎng)絡(luò) PP-PicoDet 能夠快速高效地完成檢測(cè)任務(wù),并應(yīng)用在手機(jī)等計(jì)算能力有限的邊緣設(shè)備上。
詳細(xì)信息:
https://github.com/PaddlePaddle/PaddleDetection
02 FastDeploy 推理部署工具
FastDeploy 是飛槳推出的一款全場(chǎng)景、易用靈活、極致高效的AI推理部署工具,提供大量的開箱即用的部署體驗(yàn)。目前,F(xiàn)astDeploy 支持的模型包括了物體檢測(cè)、字符識(shí)別、NLP、Stable Diffusion 文圖生成等。內(nèi)置的推理后端包含了 TensorRT、OpenVINO 等。
使用 FastDeploy 調(diào)用 PP-TinyPose 的優(yōu)勢(shì):
開箱即用,調(diào)用便捷
通過(guò)下述三行代碼即可完成推理過(guò)程,無(wú)需對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。
推理效率更快
PaddleDetection 倉(cāng)庫(kù)已提供了性能優(yōu)秀的的預(yù)訓(xùn)練模型。在此基礎(chǔ)上, FastDeploy 不僅提供了開箱即用的 API ,對(duì)運(yùn)算過(guò)程進(jìn)行了一定的優(yōu)化,從而提高了模型推理的實(shí)時(shí)性,有利于在線解算。
項(xiàng)目開發(fā)框架
01 基于 PyQt5 的通用簡(jiǎn)易體感游戲開發(fā)框架

一個(gè)簡(jiǎn)單的游戲框架可以沒有任何關(guān)卡,甚至沒有得分,只負(fù)責(zé)游戲的環(huán)境運(yùn)營(yíng)即可。例如貪吃蛇游戲,可以不設(shè)關(guān)卡,一直進(jìn)行,直到蛇的身體充斥整個(gè)屏幕。這個(gè)最簡(jiǎn)單的邏輯結(jié)構(gòu)一共需要準(zhǔn)備兩個(gè)部分的內(nèi)容。
前端
如上圖(右)所示,主要負(fù)責(zé)初始化頁(yè)面信息,周期性地調(diào)用攝像頭數(shù)據(jù),并且推理,將推理結(jié)果傳給后端,并獲取當(dāng)前的游戲畫面。
后端
如上圖(左)所示,可以聲明為一個(gè)類,在游戲開始時(shí)會(huì)創(chuàng)建這個(gè)類,并且周期性地調(diào)用更新函數(shù),根據(jù)關(guān)鍵點(diǎn)信息更新游戲的變量,并且根據(jù)當(dāng)前的游戲數(shù)據(jù),繪制游戲畫面。
這里分開來(lái)表述只是為了后續(xù)維護(hù)方便,實(shí)際上完全可以混在一起。并且上圖的表述更為偏向人而非代碼的邏輯,所以會(huì)和后續(xù)的代碼介紹有些出入。下面分別對(duì)游戲開發(fā)框架的前后端代碼進(jìn)行介紹。
02 前端
前端主要分為兩個(gè)部分:初始化和周期性調(diào)用函數(shù)。
通過(guò) PyQt5 創(chuàng)建前端頁(yè)面,初始化需4個(gè)部分
游戲管理器初始化:用于創(chuàng)建游戲變量
界面初始化:用于定義用于展示的前端頁(yè)面組件
計(jì)時(shí)器初始化:初始一次,就會(huì)周期性調(diào)用指定的函數(shù)
設(shè)備初始化:開啟攝像頭
在周期性調(diào)用函數(shù)中,需要完成以下操作體系
讀取圖片進(jìn)行推理
將推理信息傳遞給游戲管理器
獲取游戲畫面
展示畫面
需要注意的是,這里為了拆解功能,把更新數(shù)據(jù)和展示畫面分開了。代碼如下:
03 后端
后端主要分為兩個(gè)部分,初始化和更新信息。初始化內(nèi)容由游戲信息決定,比如我們當(dāng)前想要寫一個(gè)能夠隨著手部移動(dòng)而移動(dòng)的游戲,則如下所示,只需要定義 self.x、self.y、self.score 用于保存坐標(biāo)點(diǎn)信息和得分即可。
信息更新階段也是隨著游戲內(nèi)容決定的,例如對(duì)于一個(gè)能夠隨著手部移動(dòng)而移動(dòng)的游戲,只需要每個(gè)周期根據(jù)傳入的 keypoints 更新對(duì)應(yīng)的坐標(biāo)值即可。方便起見,可以將功能拆解,例如專門使用一個(gè)函數(shù)繪制畫面或判斷游戲狀態(tài)。例如實(shí)例中,如果坐標(biāo)值超過(guò) 250 即判斷為錯(cuò)誤。
04 運(yùn)行
定義好一切后,只需要在主函數(shù)中啟動(dòng) PyQt5 即可。
基于上述框架,在開發(fā)一個(gè)簡(jiǎn)易的體感小游戲時(shí),只需要在后端代碼中更新所需要邏輯即可,不需要對(duì)前端內(nèi)容進(jìn)行大改。
總結(jié)
本文簡(jiǎn)單介紹如何使用飛槳推理部署工具 FastDeploy 部署飛槳目標(biāo)檢測(cè)套件 PaddleDetection 中的 PP-TinyPose 模型進(jìn)行體感游戲開發(fā),使用的前端框架為 PyQt5 。本文使用的示例較為簡(jiǎn)單,更多示例信息可以參考 Liyulingyue/PaddleGames: Some games based on paddlepaddle (github.com),其中不僅有本文介紹的 demo 的源代碼,還有兩個(gè)基本開發(fā)完畢的小游戲:體感貪吃蛇和體感飆車游戲??梢詤⒖歼@兩個(gè)項(xiàng)目代碼定制化地開發(fā)小游戲~
同樣,也歡迎大家提交代碼到 Liyulingyue/PaddleGames: Some games based on paddlepaddle (github.com),一起改進(jìn)這個(gè) Demo 或者共同開發(fā)出更多有趣的小游戲!