在教育、體育、安防、交通、醫(yī)療等領(lǐng)域中,實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測應(yīng)用發(fā)揮著至關(guān)重要的作用,比如在體育訓(xùn)練時(shí),實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測可以精確、實(shí)時(shí)地捕捉運(yùn)動(dòng)員的動(dòng)作,從而進(jìn)行動(dòng)作分析和優(yōu)化;在安防應(yīng)用場景中,實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測應(yīng)用可以用來識別異常行為或特定姿態(tài),以達(dá)到場景安全防控的目的。
那么,什么是實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測?
簡單來說,實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測是一種計(jì)算機(jī)視覺技術(shù),它能夠在圖像或視頻中實(shí)時(shí)地自動(dòng)識別并標(biāo)注出人體的關(guān)鍵部位,如關(guān)節(jié)點(diǎn)、頭部等。
實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測在邊緣計(jì)算領(lǐng)域的應(yīng)用非常重要和廣泛,今天我們來介紹:如何在英碼科技EA500I邊緣計(jì)算盒子上使用昇騰Mind SDK來實(shí)現(xiàn)實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測。
案例概述
本應(yīng)用以英碼科技EA500I邊緣計(jì)算盒子為主要硬件平臺,使用昇騰MindX SDK開發(fā)端到端人體關(guān)鍵點(diǎn)識別的參考設(shè)計(jì),實(shí)現(xiàn)對視頻中的人體進(jìn)行關(guān)鍵點(diǎn)識別的功能。
案例說明
本案例參考華為昇騰Mind SDK 實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測,底層原理邏輯請參考:<昇騰社區(qū)應(yīng)用案例>
前置條件
一、環(huán)境安裝
●注意:
?以下操作以普通用戶HwHiAiUser安裝CANN包為例說明,推薦使用root用戶進(jìn)行操作,如果是root用戶,請將安裝準(zhǔn)備中所有的${HOME}修改為/usr/local。
?推薦按照本文檔路徑進(jìn)行操作,如安裝在自定義路徑可能會(huì)導(dǎo)致環(huán)境沖突等問題
①配置相關(guān)環(huán)境
# 以安裝用戶在任意目錄下執(zhí)行以下命令,打開.bashrc文件。 vi ~/.bashrc # 在文件最后一行后面添加如下內(nèi)容。 source ${HOME}/Ascend/ascend-toolkit/set_env.sh source /home/work/MindX_SDK/mxVision-5.0.RC3/set_env.sh export CPU_ARCH=`arch` export THIRDPART_PATH=${HOME}/Ascend/thirdpart/${CPU_ARCH} #代碼編譯時(shí)鏈接samples所依賴的相關(guān)庫文件 export LD_LIBRARY_PATH=${THIRDPART_PATH}/lib:$LD_LIBRARY_PATH #運(yùn)行時(shí)鏈接庫文件 export INSTALL_DIR=${HOME}/Ascend/ascend-toolkit/latest #CANN軟件安裝后的文件存儲路徑,根據(jù)安裝目錄自行修改 export DDK_PATH=${HOME}/Ascend/ascend-toolkit/latest #聲明CANN環(huán)境 export NPU_HOST_LIB=${DDK_PATH}/runtime/lib64/stub #聲明CANN環(huán)境 # 執(zhí)行命令保存文件并退出。 :wq! # 執(zhí)行命令使其立即生效。 source ~/.bashrc # 創(chuàng)建samples相關(guān)依賴文件夾 mkdir -p ${THIRDPART_PATH} # 下載源碼并安裝git cd ${HOME} sudo apt-get install git git clone https://gitee.com/ascend/samples.git # 拷貝公共文件到samples相關(guān)依賴路徑中 cp -r ${HOME}/samples/common ${THIRDPART_PATH} # 拷貝media_mini等so文件以及相關(guān)頭文件 mkdir -p ${INSTALL_DIR}/driver cp /usr/lib64/libmedia_mini.so ${INSTALL_DIR}/driver/ #如路徑中沒有相關(guān)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/ #如路徑中沒有相關(guān)頭文件,可跳過該命令 # 下載案例源碼并安裝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} #此步驟報(bào)錯(cuò)可參考FAQ make -j8 make install # 添加環(huán)境變量 vi ~/.bashrc # 在文件最后一行后面添加如下內(nèi)容。 export PATH=${HOME}/Ascend/thirdpart/aarch64/bin:$PATH # 執(zhí)行命令保存文件并退出。 :wq! # 執(zhí)行命令使其立即生效。 source ~/.bashrc
④安裝live555
# 下載相應(yīng)版本的live555軟件包,該版本測試可用,部分版本的軟件包會(huì)有代碼編譯的報(bào)錯(cuò) cd ${HOME} wget http://www.live555.com/liveMedia/public/live.xxxx.xx.xx.tar.gz(請根據(jù)實(shí)際版本下載) 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 # 執(zhí)行命令保存文件并退出。 :wq! # 配置視頻循環(huán)推流,按照以下提示修改文件可以使自主搭建的rtsp循環(huán)推流,如果不作更改,則為有限的視頻流 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); } # 執(zhí)行命令保存文件并退出。 :wq! # 編譯并安裝 cd .. ./genMakefiles linux #注意后面這個(gè)參數(shù)是根據(jù)當(dāng)前文件夾下config.獲取得到的,與服務(wù)器架構(gòu)等有關(guān)。 make -j8 # 編譯完成后就會(huì)在當(dāng)前目錄下生成mediaServer 文件夾,有一個(gè)live555MediaServer可執(zhí)行文件 # 防止推流丟幀 cd ../mediaServer vi DynamicRTSPServer.cpp 在mediaServer的DynamicRTSPServer.cpp文件中,修改每一處OutPacketBuffer::maxSize的值,更改到800000,該版本有三處需要修改。 # 執(zhí)行命令保存文件并退出。 :wq! # 修改了代碼后需要重新執(zhí)行編譯 cd .. make clean ./genMakefiles linux #注意后面這個(gè)參數(shù)是根據(jù)當(dāng)前文件夾下config.獲取得到的,與服務(wù)器架構(gòu)等有關(guān)。 make -j8 # 轉(zhuǎn)換MP4文件,把需要推流的人體MP4視頻文件上傳到相應(yīng)目錄,執(zhí)行命令轉(zhuǎn)換成h264文件,相應(yīng)參數(shù)請自行修改 ffmpeg -i test.mp4 -vcodec h264 -bf 0 -g 25 -r 10 -s 1280*720 -an -f h264 test1.264 //-bf B幀數(shù)目控制,-g 關(guān)鍵幀間隔控制,-s 分辨率控制 -an關(guān)閉音頻, -r 指定幀率 # 把轉(zhuǎn)換后的h264文件拷貝到${HOME}/live/mediaServer/路徑下 # 啟動(dòng)推流 ./live555MediaServer # 啟動(dòng)完成會(huì)輸出推流地址,其中rtsp_Url的格式是 rtsp://host:port/Data,host:port/路徑映射到mediaServer/目錄下,Data為視頻文件的路徑。例:rtsp://10.1.30.111:80/test1.h264 # 啟動(dòng)成功后該終端窗口會(huì)一直推流,請另開一個(gè)終端窗口進(jìn)行后續(xù)步驟
二、模型獲取&轉(zhuǎn)換
# 進(jìn)入案例路徑,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 # 進(jìn)入"${RTMHumanKeypointsDetection代碼包目錄}/models/"目錄,對"insert_op.cfg"文件做以下修改 related_input_rank: 0 src_image_size_w: 512 # onnx模型輸入的寬,請根據(jù)對應(yīng)模型進(jìn)行修改,如使用本案例文檔下載的原始模型,則不需要修改 src_image_size_h: 512 # onnx模型輸入的高,請根據(jù)對應(yīng)模型進(jìn)行修改,如使用本案例文檔下載的原始模型,則不需要修改 crop: false # 使用ATC工具進(jìn)行模型轉(zhuǎn)換 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
三、編譯運(yùn)行案例
# 修改RTMHumanKeypointsDetection/pipeline目錄下的rtmOpenpose.pipeline文件中mxpi_rtspsrc0的內(nèi)容。 "mxpi_rtspsrc0": { "factory": "mxpi_rtspsrc", "props": { "rtspUrl":"rtsp://xxx.xxx.xxx.xxx:xxxx/xxx.264", // 修改為自己所使用的的服務(wù)器和文件名,例: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"http://檢查om模型文件名是否正確 } }, # 若修改了模型的輸入尺寸,還需要將 mxpi_imageresize0 插件中的 resizeWidth 和 resizeHeight 屬性改成修改后的模型輸入尺寸值;將 mxpi_rtmopenposepostprocess0 插件中的 inputWidth 和 inputHeight 屬性改成修改后的模型輸入尺寸值。 "mxpi_imageresize0":{ "next":"queue3", "factory":"mxpi_imageresize", "props":{ "interpolation":"2", "resizeWidth":"512",//輸入的寬,請根據(jù)對應(yīng)模型進(jìn)行修改 "resizeHeight":"512",//輸入的高,請根據(jù)對應(yīng)模型進(jìn)行修改 "dataSource":"mxpi_videodecoder0", "resizeType":"Resizer_KeepAspectRatio_Fit" } }, ...... "mxpi_rtmopenposepostprocess0":{ "next":"queue4", "factory":"mxpi_rtmopenposepostprocess", "props":{ "imageSource":"mxpi_videodecoder0", "inputHeight":"512",//輸入的高,請根據(jù)對應(yīng)模型進(jìn)行修改 "dataSource":"mxpi_tensorinfer0", "inputWidth":"512"http://輸入的寬,請根據(jù)對應(yīng)模型進(jìn)行修改 } }, # 將pipeline里面的 mxpi_videoencoder0 插件中的 imageHeight 和 imageWidth 更改為上傳視頻的實(shí)際高和寬。 "mxpi_videoencoder0":{ "props": { "inputFormat": "YUV420SP_NV12", "outputFormat": "H264", "fps": "1", "iFrameInterval": "50", "imageHeight": "720",#上傳視頻的實(shí)際高 "imageWidth": "1280"#上傳視頻的實(shí)際寬 }, # 本項(xiàng)目需要使用mxpi_opencvosd 插件,使用前需要生成所需的模型文件。執(zhí)行MindX SDK開發(fā)套件包安裝目錄下operators/opencvosd/generate_osd_om.sh腳本生成所需模型文件。 例:bash /home/work/MindX_SDK/mxVision-5.0.RC3/operators/opencvosd/generate_osd_om.sh # 編譯項(xiàng)目 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 # 運(yùn)行推理 bash run.sh # 運(yùn)行成功后如無報(bào)錯(cuò)會(huì)在當(dāng)前路徑下生成一個(gè)out.h264文件 # 轉(zhuǎn)換為MP4文件 ffmpeg -i out.h264 -c copy output.mp4
四、案例展示
轉(zhuǎn)換為MP4文件后,可以看到視頻中的人體關(guān)鍵點(diǎn)。
至此,實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測應(yīng)用部署成功,以下是英碼科技技術(shù)工程師在實(shí)際操作過程中遇到的相關(guān)FAQ,供大家參考~
五、相關(guān)FAQ
①安裝ffmpeg執(zhí)行命令:./configure時(shí)報(bào)錯(cuò):“Unable to create and execute files in /tmp. Set the TMPDIR environm”
?該報(bào)錯(cuò)可能是環(huán)境問題
# 聲明相關(guān)環(huán)境 export TMPDIR=~/tmp-ffmpeg mkdir $TMPDIR # 之后再執(zhí)行./configure .......
②如果在使用Live555進(jìn)行拉流時(shí),依舊出現(xiàn)”The input frame datawas too large for our buffer“問題,導(dǎo)致丟幀。
?嘗試進(jìn)行下列優(yōu)化在“l(fā)ive/liveMedia/StreamParser.cpp”中擴(kuò)展幀解析buffer大小,即BANK_SIZE,默認(rèn)值為150k,根據(jù)傳輸?shù)腍264數(shù)據(jù)幀大小,至少設(shè)置為300k。否則超出大小,可能會(huì)被Live555拋棄。
在“l(fā)ive/liveMedia/MediaSink.cpp”中增加OutPacketBuffer::maxSize大小,同樣為了容納超大幀數(shù)據(jù),否則可能會(huì)導(dǎo)致數(shù)據(jù)丟失,設(shè)置為 600000。
在“l(fā)ive/liveMedia/MultiFramedRTPsource.cpp”中增加socket發(fā)送緩沖區(qū)大小,即increaseSendBufferTo函數(shù)的參數(shù)值--increaseRecieveBufferTo(env, RTPgs-> socketNUm(), 2000000)”
結(jié)語
以上就是英碼科技EA500I邊緣計(jì)算盒子基于昇騰Mind SDK實(shí)現(xiàn)實(shí)時(shí)人體關(guān)鍵點(diǎn)檢測應(yīng)用的全部操作內(nèi)容,將持續(xù)推出更多基于昇騰AI芯片的邊緣計(jì)算盒子和技術(shù)干貨,歡迎大家持續(xù)關(guān)注和留言交流~
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
459文章
52374瀏覽量
438943 -
AI
+關(guān)注
關(guān)注
88文章
34839瀏覽量
277366 -
SDK
+關(guān)注
關(guān)注
3文章
1074瀏覽量
48007 -
邊緣計(jì)算
+關(guān)注
關(guān)注
22文章
3309瀏覽量
50762
發(fā)布評論請先 登錄
【BPI-CanMV-K230D-Zero開發(fā)板體驗(yàn)】人體關(guān)鍵點(diǎn)檢測
DeepSeek在昇騰上的模型部署的常見問題及解決方案

創(chuàng)思遠(yuǎn)達(dá)與昇騰合作推動(dòng)AI PC應(yīng)用創(chuàng)新
(原創(chuàng))昇騰310B(8T/20T)算力主板定制方案
潤和軟件將持續(xù)深化“昇騰+DeepSeek”技術(shù)路線
2024年度華為廣東合作伙伴大會(huì) 英碼科技榮獲“昇騰萬里獎(jiǎng)”

迅龍軟件出席華為昇騰APN伙伴大會(huì),獲昇騰APN鉆石伙伴授牌及兩項(xiàng)大獎(jiǎng)

喜訊 英碼科技受邀出席華為昇騰APN伙伴大會(huì),正式成為「昇騰鉆石部件伙伴」,喜獲多個(gè)重磅獎(jiǎng)項(xiàng)!

《DNK210使用指南 -CanMV版 V1.0》第四十四章 人臉68關(guān)鍵點(diǎn)檢測實(shí)驗(yàn)
昇騰系列雙處理邊緣計(jì)算盒子DA500I,打造高效低延遲的視覺推理解決方案

昇騰與昇思原生,助力智譜打造自主創(chuàng)新大模型體系!

昇騰APN最佳伙伴—英碼科技AI算力計(jì)算產(chǎn)品亮相WAIC 2024

評論