
隨著人口老齡化問題的加重,獨居老人、空巢老人數量在不斷上升,因此如何保障獨居老人、空巢老人健康生活和人身安全至關重要。而對于獨居老人、空巢老人,如果出現摔倒等情況而不會及時發現,將會對其健康安全造成重大影響。本項目主要研究為開發一套摔倒自動識別報警平臺,使用視頻監控其采集多路視頻流數據,使用行人檢測算法、關鍵點檢測算法以及摔倒檢測算法實現對行人摔倒自動識別,并根據檢測情況,對相關人員發送警報,實現對老人的及時看護。該裝置可以布置在養老院等場所,通過算法自動判別,可以大大降低人力成本以及保護老人的隱私。該項目應用場景不知可以用到空巢老人,還可以用到家庭中的孕婦兒童、幼兒園等場景,實現對兒童的摔倒檢測。
項目中采用 OpenVINO 部署行人檢測算法、關鍵點檢測算法以及摔倒檢測算法實現對行人摔倒自動識別算法,并在英特爾開發套件 AlxBoard 使用 OpenVINO C# API 結合應用場景部署多模型。
項目中所使用的代碼全部在 GitHub 上開源,項目鏈接為:
https://github.com/guojin-yan/OpenVINO-CSharp-API/tree/csharp3.0/tutorial_examples/PP-Human_Fall_Detection
(復制鏈接到瀏覽器打開)
Part1
英特爾開發套件
OpenVINO 工具套件
1.1
英特爾發行版 OpenVINO工具套件基于oneAPI 而開發,可以加快高性能計算機視覺和深度學習視覺應用開發速度工具套件,適用于從邊緣到云的各種英特爾平臺上,幫助用戶更快地將更準確的真實世界結果部署到生產系統中。通過簡化的開發工作流程,OpenVINO 可賦能開發者在現實世界中部署高性能應用程序和算法。

OpenVINO 2023.1 于 2023 年 9 月 18 日發布,該工具包帶來了挖掘生成人工智能全部潛力的新功能。生成人工智能的覆蓋范圍得到了擴展,通過 PyTorch* 等框架增強了體驗,您可以在其中自動導入和轉換模型。大型語言模型(LLM)在運行時性能和內存優化方面得到了提升。聊天機器人、代碼生成等的模型已啟用。OpenVINO 更便攜,性能更高,可以在任何需要的地方運行:在邊緣、云中或本地。
英特爾開發套件 AlxBoard 介紹
1.2

產品定位
英特爾開發套件 AlxBoard 是英特爾開發套件官方序列中的一員,專為入門級人工智能應用和邊緣智能設備而設計。英特爾開發套件 AlxBoard 能完美勝人工智能學習、開發、實訓、應用等不同應用場景。該套件預裝了英特爾OpenVINO 工具套件、模型倉庫和演示案例,便于您輕松快捷地開始應用開發。
套件主要接口與 Jetson Nano 載板兼容,GPIO 與樹莓派兼容,能夠最大限度地復用成熟的生態資源。這使得套件能夠作為邊緣計算引擎,為人工智能產品驗證和開發提供強大支持;同時,也可以作為域控核心,為機器人產品開發提供技術支撐。
使用英特爾開發套件 AlxBoard,您將能夠在短時間內構建出一個出色的人工智能應用應用程序。無論是用于科研、教育還是商業領域,英特爾開發套件 AlxBoard都能為您提供良好的支持。借助 OpenVINO工具套件,CPU、iGPU 都具備強勁的 AI 推理能力,支持在圖像分類、目標檢測、分割和語音處理等應用中并行運行多個神經網絡。
產品參數

AI 推理單元
借助 OpenVINO 工具,能夠實現 CPU+iGPU 異構計算推理,IGPU 算力約為 0.6TOPS

Part2
PaddleDetection
實時行人分析工具 PP-Human
飛槳 (PaddlePaddle) 是集深度學習核心框架、工具組件和服務平臺為一體的技術先進、功能完備的開源深度學習平臺,已被中國企業廣泛使用,深度契合企業應用需求,擁有活躍的開發者社區生態。提供豐富的官方支持模型集合,并推出全類型的高性能部署和集成方案供開發者使用。是中國首個自主研發、功能豐富、開源開放的產業級深度學習平臺。
PaddleDetection 是一個基于 PaddlePaddle 的目標檢測端到端開發套件,內置 30+ 模型算法及 250+ 預訓練模型,覆蓋目標檢測、實例分割、跟蹤、關鍵點檢測等方向,其中包括服務器端和移動端高精度、輕量級產業級 SOTA 模型、冠軍方案和學術前沿算法,并提供配置化的網絡模塊組件、十余種數據增強策略和損失函數等高階優化支持和多種部署方案。在提供豐富的模型組件和測試基準的同時,注重端到端的產業落地應用,通過打造產業級特色模型|工具、建設產業應用范例等手段,幫助開發者實現數據準備、模型選型、模型訓練、模型部署的全流程打通,快速進行落地應用。

在實際應用中,打架、摔倒、異常闖入等異常行為的發生率高、后果嚴重,使得其成為了安防領域中重點監控的場景。飛槳目標檢測套件 PaddleDetection 中開源的行人分析工具 PP-Human 提供了五大異常行為識別、26 種人體屬性分析、人流計數、跨鏡 ReID 四大產業級功能,其中異常行為識別功能覆蓋了對摔倒、打架、打電話、抽煙、闖入等行為的檢測。

如圖所示,PP-Human 支持單張圖片、圖片文件夾單鏡頭視頻和多鏡頭視頻輸入,經目標檢測以及特征關聯,實現屬性識別、關鍵點檢測、軌跡/流量計數以及行為識別等功能。此處基于 OpenVINO 模型部署套件,進行多種模型聯合部署,實現實時行人行為識別,此處主要實現行人摔倒識別。

Part3
預測模型獲取與轉換
PP-YOLOE 行人跟蹤
3.1
模型介紹
PP-YOLOE 是基于 PP-YOLOv2 的卓越的單階段 Anchor-free 模型,超越了多種流行的 YOLO 模型,可以通過 width multiplier 和 depth multiplier 配置。PP-YOLOE 避免了使用諸如 Deformable Convolution 或者 Matrix NMS 之類的特殊算子,以使其能輕松地部署在多種多樣的硬件上。此處主要利用 PP-Yoloe 模型進行行人跟蹤。

表2 PP-Yoloe Paddle 格式模型信息
表 2 為 Paddle 格式下 PP-YOLOE 模型的輸入與輸出相關信息,該模型包括兩個輸入與兩個輸出,可以實現行人識別,該模型可以直接在飛槳平臺下載。但由于 PP-Yoloe 模型無法在 OpenVINO 平臺直接部署,需要進行節點裁剪,即裁剪掉 scale_factor 輸入節點,裁剪后模型結構如表 3 所示,具體如何裁剪后續講解。

表3 PP-YOLOE Paddle 格式模型信息
模型下載與轉換
(1) PaddlePaddle 模型下載與裁剪:
PP-Human 提供了訓練好的行人跟蹤模型,此處只需要下載,并將其解壓到指定文件夾中:
weget https://bj.bcebos.com/v1/paddledet/models/pipeline/mot_ppyoloe_l_36e_pipeline.zip
此處模型裁剪主要是在 Paddle 模型格式下進行裁剪,裁剪方式參考的jiangjiajun [1]提供的模型裁剪方式,為了方便使用,當前項目提供了模型裁剪工具包,在 “./paddle_model_process/” 文件夾下,利用命令進行模型裁剪:
python prune_paddle_model.py --model_dir mot_ppyoloe_l_36e_pipeline --model_filename model.pdmodel --params_filename model.pdiparams --output_names tmp_16 concat_14.tmp_0 --save_dir export_model
如表 4 所示,提供了模型裁剪命令說明,大家可以根據自己設置進行模型裁剪,當前命令裁剪的模型目前已經進行測試,完全符合當前階段的要求。

表4模型裁剪命令說明
(2)轉換為 ONNX 格式:
該方式需要安裝 paddle2onnx和onnxruntime 模塊。導出方式比較簡單,可以進行模型輸入固定,此處使用的都為 bath_size=1,在命令行中輸入以下指令進行轉換:
paddle2onnx --model_dir mot_ppyoloe_l_36e_pipeline --model_filename model.pdmodel --params_filename model.pdiparams --input_shape_dict "{'image':[1,3,640,640]}" --opset_version 11 --save_file mot_ppyoloe_l_36e_pipeline.onnx
(3)轉成 IR 格式
IR 格式為 OpenVINO 原生支持的模型格式,此處主要通過 OpenVINO 工具進行轉換,直接在命令行輸入以下指令即可:
mo --input_model mot_ppyoloe_l_36e_pipeline.onnx
PP-TinyPose 人體姿態識別
3.2
模型介紹
PP-TinyPose 是 PaddlePaddle 提供了關鍵點識別模型,PP-TinyPose 在單人和多人場景均達到性能 SOTA,同時對檢測人數無上限,并且在微小目標場景有卓越效果,助力開發者高性能實現異常行為識別、智能健身、體感互動游戲、人機交互等任務。同時擴大數據集,減小輸入尺寸,預處理與后處理加入 AID、UDP 和 DARK 等策略,保證模型的高性能。實現速度在 FP16 下 122FPS 的情況下,精度也可達到 51.8%AP,不僅比其他類似實現速度更快,精度更是提升了 130%。此處使用的是 dark_hrnet_w32_256x192 模型,該模型輸入與輸出如下表所示。

表5 dark_hrnet_w32_256x192 Paddle模型信息
表 5 為 Paddle 格式下 dark_hrnet_w32_256x192 模型的輸入與輸出相關信息,除此以外,飛槳還提供了輸入大小為 128×96 的模型,這兩類模型在部署時所有操作基本一致,主要差別就是輸入與輸出的形狀不同。分析模型的輸入和輸出可以獲取以下幾個點:
第一模型的輸入與 conv2d_585.tmp_1 節點輸出形狀,呈現倍數關系,具體是輸入的長寬是輸出的四倍,因此我們可以通過輸入形狀來推算輸出的大小。
第二模型 argmax_0.tmp_00 節點輸出為預測出的 17 個點的灰度圖,因此后續在進行數據處理是,只需要尋找到最大值所在位置,就可以找到近似的位置。
模型下載與轉換
(1)PaddlePaddle 模型下載方式:
命令行直接輸入以下代碼,或者瀏覽器輸入后面的網址即可。
wget https://bj.bcebos.com/v1/paddledet/models/pipeline/dark_hrnet_w32_256x192.zip
下載好后將其解壓到文件夾中,便可以獲得 Paddle 格式的推理模型。
(2)轉換為 ONNX 格式:
該方式需要安裝 paddle2onnx 和 onnxruntime 模塊。在命令行中輸入以下指令進行轉換,其中轉換時需要指定 input_shape,否者推理時間會很長:
paddle2onnx --model_dir dark_hrnet_w32_256x192 --model_filename model.pdmodel --params_filename model.pdiparams --input_shape_dict "{'image':[1,3,256,192]}" --opset_version 11 --save_file dark_hrnet_w32_256x192.onnx
(3)轉換為 IR 格式
利用 OpenVINO 模型優化器,可以實現將 ONNX 模型轉為 IR 格式。在 OpenVINO 環境下,切換到模型優化器文件夾,直接使用下面指令便可以進行轉換。
cd .openvino ools
mo --input_model paddle/model.pdmodel --input_shape [1,3,256,192]
經過上述指令模型轉換后,可以在當前文件夾下找到轉換后的三個文件。
由于 OpenVINO TM 支持 FP16 推理,此處為了對比推理時間,也已并將模型轉為 FP16 格式:
mo --input_model paddle/model.pdmodel --data_type FP16 --input_shape [1,3,256,192]
ST-GCN 基于關鍵點的行為識別
3.3
模型介紹
摔倒行為識別模型使用了 ST-GCN,并基于 PaddleVideo 套件完成模型訓練,此處可以直接下載飛槳提供的訓練好的模型。

表6 ST-GCN Paddle模型信息
表6 為 Paddle 格式下 ST-GCN 模型的輸入與輸出相關信息,該模型輸入為人體骨骼關鍵識別,由于摔倒是一個連續的過程,因此需要同時輸入 50 幀的關鍵點結果,因此該模型不支持單張圖片的預測,只支持視頻的推理預測;其模型輸出為是否摔倒的概率。
模型下載與轉換
(1)PaddlePaddle 模型下載方式:
命令行直接輸入以下代碼,或者瀏覽器輸入后面的網址即可。
wget https://bj.bcebos.com/v1/paddledet/models/pipeline/STGCN.zip
下載好后將其解壓到文件夾中,便可以獲得 Paddle 格式的推理模型。
(2)轉換為 ONNX 格式:
該方式需要安裝 paddle2onnx和onnxruntime 模塊。在命令行中輸入以下指令進行轉換:
paddle2onnx --model_dir STGCN --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 11 --save_file STGCN.onnx
(3)轉換為IR格式
利用 OpenVINO 模型優化器,可以實現將 ONNX 模型轉為 IR 格式。在 OpenVINO 環境下,切換到模型優化器文件夾,直接使用下面指令便可以進行轉換。
cd .openvino ools
mo --input_model paddle/model.pdmode
經過上述指令模型轉換后,可以在當前文件夾下找到轉換后的三個文件。
由于 OpenVINO 支持 FP16 推理,此處為了對比推理時間,也已并將模型轉為 FP16 格式:
mo --input_model paddle/model.pdmodel --data_type FP16
Part4
配置 PP-Human_Fall_Detection 項目
項目中所使用的代碼已經放在 GitHub 倉庫 PP-Human_Fall_Detection[2],大家可以根據情況自行下載和使用,下面我將會從頭開始一步步構建 PP-Human_Fall_Detection 項目。
環境配置
4.1
在該項目中主要需要配置 .NET 編譯運行環境、OpenVINO Runtime、OpenCvSharp 環境,其配置流程可以參考上一篇文章:【2023 Intel 有獎征文】英特爾開發套件 AlxBoard 使用 OpenVINO C# API 部署 Yolov8 模型 [3]。
創建 PP-Human_Fall_Detection項目
4.2
在該項目中,我們需要使用 OpenCvSharp,該依賴目前在 Ubutun 平臺最高可以支持 .NET Core 3.1,因此我們此處創建一個 .NET Core 3.1 的項目,使用 Terminal 輸入以下指令創建并打開項目文件:
dotnet new console --framework "netcoreapp3.1" -o PP-Human_Fall_Detection
cd PP-Human_Fall_Detection

添加項目源碼
4.3
前文中我們已經提供了項目源碼鏈接,大家可以直接再在源碼使用,此處由于篇幅限制,因此此處不對源碼做太多的講解,只演示如何使用項目源碼配置當前項目。將項目源碼中的 PP-Human 文件夾和 HumanFallDown.cs、Program.cs 文件復制到當前項目中,最后項目的路徑關系如下所示:
PP-Human_Fall_Detection
├──── PP-Human
| ├──── Common.cs
| ├──── PP-TinyPose.cs
| ├──── PP-YOLOE.cs
| └──── STGCN.cs
├──── HumanFallDown.cs
├──── PP-Human_Fall_Detection.csproj
└──── Program.cs
添加OpenVINO C# API
4.4
OpenVINO C# API 目前只支持克隆源碼的方式實現,首先使用 Git 克隆以下源碼,只需要在 Terminal 輸入以下命令:
git clone https://github.com/guojin-yan/OpenVINO-CSharp-API.git

然后將該項目文件夾下的除了 src 文件夾之外的文件都刪除掉,然后項目的文件路徑入下所示:
PP-Human_Fall_Detection
├──── OpenVINO-CSharp-API
| ├──── src
| └──── CSharpAPI
├──── PP-Human
| ├──── Common.cs
| ├──── PP-TinyPose.cs
| ├──── PP-YOLOE.cs
| └──── STGCN.cs
├──── HumanFallDown.cs
├──── PP-Human_Fall_Detection.csproj
└──── Program.cs
最后在當前項目中添加項目引用,只需要在 Terminal 輸入以下命令:
dotnet add reference ./OpenVINO-CSharp-API/src/CSharpAPI/CSharpAPI.csproj

添加OpenCvSharp
4.5
安裝 NuGet Package
OpenCvSharp 可以通過 NuGet Package 安裝,只需要在 Termina l輸入以下命令:
dotnet add package OpenCvSharp4_.runtime.ubuntu.20.04-x64
dotnet add package OpenCvSharp4


添加環境變量
將以下路徑添加到環境變量中:
export LD_LIBRARY_PATH=/home/ygj/Program/ OpenVINO-CSharp-API/tutorial_examples/AlxBoard_deploy_yolov8/bin/Debug/netcoreapp3.1/runtimes/ubuntu.20.04-x64/native
/bin/Debug/netcoreapp3.1/runtimes/ubuntu.20.04-x64/native 是項目編譯后生成的路徑,該路徑下存放了 libOpenCvSharpExtern.so 文件,該文件主要是封裝的 OpenCV 中的各種接口。也可以將該文件拷貝到項目運行路徑下。
Part5
測試PP-Human_Fall_Detection項目
創建視頻讀取器
5.1
當前項目測試內容為視頻,此處主要通過 OpenCV的VideoCapture 類進行讀取,實現逐幀讀取測試圖片。
// 視頻路徑
string test_video = @"E:Git_space基于Csharp和OpenVINO部署PP-Humandemo摔倒.mp4";
// string test_video = @"E:Git_space基于Csharp和OpenVINO部署PP-Humandemo摔倒2.mp4";
// 視頻讀取器
VideoCapture video_capture = new VideoCapture(test_video);
// 視頻幀率
double fps = video_capture.Fps;
// 視頻幀數
int frame_count = video_capture.FrameCount;
Console.WriteLine("video fps: {0}, frame_count: {1}", Math.Round(fps), frame_count);
行人識別
5.2
利用創建好的視頻讀取器逐幀讀取視頻圖片,將其帶入到 yoloe_predictor 預測器中進行預測,并將預測結果繪制到圖片上,期預測結果存放到 ResBboxs 類中,方便進行數據傳輸。
// 讀取視頻幀
if (!video_capture.Read(frame))
{
Console.WriteLine("視頻讀取完畢!!{0}", frame_id);
break;
}
// 復制可視化圖片
visualize_frame = frame.Clone();
// 行人識別
ResBboxs person_result = yoloe_predictor.predict(frame);
// 判斷是否識別到人
if (person_result.bboxs.Count < 1)
{
continue;
}
// 繪制行人區域
yoloe_predictor.draw_boxes(person_result, ref visualize_frame);
通過上述代碼,可以實現視頻所有幀圖片預測,將預測結果保存到本地,如圖所示,經過預測器預測,可以很好的捕獲到運動的行人。

關鍵點識別
5.3
上一步通過行人跟蹤,捕捉到了行人,由于行人是在不斷運動的,因此在進行關鍵點預測時,需要先進行裁剪,將行人區域按照指定要求裁剪下來,并根據裁剪結果對行人關鍵點進行預測,此處使用的是 bath_size=1 的預測,適合單人預測,如果出現多人時,可以采用同時預測。
// 裁剪行人區域
List point_rects;
List person_rois = tinyPose_predictor.get_point_roi(frame, person_result.bboxs, out point_rects);
for (int p = 0; p < person_rois.Count; p++)
{
// 關鍵點識別
float[,] person_point = tinyPose_predictor.predict(person_rois[p]);
KeyPoints key_point = new KeyPoints(frame_id, person_point, point_rects[p]);
//Console.WriteLine(key_point.bbox);
flag_stgcn = mot_point.add_point(key_point);
tinyPose_predictor.draw_poses(key_point, ref visualize_frame);
}
經過模型預測,第一會將預測結果存到結果容器“mot_point”中,用于后面的摔倒識別;另一點將模型預測結果繪制到圖像中,如圖所示。

摔倒識別
5.4
摔倒識別需要同時輸入 50 幀人體關鍵點識別結果,所以在開始階段需要積累 50 幀的關鍵點識別結果,此處采用自定義的結果保存容器 “MotPoint” 實現,該容器可以實現保存關鍵點結果,并將關鍵點識別結果與上一幀結果進行匹配,當容器已滿會返回推理標志,當滿足識別條件是,就會進行依次模型預測;同時會清理前 20 幀數據,繼續填充識別結果等待下一次滿足條件。
if (flag_stgcn)
{
List> predict_points = mot_point.get_points();
for (int p = 0; p < predict_points.Count; p++)
{
Console.WriteLine(predict_points[p].Count);
fall_down_result = stgcn_predictor.predict(predict_points[p]);
}
}
stgcn_predictor.draw_result(ref visualize_frame, fall_down_result, person_result.bboxs[0]);
摔倒識別結果為是否摔倒以及對應的權重,此處主要是在滿足條件的情況下,進行一次行為識別,并將識別結果繪制到圖像上。
模型聯合部署實現行人摔倒識別
5.5
通過行人跟蹤、關鍵點識別以及行為識別三個模型聯合預測,可以實現行人的行為識別,其識別效果如圖 14 所示。在該圖中分別包含了三個模型的識別結果:行人位置識別與跟蹤是通過 PP-YOLOE 模型實現的,該模型為下一步關鍵點識別提供了圖像范圍,保證了關鍵點識別的結果;人體骨骼關鍵點識別時通過 dark_hrnet 模型實現,為后續行為識別提供了輸入;最終的行為識別通過 ST-GCN 模型實現,其識別結果會知道了行人預測框下部,可以看到預測結果與行人是否摔倒一致。

Part6
總結
在該項目中,基于 C# 和 OpenVINO 聯合部署 PP-YOLOE 行人檢測模型、dark_hrnet 人體關鍵點識別模型以及 ST-GCN 行為識別模型,實現行人摔倒檢測。
在該項目中,主要存在的難點一是 PP-YOLOE 模型無法直接使用 OpenVINO 部署,需要進行裁剪,裁剪掉無法使用的節點,并根據裁剪的節點,處理模型的輸出數據;難點二是處理好行人預測與關鍵點模型識別內容的關系,在進行多人識別時,要結合行人識別模型進行對應的人體關鍵點識別,并且要當前幀識別結果要對應上一幀行人識別結果才可以保證識別的連續性。
-
英特爾
+關注
關注
61文章
10135瀏覽量
173511 -
視頻監控
+關注
關注
17文章
1719瀏覽量
65592 -
語言模型
+關注
關注
0文章
556瀏覽量
10584
原文標題:行人摔倒檢測 - 在英特爾開發套件上基于 OpenVINO? C# API 部署 PP-Human | 開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
基于C#和OpenVINO?在英特爾獨立顯卡上部署PP-TinyPose模型
使用OpenVINO C# API輕松部署飛槳PP-OCRv4模型

為什么無法檢測到OpenVINO?工具套件中的英特爾?集成圖形處理單元?
介紹英特爾?分布式OpenVINO?工具包
英特爾BOOT Loader開發套件-高級嵌入式開發基礎

產業級預訓練模型的實時行人分析工具PP-Human
C#調用OpenVINO工具套件部署Al模型項目開發項目
基于OpenVINO?工具包部署飛槳PP-Human的全流程
基于OpenVINO在英特爾開發套件上實現眼部追蹤
使用英特爾哪吒開發套件部署YOLOv5完成透明物體目標檢測

C#中使用OpenVINO?:輕松集成AI模型!

評論