0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英码科技EA500I基于昇腾Mind SDK实现实时人体关键点检测

英码嵌入式 2024-04-20 08:25 次阅读


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

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


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


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

8b766930-feac-11ee-9118-92fbcf53809c.jpg

案例概述

本应用以英码科技EA500I边缘计算盒子为主要硬件平台,使用昇腾MindX SDK开发端到端人体关键点识别的参考设计,实现对视频中的人体进行关键点识别的功能。

案例说明

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

前置条件

8bcbbb74-feac-11ee-9118-92fbcf53809c.png

1环境安装
●注意:


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


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

①配置相关环境

# 以安装用户在任意目录下执行以下命令,打开.bashrc文件。vi ~/.bashrc # 在文件最后一行后面添加如下内容。source ${HOME}/Ascend/ascend-toolkit/set_env.shsource /home/work/MindX_SDK/mxVision-5.0.RC3/set_env.sh
export 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}# 下载源码并安装gitcd ${HOME}sudo apt-get install gitgit clone https://gitee.com/ascend/samples.git# 拷贝公共文件到samples相关依赖路径中cp -r ${HOME}/samples/common ${THIRDPART_PATH} # 拷贝media_mini等so文件以及相关头文件mkdir -p ${INSTALL_DIR}/drivercp /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/ #如路径中没有相关头文件,可跳过该命令# 下载案例源码并安装gitcd ${HOME}git clone https://gitee.com/ascend/mindxsdk-referenceapps.git

②安装x264插件

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

8be68c1a-feac-11ee-9118-92fbcf53809c.png

③安装部署ffmpeg

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

8bfdf58a-feac-11ee-9118-92fbcf53809c.png

④安装live555

# 下载相应版本的live555软件包,该版本测试可用,部分版本的软件包会有代码编译的报错cd ${HOME}wget http://www.live555.com/liveMedia/public/live.xxxx.xx.xx.tar.gz(请根据实际版本下载)tar -zxvf live.xxxx.xx.xx.tar.gzcd live/# 修改config.linuxvi 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 ../mediaServervi 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# 启动成功后该终端窗口会一直推流,请另开一个终端窗口进行后续步骤

8c169702-feac-11ee-9118-92fbcf53809c.png

2模型获取&转换

# 进入案例路径,mindxsdk-referenceapps为前置步骤中下载的案例包cd ${HOME}/mindxsdk-referenceapps/contrib/RTMHumanKeypointsDetection# 在models路径下下载原始模型,下列链接可下载512x512的onnx模型文件cd ./modelswget 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: 0src_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

3编译运行案例

# 修改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/RTMHumanKeypointsDetectionvi CMakeLists.txt# 在target_link_libraries处添加:cpprest例:target_link_libraries(main glog mxbase cpprest plugintoolkit mxpidatatype streammanager mindxsdk_protobuf)cd ./pluginsbash build.sh# 运行推理bash run.sh# 运行成功后如无报错会在当前路径下生成一个out.h264文件# 转换为MP4文件ffmpeg -i out.h264 -c copy output.mp4

8c3695ac-feac-11ee-9118-92fbcf53809c.png

8c6d9098-feac-11ee-9118-92fbcf53809c.png

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

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

5相关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 datawas too large for our buffer“问题,导致丢帧。➢尝试进行下列优化

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

8ca442aa-feac-11ee-9118-92fbcf53809c.png

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

8cc9aefa-feac-11ee-9118-92fbcf53809c.png

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

8ce91f88-feac-11ee-9118-92fbcf53809c.png

结语

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 检测
    +关注

    关注

    5

    文章

    4087

    浏览量

    90774
  • AI
    AI
    +关注

    关注

    87

    文章

    26490

    浏览量

    264192
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44793
收藏 人收藏

    评论

    相关推荐

    【昇腾系列产品应用】英码科技EA500I边缘计算盒子接口使用示例和目标检测算法演示

    EA500I是英码科技联合华为昇腾精心打造的AI边缘计算盒子,其搭载昇腾310系列处理器,可提供20TOPSINT8的计算能力,并设计了丰富的外围接口,包括Type-C系统调试口、LINE音频接口
    的头像 发表于 03-30 08:25 73次阅读
    【昇腾系列产品应用】英码科技<b class='flag-5'>EA500I</b>边缘计算盒子接口使用示例和目标<b class='flag-5'>检测</b>算法演示

    【EASY EAI Nano】RV1126实时读取摄像头并进行yolo检测显示

    实现了三个并行模块,分别是 摄像头读取,使用opencv转换到适合大小 yolo检测 托管到Qt进行现实 检测的DEMO从每帧10次改到每帧2次,可以看到还是具备一定
    发表于 01-14 18:53

    【飞凌 OK113i-C 全志T113-i开发板】测试实时系统

    被称为Real-Time(RT)补丁。它通过增加内核的可抢占性,使得Linux内核能够实现实时性能。PREEMPT-RT补丁提供了可配置的实时选项,可以根据应用程序的需求进行调整。这个版本跟内核的版本
    发表于 12-25 09:50

    配网故障定位系统:实现实时监测、精准控制

    随着电力系统的不断发展,配电网络的规模和复杂性也在不断增加,这使得配网故障的排查和处理变得越来越困难。为了提高配电网络的安全性和可靠性,业界纷纷引入了配网故障定位系统,以实现实时监测、精准控制。本文将以“配网行波型故障预警与定位系统”为关键词,详细介绍这一技术的应用及其优
    的头像 发表于 12-12 10:49 255次阅读

    人体感应灯是如何检测到人的存在的?

    人体感应灯是如何检测到人的存在的? 人体感应灯是一种智能照明设备,它可以侦测到人的存在,并在人接近或离开时自动开启或关闭。这一技术的实现离不开人体
    的头像 发表于 12-07 11:09 659次阅读

    基于NXP微控制器i.MX RT1170的多人体实时检测算法和系统

    基于NXP微控制器i.MX RT1170的多人体实时检测算法和系统
    的头像 发表于 10-26 16:27 725次阅读
    基于NXP微控制器i.MX RT1170的多<b class='flag-5'>人体</b><b class='flag-5'>实时</b><b class='flag-5'>检测</b>算法和系统

    加特兰发布基于Rhine SoC单芯片的室内人体点云SDK

    近期,加特兰发布了基于Rhine SoC单芯片的室内人体点云SDK,通过集成加特兰最新研发的室内人体感知应用组件,输出丰富、高质量、高凝聚度、高感知力的动静人体点云数据,帮助客户开发出
    的头像 发表于 10-11 11:47 824次阅读

    人体健康指标实时监测系统设计

    的多参量设备,并在Android智能手机平台上开发实时监测采集系统。并以体积小、功耗低、可实时监控等优点完成医院以及家庭医疗等条件下的家庭医疗的需求,充分实现了家庭医疗的实时性,预防性
    发表于 09-27 07:06

    科技精彩亮相火爆的IOTE 2023,多面赋能AIoT产业发展!

    于智慧城市、智慧应急、智慧交通、智慧校园、智慧金融、智慧园区等领域。科技“深元”AI引擎为客户提供算法到算力的一体化快速生产模式,实实在在赋能企业快速具备AI能力,实现降本增效。 本次生态大会重磅
    发表于 09-25 10:03

    泰伦新成果发布交流会线上直播预约开启

    SDK,烧录到芯片中即可。全程零代,极大地简化了开发流程,让开发门槛更低,更高效。 以上只是部分剧透,了解详细内容请关注直播哦。 直播详情 01直播主题 《用AI解锁声音的奥秘——启泰伦新成果发布
    发表于 08-15 14:31

    AI深度相机-人体姿态估计应用

    我们非常高兴地发布一个新的代码示例,展示虹科AI深度相机SDK的惊人功能。只需6行源代码,您就可以实时准确地估计和跟踪人体姿态!我们最新的代码示例使用AI机器学习技术来识别和跟踪人体
    的头像 发表于 07-31 17:42 625次阅读
    AI深度相机-<b class='flag-5'>人体</b>姿态估计应用

    利用opencv+openpose实现人体姿态检测

    利用opencv+openpose实现人体姿态检测,附详细代码。 通过一个偶然机会,我了解到了人体姿态解算,在学习K210之余,我便想着通过opencv
    的头像 发表于 06-26 10:15 2340次阅读
    利用opencv+openpose<b class='flag-5'>实现</b><b class='flag-5'>人体</b>姿态<b class='flag-5'>检测</b>

    RG500U-EA顺利完成海外多局点场测,以优越性能助力5G客户扬帆出海

    一步为海外用户提供稳定、可靠、极具性价比的5G网络连接,助力全球5G产业实现大规模商用。 海外测试,性能再升级 RG500U-EA海外场测在欧洲、东南亚、中亚、非洲、拉美、中东的多个国家和地区完成,对搭载RG500U-EA的5G
    发表于 06-25 11:01 413次阅读
    RG<b class='flag-5'>500U-EA</b>顺利完成海外多局点场测,以优越性能助力5G客户扬帆出海

    ​使用旭日X3派实现手势检测

    本篇博客通过旭日X3搭载手势识别算法,实现实时检测,同时测试其运行性能。
    的头像 发表于 06-02 17:36 576次阅读
    ​使用旭日X3派<b class='flag-5'>实现</b>手势<b class='flag-5'>检测</b>

    点检测仪的维护

    点检测仪的维护。在线式露点仪,便携式露点仪的维护保养
    的头像 发表于 05-13 14:00 994次阅读
    露<b class='flag-5'>点检测</b>仪的维护