




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
人工智能綜合項目開發項目七人體姿態動作識別系統模擬實驗成都職業技術學院項目分析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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力設備在線監測系統的發展趨勢與挑戰考核試卷
- 2025年【起重機械電氣安裝維修】新版試題及答案
- 2024年項目管理考試回顧試題及答案
- 2025年注會學習技巧提升的途徑試題及答案
- 玻璃纖維增強塑料的低溫性能測試考核試卷
- 高端屋頂花園施工方案
- 汽車改裝配件批發考核試卷
- 2025年投資策略與經濟周期的互動關系試題及答案
- 社區服務與社會組織發展考核試卷
- 機場航站樓服務質量評價指標體系考核試卷
- 中醫醫術確有專長人員(多年實踐人員)醫師資格考核申請表
- 宏觀大類外匯系列專題(一)阿根廷匯率貶值的經驗教訓
- 教學課件 金屬學與熱處理-崔忠圻
- 成礦預測課件
- GB∕T 2518-2019 連續熱鍍鋅和鋅合金鍍層鋼板及鋼帶
- 年產美甲貼100萬張新建項目環境影響報告表
- 信息時代的研究生 學習與創新能力培養
- 契稅補貼申請表
- 西山煤電集團白家莊礦煤層開采初步設計
- 高速公路內業資料規范化管理實施細則課件
- 最新金屬軟管設計制造新工藝新技術及性能測試實用手冊
評論
0/150
提交評論