摘 ?要:隨著人工智能發(fā)展,過(guò)去的數(shù)年間,卷積神經(jīng)網(wǎng)絡(luò),循環(huán)神經(jīng)網(wǎng)絡(luò),自編碼器,等領(lǐng)域發(fā)展迅速,但是由于移動(dòng)設(shè)備的機(jī)能限制,很少存在移動(dòng)設(shè)備上能夠直接運(yùn)行的網(wǎng)絡(luò)模型,需要將網(wǎng)絡(luò)輕量化才能在移動(dòng)設(shè)備上使用。本文通過(guò)輕量化網(wǎng)絡(luò)模型檢測(cè)人體關(guān)鍵點(diǎn),然后運(yùn)用相關(guān)算法讓人體動(dòng)作和系統(tǒng)的指令相互匹配、反饋并形成一個(gè)完善的系統(tǒng)。
關(guān)鍵詞:卷積神經(jīng)網(wǎng)絡(luò);輕量級(jí)網(wǎng)絡(luò);人體檢測(cè);動(dòng)作反饋
中圖分類號(hào):TP183 ;TP311 ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):2096-4706(2021)14-0086-04
Abstract: With the improvement of artificial intelligence, convolutional neural networks, cyclic neural networks, autoencoders, and other fields have developed rapidly in the past few years. However, due to the functional limitations of mobile devices, few models can run directly on mobile devices. The network model needs to be lightweight before it can be used on mobile devices. This paper uses lightweight network models to detect the key points of the human body, and then uses related algorithms to match human body movements and system commands, feedback and form a perfect system.
Keywords: convolutional neural network; lightweight network; human body detection; action feedback
0 ?引 ?言
首先為了能夠進(jìn)行肢體檢測(cè),我們需要人體姿態(tài)的評(píng)估獲取到對(duì)應(yīng)的人體關(guān)鍵坐標(biāo),人體姿態(tài)評(píng)估算法主要是評(píng)估人體關(guān)鍵部位在二維圖中的坐標(biāo),有時(shí)我們也會(huì)把這個(gè)坐標(biāo)叫做位置。在2016年卡內(nèi)基梅隆大學(xué)Yaser Sheikh組推出了CPM,同年的7月普林斯頓大學(xué)的Deng Jia組提出了Hourglass。兩者都在當(dāng)年取得優(yōu)異表現(xiàn)。
而輕量化是我們第二步需要解決的問(wèn)題,為了能讓移動(dòng)設(shè)備和可佩戴設(shè)備能夠使用深度神經(jīng)網(wǎng)絡(luò)進(jìn)行演算,google先后提出了三種主要網(wǎng)絡(luò)結(jié)構(gòu),由于第一代網(wǎng)絡(luò)結(jié)構(gòu)中存在激活函數(shù)數(shù)值歸0的問(wèn)題,為了更好解決這些問(wèn)題提出了mobileNet-V2,其提出的Linear Bottleneck緩解了激活函數(shù)問(wèn)題,之后Goolge又推出了mobileNet-V3,利用h-wish、SE模塊,其在精度和效率提升上取得了不小的提升。
我們需要利用mobileNet-V2和mobileNet-V3對(duì)Hourglass和CPM模型對(duì)其進(jìn)行修改,將卷積層分別改用進(jìn)行替換,配合系統(tǒng)后續(xù)功能。
第三步獲取到人體關(guān)鍵部位關(guān)鍵點(diǎn)坐標(biāo),然后使用BHLD算法將這些關(guān)鍵點(diǎn)轉(zhuǎn)化成為人體肢體特征,我們將這些肢體特征與人體運(yùn)動(dòng)和特殊狀態(tài)下手臂長(zhǎng)度,肢體角度等做對(duì)比。而有目的性的抽取特定應(yīng)用場(chǎng)景下人體動(dòng)作特性,我們將這些特性規(guī)范化提取成為特征預(yù)判條件,而這些預(yù)判條件能更有效地參與到與我們之前通過(guò)輕量化模型獲取的人體關(guān)鍵點(diǎn)坐標(biāo)轉(zhuǎn)化肢體特征的對(duì)比,然后給予一套評(píng)分規(guī)則對(duì)肢體特征進(jìn)行評(píng)分和系統(tǒng)對(duì)應(yīng)的指令形成映射并反饋提示信息。
完成以上基本要求,我們需要最后能夠在手機(jī)上執(zhí)行的系統(tǒng),同時(shí)為了考慮到一些手機(jī)性能問(wèn)題,我們還需要能夠通過(guò)網(wǎng)絡(luò)來(lái)幫助這些機(jī)型進(jìn)行異地的網(wǎng)絡(luò)計(jì)算,同時(shí)也需要系統(tǒng)能夠繼續(xù)自我學(xué)習(xí),優(yōu)化模型,更新模型。而這個(gè)系統(tǒng)的實(shí)現(xiàn)我們將在后面具體描述。
1 ?BHLD算法的肢體檢測(cè)與反饋
人體姿態(tài)的評(píng)估只是獲取到人體的幾個(gè)關(guān)鍵點(diǎn),無(wú)法檢測(cè)到人體當(dāng)前正在做什么具體動(dòng)作和表達(dá)什么意思,所以本文在這里解決:
(1)如何將人體動(dòng)作最后映射到對(duì)應(yīng)系統(tǒng)指令并取得反饋。
(2)如何檢測(cè)判定人體何種動(dòng)作狀態(tài)。
(3)如何提示用戶該如何滿足特定動(dòng)作。
本文提出一種簡(jiǎn)單的處理方式BHLD算法來(lái)結(jié)局以上問(wèn)題,BHLD算法其包含以下四個(gè)主要步驟:
第一步:從人體關(guān)鍵點(diǎn)中提煉肢體特征。
L=F肢體轉(zhuǎn)化(Point[n][2])
Point[n][2]表示人體的動(dòng)作在二維視頻中獲取的關(guān)鍵點(diǎn),n為人體關(guān)鍵點(diǎn)數(shù)量,同時(shí)每個(gè)關(guān)鍵點(diǎn)又包含其X坐標(biāo)與Y坐標(biāo)。Point整體包括頭部,頸部,下腹部,左右肩,左右手肘,左右手關(guān)節(jié),等部分相對(duì)的X,Y坐標(biāo)。L表示一個(gè)n維肢體特征數(shù)組,每個(gè)肢體特征包含一個(gè)數(shù)組分別存放角度和距離,其中包含肢體當(dāng)前左右肩部和肢體的角度,左右肘部角度,肢體左右小臂膀像素距離,肢體左右大臂膀像素距離等肢體特征,角度的單位為度,像素距離單位為像素。例如Y[0]表示頭部的長(zhǎng)度,而Y[1]表示頭部的與身體的角度。F肢體轉(zhuǎn)化()函數(shù)將人體特征點(diǎn)Point[n][2]按距離公式和角度計(jì)算公式,轉(zhuǎn)化成為特定的肢體間的角度與肢體本身像素長(zhǎng)度等肢體特征。
第二步:由肢體特征判定符合的動(dòng)作結(jié)果。
Z=F動(dòng)作判定(L1,L2,Point[n][2],Action[n])
L1,L2都是肢體特征,只是獲取方式不同,L1是當(dāng)前狀態(tài)下獲取的關(guān)鍵點(diǎn)后轉(zhuǎn)化的肢體特征而是L2人體標(biāo)準(zhǔn)站立狀態(tài)下獲取肢體特征,Action[n]是記錄根據(jù)實(shí)驗(yàn)過(guò)程中發(fā)現(xiàn)的人體動(dòng)作所對(duì)應(yīng)的特征模型數(shù)據(jù)列表,列表中存放這各種動(dòng)作信息,這些動(dòng)作信息又包含許多特征限制,這些限制包含檢測(cè)類型,檢測(cè)左、右邊界和滿足檢測(cè)后的得分與相應(yīng)權(quán)重。其中每一項(xiàng)都包含[動(dòng)作編號(hào),動(dòng)作名字,限制條件列表],而限制條件列表中的每一項(xiàng)又包含[檢測(cè)類型,檢測(cè)左邊界,檢測(cè)右邊界,標(biāo)準(zhǔn)分,權(quán)重]。
F動(dòng)作判定()函數(shù)首先從Action[n]列表開始,提取第一個(gè)Action對(duì)象,并對(duì)其所包含的限制條件逐一檢測(cè)。檢測(cè)方式是:根據(jù)限制條件的檢測(cè)類型進(jìn)行檢測(cè),而這些檢測(cè)類型包含但不僅僅只包含以下幾點(diǎn):
(1)將L1中的值與限制條件中檢測(cè)左邊界、檢測(cè)右邊界進(jìn)行匹配;
(2)將L1的肢體像素距離值與L2中同位置肢體像素距離進(jìn)行對(duì)比,然后獲取兩者的商并與限制條件中的“檢測(cè)左邊界”“檢測(cè)右邊界”進(jìn)行匹配;
(3)將Point點(diǎn)中幾個(gè)點(diǎn)的坐標(biāo)值進(jìn)行X與X互減,Y與Y互減,然后將X差值或Y差值與限制條件中“檢測(cè)左邊界”“檢測(cè)右邊界”進(jìn)行匹配;
由這些匹配結(jié)果來(lái)判斷人體動(dòng)作是否符合“檢測(cè)左邊界”與“檢測(cè)右邊界”,從而獲取限制條件中的標(biāo)準(zhǔn)分和權(quán)重得分,即權(quán)重×標(biāo)準(zhǔn)分;
累加所有條件的權(quán)重評(píng)分,得到累計(jì)分?jǐn)?shù),最高累計(jì)分?jǐn)?shù)和這個(gè)得分對(duì)應(yīng)的Action[n]對(duì)象動(dòng)作編號(hào)作為結(jié)果一部分返回,同時(shí)返回每個(gè)得分限制條件的檢測(cè)類型與其標(biāo)準(zhǔn)分和權(quán)重得分。
Z是經(jīng)過(guò)F動(dòng)作判定()函數(shù)處理后結(jié)果,其中包含最高得分的動(dòng)作編號(hào),最高得分,和限制條件計(jì)算結(jié)果列表,而列表中每一項(xiàng)又包括限制類型、動(dòng)作標(biāo)準(zhǔn)分和特征權(quán)重×標(biāo)準(zhǔn)分的權(quán)重分,其數(shù)據(jù)字典:[動(dòng)作編號(hào),最高權(quán)重評(píng)分,限制條件計(jì)算結(jié)果列表]。限制評(píng)定結(jié)果是多記錄列表,其中又每條記錄又包含:[限制類型,標(biāo)準(zhǔn)分,權(quán)重分]。
第三步:將結(jié)果映射到指令,然后獲取指令并執(zhí)行。
CM=CA檢測(cè)(Z,CL[n])
CL[n]是所有指令的映射列表,其中包含的每一條指令都含有各種匹配條件,這些條件分為必要條件,互斥條件,當(dāng)所有必要條件都滿足或者互斥條件滿足其中一項(xiàng),指令就可以被獲取。對(duì)應(yīng)每天指令的數(shù)據(jù)結(jié)構(gòu)[動(dòng)作編號(hào),指令編號(hào),必要條件列表,互斥條件列表],而其中每一個(gè)條件列表又包含了檢測(cè)類型,這樣就能通過(guò)檢測(cè)類型來(lái)判斷“動(dòng)作結(jié)果”是否滿足這些條件,從而判定指令是否執(zhí)行。CM是經(jīng)過(guò)CA檢測(cè)()函數(shù)檢測(cè)后得到的指令I(lǐng)D,獲取到CM指令后,系統(tǒng)會(huì)有其對(duì)應(yīng)的功能列表,其都包含一個(gè)具體功能ID與實(shí)際執(zhí)行代碼的映射。CA檢測(cè)()函數(shù)是對(duì)CL[n]中所有指令下的每個(gè)條件進(jìn)行窮盡檢測(cè)的檢測(cè)程序,會(huì)依次檢測(cè)Z的限制條件結(jié)果列表,查找條件列表中的檢測(cè)類型的對(duì)應(yīng)Z中每條記錄的限制類型能否一一配對(duì),獲取權(quán)重得分,判斷是否滿足后返回指令I(lǐng)D。當(dāng)指令I(lǐng)D被返回后,系統(tǒng)就會(huì)根據(jù)指令I(lǐng)D進(jìn)行執(zhí)行。
第四步,將動(dòng)作結(jié)果進(jìn)行對(duì)比,獲取匹配程度與說(shuō)明,然后反饋給用戶:
PL=C檢測(cè)(Z,S[n])
PL根據(jù)動(dòng)作編號(hào)、檢測(cè)結(jié)果的檢測(cè)類型和檢測(cè)結(jié)果的權(quán)重評(píng)分與S[n]進(jìn)行逐個(gè)對(duì)比,然后獲取對(duì)比匹配的S[n]問(wèn)題提示項(xiàng),所以P是S[n]的子集,S[n]是個(gè)數(shù)組,存放了檢測(cè)結(jié)果對(duì)應(yīng)的提示文字。C檢測(cè)()函數(shù)是根據(jù)Z返回?cái)?shù)據(jù)進(jìn)行對(duì)比,然后將檢測(cè)結(jié)果匹配的問(wèn)題提示返回給PL;最終用戶根據(jù)PL返回的結(jié)果獲取到對(duì)應(yīng)的提示,而第三步的指令會(huì)被系統(tǒng)接受,然后對(duì)應(yīng)操作系統(tǒng)內(nèi)的任務(wù),同時(shí)達(dá)到用戶,系統(tǒng)都得到應(yīng)該獲取的反饋。
2 ?系統(tǒng)實(shí)現(xiàn)
本文設(shè)計(jì)的系統(tǒng)是一種利用移動(dòng)設(shè)備檢測(cè)人體動(dòng)作通過(guò)本地指令反饋并同時(shí)保留遠(yuǎn)程網(wǎng)絡(luò)對(duì)具體動(dòng)作進(jìn)行分類的整體解決方案,前后包括圖片獲取,人體姿態(tài)估計(jì),BHLD算法的肢體檢測(cè)與反饋等功能,涉及包含如圖1所示的步驟。
各步驟具體工作為:
(1)用戶處于指定位置,移動(dòng)設(shè)備通過(guò)設(shè)備自帶攝像頭或外接USB攝像頭獲取用戶的動(dòng)作行為視頻。
(2)總控系統(tǒng)分析動(dòng)作視頻,采集實(shí)時(shí)特定圖片,利用輕量化改進(jìn)后的CPM和Hourglass人體姿態(tài)估計(jì)算法獲取到人體的基本關(guān)鍵點(diǎn)。
(3)總控系統(tǒng)將基本關(guān)鍵點(diǎn)數(shù)據(jù)發(fā)送到達(dá)肢體檢測(cè)系統(tǒng)。
(4)肢體檢測(cè)系統(tǒng)根據(jù)基本關(guān)鍵點(diǎn)和BHLD算法獲取每個(gè)人體肢體的具體位置,長(zhǎng)度,關(guān)節(jié)呈現(xiàn)的角度,和身軀的長(zhǎng)度,然后判斷整個(gè)人體處于特定的動(dòng)作中;若人體姿勢(shì)不滿足標(biāo)準(zhǔn)狀態(tài),則提示用戶如何糾正特定動(dòng)作來(lái)滿足標(biāo)準(zhǔn)狀態(tài)的要求。
(5)肢體檢測(cè)系統(tǒng)返回判斷結(jié)果到總控系統(tǒng),總控系統(tǒng)將人體姿態(tài)與計(jì)算指令進(jìn)行匹配:若人體姿勢(shì)滿足標(biāo)準(zhǔn)狀態(tài),則判斷該標(biāo)準(zhǔn)狀態(tài)是否對(duì)應(yīng)某項(xiàng)動(dòng)作指令,若是,則執(zhí)行該指令,若否,則忽略執(zhí)行相應(yīng)指令,直接將動(dòng)作信息反饋給用戶。
(6)用戶根據(jù)反饋結(jié)果繼續(xù)改變動(dòng)作,再次進(jìn)入步驟(1),直到用戶退出系統(tǒng)。
其中肢體檢測(cè)系統(tǒng)的核心是BHLD算法:
首先是轉(zhuǎn)化函數(shù),輸入人體關(guān)鍵特征點(diǎn),將這些點(diǎn)對(duì)應(yīng)到不同肢體,然后通過(guò)三角函數(shù)轉(zhuǎn)化成為對(duì)應(yīng)肢體的角度數(shù)據(jù),相同的還有距離函數(shù)概念相同就不呈現(xiàn)了。轉(zhuǎn)化函數(shù)具體代碼為:
fun countAnger(x1: Float, y1: Float, x2: Float, ?y2: Float):Double{
var ?langle: Number ?= Math.atan2(((x2 - x1).toDouble()), ((y2 - y1).toDouble()))
return ?langle.toDouble()*( 180 /Math.PI)
}
這個(gè)是肢體特征的部分屬性,頭部角度,肩部角度,上臂長(zhǎng)度,這些屬性都是通過(guò)上面的角度計(jì)算函數(shù)獲取。長(zhǎng)度屬性不同的就是執(zhí)行的是計(jì)算長(zhǎng)度的公式。具體代碼為:
class ActionFeature(){
//頭部角度
var angleOfTop :Double = 0.0
//肩部角度
var lAngleOfShoulder :Double = 0.0
var rAngleOfShoulder:Double = 0.0
//上臂長(zhǎng)度
var lLengthOfShoulder :Double = 0.0
var rLengthOfShoulder:Double = 0.0
//以下忽略
以下代碼是檢測(cè)具體的人體肢體特征關(guān)鍵代碼,最外層的runConditionCheck是整體的動(dòng)作檢測(cè)方法,for(condition in conditionList)是窮盡了所有方法對(duì)應(yīng)的限制條件,condition.checkLimit是讓這些限制條件去判斷是否和actionFeature相一致,而判斷的時(shí)候又要根據(jù)conditionId來(lái)判斷限制類型來(lái)調(diào)用不同的checkAction函數(shù),最后獲得結(jié)果分?jǐn)?shù)和權(quán)重。之后的代碼基本是計(jì)算權(quán)重,然后從hash表中獲取Action的指令I(lǐng)D,這些相對(duì)簡(jiǎn)單就不在展現(xiàn)。具體代碼為:
fun runConditionCheck(actionFeature: ActionFeature?,baseActionFeature: ActionFeature?){
for(condition in conditionList){
var result: ActionDetectionResult? = condition.checkLimit(actionFeature, baseActionFeature)
total += result!!.weight * result??!.socre
}
}
fun checkLimit(actionFeature:ActionFeature?, baseActionFeature:ActionFeature?): ActionDetectionResult? {
var result : ActionDetectionResult? = null
when(conditionId){
1L -> result = actionFeature?.let { checkAction(it) }
......//略
}
return result
}
fun checkAction(actionFeature:ActionFeature):ActionDetectionResult{
if(actionFeature.angleOfTop>=leftConditionLimit ||......){
return ActionDetectionResult(conditionId, socre, weight)
}
}
在肢體檢測(cè)系統(tǒng)內(nèi),系統(tǒng)同時(shí)還保留著對(duì)網(wǎng)絡(luò)請(qǐng)求,發(fā)送網(wǎng)絡(luò)信息,將人體姿態(tài)估計(jì)后的關(guān)鍵點(diǎn)實(shí)時(shí)傳送到網(wǎng)絡(luò)服務(wù)器,并同時(shí)對(duì)現(xiàn)有的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行學(xué)習(xí)任務(wù)。
從圖2中我們可以看到移動(dòng)設(shè)備可以通過(guò)網(wǎng)絡(luò)請(qǐng)求將圖片發(fā)送給遠(yuǎn)程網(wǎng)絡(luò)服務(wù)器,然后遠(yuǎn)程網(wǎng)絡(luò)服務(wù)器獲取到圖片數(shù)據(jù)然后放入運(yùn)算中心獲取到對(duì)應(yīng)的人體關(guān)鍵點(diǎn),之后返回給手機(jī)。
系統(tǒng)會(huì)定期從用戶上傳的圖片中拿出由后臺(tái)工作人員重新對(duì)其人體關(guān)鍵點(diǎn)進(jìn)行標(biāo)記,重新批量運(yùn)算人體姿態(tài)評(píng)估模型,更新模型超參數(shù)以求達(dá)到更好的預(yù)測(cè)性能并會(huì)及時(shí)同步到用戶手機(jī)上。同步到用戶手機(jī)上的除了人體姿態(tài)評(píng)估模型還有可能是定期需要更新的肢體運(yùn)算中的預(yù)判條件和指令映射數(shù)據(jù)。圖3為紅米手機(jī)實(shí)際檢測(cè)效果。
同時(shí)我們對(duì)應(yīng)幾個(gè)移動(dòng)設(shè)備進(jìn)行了粗略的性能統(tǒng)計(jì),如表2所示。
整體系統(tǒng)基本滿足我們之前設(shè)計(jì)的預(yù)期,基本能夠在移動(dòng)設(shè)備上進(jìn)行檢測(cè),同時(shí)我們也預(yù)留了接口,對(duì)應(yīng)老舊手機(jī)我們也能支持。
3 ?結(jié) ?論
首先由于是使用CPM和Hourglass網(wǎng)絡(luò)結(jié)構(gòu),而非CPN網(wǎng)絡(luò)結(jié)構(gòu)相對(duì)精度和效率存在一定的提升空間,后續(xù)會(huì)繼續(xù)改進(jìn)系統(tǒng),使用CPN網(wǎng)絡(luò)結(jié)構(gòu)輕量化改造版本來(lái)完善現(xiàn)有系統(tǒng),由于CPM和Hourglass網(wǎng)絡(luò)結(jié)構(gòu)已經(jīng)能夠滿足系統(tǒng)需求,對(duì)系統(tǒng)是否能移植移動(dòng)設(shè)備重要程度已非技術(shù)難點(diǎn),所以在這里本文暫且忽略優(yōu)化所帶來(lái)的性能提升。
其次,由于圖片是二維結(jié)構(gòu),而人體是三維結(jié)構(gòu),相同關(guān)鍵點(diǎn)組可以表達(dá)兩種及以上肢體特征,并非1對(duì)1映射,所以存在誤差和誤判。而這個(gè)問(wèn)題雖然可以通過(guò)人體構(gòu)造的特性限制和人體活動(dòng)本身的條件限制來(lái)減少誤判,但是這種方法并非最佳解決方案,而且隨檢測(cè)條件的增加必然會(huì)加重系統(tǒng)負(fù)擔(dān),本系統(tǒng)的另外不足之處在于使用窮盡法來(lái)判斷各種人體動(dòng)作,所以檢測(cè)條件的增加必然會(huì)加劇此問(wèn)題對(duì)性能和準(zhǔn)確性的影響。
參考文獻(xiàn):
[1] 唐暉,王慶,陳洪,等.基于深度學(xué)習(xí)的體感交互方法 [J].計(jì)算機(jī)與現(xiàn)代化,2019(2):7-14.
[2] 周鑫.特征池化:一種用于CNN的特征選擇方法 [D].西安:西安電子科技大學(xué),2018.
[3] 夏瀚笙,沈峘,胡委.基于人體關(guān)鍵點(diǎn)的分心駕駛行為識(shí)別 [J].計(jì)算機(jī)技術(shù)與發(fā)展,2019,29(7):1-5.
[4] 李玲霞,王羽,吳金君,等.基于改進(jìn)型多維卷積神經(jīng)網(wǎng)絡(luò)的微動(dòng)手勢(shì)識(shí)別方法 [J].計(jì)算機(jī)工程,2018,44(9):243-249.
[5] SU Z H,YE M,ZHANG G H,et al.Cascade Feature Aggregation for Human Pose Estimation [J/OL].arXiv:1902.07837 [cs.CV].(2019-02-21).https://arxiv.org/abs/1902.07837.
作者簡(jiǎn)介:范臻君(1982.11—),男,漢族,上海人,本科,研究方向:人工智能。