徐菲,陶青川,吳玲,敬倩
(四川大學電子信息學院,成都610065)
當前體能訓練中普遍需要將俯臥撐計數(shù)作為考核成績[1],俯臥撐測試的成績測量大都采用人工計數(shù)或紅外設備測量,這些測量方式均存在測試標準不一致、測試效率低、裁判員工作負荷大等問題。
基于紅外設備的俯臥撐計數(shù)系統(tǒng)主要由紅外發(fā)射器、紅外接收器等設備組成[2]。原理是測試人員撐起和俯臥時阻斷紅外發(fā)射器和紅外接收器之間的信號,接收器無法接收到信號時,判定相應俯臥撐動作并進行計數(shù)。但當紅外線被非測量對象遮擋后,系統(tǒng)也會判定是被運動員肢體遮擋,從而出現(xiàn)計數(shù)錯誤。所以紅外傳感測量設備普遍存在的問題是容易被異物干擾而誤報成績。
因此,采用基于機器視覺的智能算法對俯臥撐這一類傳統(tǒng)體能訓練項目進行檢測計數(shù),具有重大意義。人體姿態(tài)檢測是視頻智能監(jiān)控的關鍵應用領域之一,由于人體肢體自由度較高,當人在做不同的運動時,肢體也呈現(xiàn)不同的狀態(tài)[3]。傳統(tǒng)人體姿態(tài)識別框架OpenPose是基于卷積神經(jīng)網(wǎng)絡和監(jiān)督學習的框架上開發(fā)的開源庫,可以在多種場合下實現(xiàn)對人體復雜姿態(tài)的估計,在機器視覺領域有廣泛的應用[4]。但由于卷積神經(jīng)網(wǎng)絡復雜度過大,導致該訓練框架在運行速度、內(nèi)存空間諸多方面的限制,且不利于后續(xù)計數(shù)模塊銜接。
針對上述問題,本文設計了一種基于機器視覺的俯臥撐計數(shù)算法,如圖1所示,該算法由兩個部分組成,圖像采集模塊和智能計數(shù)模塊,圖像采集模塊中由攝像機完成圖像采集。智能計數(shù)模塊中由改進的YOLOv3算法進行對人體的目標檢測,由Ultralight-Simplepose模型預測人體關鍵點,最后由SVM分類器實現(xiàn)分類計數(shù)功能,輸出計數(shù)結(jié)果。
圖1 算法流程圖
COCO的英文全名是Common Objects in Context,該數(shù)據(jù)集是由美國微軟公司建立的一種大型的圖像處理數(shù)據(jù)集,其任務信息包含目標探測、像素分割和字幕標注等。對數(shù)據(jù)集的標注信息保存在JSON格式的文件中,包括五大類注釋,分別是目標檢測、關鍵點檢測、素材分割、全景分割和字幕生成。COCO API接口可以實現(xiàn)圖像標簽數(shù)據(jù)加載、解析和視頻可視化功能。
因本文使用COCO API接口,將制作的俯臥撐數(shù)據(jù)集全部轉(zhuǎn)換為COCO數(shù)據(jù)集格式后再進行訓練和測試。腳本一開始先將數(shù)據(jù)集字典段中的info、licenses及categories進行定義,然后再遍歷圖像信息將其轉(zhuǎn)換為對應的COCO格式,最終生成相應的JSON文件。
YOLOv3是針對YOLO模型的又一次改進版本,主要包括以下幾個方面:
(1)YOLOV3使用多個分類標簽預測來不同的目標,能適應更加多樣性的場景。與傳統(tǒng)的識別模型不同,它采用了單獨的邏輯分類工具,在訓練過程中使用二元交叉熵損失函數(shù)來分類目標。
(2)用于目標檢測的YOLOv3邊界框有3種不同的尺寸,但提取不同尺寸的特征時運用的是同一種算法。在基于COCO數(shù)據(jù)集的實驗中,YOLOv3的神經(jīng)網(wǎng)絡分別為每種尺寸預測了三個邊界框,得到的邊界張量T的公式是:
張量T中包含4個邊界框角點位置、1個目標預測以及80種不同類型的目標分類預測。N×N表示檢測框的參考位置信息,3是3個不同尺寸的先驗框。之后將不同圖層中得到的特征圖進行卷積、上采樣、圖層連接,獲得其上采樣特征和細粒度特征,提高檢測精度。
(3)YOLOv3在YOLOv2的基礎上進行了提升,同時融合其他新型殘差網(wǎng)絡,由連續(xù)的3×3卷積層和1×1卷積層組合而成,其中還添加了幾個近路連接。YOLOv3與YOLO系列以前的網(wǎng)絡對比,權值更大,層數(shù)更多,其卷積層數(shù)共有53個,所以命名DarkNet-53,如圖2所示。
圖2 DarkNet-53示意圖
DarkNet-53在檢測精度上比傳統(tǒng)的YOLO模型更加精確,同時計算量更加精簡,耗時更短。與ResNet-101相比,DarkNet-53的效率提升了近1.5倍,ResNet-152和它功能相當,但運行時間卻是其2倍[5]。
YOLOv3算法可以檢測多姿多態(tài)的物體,而本文只需要檢測人體。YOLOv3有三個不同尺寸的邊界框,大小分別為13×13、26×26、52×52。小尺寸的特征圖像更適合定位目標較大的目標,而大尺寸的特征圖像更容易檢測目標較小的物體。對于只檢測人的任務,YOLOv3網(wǎng)絡相對復雜,影響算法的檢測效率,系統(tǒng)負擔較大。因此,在結(jié)構(gòu)上對YOLOv3網(wǎng)絡進行了優(yōu)化,改進后的網(wǎng)絡結(jié)構(gòu)如圖3所示。
圖3 改進后網(wǎng)絡結(jié)構(gòu)示意圖
改進后網(wǎng)絡模型在整體結(jié)構(gòu)上與原YOLOv3模型類似,仍然運用了卷積層和殘差塊來進行特征提取,調(diào)整了開始的卷積層的尺寸和步長,減少計算量。
在檢測網(wǎng)絡部分,因為檢測目標尺寸為近景人體,不存在較小目標,將特征圖從原來的3個縮減為1個,只保留最小尺寸的特征圖。
改進后輸入尺寸為416×416,權值大小為122.3Mb,大小相對于原始YOLOv3減小了約2倍,GPU平均耗時7.2ms。改進后的GPU平均耗時,速度均有明顯提升。
本文運用改進的YOLOv3進行人體目標檢測,如圖4所示,預測出人體的感興趣區(qū)域(ROI),圈定該區(qū)域以便進行進一步處理。
圖4 人體目標檢測結(jié)果
Ultralight-SimplePose是一種超輕量的人體關鍵點預測框架,主要運用的是Simple Baseline算法[6]。與傳統(tǒng)人體姿態(tài)檢測框架相比,具有速度快,精度高的優(yōu)勢。采用自上而下的策略,先進行目標檢測(人),再對每個檢測到的人進行單人的關鍵點檢測(單人姿態(tài)估計),輸入圖像是1.2小節(jié)中改進后的YOLOv3檢測到的人的ROI。
Ultralight-SimplePose算法中提出的Simple Baseline結(jié)構(gòu)如圖5所示。ResNet是圖像特征提取中常用的一種主干網(wǎng)絡,該算法在主干網(wǎng)ResNet最后一個卷積階段插入了幾層名為C5的反卷積。默認情況下,使用三個具有批處理規(guī)范化和由線性函數(shù)激活的反卷積層,每層有256個4×4核濾波器,步幅是2。最后加入1×1的卷積層,生成人體關鍵點預測圖。
圖5 baseline結(jié)構(gòu)圖
該算法與Hourglass[7]和CPN[8]在生成高分辨率特征圖的方式上有所不同,后兩者都使用上采樣來提高特征映射的分辨率,并將卷積參數(shù)放入其他塊中。而Simple Baseline的方法是將上采樣和卷積參數(shù)以更簡單的方式組合到反卷積層中,而不使用跳層連接。
該算法在姿態(tài)追蹤方面具體有如下幾點:
(1)光流聯(lián)合傳播:光流(Optical Flow)是指運動的目標在連續(xù)多幀圖像上的像素移動的瞬時速度,光流矢量是圖像上相應的坐標點灰度的瞬時變化率。對于前一幀中的檢測到的人體各個關節(jié)點,計算光流矢量,然后確定一個邊界框,作為傳播到當前幀中的人體預測。當由于運動模糊或遮擋而丟失檢測時,該算法可以從之前的幀中正確預測出當前幀的人體的邊界框。
(2)基于光流的姿態(tài)匹配:幀間追蹤某個目標時,需要計算目標前后幀的匹配度,在運動較快或者密集場景下,使用邊界框IoU(Intersection over Union)作為相似性度量(SBbox)效果不好,此時框不重疊,且與實例沒有對應關系;當兩幀間的姿態(tài)相差較大時,使用對象關節(jié)點相似性OKS(Object Keypoint Similarity)效果也不好,無法進行有效匹配。該算法就利用了光流,先計算下一幀的加上光流偏移后的姿態(tài),然后再計算OKS,考慮到兩幀之間可能有各種原因造成的不連續(xù)情況,所以這里可以計算連續(xù)多幀的OKS。給定幀Ik中的一個實例和幀Il中的一個實例,基于流的姿勢相似性度量表示為:
(3)基于光流的姿態(tài)跟蹤算法:首先將(1)中說的聯(lián)合傳播中得到人像預測和檢測模型得到的預測做非極大值抑制(NMS),然后進行單人姿態(tài)估計,之后計算如(2)中所述的兩幀之間的對象關鍵點相似性(OKS),并進行貪婪匹配,完成姿態(tài)跟蹤。
以上是關于Ultralight-SimplePose框架人體姿態(tài)預測的算法原理簡述,調(diào)用Ultralight-SimplePose進行訓練,得到俯臥撐狀態(tài)下的人體關鍵點預測模型。該算法中人體關鍵點共有17處,分別為鼻子、左眼、右眼、左耳、右耳、左肩、右鍵、左肘、右肘、左腕、右腕、左臀、右臀、左膝、右膝、左踝、右踝。將以上17個點進行預測,并分別記錄其二維平面點坐標。圖6為實驗中人體俯臥撐時關鍵點預測圖,其中人體關鍵點預測精度為0.945。
圖6 人體俯臥撐時關鍵點預測圖
支持向量機SVM(Support Vector Machines)是一種二分類模型[9]。SVM的基本算法是對于線性可分的數(shù)據(jù)集,求解一個超平面,該超平面能夠?qū)⒂柧殧?shù)據(jù)集劃分為正類和負類,并最大化其幾何區(qū)間[10]。本文需要分類的數(shù)據(jù)集為提取人體關鍵點后計算出的角度特征數(shù)據(jù),屬于非線性可分數(shù)據(jù)集,此時要通過函數(shù)變換使坐標數(shù)據(jù)映射到更高維度的空間里,在高維度空間里再求解一個超平面進行線性分類,將分類結(jié)果映射回原本的數(shù)據(jù)集中。
這種非線性的映射在SVM里由核函數(shù)來實現(xiàn),核函數(shù)的作用是簡化高維空間中的映射計算量,本文采用高斯徑向基核函數(shù)(Gaussian radial basis function kernel)來實現(xiàn)輸入空間到特征空間的映射,設訓練數(shù)據(jù)集T={(x1,y1),(x2,y2),…,(xN,yN)},坐標點數(shù)據(jù)xi∈Rd,d為樣本空間維度,學習目標yi∈{- 1,1}為二元變量,i,j=1,2,…,N。
輸入實例為Xi、Xj,核函數(shù)表達式為:
通過核函數(shù)求解凸二次規(guī)劃問題,在高維度空間里分類決策函數(shù)為:
上式中b為偏置項,其中α的值,也就是求解關于對偶問題的最大值,其中C(C>0)為懲罰因子,由下面公式計算得出:
將核函數(shù)K代入(4)式中,得到基于高斯徑向基核函數(shù)的SVM最優(yōu)分類函數(shù):
本文將1.3小節(jié)中所獲得的人體17個關鍵點坐標數(shù)據(jù)集進行處理,為減少計算維度和計算量,去除與俯臥撐動作無關的臉部點位,只提取手肘夾角、肩肘夾角、臀腰夾角等特征,輸入SVM分類器進行訓練。分別將以下三種狀態(tài)進行標注:標準俯臥撐狀態(tài)下的撐起狀態(tài),俯臥狀態(tài),以及不標準俯臥撐狀態(tài)。為了完成俯臥撐計數(shù)的同時實現(xiàn)對俯臥撐動作標準化的監(jiān)督,使用二叉樹法依次分類樣本[11],如圖7所示,SVM先將標準俯臥撐和不標準俯臥撐進行分類,以便在計數(shù)過程中篩除不標準姿態(tài),隨后分類標準俯臥撐狀態(tài)下的撐起狀態(tài)及俯臥狀態(tài)。
圖7 多分類SVM俯臥撐計數(shù)模型
訓練出檢測俯臥撐計數(shù)的SVM分類器后,設置計數(shù)器,若實例動作不標準,則不予計數(shù),當圖像遍歷撐起、俯臥、撐起三個狀態(tài)時,則計數(shù)器加一,實現(xiàn)俯臥撐計數(shù)功能,如圖8所示。
圖8 俯臥撐計數(shù)界面
本文實驗環(huán)境為PyTorch 1.4.0、Python 3.6、Ubuntu 18.04.4LTS、MXNet 1.5.0;處理器為Intel Core i5-7400,CPU頻率為3.0GHz;內(nèi)存8GB;GPU顯卡為NVIDIA GTX 1080TI,顯存12GB。
本文選擇hmdb51[12]、UCF50[13]人類行為數(shù)據(jù)集中俯臥撐視頻,自制俯臥撐訓練視頻等抽幀作為訓練數(shù)據(jù)集,選取其中3000張圖片作為數(shù)據(jù)樣本。
實驗測試由視頻測試,抽幀得到的圖片數(shù)據(jù)傳遞至智能計數(shù)模塊開始計數(shù),每張圖片檢測耗時125ms。本實驗以計數(shù)準確率作為評價標準,實驗測試結(jié)果見表1。
表1 計數(shù)算法測試結(jié)果
根據(jù)實驗結(jié)果所示,該算法完全正確率大于99%,可以實時地,準確地進行俯臥撐體能訓練及測試計數(shù)。
本文設計了一種基于機器視覺的俯臥撐計數(shù)算法,能準確實現(xiàn)體能訓練及考核中俯臥撐計數(shù),比人工計數(shù)更準確,節(jié)省人力成本;比紅外感應計數(shù)更便捷、安全、不易被異物干擾。本文的算法及網(wǎng)絡框架還可以推廣到其他體能測試計數(shù)需求,如仰臥起坐、引體向上等項目,有較強的應用性。該算法在極少數(shù)的條件下的檢測還是存在漏計和誤計的情況,因此仍需要擴充數(shù)據(jù)集,并且對網(wǎng)絡進一步優(yōu)化。