当前位置:   article > 正文

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

华为昇腾sdk linux

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

*图片来源昇腾社区官网

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

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

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

案例概述

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

案例说明

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

前置条件

一、环境安装

●注意:

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

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

①配置相关环境

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

②安装x264插件

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

③安装部署ffmpeg 

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

④安装live555

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

二、模型获取&转换 

  1. # 进入案例路径,mindxsdk-referenceapps为前置步骤中下载的案例包
  2. cd ${HOME}/mindxsdk-referenceapps/contrib/RTMHumanKeypointsDetection
  3. # 在models路径下下载原始模型,下列链接可下载512x512的onnx模型文件
  4. cd ./models
  5. wget https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/RTMHumanKeypointsDetection/human-pose-estimation512.onnx --no-check-certificate
  6. # 进入"${RTMHumanKeypointsDetection代码包目录}/models/"目录,对"insert_op.cfg"文件做以下修改
  7. related_input_rank: 0
  8. src_image_size_w: 512 # onnx模型输入的宽,请根据对应模型进行修改,如使用本案例文档下载的原始模型,则不需要修改
  9. src_image_size_h: 512 # onnx模型输入的高,请根据对应模型进行修改,如使用本案例文档下载的原始模型,则不需要修改
  10. crop: false
  11. # 使用ATC工具进行模型转换
  12. 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

三、编译运行案例

  1. # 修改RTMHumanKeypointsDetection/pipeline目录下的rtmOpenpose.pipeline文件中mxpi_rtspsrc0的内容。
  2. "mxpi_rtspsrc0": {
  3. "factory": "mxpi_rtspsrc",
  4. "props": {
  5. "rtspUrl":"rtsp://xxx.xxx.xxx.xxx:xxxx/xxx.264", // 修改为自己所使用的的服务器和文件名,例:rtsp://10.1.30.111:80/test1.h264
  6. "channelId": "0"
  7. },
  8. "next": "mxpi_videodecoder0"
  9. },
  10. # 注意检查om模型文件名是否和pipeline/rtmOpenpose.pipeline中的mxpi_tensorinfer0 插件 modelPath 属性值相同,若不同需改为一致。
  11. "mxpi_tensorinfer0":{
  12. "next":"mxpi_rtmopenposepostprocess0",
  13. "factory":"mxpi_tensorinfer",
  14. "props":{
  15. "dataSource": "mxpi_imageresize0",
  16. "modelPath":"./models/openpose_pytorch_512.om"//检查om模型文件名是否正确
  17. }
  18. },
  19. # 若修改了模型的输入尺寸,还需要将 mxpi_imageresize0 插件中的 resizeWidth 和 resizeHeight 属性改成修改后的模型输入尺寸值;将 mxpi_rtmopenposepostprocess0 插件中的 inputWidth 和 inputHeight 属性改成修改后的模型输入尺寸值。
  20. "mxpi_imageresize0":{
  21. "next":"queue3",
  22. "factory":"mxpi_imageresize",
  23. "props":{
  24. "interpolation":"2",
  25. "resizeWidth":"512",//输入的宽,请根据对应模型进行修改
  26. "resizeHeight":"512",//输入的高,请根据对应模型进行修改
  27. "dataSource":"mxpi_videodecoder0",
  28. "resizeType":"Resizer_KeepAspectRatio_Fit"
  29. }
  30. },
  31. ......
  32. "mxpi_rtmopenposepostprocess0":{
  33. "next":"queue4",
  34. "factory":"mxpi_rtmopenposepostprocess",
  35. "props":{
  36. "imageSource":"mxpi_videodecoder0",
  37. "inputHeight":"512",//输入的高,请根据对应模型进行修改
  38. "dataSource":"mxpi_tensorinfer0",
  39. "inputWidth":"512"//输入的宽,请根据对应模型进行修改
  40. }
  41. },
  42. # 将pipeline里面的 mxpi_videoencoder0 插件中的 imageHeight 和 imageWidth 更改为上传视频的实际高和宽。
  43. "mxpi_videoencoder0":{
  44. "props": {
  45. "inputFormat": "YUV420SP_NV12",
  46. "outputFormat": "H264",
  47. "fps": "1",
  48. "iFrameInterval": "50",
  49. "imageHeight": "720",#上传视频的实际高
  50. "imageWidth": "1280"#上传视频的实际宽
  51. },
  52. # 本项目需要使用 mxpi_opencvosd 插件,使用前需要生成所需的模型文件。执行MindX SDK开发套件包安装目录下 operators/opencvosd/generate_osd_om.sh 脚本生成所需模型文件。
  53. 例:bash /home/work/MindX_SDK/mxVision-5.0.RC3/operators/opencvosd/generate_osd_om.sh
  54. # 编译项目
  55. cd ${HOME}/mindxsdk-referenceapps/contrib/RTMHumanKeypointsDetection
  56. vi CMakeLists.txt
  57. # 在target_link_libraries处添加:cpprest
  58. 例:target_link_libraries(main glog mxbase cpprest plugintoolkit mxpidatatype streammanager mindxsdk_protobuf)
  59. cd ./plugins
  60. bash build.sh
  61. # 运行推理
  62. bash run.sh
  63. # 运行成功后如无报错会在当前路径下生成一个out.h264文件
  64. # 转换为MP4文件
  65. 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”

➢该报错可能是环境问题

  1. # 声明相关环境
  2. export TMPDIR=~/tmp-ffmpeg
  3. mkdir $TMPDIR
  4. # 之后再执行./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芯片的边缘计算盒子和技术干货,欢迎大家持续关注和留言交流~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/842777
推荐阅读
相关标签
  

闽ICP备14008679号