用 Python+openpose 實現抖音尬舞機

? ? ?游戲開始后,隨著音樂會給出不同的動作提示,用戶按照提示擺出正確動作即可得分。援引官方說法,“尬舞機”主要應用了今日頭條 AI Lab 自主開發的“人體關鍵點檢測技術”,依靠這項技術,抖音能夠檢測到圖像中所包含人體的各個關鍵點的位置,從而實現從用戶姿態到目標姿態的準確匹配。

? ? 以上這些體感游戲,都牽涉到計算機視覺中的一個細分領域:?體姿態估計(pose estimation)?,即識別圖像中的人體關鍵點(人體上有一定自由度的關節,如頭、頸、肩、肘、腕、腰、膝、踝等)并正確的聯系起來通過對人體關鍵點在三維空間相對位置的計算,來估計人體當前的姿態

? ? ?人體姿態估計有不少難點,比如:如何從圖片中區分出人和背景;如何定位人體的關鍵點;如何根據二維的關鍵點坐標計算出三維中的姿態;如何處理四肢交叉或遮擋的情況;如何定位多人;如何提升計算速度等等。而相關技術在游戲、安防、人機交互、行為分析等方面都有應用前景。因此,這是計算機視覺甚至人工智能領域中極具挑戰的一個課題。(小聲說句,我的碩士畢業論文就是這個方向)

? ? 不過,因為前人的貢獻,現在你只需通過少量的 Python 代碼,也可以實現從照片或視頻中進行人體姿態估計。這都要仰賴于 CMU 的開源項目:?Openpose?。

OpenPose 是基于卷積神經網絡和監督學習并以 caffe 為框架寫成的開源庫,可以實現人的面部表情、軀干和四肢甚至手指的跟蹤,適用多人且具有較好的魯棒性。是世界上第一個基于深度學習的實時多人二維姿態估計,為機器理解人類提供了一個高質量的信息維度。
其理論基礎來自《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields》,是 CVPR 2017 的一篇論文,作者是來自 CMU 感知計算實驗室的曹哲、Tomas Simon、Shih-En Wei、Yaser Sheikh。
項目地址:?https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation
(摘自網絡)

論文演示效果:

? ? ?此方法可以達到對視頻流的實時多人檢測。要知道,Kinect 可是加了一個額外的紅外深度攝像頭才做到如此準確地識別(還不能是這么多人)。

詳細的原理,我在這里就不冒充大牛強行解釋了。但通俗地說幾點,為什么 Openpose 有如此突破性地效果:

  1. 以往的識別思路是自上而下:先找人,找到人了再進一步區分身體不同部分。Openpose 則是自下而上:?先找手腳關節等特征部位,再組合人體?;
  2. Openpose 團隊將?人臉識別?、?手部識別?的已有成果整合到了姿態識別中,取得了更好的效果;
  3. 有了?大數據?的支持,這是過去的研究所沒有的。看看這個 CMU 為采集人體數據所搭建的設備,你就會有所體會:

? ? ?之前的文章?Python+OpenCV 十幾行代碼模仿世界名畫?中,我們提到 OpenCV-Python 在 3.3 版本中加入了?深度神經網絡(DNN)?的支持。同樣在項目 Samples 中,提供 Openpose 的一個 Python 簡單實現版本。(只支持圖像中有單個人)

官方代碼:

https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.py

使用方法,命令行進入代碼所在目錄執行:

python openpose.py --model pose.caffemodel --proto pose.prototxt --dataset MPI

--model?參數和?--proto?參數分別是預先訓練好的人體姿態模型和配置文件。因為模型文件很大,并不包括在 OpenCV 代碼庫中,可以在 Openpose 項目(https://github.com/CMU-Perceptual-Computing-Lab/openpose?)找到下載地址。

另外可以通過?--input?參數指定識別的圖片或視頻地址,默認則使用攝像頭實時采集。

執行后效果:

?核心代碼:
? ? 和之前 fast-neural-style 的代碼類似,大部分的工作都是 Openpose 做好的,OpenCV 這里只是使用訓練好的神經網絡進行計算。所以核心代碼其實沒有幾行,而且跟上次的例子幾乎一致。剩下一半的代碼都是在把獲取到的關鍵點坐標繪制成人體的骨架結構。
? ? 這里順帶提醒一下,我發現代碼中的一個斷言?assert(len(BODY_PARTS) == out.shape[1])?無法滿足,會導致程序終止。如果出現這樣的問題,就把這句注釋掉,并不會對結果有影響。拿到人體關鍵點數據后,我們就可以做進一步的判斷。比如我們加一個很簡單的判斷:

? 如果左手腕和右手腕的高度都超過脖子的高度,就認為是一個抬手的動作,在屏幕上輸出“?HANDS UP!?”。注意在 OpenCV 坐標系里,圖像的坐標原點是左上角。 效果:

? ? ?如此,一個簡單的動作識別程序就有了。雖然很粗糙,但已經可以附加在很多應用上,比如:商場、科技館里的互動游戲、交互式的視覺藝術作品等等。感興趣的同學不妨親自試一試,期待看到你們借此做出更有意思的項目。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252563.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252563.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252563.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP獲取中文字符拼音首字母

在項目中遇到需要把游戲進行字母排序,于是百度到一個格式化的首字母的方法。 /*** name php獲取中文字符拼音首字母* param $str* return null|string*/public function getFirstCharter($str){if (empty($str)) {return ;}$fchar ord($str{0});if ($fchar > or…

Array類型

一、轉換方法 toString() 調用數組的toString()方法會返回由數組中每個值的字符串形式拼接而成的一個以逗號分割的字符串 valueOf() 返回的還是數組 實際上,為了創建這個字符串會調用數組每一項的toString()方法 二、棧方法 push() pop() 只發生在棧的頂部 三…

Create a Service Catalog Request via REST API

http://wiki.servicenow.com/index.php?titleUseful_Catalog_Scripts#Eureka http://wiki.servicenow.com/index.php?titleService_Catalog_Script_API#gsc.tab0 Service Catalog APIhttps://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/integrate/inboun…

MYSQL和JAVA(課堂筆記)

MYSQL  數據庫管理工具 JAVA    編程語言 數據庫驅動(JAVA和MYSQL對接方式) 到官網上下載驅動    加載驅動 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class S…

解密昇騰AI處理器--Ascend310簡介

Ascend310 AI處理器規格 Ascend310 AI處理器邏輯架構 昇騰AI處理器本質上是一個片上系統(System on Chip,SoC),主要可以應用在和圖像、視頻、語音、文字處理相關的應用場景。其主要的架構組成部件包括特制的計算單元、大容量的存儲…

銀盒子掃碼下單在線訂單開啟商品售賣時段使用說明

1,登陸管理員賬號,子賬號下,配置管理--店鋪配置--掃碼下單Tab頁,是否開啟商品售賣時段,選擇“是” 2,在商家后臺登陸相應的子賬號,在店鋪管理--商品售賣時段里配置售賣時間以及相應時段售賣的商…

使用pandas時遇到ValueError: numpy.dtype has the wrong size, try recompiling

[問題]使用pandas時遇到ValueError: numpy.dtype has the wrong size, try recompiling [原因] 這是因為 Python 包的版本問題,例如安裝了較舊版本的 Numpy,但安裝了較新版本的 Pandas。 [解決方法] 查看Numpy版本號 python -c "import numpy; prin…

『Python基礎-12』各種推導式(列表推導式、字典推導式、集合推導式)

# 『Python基礎-12』各種推導式(列表推導式、字典推導式、集合推導式) 推導式comprehensions(又稱解析式),是Python的一種獨有特性。推導式是可以從一個數據序列構建另一個新的數據序列的結構體。 共有三種推導&#x…

海思芯片選型表匯總

海思芯片選型表匯總_「違規用戶」的博客-CSDN博客_海思芯片型號大全

Docker中未指定掛載點容器間volume卷的數據共享

一 背景 在實際使用過程中,我們可能會經常遇到容器間數據共享的情況,怎么處理呢?通過 docker 命令中的一些選項,我們即可完成容器間的數據共享。 二 實驗步驟 2.1 創建容器 容器一:gysl-1 [rootdev ~]# docker run -it…

為什么早上和傍晚的太陽總是紅色,而中午的大陽卻是黃白色?

由太陽光本質決定,但會受環境影響。在地球上和火星上看到的太陽光也是有區別的,和太氣層物質及厚薄也有關系。太陽光是由赤橙黃綠青藍紫七色光組成的復合光是白色光。 在日出和日落的時候,地平線上所透過的大氣層厚度,一般要比白…

js把日期字符串轉換成時間戳

//獲取當前時間: var myDate new Date();//當前時間 var year myDate.getFullYear();//當前年份 var month myDate.getMonth() 1;//當前月份 var day myDate.getDate();//當前日 myDate.getYear(); //獲取當前年份(2位) myDate.getFullYear(); …

VS2008中開發智能設備程序的一些總結

原文鏈接:http://blog.csdn.net/citybug_nj/article/details/2598705 程序中包括四個部分: 系統配置這個部分用來配置系統中的相關參數,參數包括數據庫信息和串口的配置信息。這部分的主要技術是XML文件的讀取和寫入。 數據下載從數據庫中下載…

go語言值得學習的開源項目推薦

谷歌官方維護了一個基于go語言的開源項目列表: https://github.com/golang/go/wiki/Projects 其中有非常多的優秀項目值得學習,有幾百行代碼適合新手閱讀的項目,也有大型如nsq、docker等的項目。 下面推薦幾款適合學習的項目: 1、…

部分Nand flash uboot 命令詳解

nand info & nand device顯示flash的信息: DM365 :>nand info Device 0: NAND 32MiB 3,3V 8-bit, sector size 16 KiB DM365 :>nand device Device 0: NAND 32MiB 3,3V 8-bitnand read(.oob) addr off size 不管是讀取data, 使用nand read,還是…

java7

第八章 數組 1.數組的聲明定義 數據類型[]變量名 new 數據類型[長度]; 列:int[]ary new int[5]; 2.取值,賦值 取值:數據名[下標]; 列:int a ary[1]; 賦值:變量數據名[…

BZOJ 3564 信號增幅儀

題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id3564 題意:給出平面上n個點,畫出一個橢圓,橢圓的長軸是短軸的p倍,且長軸的方向為x軸逆時針旋轉a度。求這個橢圓短軸的最小值使得可以覆蓋所以點。 思路&…

CentOS 7 搭建JAVA環境

安裝環境: LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.3.1611 (Core) Release: 7.3.1611 Codename: Core 開始 運行java -version 檢查系統是否安裝JRE 或JDK,有則卸載系統自帶JAVA包輸…

串口波形分析

UART口發出數據按字節發送,發送數據8bit,實際量出波形為10bit,軟件底層驅動會自動加上起始位和停止位各1bit,起始位為0,停止位為1。下圖為用串口工具發送的數據和用示波器所量波形。 發送數據:0x34 0x43 示…

SpringBoot之MongoTemplate的查詢可以怎么耍

學習一個新的數據庫,一般怎么下手呢?基本的CURD沒跑了,當可以熟練的增、刪、改、查一個數據庫時,可以說對這個數據庫算是入門了,如果需要更進一步的話,就需要了解下數據庫的特性,比如索引、事物…