博客專欄

        EEPW首頁 > 博客 > 基于 Openpose 實現人體動作識別

        基于 Openpose 實現人體動作識別

        發布人:AI科技大本營 時間:2021-09-19 來源:工程師 發布文章

        引言

        伴隨著計算機視覺的發展和在生活實踐中的廣泛應用,基于各種算法的行為檢測和動作識別項目在實踐中得到了越來越多的應用,并在相關領域得到了廣泛的研究。在行為監測方面,不僅僅有通過圖形、溫濕度、聲音等信息進行蜂群行為的監測,同時更多的應用是集中在人類行為監測上。而人體姿態識別作為行為監測重要參考依據在視頻捕捉、計算機圖形學等領域得到了廣泛應用。其中傳統的人體姿態識別方法有RMPE模型和Mask R-CNN模型,它們都是采用自頂向下的檢測方法,而Openpose作為姿態識別的經典項目是采用的自底向上的檢測方法,主要應用于行為監測、姿態糾正、動作分類,在智能家居、自動駕駛、智能監控等領域局具有重要的研究意義和應用價值。

        在多人目標姿態識別方面,歷史上常見的方法有通過自頂而下的候選關鍵點查找并結合空間聯系優化算法匹配人物以及通過建立部分親和字段的方法實現關鍵點檢測到人體骨架連接等等。

        本項目針對當前行為監測中的精度不足、效率較低等問題,結合了openpose的姿態識別技術通過不同肢體之間的協調關系來搭建分類算法,并通過不同的分類算法比較,選擇出最優模型搭建多目標的分類方法,最終可以實現多個目標的姿態顯示、目標檢測和分類的實時顯示。在此次的模型中通過調用輕量級的openpose模型進行人體姿態識別,其主要的方法是通過openpose獲取人體各個骨骼關鍵點位置,然后通過歐氏距離進行匹配兩個骨骼來具體檢測到每一個人,對于常見檢測中骨骼關鍵點的缺失可以通過上一幀的骨骼信息進行填充。

        其最終實現效果如下圖可見:


        系統組成

        系統運行的基本流程:

        1、利用openpose遍歷數據集下不同分類下的人物的姿態信息進行提取作為動作特征并保存為對應的TXT文檔。

        2、將提取的特征信息和對應的圖片對應起來整合在一個TXT文件中。

        3、整合TXT信息分別為輸入和輸出標簽csv文件。

        4、模型訓練部分分別使用不同分類算法達到訓練的效果。

        1.1 Openpose環境的構建

        openpose是依賴于卷積神經網絡和監督學習實現人體姿態評估算法,其主要的優點在于適用于多人二維且較為精準和迅速的識別開源模型。

        整個多目標動作監測系統的搭建主要是依賴于openpose的姿態識別環境。而openpose的基本環境依賴于python,CUDA和swig的支持,其中python是作為openpose的代碼編寫和運行工具,CUDA作為調用顯卡訓練測試的必須軟件需要和python版本有一定的關系,swig目的在于給openpose編譯環境。根據openpose官方提供的cmu模型、mobilenet_thin模型、mobilenet_v2_large模型和mobilenet_v2_small模型的評價,我們選擇了cmu模型作為姿態識別的調用模型,主要原因在于cmu具有更高一些的識別精度。

        Openpose的調用在這里通過調用其中設定好的主函數即可,其中包括模型加載程序、調用程序以及Estimator評估等等。

        本文共設定站立、行走、奔跑、跳動、坐下、下蹲、踢腿、出拳、揮手等行為標簽,每類行為通過攝像頭采集相關視頻,并將視頻分幀成多張圖片,由不同的照片組合形成了不同動作,將其中的姿態特征利用openpose提取作為完整動作的基本識別特征,并將其中的信息整合到txt文件中。其中提取的部分分別包括鼻子、脖子、左右肩、左右手腕、左右膝蓋等等。

        1.2 數據和特征的處理

        數據處理的第一步是將采集到的圖片放入openpose骨架提取網絡進行提取行人的關鍵點坐標數據,并將不同分類下的人物的姿態信息進行提取作為動作特征并保存為對應的TXT文檔。然后進行特征的整合:將提取的特征信息和對應的圖片對應起來整合在一個TXT文件中,同時去除無用的多余數據集。最后整合TXT信息分別作為輸入和輸出標簽csv文件。

        其中輸入的特征既包含關鍵點的特征,同時也包括不同骨骼點連接的線特征,以及不同線之間組合形成的面特征。而這些提取的特征將通過下述設定好的分類算法進行提取和學習。

        1.3 機器算法設計(簡易版本)

        首先是特征的提取,利用openpose遍歷數據集下不同分類下的人物的姿態信息進行提取作為動作特征并保存為對應的TXT文檔。然后進行特征的整合:將提取的特征信息和對應的圖片對應起來整合在一個TXT文件中,同時去除無用的多余數據集。最后整合TXT信息分別作為輸入和輸出標簽csv文件。

        將從輸入端csv讀取的人體骨骼信息作為輸入,Y標簽的csv文件作為輸出,按照0.3的比例劃分訓練集和驗證集,并轉為numpy矩陣參與運算。其中模型分類器的選擇主要按照決策樹、隨機森林、神經網絡和支持向量機進行測試模型效果。模型的評估則主要根據混淆矩陣、精準率、召回率和F1得分進行評估。

        2.png

        1、支持向量機SVM分類器:

        SVM是機器學習領域常用的有監督學習模型,常用來進行分類和回歸。它是基于結構風險最小化理論建立模型,而達到學習器的全局最優化結果,主要是被用來分析線性可分的情況。參數選擇問題作為支持向量機中的一個復雜優化問題,主要目的是求解超參數的最優解,即計算出最佳超平面,這個超平面是將平面分成兩部分,其中每一級都位于兩側,在這里通過設定核函數來達到優化參數的目的。

        在這里直接調用sklearn框架中搭建好的分類器進行訓練,其中設置核函數為線性核函數。懲罰系數C為10,這個懲罰系數的設定一般來說這個系數設置的越大,容錯性也就相對小一些,分隔空間的硬度也就更強。

        2、決策樹Decision Tree分類器:

        決策樹作為監督學習算法中的常見算法,是屬于非參數學習的算法,常常被應用于多分類和回歸問題中。它主要是通過計算各種不同情況的概率,在已知概率的基礎上,來求解凈現值大于等于零的情況。與傳統回歸模型相比。決策樹在識別決策方面更具有優勢,同時可以檢驗變量之間的交互效應以解決多重共線性問題。

        這里通過調用sklearn模塊下的DecisionTreeClassifier函數進行搭建決策樹分類模型,并設置一定的樹的深度以進行模型的訓練。

        3、隨機森林RandomForestClassifier分類器:

        隨機森林是由多個決策樹組成的分類器,通過分裂訓練數據集進行加載入多個決策樹的訓練。其隨機性主要體現在數據選擇的隨機性和特征選擇的隨機性,它使用隨機維度選擇和抽樣,使得決策樹更具有隨機性,從而保證了算法的準確度和魯棒性。

        這里設置樹的數目為100,深度為10,max_features取值為“auto”,即取為n_features的平方根值。

        4、神經網絡MLPClassifier分類器:

        MLPClassifier分類器又被稱為多層感知器和人工神經網絡。其是輸入的特征輸入到隱層的神經元,然后隱藏層通過全連接的方式連接輸入層,相鄰的兩層通過RELU激活函數對上一層進行非線性變換,通過反向傳播進行調整不同神經元之間的w和b參數來達到訓練的目的。而在反向傳播的過程中通過隨機梯度下降的方法進行模型的收斂。

        在這里通過從X端CSV文件數據讀入作為輸入層,設置隱藏層節點數分別為20,30和40,Y標簽數作為輸出進行分類建立分類器模型。

        3.png

        2.1 深度算法設計(GUI附加二次檢測)

        利用keras搭建RNN網絡模型,并加入了二次檢測,以防止對坐下、摔倒誤判。二次檢測主要對人體高度和寬度的比例進行對比以判斷是否為跌倒動作。

        部分代碼如下:

        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), "系統日志:" + dates, font=myfont, fill=(255, 0, 0))
        image3 = cv2.cvtColor(np.asarray(image3), cv2.COLOR_RGB2BGR)

        4.png

        簡易版本代碼:

        鏈接:https://pan.baidu.com/s/172z3YOvpQkMFZANhP3yDJg

        提取碼:imtw

        GUI二次檢測代碼:

        https://download.csdn.net/download/qq_42279468/22009054

        作者簡介:

        李秋鍵,CSDN博客專家,CSDN達人課作者。碩士在讀于中國礦業大學,開發有taptap競賽獲獎等。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        電子管相關文章:電子管原理


        衰減器相關文章:衰減器原理


        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 延吉市| 邢台市| 柳江县| 龙川县| 莱西市| 张家口市| 曲阜市| 抚顺县| 秀山| 上虞市| 宜兴市| 无锡市| 班戈县| 扶绥县| 平昌县| 平舆县| 沁水县| 青神县| 南阳市| 紫云| 绍兴县| 南涧| 临江市| 深圳市| 康乐县| 新干县| 金阳县| 漾濞| 博乐市| 寿阳县| 逊克县| 潜山县| 兰西县| 台北市| 柳林县| 洮南市| 玉溪市| 禹城市| 延长县| 贵阳市| 大兴区|