人工智能綜合項目開發- 課件 項目七 人體姿態動作識別系統模擬實驗_第1頁
人工智能綜合項目開發- 課件 項目七 人體姿態動作識別系統模擬實驗_第2頁
人工智能綜合項目開發- 課件 項目七 人體姿態動作識別系統模擬實驗_第3頁
人工智能綜合項目開發- 課件 項目七 人體姿態動作識別系統模擬實驗_第4頁
人工智能綜合項目開發- 課件 項目七 人體姿態動作識別系統模擬實驗_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

人工智能綜合項目開發項目七人體姿態動作識別系統模擬實驗成都職業技術學院項目分析01任務一人體姿態檢測模型部署02任務二人體姿態動作識別算法實現03項目七

人體姿態動作識別系統模擬實驗項目分析人體關鍵點檢測算法原理,實現人體姿態檢測,構建跌倒預警系統實現人體姿態識

別預警系統,然后構建

web

顯示界面對人體姿態識別結果進行可視化。1.學習神經網絡數學模型基本概念。

2.了解人體姿態行為動作檢測算法與模型部署。

3.了解人體姿態行為動作的動作識別算法實現。4.掌握利用人體姿態行為動作的動作識別模型進行基于姿態檢測的危險行為識別系

統項目開發。人體姿態識別的應用范圍十分廣泛,可用于人機交互、影視制作、運動分析、游戲

娛樂等各種領域。人們可以利用人體姿態識別定位人體關節點運動軌跡并記錄其運動數據,

實現

3D

動畫模擬人體運動來制作電影電視;也可以通過記錄的軌道和數據對運動進

行分析;例如體育健身:根據人體關鍵點信息,分析人體姿態、運動軌跡、動作角度等,

輔助運動員進行體育訓練,分析健身鍛煉效果,提升教學效率;娛樂互動:視頻直播平

臺、線下互動屏幕等場景,可基于人體檢測和關鍵點分析,增加身體道具、體感游戲等

互動形式,豐富娛樂體驗;安防監控:實時監測定位人體,判斷特殊時段、核心區域是

否有人員入侵;基于人體關鍵點信息,進行二次開發,識別特定的異常行為,及時預警

管控等功能。人體姿態識別目前最為廣泛的應用是在于智能監控中。智能監控與一般普通監控的

區別主要在于將人體姿態識別技術嵌入視頻服務器中,

運用算法,

識別、判斷監控畫

面場景中的動態物體——行人、車輛的行為,

提取其中關鍵信息,

當出現異常行為時,

及時向用戶發出警報。世界衛生組織報告指出,全球每年有

30

余萬人死于跌倒,其中一半是

60

歲以上老人。在我國,跌倒已成為

65

歲以上老人傷害死亡的“頭號殺手”。

對于老人來說,摔倒

無疑是對健康的一大威脅。據北京市疾控中心公布的抽樣調查結果顯示:60

69

歲老年

人每年跌倒發生率為

9.8%,70

79

歲為

15.7%,80

歲以上為

22.7%,每增長

10

歲,跌

倒發生率會升高

0.5

倍左右。隨著目前中國人口老齡化日漸嚴重,所以在固定場景下的人體姿態識別技術可以應

用于家庭監控,

如為了預防獨居老人摔倒情況的發生,

可以通過在家中安裝識別摔倒

姿態的智能監控設備,

對獨居老年人摔倒情況的識別,

當出現緊急情況時及時作出響

應。人類社會的不斷發展與生活質量的不斷提升,

視頻監控已經被非常廣泛地應用到各

個領域,

人們生活空間的不斷擴大和延展,

公共及私人場所的領域也在隨之發展,

到各種突發情況的概率在不斷增加,

尤其是在公共場所,

由于其監控難度較大,

人口

密集。通過簡單的監控,

已經無法滿足當今社會發展的要求,

簡單地依靠值班人員的

堅守,

想要真正做到人體姿態預測還有較大難度,

對于社會資源也是一種潛在的浪費。因此,

選用智能監控系統已經成為當前社會解決這一根本問題的必由之路,

在社交的

過程中,

人類除了語言以外其肢體動作也能傳遞一定的信息,

通過較為科學合理的計

算機預測能夠實現動作的含義解讀,

并且更好幫助人們實現社交。本次項目案例主要應用于養老院或者智能家居里面的應用場景,其主要功能分為硬

件和軟件兩部分:1)硬件部分:STM32F407

核心控制板、姿態檢測傳感器、LCD

顯示屏、蜂鳴報警器;2)軟件部分:TensorFlow

深度科學框架

MoveNet

姿態檢測模型和

OpenCV

計算機視

覺技術。當姿態檢測傳感器檢測到人體姿態為跌倒時,會自動觸發報警系統,并將跌倒姿勢

顯示在

LCD

屏上。實現人體姿態動作識別系統分為三個任務:任務一主要實現人體姿態檢測模型部署

功能;任務二主要實現人體姿態動作識別算法功能;任務三主要實現人體姿態動作識別系統完整功能,如圖

7.1

所示:圖

7.1

人體姿態動作識別系統項目開發框圖任務一

人體姿態檢測模型部署本次實驗使用

TensorFlow

搭建姿態檢測模型

MoveNet

來實時識別人體姿態動作,例

如站立、行走、奔跑、蹲下,跳躍、摔倒等動作;并將人體姿態監測模型進行端側部署。(1)人體姿態識別概述人體姿態主要分為基于計算機視角的識別和基于運動捕獲技術的識別。基于計算機

視覺的識別主要通過各種特征信息來對人體姿態動作進行識別,

比如視頻圖像序列、人

體輪廓、多視角等。基于計算機視覺的識別可以比較容易獲取人體運動的軌跡、輪廓等

信息,

但沒有辦法具體實現表達人體的運動細節,

以及容易存在因遮擋而識別錯誤等

問題。基于運動捕獲技術的人體姿態識別,

則是通過定位人體的關節點、儲存關節點運

動數據信息來識別人體運動軌道。相較于計算機視角的人體姿態識別,

基于運動捕獲技

術的人體姿態識別可以更好地反映人體姿態信息,

也可以更好地處理和記錄運動細節,

不會因為物體顏色或被遮擋而影響運動軌道的識別,如圖

7.2

為人體姿態關鍵點檢測示

例圖。圖

7.2

人體姿態關鍵點檢測(2)人體姿態識別實現原理谷歌研究院推出了最新的姿態檢測模型

MoveNet,并在

TensorFlow.js

中推出了新

的姿態檢測

API,該模型可以非常快速、準確地檢測人體的

17

個關鍵節點,能夠以

50+fps

的速度在筆記本電腦和手機上運行。目前,MoveNet

有兩個版本以提供性能的權衡。Lightning

版本時效性更快,但是

產生的結果可能準確率不高;Thunder

版本時效性稍微慢一點,但準確率更高;因此,

可以看到

Thunder

模型的關鍵點得分通常會比

Lightning

略高。人體姿態關鍵點檢測,是指在圖像中把人身體的各個關鍵點預測出來。而人體姿態

估計,是指將圖片中已檢測到的人體關鍵點正確地聯系起來,從而估計人體姿態。人體

關鍵點通常是指人體上有一定自由度的關節,如頸部、肩部、腕部、手部等,如圖

7.3

所示:圖

7.3

人體姿態

17

個關鍵點17

個關鍵點所對應的人體部位包括:0:

鼻子、1:

左眼、2:

右眼、3:

左耳、4:

耳、5:

左肩、6:

右肩、7:

左肘、8:

右肘、9:

左腕、10:

右腕、11:

左胯、12:

右胯、

13:

左膝、14:

右膝、15:

左踝、16:

右踝。通過人體關鍵點在三維空間中的相對位置隨時間序的變化,來估計當前人體的姿態

動作。通過一段連續時間范圍內人體關鍵點的位置變化,可以抽象分析出人體的行為意

圖,例如判斷人的肢體動作,如圖

7.4

所示。圖

7.4

人體姿態動作(3)人體姿態識別模型部署流程人體姿態識別的模型部署流程先進行圖片輸入,使用

MoveNet

姿態檢測模型提取人

體姿態關鍵點,再將人體姿態骨骼圖數據集進行模型訓練,最后將訓練的模型進行部署

與測試,如圖

7.0-1

所示。圖

7.0-1

人體姿態識別模型部署流程1)MoveNet

模型框架MoveNet

是自下而上的估計模型,使用熱圖來精確定位人體關鍵點。該架構由兩個

部分組成:特征提取器和一組預測頭。預測方案大致遵循

CenterNet,但相較該架構而

言大幅提升了速度和準確性。所有模型均使用

TensorFlow

對象檢測

API

進行訓練。

MoveNet

中的特征提取器是

MobileNetV2,帶有附加的特征金字塔網絡

(FPN),可以實現

高分辨率(輸出步長為

4)且語義豐富的特征圖輸出,如圖

7.0-2

所示。特征提取器上附

帶四個預測頭,負責密集預測:a.人體中心熱圖:預測人體實例的幾何中心;b.關鍵點回歸場:預測人體的完整關鍵點集,用于將關鍵點分組到實例中;

c.人體關鍵點熱圖:獨立于人體實例,預測所有關鍵點的位置;d.每個關鍵點的

2D

偏移場:預測從每個輸出特征圖像素到每個關鍵點的精確子像

素位置的局部偏移量。圖

7.0-2

MoveNet

框架2)模型操作步驟一:人體中心熱圖用于識別框架中所有個人的中心,定義為屬于個人的所有關鍵點的算術平均值。選擇得分最高的位置(通過與框架中心的反距離加權)。步驟二:通過對象中心對應的像素分割關鍵點回歸輸出來生成該人體的初始關鍵點

集。由于這是中心向外的預測(必須在不同的尺度上操作),所以回歸關鍵點的質量不

會特別準確。步驟三:關鍵點熱圖中的每個像素都乘以一個權重,該權重與相應回歸關鍵點的距

離成反比。這可以確保我們不接受來自背景人物的關鍵點,因為他們通常不會靠近回歸

的關鍵點,因此得分較低。步驟四:通過檢索每個關鍵點通道中最大熱圖值的坐標來選擇關鍵點預測的最終集

合。然后將局部

2D

偏移量預測添加到這些坐標以給出精確的估計;如下圖

7.0-3

所示:圖

7.0-3

MoveNet

模型操作3)模型訓練準備好姿勢檢測模型

MoveNet,使用

MoveNet

對人體的

RGB

圖片數據集進行識別得

到人體姿態骨骼數據集,輸出的

17

個人體關節點畫出骨骼圖,如下圖示。圖

7.0-4

MoveNet

17

個人體關節骨骼如下圖所示,將骨骼數據集分為訓練集與測試集。圖

7.0-5

MoveNet

骨骼數據集將準備數據集在

TensorFlow

深度學習框架下訓練,構建全連接神經網絡層,生成測

試模型。4)模型部署加載

tflite

模型,讀取模型,分配張量,獲取輸入層和輸出層維度和輸入數據的形

狀:

erpreter

=

tflite.Interpreter(model_path=model_path)self.interpreter.allocate_tensors()self.model_name

=

model_nameself.input_details

=

erpreter.get_input_details()self.output_details

=

erpreter.get_output_details()

print(self.model_name

+

"_input_shape",

self.input_details[0]['shape'])

print(self.model_name

+

"_input_details",

self.input_details)

print(self.model_name

+

"_output_datalis",

self.output_details)獲取輸出層數據進行模型推理:input_data

=

img

self.interpreter.set_tensor(self.input_details[0]['index'],

input_data)

erpreter.invoke()

#

推理output_data1

=

erpreter.get_tensor(self.output_details[0]['index'])

#

獲取輸出層數據

return

output_data1任務二

人體姿態動作識別算法實現(1)人體姿態檢測模型輸出數據解析將部署完成的模型調用,解析模型輸出結果,對原圖像進行關鍵點繪制,將繪制的關鍵點進行連線,模型測試效果如圖

7.0-1

所示:keypoints_xy,

edges_xy,

edge_colors

=

_keypoints_and_edges_for_display(predictions[0],ai_cfg.CAM_HEIGHT,ai_cfg.CAM_WIDTH)drawLine(edges_xy,

img,

edge_colors)img,

human_action

=

humanAction(img,

keypoints_xy)圖

7.0-1

模型測試效果(2)基本動作判別算法實現

1)站立動作識別站立動作的識別當人體關鍵點成為一條直線,且關鍵點之間的連線斜率為

0

時,就

判斷該動作為站立:2action_index

=

0)行走動作識別行走動作的識別主要是基于左膝蓋與左腳踝或者右膝蓋與右腳踝關鍵點之間的連線

斜率大于

0.3

時,就判斷該動作為行走:elif

(math.fabs((keypoints_xy[13][0]

-

keypoints_xy[15][0])

/

(keypoints_xy[13][1]

-

keypoints_xy[15][1]))

>

0.3or

math.fabs(

(keypoints_xy[14][0]

-

keypoints_xy[16][0])

/

(keypoints_xy[14][1]

-keypoints_xy[16][1]))

>

0.3):if

action_index

==

0:action_index

=

9img

=

putText(img,

"行走",

(0,

110))3)蹲下動作識別蹲下動作的識別主要基于左臀與左腳踝或者右臀與右腳踝關鍵點之間的連線斜率大于

0.5

小于

2

時,就判斷該動作為蹲下:elif

(0.5

<

math.fabs((keypoints_xy[11][1]

-

keypoints_xy[15][1])

/

(keypoints_xy[11][0]

-

keypoints_xy[15][0]))

<

2or

0.5

<

math.fabs((keypoints_xy[12][1]

-

keypoints_xy[16][1])

/

(keypoints_xy[12][0]

-

keypoints_xy[16][0]))

<

2):if

action_index

==

0:action_index

=

8#

cv2.putText(img,

'Squat',

(0,

110),

cv2.FONT_HERSHEY_SIMPLEX,

0.7,#(0,

0,

255),

2)img

=

putText(img,

"蹲下",

(0,

110))4)摔倒動作識別摔倒動作的識別主要基于左臀與左腳踝或者右臀與右腳踝關鍵點之間的連線斜率小于

0.5

時,就判斷該動作為摔倒:elif

(math.fabs((keypoints_xy[11][1]

-

keypoints_xy[15][1])

/

(keypoints_xy[11][0]

-

keypoints_xy[15][0]))

<

0.5or

math.fabs((keypoints_xy[12][1]

-

keypoints_xy[16][1])

/

(keypoints_xy[12][0]

-

keypoints_xy[16][0]))

<

0.5):1if

action_index

==

0:action_index

=

5#

cv2.putText(img,

'WARNING:

Someone

is

falling

down!',

(0,

110),

cv2.FONT_HERSHEY_SIMPLEX,

0.7,#(0,

0,

255),

2)img

=

putText(img,

"警告:有人摔倒!!",

(0,

110))人體姿態動作識別系統項目開發(1)系統框架結構分析系統框架結構分為硬件和軟件兩部分,充分體現出嵌入式人工智能理念,硬件與軟件的完美結合,實現人體姿態動作識別系統。1)硬件部分硬件部分實現的過程整體框架分析圖如圖

7.11

所示,姿態檢測傳感器對人體姿態的動作進行數據采集與識別,并將識別結果顯示在

LCD

顯示屏,

7

核心控制板通過

WiFi

通信將采集識別到的數據上傳給軟件部分,軟件部分在接收完數據之后,識別為跌倒動作

時,立即下行數據給核心控制板,控制

RGB

燈閃爍,發出警報聲。圖

7.0-2

硬件部分框架分析圖2)軟件部分軟件部分實現的過程整體框架分析圖如圖

7.0-3

所示,通過

OpenCV

計算機技術,對

圖像進行獲取,軟件部分通過

WiFi

接收硬件部分傳來的數據,使用

TensorFlow

深度學習

框架

MoveNet

模型進行數據預處理,模型推理,訓練,對生成的模型進行動作判斷識別,

并通過

WiFi,將識別的動作與可視化交互界面聯動起來,可實現站立、行走、奔跑、蹲

下、跳躍、跌倒等動畫圖像。當識別為跌倒動作時,通過

WiFi

立即發送下行控制指令發送給

STM32F407

核心控制板,控制蜂鳴器發出報警聲。圖

7.0-3

軟件部分框架分析圖(2)人體姿態動作識別功能插件構建1)本次人體姿態動作識別系統開發采用

python

多進程實現圖像獲取,圖像識別,

嵌入式系統數據交互,結果可視化等任務。首先構建人體姿態圖像獲取、人體姿態動作

圖像識別、網頁端圖像傳遞、跌倒檢測預警系統數據接收與發送共四個功能插件:

q_flask

=

mp.Manager().Queue(5)

#

傳遞識別結果到網頁q_img

=

mp.Manager().Queue(1)

#

獲取攝像頭圖像q_rec

=

mp.Manager().Queue(1)

#

識別結果q_send

=

mp.Manager().Queue(2)

#

發送控制指令消息隊列full_dict

=

mp.Manager().dict({cfg.POSEN_STATIC:

4})

#

全局數據共享

mapOpenPlugin

=

dict()mapClosePlugin

=

dict()mapOpenPlugin[TaskType.IMAGE_GET_TASK]

=

(imgGetPluginRegist,

#

人體圖像獲取插件

(q_flask,

q_img,

q_rec,

q_send,

full_dict))mapOpenPlugin[TaskType.IMAGE_REC_TASK]

=

(imgRecPluginRegist,

#

人體姿態動作圖像識別插件

(q_img,

q_rec))(q_send,

full_dict))

for

plugin

in

mapOpenPlugin:

(str(plugin)

+

"啟動成功~")taskFunc,

taskArgs

=

mapOpenPlugin[plugin]

taskFunc(*taskArgs)

#

提交任務

workFlow.busStart()2)人體姿態圖像獲取功能插件實現實現第一個功能插件,人體姿態圖像獲取功能插件。調用攝像頭獲取人體姿態圖像,

獲取人體姿態結果消息隊列,并調用函數實現識別結果繪制,以及將結果傳遞到

web

頁端:mapOpenPlugin[TaskType.FLASK_TASK]

=

(flaskPluginRegist,#

網頁端

GUI

界面插件(htop,

port,

q_flask,

full_dict))mapOpenPlugin[TaskType.EMD_READ_SEND]

=

(emdPluginRegist,

#

嵌入式系統數據交互插件-class

VideoThread(threading.Thread):def

init

(self,

camera="0",

q_flask:

Queue=None,q_img:

Queue=None,

q_rec:

Queue=None,

q_send=None,

full_dict=None):threading.Thread.

init

(self)

self.cap

=

setCamera(0)

#

網絡攝像頭self.q_flask

=

q_flask

self.q_img

=

q_img

self.q_rec

=

q_rec#

消息隊列傳遞繪制識別結果后的圖像到

web

顯示插件

#

消息隊列傳遞原始圖像到識別插件#

消息隊列傳遞

AI

模型的推理結果self.embd_drive

=

EmbdDrive(q_send)2

self.full_dict

=

full_dictdef

run(self):

move_pricet

=

[]

while

True:if

self.cap

!=

"":ret,

frame

=

self.cap.read()frame

=

cv2.resize(frame,

(ai_cfg.CAM_WIDTH,

ai_cfg.CAM_HEIGHT))

#

原始圖像傳遞if

not

self.q_img.full()

and

not

frame

is

None:

self.q_img.put(bytearray(frame))#

識別結果繪制if

not

self.q_rec.empty():

move_pricet

=

self.q_rec.get()frame,

human_action

=

recImgDis(frame,

move_pricet)

#

賦值識別到的姿態動作

self.full_dict[config.POSEN_STATIC]

=

human_action

#

根據識別結果控制嵌入式設備if

human_action

==

5:controlEmbedded(self.embd_drive,

1)else:controlEmbedded(self.embd_drive,

0)#

傳遞圖像到

web

顯示界面中if

not

self.q_flask.full()

and

not

frame

is

None:self.q_flask.put(bytearray(frame))3)人體姿態識別模型推理功能插件實現實現第二個功能插件,人體姿態識別模型推理插件。在任務一中已經進行人體姿態識別模型部署,利用深度學習

MoveNet

算法實現了人體姿態動作識別功能,調用函數實現模型推理,并將模型推理結果進行傳遞:class

FaceMaskRecThread(threading.Thread):def

init

(self,

q_img:Queue=None,

q_rec:Queue=None,

model_path=ai_cfg.MOVE_MODEL_PATH):threading.Thread.

init

(self)self.q_img

=

q_img

self.q_rec

=

q_rec#

消息隊列傳遞原始圖像到識別插件

#

消息隊列傳遞

AI

模型的推理結果self.move_rec

=

MoveRec(model_path=model_path)

def

run(self):while

True:if

self.q_img.empty():

continue

4)可視化交互界面插件實現實現第三個功能插件,可視化交互界面插件。識別結果主要是站立、蹲下、行走、

摔倒等動作傳遞到

web

端。web

端獲取到識別結果進行展示:

else:image

=

self.q_img.get()if

image

!=

False:image

=

np.array(image).reshape(ai_cfg.CAM_HEIGHT,

ai_cfg.CAM_WIDTH,

3)else:breakmove_pricet

=

self.move_rec.inference(image)if

self.q_rec.full():continueelse:self.q_rec.put(move_pricet)class

FlaskTask():def

init

(self):global

appdef

onExit(self):passdef

worker(self,

host="",

port=8082,

q_flask=None,

full_dict=None):setStatus(full_dict)@app.route('/',

methods=['GET',

'POST'])

(3)跌倒檢測預警系統功能實現身體動作具有突發性、劇烈性和短暫性。在變化過程中,人身體傾斜入致角度發生def

base_layout():return

render_template('index.html')def

camera():while

True:if

q_flask.empty():continueelse:img

=

q_flask.get()if

img

!=

False:img

=

np.array(img).reshape(ai_cfg.CAM_HEIGHT,

ai_cfg.CAM_WIDTH,

3)ret,

buf

=

cv2.imencode(".jpeg",

img)yield

(b"--frame\r\nContent-Type:

image/jpeg\r\n\r\n"

+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論