基于 Openpose 實(shí)現(xiàn)人體動作識別
引言
伴隨著計(jì)算機(jī)視覺的發(fā)展和在生活實(shí)踐中的廣泛應(yīng)用,基于各種算法的行為檢測和動作識別項(xiàng)目在實(shí)踐中得到了越來越多的應(yīng)用,并在相關(guān)領(lǐng)域得到了廣泛的研究。在行為監(jiān)測方面,不僅僅有通過圖形、溫濕度、聲音等信息進(jìn)行蜂群行為的監(jiān)測,同時(shí)更多的應(yīng)用是集中在人類行為監(jiān)測上。而人體姿態(tài)識別作為行為監(jiān)測重要參考依據(jù)在視頻捕捉、計(jì)算機(jī)圖形學(xué)等領(lǐng)域得到了廣泛應(yīng)用。其中傳統(tǒng)的人體姿態(tài)識別方法有RMPE模型和Mask R-CNN模型,它們都是采用自頂向下的檢測方法,而Openpose作為姿態(tài)識別的經(jīng)典項(xiàng)目是采用的自底向上的檢測方法,主要應(yīng)用于行為監(jiān)測、姿態(tài)糾正、動作分類,在智能家居、自動駕駛、智能監(jiān)控等領(lǐng)域局具有重要的研究意義和應(yīng)用價(jià)值。
在多人目標(biāo)姿態(tài)識別方面,歷史上常見的方法有通過自頂而下的候選關(guān)鍵點(diǎn)查找并結(jié)合空間聯(lián)系優(yōu)化算法匹配人物以及通過建立部分親和字段的方法實(shí)現(xiàn)關(guān)鍵點(diǎn)檢測到人體骨架連接等等。
本項(xiàng)目針對當(dāng)前行為監(jiān)測中的精度不足、效率較低等問題,結(jié)合了openpose的姿態(tài)識別技術(shù)通過不同肢體之間的協(xié)調(diào)關(guān)系來搭建分類算法,并通過不同的分類算法比較,選擇出最優(yōu)模型搭建多目標(biāo)的分類方法,最終可以實(shí)現(xiàn)多個(gè)目標(biāo)的姿態(tài)顯示、目標(biāo)檢測和分類的實(shí)時(shí)顯示。在此次的模型中通過調(diào)用輕量級的openpose模型進(jìn)行人體姿態(tài)識別,其主要的方法是通過openpose獲取人體各個(gè)骨骼關(guān)鍵點(diǎn)位置,然后通過歐氏距離進(jìn)行匹配兩個(gè)骨骼來具體檢測到每一個(gè)人,對于常見檢測中骨骼關(guān)鍵點(diǎn)的缺失可以通過上一幀的骨骼信息進(jìn)行填充。
其最終實(shí)現(xiàn)效果如下圖可見:
系統(tǒng)組成
系統(tǒng)運(yùn)行的基本流程:
1、利用openpose遍歷數(shù)據(jù)集下不同分類下的人物的姿態(tài)信息進(jìn)行提取作為動作特征并保存為對應(yīng)的TXT文檔。
2、將提取的特征信息和對應(yīng)的圖片對應(yīng)起來整合在一個(gè)TXT文件中。
3、整合TXT信息分別為輸入和輸出標(biāo)簽csv文件。
4、模型訓(xùn)練部分分別使用不同分類算法達(dá)到訓(xùn)練的效果。
1.1 Openpose環(huán)境的構(gòu)建
openpose是依賴于卷積神經(jīng)網(wǎng)絡(luò)和監(jiān)督學(xué)習(xí)實(shí)現(xiàn)人體姿態(tài)評估算法,其主要的優(yōu)點(diǎn)在于適用于多人二維且較為精準(zhǔn)和迅速的識別開源模型。
整個(gè)多目標(biāo)動作監(jiān)測系統(tǒng)的搭建主要是依賴于openpose的姿態(tài)識別環(huán)境。而openpose的基本環(huán)境依賴于python,CUDA和swig的支持,其中python是作為openpose的代碼編寫和運(yùn)行工具,CUDA作為調(diào)用顯卡訓(xùn)練測試的必須軟件需要和python版本有一定的關(guān)系,swig目的在于給openpose編譯環(huán)境。根據(jù)openpose官方提供的cmu模型、mobilenet_thin模型、mobilenet_v2_large模型和mobilenet_v2_small模型的評價(jià),我們選擇了cmu模型作為姿態(tài)識別的調(diào)用模型,主要原因在于cmu具有更高一些的識別精度。
Openpose的調(diào)用在這里通過調(diào)用其中設(shè)定好的主函數(shù)即可,其中包括模型加載程序、調(diào)用程序以及Estimator評估等等。
本文共設(shè)定站立、行走、奔跑、跳動、坐下、下蹲、踢腿、出拳、揮手等行為標(biāo)簽,每類行為通過攝像頭采集相關(guān)視頻,并將視頻分幀成多張圖片,由不同的照片組合形成了不同動作,將其中的姿態(tài)特征利用openpose提取作為完整動作的基本識別特征,并將其中的信息整合到txt文件中。其中提取的部分分別包括鼻子、脖子、左右肩、左右手腕、左右膝蓋等等。
1.2 數(shù)據(jù)和特征的處理
數(shù)據(jù)處理的第一步是將采集到的圖片放入openpose骨架提取網(wǎng)絡(luò)進(jìn)行提取行人的關(guān)鍵點(diǎn)坐標(biāo)數(shù)據(jù),并將不同分類下的人物的姿態(tài)信息進(jìn)行提取作為動作特征并保存為對應(yīng)的TXT文檔。然后進(jìn)行特征的整合:將提取的特征信息和對應(yīng)的圖片對應(yīng)起來整合在一個(gè)TXT文件中,同時(shí)去除無用的多余數(shù)據(jù)集。最后整合TXT信息分別作為輸入和輸出標(biāo)簽csv文件。
其中輸入的特征既包含關(guān)鍵點(diǎn)的特征,同時(shí)也包括不同骨骼點(diǎn)連接的線特征,以及不同線之間組合形成的面特征。而這些提取的特征將通過下述設(shè)定好的分類算法進(jìn)行提取和學(xué)習(xí)。
1.3 機(jī)器算法設(shè)計(jì)(簡易版本)
首先是特征的提取,利用openpose遍歷數(shù)據(jù)集下不同分類下的人物的姿態(tài)信息進(jìn)行提取作為動作特征并保存為對應(yīng)的TXT文檔。然后進(jìn)行特征的整合:將提取的特征信息和對應(yīng)的圖片對應(yīng)起來整合在一個(gè)TXT文件中,同時(shí)去除無用的多余數(shù)據(jù)集。最后整合TXT信息分別作為輸入和輸出標(biāo)簽csv文件。
將從輸入端csv讀取的人體骨骼信息作為輸入,Y標(biāo)簽的csv文件作為輸出,按照0.3的比例劃分訓(xùn)練集和驗(yàn)證集,并轉(zhuǎn)為numpy矩陣參與運(yùn)算。其中模型分類器的選擇主要按照決策樹、隨機(jī)森林、神經(jīng)網(wǎng)絡(luò)和支持向量機(jī)進(jìn)行測試模型效果。模型的評估則主要根據(jù)混淆矩陣、精準(zhǔn)率、召回率和F1得分進(jìn)行評估。
1、支持向量機(jī)SVM分類器:
SVM是機(jī)器學(xué)習(xí)領(lǐng)域常用的有監(jiān)督學(xué)習(xí)模型,常用來進(jìn)行分類和回歸。它是基于結(jié)構(gòu)風(fēng)險(xiǎn)最小化理論建立模型,而達(dá)到學(xué)習(xí)器的全局最優(yōu)化結(jié)果,主要是被用來分析線性可分的情況。參數(shù)選擇問題作為支持向量機(jī)中的一個(gè)復(fù)雜優(yōu)化問題,主要目的是求解超參數(shù)的最優(yōu)解,即計(jì)算出最佳超平面,這個(gè)超平面是將平面分成兩部分,其中每一級都位于兩側(cè),在這里通過設(shè)定核函數(shù)來達(dá)到優(yōu)化參數(shù)的目的。
在這里直接調(diào)用sklearn框架中搭建好的分類器進(jìn)行訓(xùn)練,其中設(shè)置核函數(shù)為線性核函數(shù)。懲罰系數(shù)C為10,這個(gè)懲罰系數(shù)的設(shè)定一般來說這個(gè)系數(shù)設(shè)置的越大,容錯(cuò)性也就相對小一些,分隔空間的硬度也就更強(qiáng)。
2、決策樹Decision Tree分類器:
決策樹作為監(jiān)督學(xué)習(xí)算法中的常見算法,是屬于非參數(shù)學(xué)習(xí)的算法,常常被應(yīng)用于多分類和回歸問題中。它主要是通過計(jì)算各種不同情況的概率,在已知概率的基礎(chǔ)上,來求解凈現(xiàn)值大于等于零的情況。與傳統(tǒng)回歸模型相比。決策樹在識別決策方面更具有優(yōu)勢,同時(shí)可以檢驗(yàn)變量之間的交互效應(yīng)以解決多重共線性問題。
這里通過調(diào)用sklearn模塊下的DecisionTreeClassifier函數(shù)進(jìn)行搭建決策樹分類模型,并設(shè)置一定的樹的深度以進(jìn)行模型的訓(xùn)練。
3、隨機(jī)森林RandomForestClassifier分類器:
隨機(jī)森林是由多個(gè)決策樹組成的分類器,通過分裂訓(xùn)練數(shù)據(jù)集進(jìn)行加載入多個(gè)決策樹的訓(xùn)練。其隨機(jī)性主要體現(xiàn)在數(shù)據(jù)選擇的隨機(jī)性和特征選擇的隨機(jī)性,它使用隨機(jī)維度選擇和抽樣,使得決策樹更具有隨機(jī)性,從而保證了算法的準(zhǔn)確度和魯棒性。
這里設(shè)置樹的數(shù)目為100,深度為10,max_features取值為“auto”,即取為n_features的平方根值。
4、神經(jīng)網(wǎng)絡(luò)MLPClassifier分類器:
MLPClassifier分類器又被稱為多層感知器和人工神經(jīng)網(wǎng)絡(luò)。其是輸入的特征輸入到隱層的神經(jīng)元,然后隱藏層通過全連接的方式連接輸入層,相鄰的兩層通過RELU激活函數(shù)對上一層進(jìn)行非線性變換,通過反向傳播進(jìn)行調(diào)整不同神經(jīng)元之間的w和b參數(shù)來達(dá)到訓(xùn)練的目的。而在反向傳播的過程中通過隨機(jī)梯度下降的方法進(jìn)行模型的收斂。
在這里通過從X端CSV文件數(shù)據(jù)讀入作為輸入層,設(shè)置隱藏層節(jié)點(diǎn)數(shù)分別為20,30和40,Y標(biāo)簽數(shù)作為輸出進(jìn)行分類建立分類器模型。
2.1 深度算法設(shè)計(jì)(GUI附加二次檢測)
利用keras搭建RNN網(wǎng)絡(luò)模型,并加入了二次檢測,以防止對坐下、摔倒誤判。二次檢測主要對人體高度和寬度的比例進(jìn)行對比以判斷是否為跌倒動作。
部分代碼如下:
myfont = ImageFont.truetype(r'C:/Windows/SIMLI.TTF', 20) parser = argparse.ArgumentParser(description='tf-pose-estimation run') parser.add_argument('--image', type=str, default='Standard/1.jpg') parser.add_argument('--model', type=str, default='cmu', help='cmu / mobilenet_thin / mobilenet_v2_large / mobilenet_v2_small') parser.add_argument('--resize', type=str, default='0x0', help='if provided, resize images before they are processed. ' 'default=0x0, Recommends : 432x368 or 656x368 or 1312x736 ') parser.add_argument('--resize-out-ratio', type=float, default=4.0, help='if provided, resize heatmaps before they are post-processed. default=1.0') args = parser.parse_args() update_a = ["", "", "", "", "", "", "", "", "", ""] w, h = model_wh(args.resize) if w == 0 or h == 0: e = TfPoseEstimator(get_graph_path(args.model), target_size=(432, 368)) else: e = TfPoseEstimator(get_graph_path(args.model), target_size=(w, h)) cap=cv2.VideoCapture("shuaidao.mp4") conditions=[5,6] num=0 image3 = np.zeros([600, 480, 3]) image3.fill(255) cv2.imwrite("iimg3.jpg", image3) image3 = cv2.imread("iimg3.jpg") image_web4=cv2.resize(image3,(800,480)) image3 = Image.fromarray(cv2.cvtColor(image3, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(image3) dates = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) draw.text((10, 10), "系統(tǒng)日志:" + dates, font=myfont, fill=(255, 0, 0)) image3 = cv2.cvtColor(np.asarray(image3), cv2.COLOR_RGB2BGR)
簡易版本代碼:
鏈接:https://pan.baidu.com/s/172z3YOvpQkMFZANhP3yDJg
提取碼:imtw
GUI二次檢測代碼:
https://download.csdn.net/download/qq_42279468/22009054
作者簡介:
李秋鍵,CSDN博客專家,CSDN達(dá)人課作者。碩士在讀于中國礦業(yè)大學(xué),開發(fā)有taptap競賽獲獎(jiǎng)等。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。
電子管相關(guān)文章:電子管原理
衰減器相關(guān)文章:衰減器原理