【昇腾产品应用】英码科技EA500I基于昇腾Mind SDK实现实时人体关键点检测

在教育、体育、安防、交通、医疗等领域中,实时人体关键点检测应用发挥着至关重要的作用,比如在体育训练时,实时人体关键点检测可以精确、实时地捕捉运动员的动作,从而进行动作分析和优化;在安防应用场景中,实时人体关键点检测应用可以用来识别异常行为或特定姿态,以达到场景安全防控的目的。

*图片来源昇腾社区官网

那么,什么是实时人体关键点检测?

简单来说,实时人体关键点检测是一种计算机视觉技术,它能够在图像或视频中实时地自动识别并标注出人体的关键部位,如关节点、头部等。

实时人体关键点检测在边缘计算领域的应用非常重要和广泛,今天我们来介绍:如何在英码科技EA500I边缘计算盒子上使用昇腾Mind SDK来实现实时人体关键点检测。

案例概述

该项目使用昇腾MindX SDK开发端到端人体关键点识别的参考设计,实现对视频中的人体进行关键点识别的功能。

案例说明

本案例参考华为昇腾Mind SDK 实时人体关键点检测,底层原理逻辑请参考<昇腾社区应用案例>

前置条件

一、环境安装

●注意:

➢以下操作以普通用户HwHiAiUser安装CANN包为例说明,推荐使用root用户进行操作,如果是root用户,请将安装准备中所有的${HOME}修改为/usr/local。

➢推荐按照本文档路径进行操作,如安装在自定义路径可能会导致环境冲突等问题

①配置相关环境

# 以安装用户在任意目录下执行以下命令,打开.bashrc文件。
vi ~/.bashrc  
# 在文件最后一行后面添加如下内容。
source ${HOME}/Ascend/ascend-toolkit/set_env.sh
source /home/work/MindX_SDK/mxVision-5.0.RC3/set_env.shexport CPU_ARCH=`arch`
export THIRDPART_PATH=${HOME}/Ascend/thirdpart/${CPU_ARCH}  #代码编译时链接samples所依赖的相关库文件
export LD_LIBRARY_PATH=${THIRDPART_PATH}/lib:$LD_LIBRARY_PATH  #运行时链接库文件
export INSTALL_DIR=${HOME}/Ascend/ascend-toolkit/latest #CANN软件安装后的文件存储路径,根据安装目录自行修改
export DDK_PATH=${HOME}/Ascend/ascend-toolkit/latest #声明CANN环境
export NPU_HOST_LIB=${DDK_PATH}/runtime/lib64/stub #声明CANN环境
# 执行命令保存文件并退出。
:wq!  
# 执行命令使其立即生效。
source ~/.bashrc
# 创建samples相关依赖文件夹
mkdir -p ${THIRDPART_PATH}
# 下载源码并安装git
cd ${HOME}
sudo apt-get install git
git clone https://gitee.com/ascend/samples.git
# 拷贝公共文件到samples相关依赖路径中
cp -r ${HOME}/samples/common ${THIRDPART_PATH} 
# 拷贝media_mini等so文件以及相关头文件
mkdir -p ${INSTALL_DIR}/driver
cp /usr/lib64/libmedia_mini.so ${INSTALL_DIR}/driver/ #如路径中没有相关so文件,可跳过该命令
cp /usr/lib64/libslog.so ${INSTALL_DIR}/driver/
cp /usr/lib64/libc_sec.so ${INSTALL_DIR}/driver/
cp /usr/lib64/libmmpa.so ${INSTALL_DIR}/driver/
cp /usr/local/Ascend/include/peripheral_api.h ${INSTALL_DIR}/driver/ #如路径中没有相关头文件,可跳过该命令
# 下载案例源码并安装git
cd ${HOME}
git clone https://gitee.com/ascend/mindxsdk-referenceapps.git

②安装x264插件

# 下载x264
cd ${HOME}
git clone https://code.videolan.org/videolan/x264.git
cd x264
# 安装x264
./configure --enable-shared --disable-asm
make
sudo make install
sudo cp /usr/local/lib/libx264.so.164 /lib

③安装部署ffmpeg 

# 下载ffmpeg
cd ${HOME}
wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate
tar -zxvf ffmpeg-4.1.3.tar.gz
cd ffmpeg-4.1.3
# 安装ffmpeg
./configure --enable-shared --enable-pic --enable-static --disable-x86asm --enable-libx264 --enable-gpl --prefix=${THIRDPART_PATH} #此步骤报错可参考FAQ
make -j8
make install
# 添加环境变量
vi ~/.bashrc  
# 在文件最后一行后面添加如下内容。
export PATH=${HOME}/Ascend/thirdpart/aarch64/bin:$PATH
# 执行命令保存文件并退出。
:wq!  
# 执行命令使其立即生效。
source ~/.bashrc

④安装live555

# 下载相应版本的live555软件包,该版本测试可用,部分版本的软件包会有代码编译的报错
cd ${HOME}
wget http://www.live555.com/liveMedia/public/live.xxxx.xx.xx.tar.gz(请根据实际版本下载)
tar -zxvf live.xxxx.xx.xx.tar.gz
cd live/
# 修改config.linux
vi config.linux
找到:CPLUSPLUS_FLAGS =       $(COMPILE_OPTS) -Wall -DBSD=1
替换为:CPLUSPLUS_FLAGS =       $(COMPILE_OPTS) -Wall -DBSD=1 -std=c++2a
# 执行命令保存文件并退出。
:wq! 
# 配置视频循环推流,按照以下提示修改文件可以使自主搭建的rtsp循环推流,如果不作更改,则为有限的视频流
cd ./liveMedia/
vi ByteStreamFileSource.cpp
# 在liveMedia库下的ByteStreamFileSource.cpp文件中的95行,找到:
void ByteStreamFileSource::doGetNextFrame() {if (feof(fFid) || ferror(fFid) || (fLimitNumBytesToStream && fNumBytesToStream == 0))
{handleClosure();return;}
# 替换为:
void ByteStreamFileSource::doGetNextFrame() {if (feof(fFid) || ferror(fFid) || (fLimitNumBytesToStream && fNumBytesToStream == 0)) {//handleClosure();**//return;**fseek(fFid, 0, SEEK_SET);}
# 执行命令保存文件并退出。
:wq! 
# 编译并安装
cd ..
./genMakefiles linux  #注意后面这个参数是根据当前文件夹下config.<后缀>获取得到的,与服务器架构等有关。
make -j8
# 编译完成后就会在当前目录下生成mediaServer 文件夹,有一个live555MediaServer可执行文件
# 防止推流丢帧
cd ../mediaServer
vi DynamicRTSPServer.cpp
在mediaServer的DynamicRTSPServer.cpp文件中,修改每一处OutPacketBuffer::maxSize的值,更改到800000,该版本有三处需要修改。
# 执行命令保存文件并退出。
:wq!
# 修改了代码后需要重新执行编译
cd ..
make clean
./genMakefiles linux  #注意后面这个参数是根据当前文件夹下config.<后缀>获取得到的,与服务器架构等有关。
make -j8
# 转换MP4文件,把需要推流的人体MP4视频文件上传到相应目录,执行命令转换成h264文件,相应参数请自行修改
ffmpeg -i test.mp4 -vcodec h264 -bf 0 -g 25 -r 10 -s 1280*720 -an -f h264 test1.264
//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制 -an关闭音频, -r 指定帧率
# 把转换后的h264文件拷贝到${HOME}/live/mediaServer/路径下
# 启动推流
./live555MediaServer
# 启动完成会输出推流地址,其中rtsp_Url的格式是 rtsp://host:port/Data,host:port/路径映射到mediaServer/目录下,Data为视频文件的路径。例:rtsp://10.1.30.111:80/test1.h264
# 启动成功后该终端窗口会一直推流,请另开一个终端窗口进行后续步骤

二、模型获取&转换 

# 进入案例路径,mindxsdk-referenceapps为前置步骤中下载的案例包
cd ${HOME}/mindxsdk-referenceapps/contrib/RTMHumanKeypointsDetection
# 在models路径下下载原始模型,下列链接可下载512x512的onnx模型文件
cd ./models
wget https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/RTMHumanKeypointsDetection/human-pose-estimation512.onnx --no-check-certificate
# 进入"${RTMHumanKeypointsDetection代码包目录}/models/"目录,对"insert_op.cfg"文件做以下修改
related_input_rank: 0
src_image_size_w: 512 # onnx模型输入的宽,请根据对应模型进行修改,如使用本案例文档下载的原始模型,则不需要修改
src_image_size_h: 512 # onnx模型输入的高,请根据对应模型进行修改,如使用本案例文档下载的原始模型,则不需要修改
crop: false
# 使用ATC工具进行模型转换
atc --model=./human-pose-estimation512.onnx --framework=5 --output=openpose_pytorch_512 --soc_version=Ascend310B1 --input_shape="data:1, 3, 512, 512" --input_format=NCHW --insert_op_conf=./insert_op.cfg

 

三、编译运行案例

# 修改RTMHumanKeypointsDetection/pipeline目录下的rtmOpenpose.pipeline文件中mxpi_rtspsrc0的内容。"mxpi_rtspsrc0": {"factory": "mxpi_rtspsrc","props": {"rtspUrl":"rtsp://xxx.xxx.xxx.xxx:xxxx/xxx.264",      // 修改为自己所使用的的服务器和文件名,例:rtsp://10.1.30.111:80/test1.h264"channelId": "0"},"next": "mxpi_videodecoder0"},# 注意检查om模型文件名是否和pipeline/rtmOpenpose.pipeline中的mxpi_tensorinfer0 插件 modelPath 属性值相同,若不同需改为一致。"mxpi_tensorinfer0":{"next":"mxpi_rtmopenposepostprocess0","factory":"mxpi_tensorinfer","props":{"dataSource": "mxpi_imageresize0","modelPath":"./models/openpose_pytorch_512.om"//检查om模型文件名是否正确}},
# 若修改了模型的输入尺寸,还需要将 mxpi_imageresize0 插件中的 resizeWidth 和 resizeHeight 属性改成修改后的模型输入尺寸值;将 mxpi_rtmopenposepostprocess0 插件中的 inputWidth 和 inputHeight 属性改成修改后的模型输入尺寸值。"mxpi_imageresize0":{"next":"queue3","factory":"mxpi_imageresize","props":{"interpolation":"2","resizeWidth":"512",//输入的宽,请根据对应模型进行修改"resizeHeight":"512",//输入的高,请根据对应模型进行修改"dataSource":"mxpi_videodecoder0","resizeType":"Resizer_KeepAspectRatio_Fit"}},......"mxpi_rtmopenposepostprocess0":{"next":"queue4","factory":"mxpi_rtmopenposepostprocess","props":{"imageSource":"mxpi_videodecoder0","inputHeight":"512",//输入的高,请根据对应模型进行修改"dataSource":"mxpi_tensorinfer0","inputWidth":"512"//输入的宽,请根据对应模型进行修改}},
#   将pipeline里面的 mxpi_videoencoder0 插件中的 imageHeight 和 imageWidth 更改为上传视频的实际高和宽。"mxpi_videoencoder0":{"props": {"inputFormat": "YUV420SP_NV12","outputFormat": "H264","fps": "1","iFrameInterval": "50","imageHeight": "720",#上传视频的实际高"imageWidth": "1280"#上传视频的实际宽},
# 本项目需要使用 mxpi_opencvosd 插件,使用前需要生成所需的模型文件。执行MindX SDK开发套件包安装目录下 operators/opencvosd/generate_osd_om.sh 脚本生成所需模型文件。
例:bash /home/work/MindX_SDK/mxVision-5.0.RC3/operators/opencvosd/generate_osd_om.sh
# 编译项目
cd ${HOME}/mindxsdk-referenceapps/contrib/RTMHumanKeypointsDetection
vi CMakeLists.txt
# 在target_link_libraries处添加:cpprest
例:target_link_libraries(main glog mxbase cpprest plugintoolkit mxpidatatype streammanager mindxsdk_protobuf)
cd ./plugins
bash build.sh
# 运行推理
bash run.sh
# 运行成功后如无报错会在当前路径下生成一个out.h264文件
# 转换为MP4文件
ffmpeg -i out.h264 -c copy output.mp4

 

四、案例展示

转换为MP4文件后,可以看到视频中的人体关键点。

至此,实时人体关键点检测应用部署成功,以下是英码科技技术工程师在实际操作过程中遇到的相关FAQ,供大家参考~

五、相关FAQ

①安装ffmpeg执行命令:./configure时报错:“Unable to create and execute files in /tmp. Set the TMPDIR environm”

➢该报错可能是环境问题

# 声明相关环境
export TMPDIR=~/tmp-ffmpeg
mkdir $TMPDIR
# 之后再执行./configure .......

 

②如果在使用Live555进行拉流时,依旧出现”The input frame data was too large for our buffer“问题,导致丢帧。

➢尝试进行下列优化在“live/liveMedia/StreamParser.cpp”中扩展帧解析buffer大小,即BANK_SIZE,默认值为150k,根据传输的H264数据帧大小,至少设置为300k。否则超出大小,可能会被Live555抛弃。

在“live/liveMedia/MediaSink.cpp”中增加OutPacketBuffer::maxSize大小,同样为了容纳超大帧数据,否则可能会导致数据丢失,设置为 600000。

在“live/liveMedia/MultiFramedRTPsource.cpp”中增加socket发送缓冲区大小,即increaseSendBufferTo函数的参数值--increaseRecieveBufferTo(env, RTPgs-> socketNUm(), 2000000)”

结语

以上就是英码科技EA500I边缘计算盒子基于昇腾Mind SDK实现实时人体关键点检测应用的全部操作内容,将持续推出更多基于昇腾AI芯片的边缘计算盒子和技术干货,欢迎大家持续关注和留言交流~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3:响应式数据的基本使用(ref、reactive)

一、前言 在Vue3中&#xff0c;如果数据不是响应式数据&#xff0c;当数据的值发生改变时&#xff0c;页面上的数据是不会发生改变的。因此本文主要介绍Vue3中响应式数据的使用&#xff0c;包括ref和reactive的基本使用。 二、ref 1、ref —— 创建基本类型的响应式数据 re…

Python-VBA函数之旅-globals函数

目录 一、globals函数的常见应用场景&#xff1a; 二、globals函数与locals函数对比分析&#xff1a; 1、globals函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm101…

Python的round与Excel的round不一样?

Python四舍五入怎么做 round()奇进偶舍round函数既不是“四舍五入”的原则&#xff0c;也不是“四舍六入无成双”的原则。 decimal round() 偶然发现python的round函数和excel的round函数对某些数据的处理结果不一致。有看到博主提到是奇进偶舍的方法&#xff0c;但经过验证和…

49-PCIE转网口电路设计

视频链接 PCIE转网口电路设计01_哔哩哔哩_bilibili PCIe转网口电路设计 1、PCIE转网口电路设计基本介绍 pcie转网口的设计&#xff0c;一般有intel (i350)和网讯&#xff08;wx1860&#xff09;两种方案。 2、PCIE转网口的方案 2.1、I350 2.2、WX1860 (网迅) 国产化&#…

linux C -- 消息队列

linux C -- 消息队列 前言一、System V(IPC)消息队列接口调用主要涉及到 msgget、msgsnd、msgrcv 和 msgctl 四个接口&#xff1a; 1、创建消息队列 msgget2、发送消息到队列3、从队列接收信息4、控制消息队列 msgctl5、删除消息队列 二、代码编写1、发送部分的代码2、代码完成…

BYOL(NeurIPS 2020)原理解读

paper&#xff1a;Bootstrap your own latent: A new approach to self-supervised Learning third-party implementation&#xff1a;https://github.com/open-mmlab/mmpretrain/blob/main/mmpretrain/models/selfsup/byol.py 本文的创新点 本文提出了一种新的自监督学习方…

uniapp picker 多列选择器用法

uniapp picker 多列选择器联动筛选器交互处理方法&#xff0c; uniapp 多列选择器 mode"multiSelector" 数据及筛选联动交互处理&#xff0c; 通过接口获取数据&#xff0c;根据用户选择当前列选项设置子列数据&#xff0c;实现三级联动效果&#xff0c; 本示例中处…

SEW减速机参数查询 2-2 实践

首先说说结论&#xff1a;在不和SEW官方取得沟通之前&#xff0c;你几乎无法直接通过查阅SEW官方文档得到相关减速机的所有技术参数&#xff1a;比如轴的模数和齿数&#xff0c;轴承的参数。我在周一耗费了一个上午&#xff0c;最终和SEW方面确认后才知晓相关技术参数需要凭借销…

Jenkins的安装和部署

文章目录 概述Jenkins部署项目的流程jenkins的安装启动创建容器进入容器浏览器访问8085端口 Jenkins创建项目创建example项目 概述 Jenkins&#xff1a;是一个开源的、提供友好操作界面的持续集成&#xff08;CLI&#xff09;工具&#xff0c;主要用于持续、自动构建的一些定时…

什么是Rust语言?探索安全系统编程的未来

&#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来 文章目录 &#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来摘要引言正文&#x1f4d8; Rust语言简介&#x1f31f; 发展历程&#x1f3af; Rust的技术意义和优势&#x1f4e6; Rust解决的问题…

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

deepinV23 Beta3安装cuda

文章目录 下载CUDA安装,以cuda11.6为例运行.run文件安装选项配置环境变量查看cuda版本重启计算机 卸载cuda deepinV23 Beta3对应的debian版本是12&#xff1a; bookworm指的是debian12&#xff0c; sid代表不稳定版。 下载CUDA 官网&#xff1a;https://developer.nvidia.com…

中华环保联合会获得国家“绿色制造体系” 第三方评价机构资格

近日&#xff0c;中华环保联合会成功获得工业和信息化部“绿色制造体系”第三方评价机构资格&#xff0c;可为企业、园区及相关机构提供全面的绿色制造体系评价服务&#xff0c;包括绿色工厂、绿色园区、绿色供应链等方面。 “绿色制造体系建设”是由工业和信息化部负责统筹推进…

redis异常:OOM command not allowed when used memory > ‘maxmemory‘

redis存储数据太多,内存溢出,导致异常 1.查看redis内存使用情况 登录redis后 info memory2.查看分配给redis的最大内存 config get maxmemory3.处理方式:拓展redis的最大内存 打开redis.conf文件,修改maxmemory 4.删掉键值重启redis后,发现删掉的数据又恢复了? redis根目录…

Midjourney是什么?Midjourney怎么用?怎么注册Midjourney账号?国内怎么使用Midjourney?多人合租Midjourney拼车

Midjourney是什么 OpenAI发布的ChatGPT4引领了聊天机器人的竞争浪潮&#xff0c;随后谷歌推出了自己的AI聊天机器人Bard&#xff0c;紧接着微软推出了Bing Chat&#xff0c;百度也推出了文心一言&#xff0c;这些聊天机器人的推出&#xff0c;标志着对话式AI技术已经达到了一个…

月球地形数据介绍(LOLA)

月球地形数据介绍 LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系SIMPLE CYLINDRICALPOLAR STEREOGRAPHIC 数据下载与浏览 LOLA介绍 目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。 “月球勘测轨道器”(Lunar Reconnaissance Orbiter&#xff0c;LRO)…

7.2 跳跃表(skiplist)

文章目录 前言一、跳跃表——查找操作二、跳跃表——插入操作三、代码演示3.1 输出结果3.2 代码细节 四、总结&#xff1a;参考文献&#xff1a; 前言 本章内容参考海贼宝藏胡船长的数据结构与算法中的第七章——查找算法&#xff0c;侵权删。 查找的时间复杂度能从原来链表的…

线上真实案例之执行一段逻辑后报错Communications link failure

1.问题发现 在开发某个项目的一个定时任务计算经销商返利的功能时&#xff0c;有一个返利监测的调度&#xff0c;如果某一天返利计算调度失败了&#xff0c;需要重新计算&#xff0c;这个监测的调度就会重新计算某天的数据。 在UAT测试通过&#xff0c;发布生产后&#xff0c…

CSS动画(css、js动画库:各种动画效果)

第一种方法&#xff1a;文字从上到下显示动画&#xff1b; <div class"text-container"><div class"text">文字从上到下显示</div></div><style scoped> /*确保 keyframes 规则在引用它的任何选择器之前定义&#xff0c;以避…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云&#xff1a; 百度智能云是百度提供的公有云平台&#xff0c;于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景&#xff0c;致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…