From e5d3cb5ce2063b5d32e54809fdfb8e1d9396b8a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E7=92=90=E9=81=A5?= Date: Fri, 9 Sep 2022 09:30:41 +0000 Subject: [PATCH 01/11] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20PoseEstNet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/PoseEstNet/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/PoseEstNet/.keep diff --git a/contrib/PoseEstNet/.keep b/contrib/PoseEstNet/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 726f84d0b74a8c7b2fc5b9171b06b04d6bb24818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E7=92=90=E9=81=A5?= Date: Fri, 9 Sep 2022 09:30:52 +0000 Subject: [PATCH 02/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntrib/PoseEstNet/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/PoseEstNet/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/PoseEstNet/.keep diff --git a/contrib/PoseEstNet/.keep b/contrib/PoseEstNet/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 6b5076b1ec97066ff3d9fae960504fa69f3e1900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E7=92=90=E9=81=A5?= Date: Fri, 9 Sep 2022 09:31:14 +0000 Subject: [PATCH 03/11] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20PoseEstNet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/PoseEstNet/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/PoseEstNet/.keep diff --git a/contrib/PoseEstNet/.keep b/contrib/PoseEstNet/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 522a50dbed4667add924c01281ba9769c623fd91 Mon Sep 17 00:00:00 2001 From: LOO YO Date: Fri, 9 Sep 2022 20:13:30 +0800 Subject: [PATCH 04/11] update code --- .DS_Store | Bin 0 -> 10244 bytes contrib/.DS_Store | Bin 0 -> 20484 bytes contrib/PoseEstNet/.DS_Store | Bin 0 -> 6148 bytes contrib/PoseEstNet/README.md | 279 +++++++++++ contrib/PoseEstNet/eval.py | 277 +++++++++++ contrib/PoseEstNet/image/oral_eval.png | Bin 0 -> 250341 bytes contrib/PoseEstNet/image/output_eval.png | Bin 0 -> 16306 bytes contrib/PoseEstNet/image/plugin_tree.png | Bin 0 -> 54509 bytes contrib/PoseEstNet/image/project_tree.png | Bin 0 -> 49570 bytes contrib/PoseEstNet/main.py | 156 ++++++ .../models/aipp_hrnet_256_256.aippconfig | 32 ++ contrib/PoseEstNet/models/aipp_nv12.cfg | 38 ++ contrib/PoseEstNet/models/coco.names | 81 ++++ contrib/PoseEstNet/models/yolov3.cfg | 10 + .../PoseEstNet/pipeline/PoseEstNet.pipeline | 92 ++++ .../pipeline/eval_PoseEstNet.pipeline | 52 ++ contrib/PoseEstNet/plugins/build.sh | 38 ++ .../plugins/postprocess/CMakeLists.txt | 35 ++ .../postprocess/MxpiPNetPostprocess.cpp | 381 +++++++++++++++ .../plugins/postprocess/MxpiPNetPostprocess.h | 111 +++++ .../PoseEstNet/plugins/postprocess/build.sh | 36 ++ .../plugins/preprocess/CMakeLists.txt | 35 ++ .../plugins/preprocess/MxpiPNetPreprocess.cpp | 455 ++++++++++++++++++ .../plugins/preprocess/MxpiPNetPreprocess.h | 118 +++++ .../PoseEstNet/plugins/preprocess/build.sh | 36 ++ ...10\344\276\213\345\210\206\344\272\253.md" | 224 +++++++++ 26 files changed, 2486 insertions(+) create mode 100644 .DS_Store create mode 100644 contrib/.DS_Store create mode 100644 contrib/PoseEstNet/.DS_Store create mode 100755 contrib/PoseEstNet/README.md create mode 100755 contrib/PoseEstNet/eval.py create mode 100644 contrib/PoseEstNet/image/oral_eval.png create mode 100644 contrib/PoseEstNet/image/output_eval.png create mode 100644 contrib/PoseEstNet/image/plugin_tree.png create mode 100644 contrib/PoseEstNet/image/project_tree.png create mode 100755 contrib/PoseEstNet/main.py create mode 100644 contrib/PoseEstNet/models/aipp_hrnet_256_256.aippconfig create mode 100644 contrib/PoseEstNet/models/aipp_nv12.cfg create mode 100644 contrib/PoseEstNet/models/coco.names create mode 100644 contrib/PoseEstNet/models/yolov3.cfg create mode 100755 contrib/PoseEstNet/pipeline/PoseEstNet.pipeline create mode 100755 contrib/PoseEstNet/pipeline/eval_PoseEstNet.pipeline create mode 100755 contrib/PoseEstNet/plugins/build.sh create mode 100755 contrib/PoseEstNet/plugins/postprocess/CMakeLists.txt create mode 100755 contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.cpp create mode 100755 contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h create mode 100755 contrib/PoseEstNet/plugins/postprocess/build.sh create mode 100755 contrib/PoseEstNet/plugins/preprocess/CMakeLists.txt create mode 100755 contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp create mode 100755 contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h create mode 100755 contrib/PoseEstNet/plugins/preprocess/build.sh create mode 100644 "contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fce2dcded98251649bbcc3c08d5bd5f1519703f5 GIT binary patch literal 10244 zcmeGhTWl0n^qy%;XY2q&E#)Db-CBeO3*DB2JVduI3PPc>eN!yEJ3~7%J5zUNw}qyr z#P~o=Fh1iK5g(sbQ6oh06-`VOjiw=yMB*#aFN4YtM#OXH&bG7LEngByoV%HO=AQRG zbIzT6X9*!tpOmW!2@pbfyeO1J>~b_pr`NQ`Ihdsg0p*F-UmcDa@xf`F9>R-&7XdE< zUIe@dcoDc!B7pB~+V~;{z21v}7XdE^AT+~yqD+= z!hi!q4jf|;DcFFCB4ncA95H~2BR=5pg&a7>AQLCx96rFY49*D!Z0o2$V6zhlG3fPP z1iT1Lj{rTp=aW^WpQyxgpWmC0G=1u(#f`?ssAfbF$Dg{uHJwmCsmr9xSEUaQOnn>J zGRLmcS!ugOA&T2JmTv*-&Y-*PM;eYcI`*@8rhJ%*$L)u+Mir1KN#gu9B4>J$7eFsu zRJRYcZIeD^a7=lSnllMH1*mG&*DsI*~pZ9n@6Q3I@*tmzQ5KtB^0` zi}*d^0b?j^MXaP*A4%+{qc+3PqUrlcv_n;f`lONuL$@NTt|V*$RaTItw^P++W2oLp z>auCeh8ckuc%e^PI5JYRrlvBmIv5 z8#s$Gna#$N{Smy&nw2}Ug|#De+0N!LQw?n1dExZD&!y)r+*Bma_H}l3_lUh+YRu5X z>OrMXnrq_Zx8krhp`>uqoiRg8#&xq#niq>`v7{EUlsZkL%!r$7#uA36wHl^ssfOO& zWhui}T2Th6tH(4FR)ejqPm+?RvP(f-YD#HDji{=aTH85D)tDVh!bDge3bFtQ<8v1H zmsYH-x#P}I)7BlkCgw`>ip3JKv@@leYE)C&hg8`b=#H2%MVD2*zXzXyZmIiJB_Yg% zN})}U#FdHSg^L#7vc%`h=1yzrN=DTOlB#t;D(87-qs&(>NN@AKGCJ8}$W)_jQ+#E< zUr^)xnpC z4zov69$MktFhGbMW1%EHbRgY^_{cJ{j)X`X*@tC$h&(}#k+;Zc@;*63&XV)wXYw1l zME)X|$v=<>A{4_CSPCnl3W87#8(<@Bg1cZFv_U&`Kos_a209pE!6-ZkV{ix_furyw zJOxj~3ve7>f>+>G7>9S@B%Fee;dA%`zJ#yfJp2N`!yoV`{0*1k3P-piu7sPx=nSHiOBLcovQ8e}@;&*LTqKuZ78HR5eyD&|P>Z>}8Ma`4Z-*Al?=I+p z-OvjP^n(ibW42q6f?+rS2jL-j7#@Yk;4tR;Gw>`t2gl$=%=ecu{Heih(W#=xJJ6%i~kSBKm@d(w0)o(s>n1y^85DY=5qUU=(WjBZVr8Jzpl=i;a}ke>YvxV z2zU|jB5<7}kjLx?==cAong9R4&R%-vy$E;_xRw!s{Kjx&Jz7Yg9kY#bhzQ`d7cbf< z-x!0o2zHc(;_c7zIG~^7D;%8jS;VG?9NZX#wm8b!;s|YVgzRhnwfr-{JO4*DGv%HC J|F7r&e*wn>q&NTo literal 0 HcmV?d00001 diff --git a/contrib/.DS_Store b/contrib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f71ae395a06cbb773320f05ad9684d0247ea8709 GIT binary patch literal 20484 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 literal 0 HcmV?d00001 diff --git a/contrib/PoseEstNet/.DS_Store b/contrib/PoseEstNet/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b5bb5dff21c752543656712e78838f2cf2e306b0 GIT binary patch literal 6148 zcmeHKOHRWu5FM9F1hFYQmKG-dA`0`(GAEi5Q3hq4T%b81JkC0jiCK6s$Q%u=>6Pkcl~*HgH~dEi zbaQ*`TTeCZ?ca0P_L}h37cj&4z^CoXa?x}P8Kd;@UVq#j_FMkSuYbv_-I@_o(K*&^ zXhSPGRd0N%b{?NMV~=4@^k_N#n5XUbGdkuq$S2%#J}%CHGvExI3InLwEZL=^x6Xhw z;0$aT;O|3(G8TqOQ9d1LKAWX}uoa2?O xwvJwoYi)!+L0Q-@DQ-j1kx~p_F2&bS5!fSlfQ4aFgazV10z!i~&cL5C@C~qIOp*Wq literal 0 HcmV?d00001 diff --git a/contrib/PoseEstNet/README.md b/contrib/PoseEstNet/README.md new file mode 100755 index 000000000..41fbb181c --- /dev/null +++ b/contrib/PoseEstNet/README.md @@ -0,0 +1,279 @@ +# MindXSDK 车辆姿态识别 + +## 1 简介 +本开发样例基于MindX SDK实现了姿态估计网络(PoseEstNet),用于检测并预测车辆36个关键点坐标以及生成热点图。 + +## 2 目录结构 +本工程名称为PoseEstNet,工程目录如下图所示: + +``` +PoseEstNet +|---- models +| | |---- aipp_nv12.cfg +| | |---- coco.names +| | |---- PoseEstNet.om +| | |---- yolov3.cfg +| | |---- yolov3.om +| | |---- aipp_hrnet_256_256.aippconfig +|---- pipeline // 流水线配置文件夹 +| | |---- eval_PoseEstNet.pipeline +| | |---- PoseEstNet.pipeline +|---- plugins // 插件文件夹 +|---- data +|---- data_eval +| | |---- images +| | |---- labels +|---- output // 结果保存文件夹 +|---- output_eval +|---- main.py +|---- eval.py +|---- README.md +``` + +## 3 依赖 +| 软件名称 | 版本 | +| :--------: | :------: | +|ubuntu 18.04|18.04.1 LTS | +|CANN|5.0.4| +|MindX SDK|2.0.4| +|Python| 3.9.12| +|numpy | 1.22.4 | +|opencv_python|4.6.0| +|cmake|3.5+| +请注意MindX SDK使用python版本为3.9.12,如出现无法找到python对应lib库请在root下安装python3.9开发库 +``` +apt-get install libpython3.9 +``` + +## 4 模型转换 +车辆姿态识别先采用了yolov3模型将图片中的车辆检测出来,然后利用PoseEstNet模型预测车辆36个关键点坐标。 + +4.1 yolov3的模型转换: + +**步骤1** 获取yolov3的原始模型(.pb文件)和相应的配置文件(.cfg文件) +      [原始模型下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/yolov3_tensorflow_1.5.pb) +      [配置文件下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/aipp_nv12.cfg) + +**步骤2** 将获取到的yolov3模型.pb文件和.cfg文件存放至:“项目所在目录/models” + +**步骤3** .om模型转换 +以下操作均在“项目所在目录/models”路径下进行: +- 设置环境变量(请确认install_path路径是否正确) +``` +export install_path=/usr/local/Ascend/ascend-toolkit/latest + +export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH +export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH +export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH +export ASCEND_OPP_PATH=${install_path}/opp +export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/ +``` +- 使用ATC将.pb文件转成为.om文件 +``` +atc --model=yolov3_tensorflow_1.5.pb --framework=3 --output=yolov3 --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" --log=info --insert_op_conf=aipp_nv12.cfg +``` +- 执行完模型转换脚本后,若提示如下信息说明模型转换成功,可以在该路径下找到名为yolov3.om模型文件。 +(可以通过修改output参数来重命名这个.om文件) +``` +ATC run success, welcome to the next use. +``` + +4.2 PoseEstNet的模型转换 + +4.2.1 模型概述 +      [PoseEstNet论文地址](https://arxiv.org/pdf/2005.00673.pdf) +      [PoseEstNet代码地址](https://github.com/NVlabs/PAMTRI/tree/master/PoseEstNet) + +4.2.2 模型转换环境需求 +``` +- 框架需求 + CANN == 5.0.4 + torch == 1.5.0 + torchvision == 0.6.0 + onnx == 1.11.1 + +- python第三方库 + numpy == 1.22.4 + opencv-python == 4.6.0 + Pillow == 8.2.0 + yacs == 0.1.8 + pytorch-ignite == 0.4.5 +``` + +4.2.3 模型转换步骤 + +**步骤1** .pth模型转.onnx模型 + +***1*** 获取.pth权重文件:[下载链接](https://docs.google.com/uc?export=download&id=1vD08fh-za3mgTJ9UkK1ASCTJAqypW0RL) + + models/veri/pose_hrnet/w32_256x256_adam_lr1e-3/model_best.pth + +***2*** 获取PoseEstNet_pth2onnx.py +  下载PoseEstNet源码并创建项目,将该脚本放在“项目所在目录/models”路径下,执行下列命令,生成.onnx模型文件 +``` +python3 tools/PoseEstNet_pth2onnx.py --cfg experiments/veri/hrnet/w32_256x256_adam_lr1e-3.yaml TEST.MODEL_FILE models/veri/pose_hrnet/w32_256x256_adam_lr1e-3/model_best.pth +``` +> 注意目前ATC支持的onnx算子版本为11 + +此时在“项目所在目录/models”路径下会出现PoseEstNet.onnx模型,到此步骤1已完成 +如果在线环境中无法安装pytorch,你可以在本地环境中进行上述.pth模型转.onnx模型操作,然后将得到的.onnx模型放在“项目所在目录/models”即可 + +本项目提供onnx模型:[Huawei Cloud下载链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/PoseEstNet/PoseEstNet.onnx) + +**步骤2** .onnx模型转.om模型 + +***1*** 设置环境变量,进入根目录,执行如下命令后返回原目录 +``` +source usr/local/Ascend/ascend-toolkit/set_env.sh +``` + +***2*** 进入.onnx文件所在目录,使用ATC将.onnx文件转成为.om文件(注意文件路径) +``` +atc --framework=5 --model=PoseEstNet.onnx --output=PoseEstNet --input_format=NCHW --input_shape="image:1,3,256,256" --insert_op_conf=aipp_hrnet_256_256.aippconfig --log=debug --soc_version=Ascend310 +``` +- 执行完模型转换脚本后,若提示如下信息说明模型转换成功(同样的,可以通过修改output参数来重命名这个.om文件) +``` +ATC run success, welcome to the next use. +``` + +经过上述操作,可以在“项目所在目录/models”找到yolov3.om模型和PoseEstNet.om模型,模型转换操作已全部完成 + +4.3 参考链接 +> 模型转换使用了ATC工具,如需更多信息请参考:[ATC工具使用指南-快速入门](https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0005.html) + +## 5 数据集 +5.1 原始VeRi数据集 + +      [Github下载链接](https://vehiclereid.github.io/VeRi/) +      [Huawei Cloud下载链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ReID/ReID%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6.rar) +原数据集images文件夹下面分为images_train和images_test,需要自己将这两个文件夹里的图片复制到data_eval/images文件夹下面 +目录结构如下: +``` +├── data_eval + ├── images + | ├── 0010_c014_00034990_0.jpg + | ├── 0010_c017_00034050_1.jpg + ├── labels + | ├── label_test.csv +``` +其中data/labels中的csv文件:[Github下载链接](https://github.com/NVlabs/PAMTRI/tree/master/PoseEstNet/data/veri/annot) + +---------------------------------------------------- +## 6 测试 + +6.1 配置环境变量 +``` +export MX_SDK_HOME=${SDK安装路径}/mxVision + +export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ + +export PYTHONPATH=${MX_SDK_HOME}/python + +export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner + +export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins +``` +6.2 获取om模型 +``` +步骤详见4: 模型转换 +``` +6.3 准备数据集 +``` +步骤详见5: 数据集 +``` +6.4 安装插件编译所需要的NumCpp库 +``` +cd plugins +git clone https://github.com/dpilger26/NumCpp +mkdir include +cp -r NumCpp/include/NumCpp ./include/ +``` +6.5 编译插件 +``` +bash build.sh +``` +6.6 切换到插件目录更新权限 +``` +cd ${MX_SDK_HOME}/lib/plugins +chmod 640 libmxpi_pnetpostprocessplugin.so +chmod 640 libmxpi_pnetpreprocessplugin.so +``` +6.7 切换回根目录,创建文件夹 +``` +cd (项目根目录) +mkdir data +mkdir data_eval +mkdir output +mkdir output_eval +``` +6.8 配置pipeline +根据所需场景,配置pipeline文件,调整路径参数等。 + +PoseEstNet.pipeline: +``` + # 配置mxpi_tensorinfer插件的yolov3.om模型加载路径(lines 26-33) + lines 26-33: + "mxpi_tensorinfer0": { + "props": { + "dataSource": "mxpi_imageresize0", + "modelPath": "models/yolov3.om(这里根据你的命名或路径进行更改)" + }, + "factory": "mxpi_tensorinfer", + "next": "mxpi_objectpostprocessor0" + }, + # 配置mxpi_objectpostprocessor插件的yolov3.cfg配置文件加载路径以及SDN的安装路径(lines 34-43) + lines 34-43: + "mxpi_objectpostprocessor0": { + "props": { + "dataSource": "mxpi_tensorinfer0", + "postProcessConfigPath": "models/yolov3.cfg(这里根据你的命名或路径进行更改)", + "labelPath": "models/coco.names", + "postProcessLibPath": "${SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so" + }, + "factory": "mxpi_objectpostprocessor", + "next": "mxpi_imagecrop0" + }, + # 配置mxpi_tensorinfer插件的PoseEstNet.om模型加载路径(lines 68-75 以及 92-99) + lines 68-75: + "mxpi_tensorinfer2":{ + "props": { + "dataSource": "mxpi_preprocess1", + "modelPath": "models/PoseEstNet.om(这里根据你的命名或路径进行更改)" + }, + "factory":"mxpi_tensorinfer", + "next":"mxpi_postprocess1" + }, + +``` +eval_PoseEstNet.pipeline: +``` + # 配置mxpi_tensorinfer插件的PoseEstNet.om模型加载路径(lines 28-35) + lines 28-35: + "mxpi_tensorinfer2":{ + "props": { + "dataSource": "mxpi_preprocess1", + "modelPath": "models/PoseEstNet.om(这里根据你的命名或路径进行更改)" + }, + "factory":"mxpi_tensorinfer", + "next":"mxpi_postprocess1" + }, +``` + +6.9 执行 + +业务代码main.py结果在output文件夹 +``` +python3 main.py --inputPath data +``` +评估代码的具体结果在output_eval文件夹 +``` +python3 eval.py --inputPath data_eval/images/ --labelPath data_eval/labels/label_test.csv +``` + + +## 7 精度对比 +项目精度: +![项目精度](image/output_eval.png) +目标精度: +![目标精度](image/oral_eval.png) + diff --git a/contrib/PoseEstNet/eval.py b/contrib/PoseEstNet/eval.py new file mode 100755 index 000000000..aecbb64a9 --- /dev/null +++ b/contrib/PoseEstNet/eval.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python +# coding=utf-8 + +""" +Copyright(C) Huawei Technologies Co.,Ltd. 2012-2022 All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import argparse +import os +import cv2 +import numpy as np +import io +import csv +import math +from PIL import Image + + +YUV_BYTES_NU = 3 +YUV_BYTES_DE = 2 + +import MxpiDataType_pb2 as MxpiDataType +from StreamManagerApi import StreamManagerApi, MxDataInput, StringVector + +POSTESTNET_STREAM_NAME = b'PoseEstNetProcess' +IN_PLUGIN_ID = 0 + + +def initialize_stream(): + """ + Initialize stream + :arg: + None + :return: + Stream api + """ + streamApi = StreamManagerApi() + streamState = streamApi.InitManager() + if streamState != 0: + errorMessage = "Failed to init Stream manager, streamState=%s" % str(streamState) + print(errorMessage) + exit() + + # creating stream based on json strings in the pipeline file: 'ReID.pipeline' + with open("pipeline/eval_PoseEstNet.pipeline", 'rb') as f: + pipeline = f.read().replace(b'\r', b'').replace(b'\n', b'') + pipelineString = pipeline + + streamState = streamApi.CreateMultipleStreams(pipelineString) + if streamState != 0: + errorMessage = "Failed to create Stream, streamState=%s" % str(streamState) + print(errorMessage) + exit() + + return streamApi + + +def get_result(inputPath, labelPath, streamApi): + # constructing the results returned by the stream + pluginNames = [b"mxpi_postprocess1"] + pluginNameVector = StringVector() + for key in pluginNames: + pluginNameVector.push_back(key) + + # check the file + if os.path.exists(inputPath) != 1: + errorMessage = 'The file of input images does not exist.' + print(errorMessage) + exit() + if len(os.listdir(inputPath)) == 0: + errorMessage = 'The file of input images is empty.' + print(errorMessage) + exit() + + label_csv = open(labelPath) + reader = csv.reader(label_csv, delimiter=',') + hash_annot = {} + for row in reader: + img_name = row[0] + width = int(row[1]) + height = int(row[2]) + joints = [] + for j in range(36): + joint = [int(row[j * 3 + 3]), int(row[j * 3 + 4]), int(row[j * 3 + 5])] + joints.append(joint) + hash_annot[img_name] = (width, height, joints) + all_preds = np.zeros((len(hash_annot), 36, 3), dtype=np.float32) + batch_count = 0 + idx = 0 + image_names = [] + + for k in sorted(hash_annot.keys()): + image_name = k + image_names.append(image_name) + if not image_name.lower().endswith((".jpg")): + print('Input image only support jpg') + exit() + img_path = os.path.join(inputPath, image_name) + queryDataInput = MxDataInput() + with open(img_path, 'rb') as f: + queryDataInput.data = f.read() + + # send the prepared data to the stream + uniqueId = streamApi.SendData(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, queryDataInput) + if uniqueId < 0: + errorMessage = 'Failed to send data to queryImageProcess stream.' + print(errorMessage) + exit() + + # get infer result + inferResult = streamApi.GetProtobuf(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, pluginNameVector) + # checking whether the infer results is valid or not + if inferResult.size() == 0: + errorMessage = 'Unable to get effective infer results, please check the stream log for details' + print(errorMessage) + exit() + if inferResult[0].errorCode != 0: + errorMessage = "GetProtobuf error. errorCode=%d, errorMessage=%s" % (inferResult[0].errorCode, + inferResult[0].messageName) + print(errorMessage) + exit() + + # get the output + objectList = MxpiDataType.MxpiObjectList() + objectList.ParseFromString(inferResult[0].messageBuf) + for index in range(len(objectList.objectVec)): + x = objectList.objectVec[index].x0 + y = objectList.objectVec[index].y0 + vision = objectList.objectVec[index].x1 + all_preds[idx + batch_count, index, 0] = x + all_preds[idx + batch_count, index, 1] = y + all_preds[idx + batch_count, index, 2] = vision + + if batch_count == 31: + print(f'-------- Test: [{int((idx+1)/32 + 1)}/{int(len(hash_annot)/32)}] ---------') + idx += batch_count + 1 + batch_count = 0 + else: + batch_count += 1 + + # output pose in CSV format + output_pose = open('output_eval/pose_test.csv', 'w') + + for p in range(len(all_preds)): + output_pose.write("%s," % (image_names[p])) + for k in range(len(all_preds[p])-1): + output_pose.write("%.3f,%.3f,%.3f," % (all_preds[p][k][0], + all_preds[p][k][1], + all_preds[p][k][2])) + output_pose.write("%.3f,%.3f,%.3f\n" % (all_preds[p][len(all_preds[p])-1][0], + all_preds[p][len(all_preds[p])-1][1], + all_preds[p][len(all_preds[p])-1][2])) + output_pose.close() + + +def evaluate(label_path): + SC_BIAS = 0.25 + threshold = 0.5 + + preds_read = [] + with open('output_eval/pose_test.csv') as annot_file: + reader = csv.reader(annot_file, delimiter=',') + for row in reader: + joints = [] + for j in range(36): + joint = [float(row[j * 3 + 1]), float(row[j * 3 + 2]), float(row[j * 3 + 3])] + joints.append(joint) + preds_read.append(joints) + gts = [] + viss = [] + area_sqrts = [] + with open(label_path) as annot_file: + reader = csv.reader(annot_file, delimiter=',') + for row in reader: + joints = [] + vis = [] + top_lft = btm_rgt = [int(row[3]), int(row[4])] + for j in range(36): + joint = [int(row[j * 3 + 3]), int(row[j * 3 + 4]), int(row[j * 3 + 5])] + joints.append(joint) + vis.append(joint[2]) + if joint[0] < top_lft[0]: + top_lft[0] = joint[0] + if joint[1] < top_lft[1]: + top_lft[1] = joint[1] + if joint[0] > btm_rgt[0]: + btm_rgt[0] = joint[0] + if joint[1] > btm_rgt[1]: + btm_rgt[1] = joint[1] + gts.append(joints) + viss.append(vis) + area_sqrts.append(math.sqrt((btm_rgt[0] - top_lft[0] + 1) * (btm_rgt[1] - top_lft[1] + 1))) + + jnt_visible = np.array(viss, dtype=int) + jnt_visible = np.transpose(jnt_visible) + pos_pred_src = np.transpose(preds_read, [1, 2, 0]) + pos_gt_src = np.transpose(gts, [1, 2, 0]) + uv_error = pos_pred_src - pos_gt_src + uv_err = np.linalg.norm(uv_error, axis=1) + area_sqrts = np.linalg.norm(area_sqrts, axis=0) + area_sqrts *= SC_BIAS + scale = np.multiply(area_sqrts, np.ones((len(uv_err), 1))) + scaled_uv_err = np.divide(uv_err, scale) + scaled_uv_err = np.multiply(scaled_uv_err, jnt_visible) + jnt_count = np.sum(jnt_visible, axis=1) + less_than_threshold = np.multiply((scaled_uv_err <= threshold), + jnt_visible) + PCKh = np.divide(100. * np.sum(less_than_threshold, axis=1), jnt_count) + + # save + rng = np.arange(0, 0.5 + 0.01, 0.01) + pckAll = np.zeros((len(rng), 36)) + + for r in range(len(rng)): + threshold = rng[r] + less_than_threshold = np.multiply((scaled_uv_err <= threshold), + jnt_visible) + pckAll[r, :] = np.divide(100. * np.sum(less_than_threshold, axis=1), + jnt_count) + + PCKh = np.ma.array(PCKh, mask=False) + jnt_count = np.ma.array(jnt_count, mask=False) + jnt_ratio = jnt_count / np.sum(jnt_count).astype(np.float64) + + name_value = { + 'Wheel': (1.0 / 4.0) * (PCKh[0] + PCKh[1] + PCKh[18] + PCKh[19]), + 'Fender': (1.0 / 16.0) * (PCKh[2] + PCKh[3] + PCKh[4] + PCKh[5] + PCKh[6] + PCKh[7] + PCKh[8] + + PCKh[9] + PCKh[20] + PCKh[21] + PCKh[22] + PCKh[23] + PCKh[24] + + PCKh[25] + PCKh[26] + PCKh[27]), + 'Back': (1.0 / 4.0) * (PCKh[10] + PCKh[11] + PCKh[28] + PCKh[29]), + 'Front': (1.0 / 4.0) * (PCKh[16] + PCKh[17] + PCKh[34] + PCKh[35]), + 'WindshieldBack': (1.0 / 4.0) * (PCKh[12] + PCKh[13] + PCKh[30] + PCKh[31]), + 'WindshieldFront': (1.0 / 4.0) * (PCKh[14] + PCKh[15] + PCKh[32] + PCKh[33]), + 'Mean': np.sum(PCKh * jnt_ratio), + 'Mean@0.1': np.sum(pckAll[11, :] * jnt_ratio) + } + + _print_name_value(name_value, 'PoseEstNet') + + +def _print_name_value(name_value, full_arch_name): + ''' print accuracy ''' + names = name_value.keys() + values = name_value.values() + print( + '| Arch ' + + ' '.join(['| {}'.format(name) for name in names]) + + ' |' + ) + if len(full_arch_name) > 15: + full_arch_name = full_arch_name[:8] + '...' + print( + '| ' + full_arch_name + ' ' + + ' '.join(['| {:.3f}'.format(value) for value in values]) + + ' |' + ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--inputPath', type=str, default='data_eval/images', help="Query File Path") + parser.add_argument('--labelPath', type=str, default='data_eval/labels/label_test.csv', help="Gallery File Path") + opt = parser.parse_args() + streamManagerApi = initialize_stream() + get_result(opt.inputPath, opt.labelPath, streamManagerApi) + evaluate(opt.labelPath) \ No newline at end of file diff --git a/contrib/PoseEstNet/image/oral_eval.png b/contrib/PoseEstNet/image/oral_eval.png new file mode 100644 index 0000000000000000000000000000000000000000..f54cda403a99cdd2b43d809446b548477ac664f9 GIT binary patch literal 250341 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

^dSAnq_GVDp9?ER4o-%2{dy=KW@6N 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 z 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%0A88>29e#Bn<2Qns8*w#Ql0K#jd&CD2Em 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 literal 0 HcmV?d00001 diff --git a/contrib/PoseEstNet/image/plugin_tree.png b/contrib/PoseEstNet/image/plugin_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..6993314f8183b3a0e55a392a651c2a1cb1241741 GIT binary patch literal 54509 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]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

^-{+W~ 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 literal 0 HcmV?d00001 diff --git a/contrib/PoseEstNet/image/project_tree.png b/contrib/PoseEstNet/image/project_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..0155d3138768bd12cdf2579f4c425fb605a46278 GIT binary patch literal 49570 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 Z^(5yZSKvaMx&`oWw~qdfo7=6={1^MIV=e#y literal 0 HcmV?d00001 diff --git a/contrib/PoseEstNet/main.py b/contrib/PoseEstNet/main.py new file mode 100755 index 000000000..a2cf3aeee --- /dev/null +++ b/contrib/PoseEstNet/main.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python +# coding=utf-8 + +""" +Copyright(C) Huawei Technologies Co.,Ltd. 2012-2022 All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import argparse +import os +import cv2 +import numpy as np +import io +from PIL import Image +YUV_BYTES_NU = 3 +YUV_BYTES_DE = 2 + +import MxpiDataType_pb2 as MxpiDataType +from StreamManagerApi import StreamManagerApi, MxDataInput, StringVector +POSTESTNET_STREAM_NAME = b'PoseEstNetProcess' +IN_PLUGIN_ID = 0 + + +def initialize_stream(): + """ + Initialize stream + + :arg: + None + + :return: + Stream api + """ + streamApi = StreamManagerApi() + streamState = streamApi.InitManager() + if streamState != 0: + errorMessage = "Failed to init Stream manager, streamState=%s" % str(streamState) + print(errorMessage) + exit() + + # creating stream based on json strings in the pipeline file: 'PoseEstNet.pipeline' + with open("pipeline/PoseEstNet.pipeline", 'rb') as f: + pipeline = f.read().replace(b'\r', b'').replace(b'\n', b'') + pipelineString = pipeline + + streamState = streamApi.CreateMultipleStreams(pipelineString) + if streamState != 0: + errorMessage = "Failed to create Stream, streamState=%s" % str(streamState) + print(errorMessage) + exit() + + return streamApi + + +def process(inputPath, streamApi): + """ + :arg: + queryPath: the directory of query images + streamApi: stream api + + :return: + queryFeatures: the vectors of queryFeatures + queryPid: the vectors of queryPid + """ + + # constructing the results returned by the queryImageProcess stream + pluginNames = [b"mxpi_distributor0_0", b"mxpi_postprocess1"] + + pluginNameVector = StringVector() + for key in pluginNames: + pluginNameVector.push_back(key) + + # check the query file + if os.path.exists(inputPath) != 1: + errorMessage = 'The file of input images does not exist.' + print(errorMessage) + exit() + if len(os.listdir(inputPath)) == 0: + errorMessage = 'The file of input images is empty.' + print(errorMessage) + exit() + + # extract the features for all images in query file + for root, dirs, files in os.walk(inputPath): + for file in files: + if not file.endswith('.jpg'): + print('Input image only support jpg') + exit() + + queryDataInput = MxDataInput() + filePath = os.path.join(root, file) + with open(filePath, 'rb') as f: + queryDataInput.data = f.read() + + # send the prepared data to the stream + uniqueId = streamApi.SendData(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, queryDataInput) + if uniqueId < 0: + errorMessage = 'Failed to send data to queryImageProcess stream.' + print(errorMessage) + exit() + + # get infer result + inferResult = streamApi.GetProtobuf(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, pluginNameVector) + + # checking whether the infer results is valid or not + if inferResult.size() == 0: + errorMessage = 'Unable to get effective infer results, please check the stream log for details' + print(errorMessage) + exit() + if inferResult[0].errorCode != 0: + errorMessage = "GetProtobuf error. errorCode=%d, errorMessage=%s" % (inferResult[0].errorCode, + inferResult[0].messageName) + print(errorMessage) + exit() + + # get the output information of "mxpi_objectpostprocessor0" plugin + car_objectList = MxpiDataType.MxpiObjectList() + car_objectList.ParseFromString(inferResult[0].messageBuf) + car_num = len(car_objectList.objectVec) + + # get the output information of "mxpi_objectpostprocessor0" plugin + keypoint_objectList = MxpiDataType.MxpiObjectList() + keypoint_objectList.ParseFromString(inferResult[1].messageBuf) + keypoint_num = len(keypoint_objectList.objectVec) + if keypoint_num // car_num != 36: + errorMessage = 'Failed to map the inferred key points to the detected cars.' + print(errorMessage) + exit() + + orignal_img = cv2.imread(filePath) + for index in range(len(keypoint_objectList.objectVec)): + orignal_x = int(car_objectList.objectVec[index // 36].x0) + keypoint_objectList.objectVec[index].x0 + orignal_y = int(car_objectList.objectVec[index // 36].y0) + keypoint_objectList.objectVec[index].y0 + visible = keypoint_objectList.objectVec[index].x1 + if round(visible): + cv2.circle(orignal_img, (int(orignal_x), int(orignal_y)), 2, [255, 0, 0], 2) + cv2.imwrite("output/result_{}".format(str(file)), orignal_img) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--inputPath', type=str, default='data') + opt = parser.parse_args() + streamManagerApi = initialize_stream() + process(opt.inputPath, streamManagerApi) \ No newline at end of file diff --git a/contrib/PoseEstNet/models/aipp_hrnet_256_256.aippconfig b/contrib/PoseEstNet/models/aipp_hrnet_256_256.aippconfig new file mode 100644 index 000000000..7806914de --- /dev/null +++ b/contrib/PoseEstNet/models/aipp_hrnet_256_256.aippconfig @@ -0,0 +1,32 @@ +aipp_op { + aipp_mode: static + related_input_rank: 0 + src_image_size_w: 256 + src_image_size_h: 256 + crop: false + input_format: RGB888_U8 + csc_switch: false + rbuv_swap_switch: false + matrix_r0c0 : 256 + matrix_r0c1 : 0 + matrix_r0c2 : 359 + matrix_r1c0 : 256 + matrix_r1c1 : -88 + matrix_r1c2 : -183 + matrix_r2c0 : 256 + matrix_r2c1 : 454 + matrix_r2c2 : 0 + input_bias_0 : 0 + input_bias_1 : 128 + input_bias_2 : 128 + # 归一化和标准化 + mean_chn_0: 124 + mean_chn_1: 116 + mean_chn_2: 104 + min_chn_0: 0.0 + min_chn_1: 0.0 + min_chn_2: 0.0 + var_reci_chn_0: 0.0171 + var_reci_chn_1: 0.0175 + var_reci_chn_2: 0.0174 +} diff --git a/contrib/PoseEstNet/models/aipp_nv12.cfg b/contrib/PoseEstNet/models/aipp_nv12.cfg new file mode 100644 index 000000000..0ed9a6314 --- /dev/null +++ b/contrib/PoseEstNet/models/aipp_nv12.cfg @@ -0,0 +1,38 @@ +aipp_op{ +aipp_mode:static +crop:false +rbuv_swap_switch:true +input_format : YUV420SP_U8 +load_start_pos_h : 0 +load_start_pos_w : 0 +src_image_size_w : 416 +src_image_size_h : 416 + +csc_switch : true + +matrix_r0c0 : 298 +matrix_r0c1 : 516 +matrix_r0c2 : 0 +matrix_r1c0 : 298 +matrix_r1c1 : -100 +matrix_r1c2 : -208 +matrix_r2c0 : 298 +matrix_r2c1 : 0 +matrix_r2c2 : 409 +input_bias_0 : 16 +input_bias_1 : 128 +input_bias_2 : 128 +mean_chn_0 : 0 +mean_chn_1 : 0 +mean_chn_2 : 0 +min_chn_0 : 0.0 +min_chn_1 : 0.0 +min_chn_2 : 0.0 + +var_reci_chn_0 :0.003921568627451 +var_reci_chn_1 :0.003921568627451 +var_reci_chn_2 :0.003921568627451 + + +} + diff --git a/contrib/PoseEstNet/models/coco.names b/contrib/PoseEstNet/models/coco.names new file mode 100644 index 000000000..8f143661c --- /dev/null +++ b/contrib/PoseEstNet/models/coco.names @@ -0,0 +1,81 @@ +# This file is originally from https://github.com/pjreddie/darknet/blob/master/data/coco.names +person +bicycle +car +motorbike +aeroplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +sofa +pottedplant +bed +diningtable +toilet +tvmonitor +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush \ No newline at end of file diff --git a/contrib/PoseEstNet/models/yolov3.cfg b/contrib/PoseEstNet/models/yolov3.cfg new file mode 100644 index 000000000..e6ad98df2 --- /dev/null +++ b/contrib/PoseEstNet/models/yolov3.cfg @@ -0,0 +1,10 @@ +CLASS_NUM=80 +BIASES_NUM=18 +BIASES=10,13,16,30,33,23,30,61,62,45,59,119,116,90,156,198,373,326 +SCORE_THRESH=0.4 +OBJECTNESS_THRESH=0.8 +IOU_THRESH=0.5 +YOLO_TYPE=3 +ANCHOR_DIM=3 +MODEL_TYPE=0 +RESIZE_FLAG=0 diff --git a/contrib/PoseEstNet/pipeline/PoseEstNet.pipeline b/contrib/PoseEstNet/pipeline/PoseEstNet.pipeline new file mode 100755 index 000000000..c4cb28aea --- /dev/null +++ b/contrib/PoseEstNet/pipeline/PoseEstNet.pipeline @@ -0,0 +1,92 @@ +{ + "PoseEstNetProcess": { + "stream_config": { + "deviceId": "0" + }, + "appsrc0": { + "props": { + "blocksize": "409600" + }, + "factory": "appsrc", + "next": "mxpi_imagedecoder0" + }, + "mxpi_imagedecoder0": { + "factory": "mxpi_imagedecoder", + "next": "mxpi_imageresize0" + }, + "mxpi_imageresize0": { + "props": { + "dataSource": "mxpi_imagedecoder0", + "resizeHeight": "416", + "resizeWidth": "416" + }, + "factory": "mxpi_imageresize", + "next": "mxpi_tensorinfer0" + }, + "mxpi_tensorinfer0": { + "props": { + "dataSource": "mxpi_imageresize0", + "modelPath": "models/yolov3.om(这里根据你的命名或路径进行更改)" + }, + "factory": "mxpi_tensorinfer", + "next": "mxpi_objectpostprocessor0" + }, + "mxpi_objectpostprocessor0": { + "props": { + "dataSource": "mxpi_tensorinfer0", + "postProcessConfigPath": "models/yolov3.cfg(这里根据你的命名或路径进行更改)", + "labelPath": "models/coco.names", + "postProcessLibPath": "\${SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so" + }, + "factory": "mxpi_objectpostprocessor", + "next": "mxpi_distributor0" + }, + "mxpi_distributor0": { + "props": { + "dataSource": "mxpi_objectpostprocessor0", + "classIds": "2" + }, + "factory": "mxpi_distributor", + "next": "mxpi_imagecrop0" + }, + "mxpi_imagecrop0": { + "props": { + "dataSource": "mxpi_distributor0_0", + "dataSourceImage": "mxpi_imagedecoder0" + }, + "factory": "mxpi_imagecrop", + "next": "mxpi_preprocess1" + }, + "mxpi_preprocess1": { + "props":{ + "dataSource":"mxpi_imagecrop0", + "outputFormat": "RGB" + }, + "factory": "mxpi_pnetpreprocessplugin", + "next": "mxpi_tensorinfer2" + }, + "mxpi_tensorinfer2":{ + "props": { + "dataSource": "mxpi_preprocess1", + "modelPath": "models/PoseEstNet.om(这里根据你的命名或路径进行更改)" + }, + "factory":"mxpi_tensorinfer", + "next":"mxpi_postprocess1" + }, + "mxpi_postprocess1":{ + "props": { + "dataSource":"mxpi_tensorinfer2", + "InfoSource":"mxpi_imagecrop0", + "descriptionMessage": "Don’t panic!" + }, + "factory":"mxpi_pnetpostprocessplugin", + "next":"appsink0" + }, + "appsink0": { + "props": { + "blocksize": "4096000" + }, + "factory": "appsink" + } + } +} \ No newline at end of file diff --git a/contrib/PoseEstNet/pipeline/eval_PoseEstNet.pipeline b/contrib/PoseEstNet/pipeline/eval_PoseEstNet.pipeline new file mode 100755 index 000000000..f269b20ed --- /dev/null +++ b/contrib/PoseEstNet/pipeline/eval_PoseEstNet.pipeline @@ -0,0 +1,52 @@ +{ + "PoseEstNetProcess": { + "stream_config": { + "deviceId": "0" + }, + "appsrc0": { + "props": { + "blocksize": "409600" + }, + "factory": "appsrc", + "next": "mxpi_imagedecoder0" + }, + "mxpi_imagedecoder0": { + "props": { + "deviceId": "0" + }, + "factory": "mxpi_imagedecoder", + "next": "mxpi_preprocess1" + }, + "mxpi_preprocess1": { + "props":{ + "dataSource":"mxpi_imagedecoder0", + "outputFormat": "RGB" + }, + "factory": "mxpi_pnetpreprocessplugin", + "next": "mxpi_tensorinfer2" + }, + "mxpi_tensorinfer2":{ + "props": { + "dataSource": "mxpi_preprocess1", + "modelPath": "models/PoseEstNet.om(这里根据你的命名或路径进行更改)" + }, + "factory":"mxpi_tensorinfer", + "next":"mxpi_postprocess1" + }, + "mxpi_postprocess1":{ + "props": { + "dataSource":"mxpi_tensorinfer2", + "InfoSource":"mxpi_imagedecoder0", + "descriptionMessage": "Don’t panic!" + }, + "factory":"mxpi_pnetpostprocessplugin", + "next":"appsink0" + }, + "appsink0": { + "props": { + "blocksize": "4096000" + }, + "factory": "appsink" + } + } +} \ No newline at end of file diff --git a/contrib/PoseEstNet/plugins/build.sh b/contrib/PoseEstNet/plugins/build.sh new file mode 100755 index 000000000..f444148ba --- /dev/null +++ b/contrib/PoseEstNet/plugins/build.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Copyright 2022 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e +current_folder="$( cd "$(dirname "$0")" ;pwd -P )" + +SAMPLE_FOLDER=( + /postprocess/ + /preprocess/ +) + + +err_flag=0 +for sample in ${SAMPLE_FOLDER[@]};do + cd ${current_folder}/${sample} + bash build.sh || { + echo -e "Failed to build ${sample}" + err_flag=1 + } +done + + +if [ ${err_flag} -eq 1 ]; then + exit 1 +fi +exit 0 \ No newline at end of file diff --git a/contrib/PoseEstNet/plugins/postprocess/CMakeLists.txt b/contrib/PoseEstNet/plugins/postprocess/CMakeLists.txt new file mode 100755 index 000000000..202104604 --- /dev/null +++ b/contrib/PoseEstNet/plugins/postprocess/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.5.2) +project(MxpiPNetPostprocess) + +add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) +add_definitions(-Dgoogle=mindxsdk_private) +add_definitions(-DNUMCPP_NO_USE_BOOST) + +set(PLUGIN_NAME "mxpi_pnetpostprocessplugin") +set(TARGET_LIBRARY ${PLUGIN_NAME}) +set(MX_SDK_HOME $ENV{MX_SDK_HOME}) +set(LIBRARY_OUTPUT_PATH ${MX_SDK_HOME}/lib/plugins) +set(CMAKE_CXX_STANDARD 14) + +include_directories(${MX_SDK_HOME}/include) +include_directories(${MX_SDK_HOME}/opensource/include) +include_directories(${MX_SDK_HOME}/opensource/include/gstreamer-1.0) +include_directories(${MX_SDK_HOME}/opensource/include/glib-2.0) +include_directories(${MX_SDK_HOME}/opensource/lib/glib-2.0/include) +include_directories(${MX_SDK_HOME}/opensource/include/opencv4) +include_directories(../include) + +link_directories(${MX_SDK_HOME}/lib) +link_directories(${MX_SDK_HOME}/opensource/lib) + +add_compile_options(-std=c++11 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations -g) +add_compile_options("-DPLUGIN_NAME=${PLUGIN_NAME}") + +add_definitions(-DENABLE_DVPP_INTERFACE) + +add_library(${TARGET_LIBRARY} SHARED MxpiPNetPostprocess.cpp) +target_link_libraries(${TARGET_LIBRARY} glib-2.0 gstreamer-1.0 gobject-2.0 gstbase-1.0 gmodule-2.0 glog) + + +target_link_libraries(${TARGET_LIBRARY} mxpidatatype plugintoolkit mxbase mindxsdk_protobuf) +target_link_libraries(${TARGET_LIBRARY} -Wl,-z,relro,-z,now,-z,noexecstack -s) diff --git a/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.cpp b/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.cpp new file mode 100755 index 000000000..8b3657763 --- /dev/null +++ b/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.cpp @@ -0,0 +1,381 @@ +/* + * Copyright(C) 2022. Huawei Technologies Co.,Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MxpiPNetPostprocess.h" +#include "MxBase/Log/Log.h" +#include "MxBase/Tensor/TensorBase/TensorBase.h" + + +using namespace MxBase; +using namespace MxPlugins; +using namespace MxTools; +using namespace std; +namespace { + const string SAMPLE_KEY = "MxpiTensorPackageList"; + const string INFO_KEY = "MxpiVisionList"; + const int BIN_WIDTH_IN_DEGREES = 3; +} + +// Unpack MxpiTensorPackageList +void GetTensors(const MxTools::MxpiTensorPackageList tensorPackageList, + std::vector &tensors) { + for (int i = 0; i < tensorPackageList.tensorpackagevec_size(); ++i) { + for (int j = 0; j < tensorPackageList.tensorpackagevec(i).tensorvec_size(); j++) { + MxBase::MemoryData memoryData = {}; + memoryData.deviceId = tensorPackageList.tensorpackagevec(i).tensorvec(j).deviceid(); + memoryData.type = (MxBase::MemoryData::MemoryType)tensorPackageList. + tensorpackagevec(i).tensorvec(j).memtype(); + memoryData.size = (uint32_t) tensorPackageList. + tensorpackagevec(i).tensorvec(j).tensordatasize(); + memoryData.ptrData = (void *) tensorPackageList. + tensorpackagevec(i).tensorvec(j).tensordataptr(); + std::vector outputShape = {}; + for (int k = 0; k < tensorPackageList. + tensorpackagevec(i).tensorvec(j).tensorshape_size(); ++k) { + outputShape.push_back((uint32_t) tensorPackageList. + tensorpackagevec(i).tensorvec(j).tensorshape(k)); + } + MxBase::TensorBase tmpTensor(memoryData, true, outputShape, + (MxBase::TensorDataType)tensorPackageList. + tensorpackagevec(i).tensorvec(j).tensordatatype()); + tensors.push_back(tmpTensor); + } + } +} + +APP_ERROR MxpiPNetPostprocess::Init(std::map>& configParamMap) { + LogInfo << "MxpiPNetPostprocess::Init start."; + APP_ERROR ret = APP_ERR_OK; + // Get the property values by key + std::shared_ptr parentNamePropSptr = std::static_pointer_cast(configParamMap["dataSource"]); + parentName_ = *parentNamePropSptr.get(); + std::shared_ptr infoPlugPropSptr = std::static_pointer_cast(configParamMap["InfoSource"]); + infoPlugName_ = *infoPlugPropSptr.get(); + std::shared_ptr descriptionMessageProSptr = + std::static_pointer_cast(configParamMap["descriptionMessage"]); + descriptionMessage_ = *descriptionMessageProSptr.get(); + LogInfo << "MxpiPNetPostprocess::Init complete."; + return APP_ERR_OK; +} + +APP_ERROR MxpiPNetPostprocess::DeInit() { + LogInfo << "MxpiPNetPostprocess::DeInit start."; + LogInfo << "MxpiPNetPostprocess::DeInit complete."; + return APP_ERR_OK; +} + +APP_ERROR MxpiPNetPostprocess::SetMxpiErrorInfo(MxpiBuffer& buffer, const std::string pluginName, + const MxpiErrorInfo mxpiErrorInfo) { + APP_ERROR ret = APP_ERR_OK; + // Define an object of MxpiMetadataManager + MxpiMetadataManager mxpiMetadataManager(buffer); + ret = mxpiMetadataManager.AddErrorInfo(pluginName, mxpiErrorInfo); + if (ret != APP_ERR_OK) { + LogError << "Failed to AddErrorInfo."; + return ret; + } + ret = SendData(0, buffer); + return ret; +} + +APP_ERROR MxpiPNetPostprocess::GenerateHeadPoseInfo(const MxpiTensorPackageList srcMxpiTensorPackage, + const MxpiVisionList srcMxpiVisionPackage, + MxpiObjectList& dstMxpiObjectListSptr) { + // Get Tensors + std::vector tensors = {}; + + GetTensors(srcMxpiTensorPackage, tensors); + // LogInfo << "Till now is ok"; + + auto tensor_size = tensors.size(); + + for(int i = 0; i < tensor_size; i++){ + auto dataPtr = (float *)tensors[i].GetBuffer(); + auto tensor_shape = tensors[i].GetShape(); + + auto orignal_width = srcMxpiVisionPackage.visionvec()[i].visioninfo().width(); + auto orignal_height = srcMxpiVisionPackage.visionvec()[i].visioninfo().height(); + int keypoint_nums, hm_h, hm_w; + keypoint_nums = tensor_shape[1]; + hm_h = tensor_shape[2]; + hm_w = tensor_shape[3]; + + nc::NdArray coordinate; + coordinate = nc::zeros(keypoint_nums, 2); + nc::NdArray maxval; + maxval = nc::zeros(keypoint_nums, 1); + + for(auto j = 0; j < keypoint_nums; j++){ + nc::NdArray heatmap; + heatmap = nc::zeros(1, hm_h*hm_w); + for(auto k = 0; k < hm_h*hm_w; k++){ + heatmap(0, k) = dataPtr[j*hm_h*hm_w + k]; + } + auto index = nc::argmax(heatmap); + auto max_value = nc::max(heatmap); + auto hm_x = index(0, 0) % hm_w; + auto hm_y = floor(index(0, 0) / hm_w); + coordinate(j, 0) = hm_x; + coordinate(j, 1) = hm_y; + maxval(j, 0) = max_value(0, 0); + + auto px = floor(coordinate(j, 0) + 0.5); + auto py = floor(coordinate(j, 1) + 0.5); + heatmap = heatmap.reshape(hm_h, hm_w); + + if((1 < px < hm_w - 1) and (1 < py < hm_h - 1)){ + auto diff_x = heatmap(py, px + 1) - heatmap(py, px - 1); + auto diff_y = heatmap(py + 1, px) - heatmap(py - 1, px); + if( diff_x > 0) { + coordinate(j, 0) = coordinate(j, 0) + 0.25; + } else if( diff_x < 0 ) { + coordinate(j, 0) = coordinate(j, 0) - 0.25; + } else { + coordinate(j, 0) = coordinate(j, 0); + } + if( diff_y > 0) { + coordinate(j, 1) = coordinate(j, 1) + 0.25; + } else if( diff_y < 0 ) { + coordinate(j, 1) = coordinate(j, 1) - 0.25; + } else { + coordinate(j, 1) = coordinate(j, 1); + } + } + } + + auto pixel_std = 200; + nc::NdArray center = {float(orignal_width / 2.0), float(orignal_height / 2.0)}; + float scale = MAX(orignal_width, orignal_height) * 1.25 / pixel_std; + + int w_h[2] = { hm_w, hm_h }; + nc::NdArray final_coordinate = transform_preds(coordinate, center, scale, w_h); + + for(auto it = 0; it < keypoint_nums; it++){ + auto dstMxpiHObjectInfoPtr = dstMxpiObjectListSptr.add_objectvec(); + MxpiMetaHeader* dstMxpiMetaHeaderList = dstMxpiHObjectInfoPtr->add_headervec(); + dstMxpiMetaHeaderList->set_datasource(parentName_); + dstMxpiMetaHeaderList->set_memberid(0); + dstMxpiHObjectInfoPtr->set_x0(final_coordinate(it, 0)); + dstMxpiHObjectInfoPtr->set_y0(final_coordinate(it, 1)); + dstMxpiHObjectInfoPtr->set_x1(maxval(it, 0)); + dstMxpiHObjectInfoPtr->set_y1(0); + } + } + return APP_ERR_OK; +} + + +nc::NdArray MxpiPNetPostprocess::transform_preds(nc::NdArray coords, nc::NdArray center, + float scale, int output_size[2]) { + nc::NdArray target_coords = nc::zeros(coords.shape()); + nc::NdArray target_coords_temp; + + cv::Mat trans = get_affine_transform(center, scale, 0, output_size, {0, 0}, 1); + nc::NdArray trans_NdArray = nc::zeros(trans.rows, trans.cols); + double* ptr_data = (double*)trans.data; + for (int i = 0; i < trans.rows; i++) { + for (int j = 0; j < trans.cols; j++) { + trans_NdArray(i, j) = (float)ptr_data[i * trans.cols + j]; + } + } + for (int p = 0; p < coords.shape().rows; p++) { + target_coords_temp = nc::copy(affine_transform(coords(p, {0, 2}), trans_NdArray)); + for (int q = 0; q < 2; q++) { + target_coords(p, q) = target_coords_temp(q, 0); + } + } + return target_coords; +} + +nc::NdArray MxpiPNetPostprocess::affine_transform(nc::NdArray pt, nc::NdArray t) { + nc::NdArray new_pt = {pt(0, 0), pt(0, 1), 1.0}; + new_pt = new_pt.transpose(); + nc::NdArray new_pt_dot = nc::dot(t, new_pt); + nc::NdArray my_pt_dot = new_pt_dot( {0, 2}, 0); + return my_pt_dot; +} + +cv::Mat MxpiPNetPostprocess::get_affine_transform(nc::NdArray center, float scale, float rot, + int output_size[2], nc::NdArray shift = {0, 0}, int inv = 0) { + nc::NdArray scales = { scale * 200, scale * 200 }; + nc::NdArray scale_tmp = scales; + float src_w = scale_tmp[0]; + int dst_w = output_size[0]; + int dst_h = output_size[1]; + float rot_rad = nc::constants::pi * rot / 180; + nc::NdArray src_dir = get_dir(nc::NdArray { 0, float(src_w * -0.5) }, rot_rad); + nc::NdArray dst_dir = { 0, float(dst_w * -0.5) }; + nc::NdArray src = nc::zeros(3, 2); + nc::NdArray dst = nc::zeros(3, 2); + nc::NdArray temp; + + temp = center + scale_tmp * shift; + src(0, 0) = temp(0, 0); + src(0, 1) = temp(0, 1); + temp = center + src_dir + scale_tmp * shift; + src(1, 0) = temp(0, 0); + src(1, 1) = temp(0, 1); + temp = dst_w * 0.5, dst_h * 0.5; + dst(0, 0) = temp(0, 0); + dst(0, 1) = temp(0, 1); + temp = nc::NdArray {float(dst_w * 0.5), float(dst_h * 0.5)} + dst_dir; + dst(1, 0) = temp(0, 0); + dst(1, 1) = temp(0, 1); + temp = get_3rd_point(src(0, src.cSlice()), src(1, src.cSlice())); + src(2, 0) = temp(0, 0); + src(2, 1) = temp(0, 1); + temp = get_3rd_point(dst(0, dst.cSlice()), dst(1, dst.cSlice())); + dst(2, 0) = temp(0, 0); + dst(2, 1) = temp(0, 1); + + cv::Mat trans; + cv::Point2f SRC[3]; + cv::Point2f DST[3]; + SRC[0] = cv::Point2f(src(0, 0), src(0, 1)); + SRC[1] = cv::Point2f(src(1, 0), src(1, 1)); + SRC[2] = cv::Point2f(src(2, 0), src(2, 1)); + DST[0] = cv::Point2f(dst(0, 0), dst(0, 1)); + DST[1] = cv::Point2f(dst(1, 0), dst(1, 1)); + DST[2] = cv::Point2f(dst(2, 0), dst(2, 1)); + if (1 == inv) { + trans = cv::getAffineTransform(DST, SRC); + } + else + { + trans = cv::getAffineTransform(SRC, DST); + } + return trans; +} + +nc::NdArray MxpiPNetPostprocess::get_dir(nc::NdArray src_point, float rot_rad) { + float sn = nc::sin(rot_rad); + float cs = nc::cos(rot_rad); + nc::NdArray src_result = {0, 0}; + src_result[0] = src_point[0] * cs - src_point[1] * sn; + src_result[1] = src_point[0] * sn + src_point[1] * cs; + return src_result; +} + +nc::NdArray MxpiPNetPostprocess::get_3rd_point(nc::NdArray a, nc::NdArray b) { + nc::NdArray direct = a - b; + nc::NdArray c = b + nc::NdArray { -direct[1], direct[0] }; + return c; +} + +APP_ERROR MxpiPNetPostprocess::Process(std::vector& mxpiBuffer) { + LogInfo << "MxpiPNetPostprocess::Process start"; + MxpiBuffer* buffer = mxpiBuffer[0]; + MxpiMetadataManager mxpiMetadataManager(*buffer); + MxpiErrorInfo mxpiErrorInfo; + ErrorInfo_.str(""); + auto errorInfoPtr = mxpiMetadataManager.GetErrorInfo(); + if (errorInfoPtr != nullptr) { + ErrorInfo_ << GetError(APP_ERR_COMM_FAILURE, pluginName_) << "MxpiPNetPostprocess process is not implemented"; + mxpiErrorInfo.ret = APP_ERR_COMM_FAILURE; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + LogError << "MxpiPNetPostprocess process is not implemented"; + return APP_ERR_COMM_FAILURE; + } + // Get the data (infer tensor) from buffer + shared_ptr metadata = mxpiMetadataManager.GetMetadata(parentName_); + if (metadata == nullptr) { + ErrorInfo_ << GetError(APP_ERR_METADATA_IS_NULL, pluginName_) << "Metadata of tensor is NULL, failed"; + mxpiErrorInfo.ret = APP_ERR_METADATA_IS_NULL; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return APP_ERR_METADATA_IS_NULL; // self define the error code + } + // Check the proto struct name + google::protobuf::Message* msg = (google::protobuf::Message*)metadata.get(); + const google::protobuf::Descriptor* desc = msg->GetDescriptor(); + if (desc->name() != SAMPLE_KEY) { + ErrorInfo_ << GetError(APP_ERR_PROTOBUF_NAME_MISMATCH, pluginName_) + << "Proto struct name is not MxpiTensorPackageList, failed"; + mxpiErrorInfo.ret = APP_ERR_PROTOBUF_NAME_MISMATCH; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return APP_ERR_PROTOBUF_NAME_MISMATCH; // self define the error code + } + LogInfo << "MxpiPNetPostprocess::Get Tensor Completed"; + + // Get the data (image information) from buffer + shared_ptr Info_metadata = mxpiMetadataManager.GetMetadata(infoPlugName_); + if (Info_metadata == nullptr) { + ErrorInfo_ << GetError(APP_ERR_METADATA_IS_NULL, infoPlugName_) << "Metadata of original image is NULL, failed"; + mxpiErrorInfo.ret = APP_ERR_METADATA_IS_NULL; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, infoPlugName_, mxpiErrorInfo); + return APP_ERR_METADATA_IS_NULL; // self define the error code + } + // Check the proto struct name + google::protobuf::Message* info_msg = (google::protobuf::Message*)Info_metadata.get(); + const google::protobuf::Descriptor* info_desc = info_msg->GetDescriptor(); + if (info_desc->name() != INFO_KEY) { + ErrorInfo_ << GetError(APP_ERR_PROTOBUF_NAME_MISMATCH, infoPlugName_) + << "Proto struct name is not MxpiTensorPackageList, failed"; + mxpiErrorInfo.ret = APP_ERR_PROTOBUF_NAME_MISMATCH; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, infoPlugName_, mxpiErrorInfo); + return APP_ERR_PROTOBUF_NAME_MISMATCH; // self define the error code + } + LogInfo << "MxpiPNetPostprocess::Get Image Info Completed"; + + // Generate WHENet output + shared_ptr srcMxpiTensorPackageListSptr = static_pointer_cast(metadata); + shared_ptr srcMxpiVisionListSptr = static_pointer_cast(Info_metadata); + shared_ptr dstMxpiObjectListSptr = make_shared(); + APP_ERROR ret = GenerateHeadPoseInfo(*srcMxpiTensorPackageListSptr, *srcMxpiVisionListSptr, *dstMxpiObjectListSptr); + if (ret != APP_ERR_OK) { + LogError << GetError(ret, pluginName_) << "MxpiPNetPostprocess gets inference information failed."; + mxpiErrorInfo.ret = ret; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return ret; + } + + ret = mxpiMetadataManager.AddProtoMetadata(pluginName_, static_pointer_cast(dstMxpiObjectListSptr)); + if (ret != APP_ERR_OK) { + ErrorInfo_ << GetError(ret, pluginName_) << "MxpiPNetPostprocess add metadata failed."; + mxpiErrorInfo.ret = ret; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return ret; + } + // Send the data to downstream plugin + SendData(0, *buffer); + LogInfo << "MxpiPNetPostprocess::Process end"; + return APP_ERR_OK; +} + +std::vector> MxpiPNetPostprocess::DefineProperties() { + // Define an A to store properties + std::vector> properties; + // Set the type and related information of the properties, and the key is the name + auto parentNameProSptr = std::make_shared>(ElementProperty{ + STRING, "dataSource", "name", "the name of previous plugin", "mxpi_tensorinfer2", "NULL", "NULL"}); + auto infoPlugProSptr = std::make_shared>(ElementProperty{ + STRING, "InfoSource", "name", "the name of needed decoder/crop plugin", "mxpi_imagedecoder0", "NULL", "NULL"}); + auto descriptionMessageProSptr = std::make_shared>(ElementProperty{ + STRING, "descriptionMessage", "message", "Description mesasge of plugin", "This is MxpiSamplePlugin", "NULL", "NULL"}); + properties.push_back(parentNameProSptr); + properties.push_back(infoPlugProSptr); + properties.push_back(descriptionMessageProSptr); + return properties; +} + +// Register the Sample plugin through macro +MX_PLUGIN_GENERATE(MxpiPNetPostprocess) \ No newline at end of file diff --git a/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h b/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h new file mode 100755 index 000000000..0787c5a1c --- /dev/null +++ b/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h @@ -0,0 +1,111 @@ +/* + * Copyright(C) 2022. Huawei Technologies Co.,Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SDKMEMORY_MXPIPNETPOSTPROCESS_H +#define SDKMEMORY_MXPIPNETPOSTPROCESS_H + +#include "MxTools/PluginToolkit/base/MxPluginGenerator.h" +#include "MxTools/PluginToolkit/base/MxPluginBase.h" +#include "MxTools/PluginToolkit/metadata/MxpiMetadataManager.h" +#include "MxTools/Proto/MxpiDataType.pb.h" +#include "MxBase/PostProcessBases/PostProcessDataType.h" +#include "MxBase/ErrorCode/ErrorCode.h" +#include "opencv2/opencv.hpp" +#include + +#if defined(__cpp_lib_math_special_functions) || !defined(DNUMCPP_NO_USE_BOOST) +#include "NumCpp/Core/Internal/StaticAsserts.hpp" +#include "NumCpp/Core/Internal/StlAlgorithms.hpp" +#include "NumCpp/NdArray.hpp" +#include "NumCpp/Functions.hpp" +#endif +#include + +#ifndef __cpp_lib_math_special_functions +#include +#else +#include "boost/math/special_functions/bessel.hpp" +#endif + +/** +* @api +* @brief Definition of MxpiHeadPosePlugin class. +*/ + +namespace MxPlugins { + class MxpiPNetPostprocess : public MxTools::MxPluginBase { + public: + /** + * @api + * @brief Initialize configure parameter. + * @param configParamMap + * @return APP_ERROR + */ + APP_ERROR Init(std::map>& configParamMap) override; + /** + * @api + * @brief DeInitialize configure parameter. + * @return APP_ERROR + */ + APP_ERROR DeInit() override; + /** + * @api + * @brief Process the data of MxpiBuffer. + * @param mxpiBuffer + * @return APP_ERROR + */ + APP_ERROR Process(std::vector& mxpiBuffer) override; + /** + * @api + * @brief Definition the parameter of configure properties. + * @return std::vector> + */ + static std::vector> DefineProperties(); + /** + * @api + * @brief Get the number of class id and confidence from model inference. + * @param key + * @param buffer + * @return APP_ERROR + */ + APP_ERROR GenerateHeadPoseInfo(const MxTools::MxpiTensorPackageList srcMxpiTensorPackage, + const MxTools::MxpiVisionList srcMxpiVisionPackage, + MxTools::MxpiObjectList& dstMxpiHeadPoseListSptr); + + nc::NdArray transform_preds(nc::NdArray coords, nc::NdArray center, + float scale, int output_size[2]); + + cv::Mat get_affine_transform(nc::NdArray center, float scale, float rot, int output_size[2], + nc::NdArray shift, int inv); + + nc::NdArray get_dir(nc::NdArray src_point, float rot_rad); + + nc::NdArray get_3rd_point(nc::NdArray a, nc::NdArray b); + + nc::NdArray affine_transform(nc::NdArray pt, nc::NdArray t); + + private: + APP_ERROR SetMxpiErrorInfo(MxTools::MxpiBuffer& buffer, const std::string pluginName, + const MxTools::MxpiErrorInfo mxpiErrorInfo); + std::string parentName_; + std::string infoPlugName_; + std::string descriptionMessage_; + std::ostringstream ErrorInfo_; + }; +} + + +#endif //SDKMEMORY_MXPIPNETPOSTPROCESS_H diff --git a/contrib/PoseEstNet/plugins/postprocess/build.sh b/contrib/PoseEstNet/plugins/postprocess/build.sh new file mode 100755 index 000000000..162319a9d --- /dev/null +++ b/contrib/PoseEstNet/plugins/postprocess/build.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Copyright 2022 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License.mitations under the License. + +set -e + +current_folder="$( cd "$(dirname "$0")" ;pwd -P )" + +function build_plugin() { + build_path=$current_folder/build + if [ -d "$build_path" ]; then + rm -rf "$build_path" + else + echo "file $build_path is not exist." + fi + mkdir -p "$build_path" + cd "$build_path" + cmake .. + make -j + cd .. + exit 0 +} + +build_plugin +exit 0 diff --git a/contrib/PoseEstNet/plugins/preprocess/CMakeLists.txt b/contrib/PoseEstNet/plugins/preprocess/CMakeLists.txt new file mode 100755 index 000000000..56e2a811b --- /dev/null +++ b/contrib/PoseEstNet/plugins/preprocess/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.5.2) +project(MxpiPNetPreprocess) + +add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) +add_definitions(-Dgoogle=mindxsdk_private) +add_definitions(-DNUMCPP_NO_USE_BOOST) + +set(PLUGIN_NAME "mxpi_pnetpreprocessplugin") +set(TARGET_LIBRARY ${PLUGIN_NAME}) +set(MX_SDK_HOME $ENV{MX_SDK_HOME}) +set(LIBRARY_OUTPUT_PATH ${MX_SDK_HOME}/lib/plugins) +set(CMAKE_CXX_STANDARD 14) + +include_directories(${MX_SDK_HOME}/include) +include_directories(${MX_SDK_HOME}/opensource/include) +include_directories(${MX_SDK_HOME}/opensource/include/gstreamer-1.0) +include_directories(${MX_SDK_HOME}/opensource/include/glib-2.0) +include_directories(${MX_SDK_HOME}/opensource/lib/glib-2.0/include) +include_directories(${MX_SDK_HOME}/opensource/include/opencv4) +include_directories(../include) + +link_directories(${MX_SDK_HOME}/lib) +link_directories(${MX_SDK_HOME}/opensource/lib) + +add_compile_options(-std=c++11 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations -g) +add_compile_options("-DPLUGIN_NAME=${PLUGIN_NAME}") + +add_definitions(-DENABLE_DVPP_INTERFACE) + +add_library(${TARGET_LIBRARY} SHARED MxpiPNetPreprocess.cpp) +target_link_libraries(${TARGET_LIBRARY} glib-2.0 gstreamer-1.0 gobject-2.0 gstbase-1.0 gmodule-2.0 glog) + + +target_link_libraries(${TARGET_LIBRARY} mxpidatatype plugintoolkit mxbase mindxsdk_protobuf) +target_link_libraries(${TARGET_LIBRARY} -Wl,-z,relro,-z,now,-z,noexecstack -s) \ No newline at end of file diff --git a/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp new file mode 100755 index 000000000..3c7ec99f6 --- /dev/null +++ b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp @@ -0,0 +1,455 @@ +/* + * Copyright(C) 2022. Huawei Technologies Co.,Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MxpiPNetPreprocess.h" +#include "MxBase/Log/Log.h" +#include "MxBase/Tensor/TensorBase/TensorBase.h" + + +using namespace MxBase; +using namespace MxPlugins; +using namespace MxTools; +using namespace std; +namespace { + const string VISION_KEY = "MxpiVisionList"; + const mindxsdk_private::protobuf::uint32 MXBASE_PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1; + const mindxsdk_private::protobuf::uint32 MXBASE_PIXEL_FORMAT_RGB_888 = 12; + const mindxsdk_private::protobuf::uint32 MXBASE_PIXEL_FORMAT_BGR_888 = 13; + const int YUV_U = 2; + const int YUV_V = 3; +} + + +APP_ERROR MxpiPNetPreprocess::Init(std::map>& configParamMap) { + LogInfo << "MxpiPoseEstNetPrepostPlugin::Init start."; + APP_ERROR ret = APP_ERR_OK; + // Get the property values by key + std::shared_ptr parentNamePropSptr = std::static_pointer_cast(configParamMap["dataSource"]); + parentName_ = *parentNamePropSptr.get(); + std::shared_ptr outputFormatPropSptr = std::static_pointer_cast(configParamMap["outputFormat"]); + outputDataFormat = *outputFormatPropSptr.get(); + std::shared_ptr descriptionMessageProSptr = std::static_pointer_cast(configParamMap["descriptionMessage"]); + descriptionMessage_ = *descriptionMessageProSptr.get(); + LogInfo << "MxpiPoseEstNetPrepostPlugin::Init complete."; + return APP_ERR_OK; +} + + +APP_ERROR MxpiPNetPreprocess::DeInit() { + LogInfo << "MxpiPNetPreprocess::DeInit start."; + LogInfo << "MxpiPNetPreprocess::DeInit complete."; + return APP_ERR_OK; +} + + +APP_ERROR MxpiPNetPreprocess::SetMxpiErrorInfo(MxpiBuffer& buffer, const std::string pluginName, + const MxpiErrorInfo mxpiErrorInfo) { + APP_ERROR ret = APP_ERR_OK; + // Define an object of MxpiMetadataManager + MxpiMetadataManager mxpiMetadataManager(buffer); + ret = mxpiMetadataManager.AddErrorInfo(pluginName, mxpiErrorInfo); + if (ret != APP_ERR_OK) { + LogError << "Failed to AddErrorInfo."; + return ret; + } + ret = SendData(0, buffer); + return ret; +} + + +APP_ERROR MxpiPNetPreprocess::GenerateVisionList(const MxpiVisionList srcMxpiVisionList, + MxpiVisionList& dstMxpiVisionList) { + LogInfo <<"input type:" <CopyFrom(dstVision); + } + if (dstMxpiVisionList.visionvec_size() == 0) { + LogError << "element("<< elementName_<<") dst vision vec size is 0!"; + return APP_ERR_COMM_FAILURE; + } + LogInfo << "Generate done"; + return APP_ERR_OK; +} + + +APP_ERROR MxpiPNetPreprocess::DoAffineTransform(size_t idx, + const MxTools::MxpiVision srcMxpiVision, + MxTools::MxpiVision& dstMxpiVision) { + LogInfo << "Till now is ok"; + auto &visionInfo = srcMxpiVision.visioninfo(); + auto &visionData = srcMxpiVision.visiondata(); + + MemoryData memorySrc = {}; + memorySrc.deviceId = visionData.deviceid(); + memorySrc.type = (MxBase::MemoryData::MemoryType)visionData.memtype(); + memorySrc.size = visionData.datasize(); + memorySrc.ptrData = (void *)visionData.dataptr(); + MemoryData memoryDst(visionData.datasize(), MemoryData::MEMORY_HOST_NEW); + APP_ERROR ret = MxBase::MemoryHelper::MxbsMallocAndCopy(memoryDst, memorySrc); + if (ret != APP_ERR_OK) { + LogError << "Fail to malloc and copy host memory."; + return ret; + } + + int orignal_width; + int orignal_height; + + cv::Mat src; + cv::Mat imgBGR; + cv::Mat imgRGB; + + // check the format of the input image, decode it accordingly. + outputPixelFormat_ = visionInfo.format(); + LogInfo << outputPixelFormat_; + if (outputPixelFormat_ == MXBASE_PIXEL_FORMAT_YUV_SEMIPLANAR_420){ + LogInfo << "the format of input image is YUV, using dvpp to decode."; + imgRGB = cv::Mat(visionInfo.height(), visionInfo.width(), CV_8UC3); + orignal_width = visionInfo.width(); + orignal_height = visionInfo.height(); + + cv::Mat transedImgRBG = cv::Mat(visionInfo.heightaligned(), visionInfo.widthaligned(), CV_8UC3); + src = cv::Mat(visionInfo.heightaligned()* YUV_V / YUV_U, visionInfo.widthaligned(), CV_8UC1, memoryDst.ptrData); + cv::cvtColor(src, transedImgRBG, cv::COLOR_YUV2RGB_NV12); + + vector cropRange; + cropRange.push_back(0); //x_0 + cropRange.push_back(0); //y_0 + cropRange.push_back(orignal_width); //x_1 + cropRange.push_back(orignal_height); //y_1 + crop_img(transedImgRBG, imgRGB, cropRange); + } else { + imgRGB = cv::Mat(visionInfo.heightaligned(), visionInfo.widthaligned(), CV_8UC3); + orignal_width = visionInfo.widthaligned(); + orignal_height = visionInfo.heightaligned(); + if (outputPixelFormat_ == MXBASE_PIXEL_FORMAT_RGB_888) { + LogInfo << "the format of input image is RGB, using opencv to decode."; + imgRGB = cv::Mat(visionInfo.heightaligned(), visionInfo.widthaligned(), CV_8UC3, memoryDst.ptrData); + } else if (outputPixelFormat_ == MXBASE_PIXEL_FORMAT_BGR_888) { + LogInfo << "the format of input image is BGR, using opencv to decode."; + src = cv::Mat(visionInfo.heightaligned(), visionInfo.widthaligned(), CV_8UC3, memoryDst.ptrData); + cv::cvtColor(src, imgRGB, cv::COLOR_BGR2RGB); + } + } + + cv::Mat dst; + MxBase::MemoryData memoryNewDst(dst.data, MxBase::MemoryData::MEMORY_HOST_NEW); + auto pixel_std = 200; + nc::NdArray center = {float(orignal_width / 2.0), float(orignal_height / 2.0)}; + float scale = MAX(orignal_width, orignal_height) * 1.25 / pixel_std; + int outputSize[2] = { 256, 256 }; + cv::Size dstSize = { 256, 256 }; + cv::Mat trans = get_affine_transform(center, scale, 0, outputSize, {0, 0}, 0); + cv::warpAffine(imgRGB, dst, trans, dstSize); + + cv::Mat imgYuv; + cv::Mat yuv_mat; + cv::Mat img_nv12; + if (outputDataFormat == "YUV") { + LogInfo << "output in yuv"; + imgYuv = cv::Mat(256, 256, CV_8UC1); + cv::cvtColor(dst, imgYuv, cv::COLOR_RGB2YUV_I420); + yuv_mat = imgYuv.clone(); + Bgr2Yuv(yuv_mat, img_nv12); + ret = Mat2MxpiVisionDvpp(idx, img_nv12, dstMxpiVision); + } else { + if (outputDataFormat == "RGB") { + LogInfo <<"output in rgb"; + ret = Mat2MxpiVisionOpencv(idx, dst, dstMxpiVision); + } else { + LogInfo <<"output in bgr"; + imgBGR = cv::Mat(256, 256, CV_8UC3); + cv::cvtColor(dst, imgBGR, cv::COLOR_RGB2BGR); + ret = Mat2MxpiVisionOpencv(idx, imgBGR, dstMxpiVision); + } + } + + if (ret != APP_ERR_OK) { + LogError << "convert mat to mxvision failed!"; + return ret; + } + LogInfo << "affine_transform done"; + return APP_ERR_OK; +} + + +APP_ERROR MxpiPNetPreprocess::Mat2MxpiVisionOpencv(size_t idx, const cv::Mat& mat, MxTools::MxpiVision& vision) { + LogInfo << "Mat2MxpiVision begin"; + auto header = vision.add_headervec(); + header->set_memberid(idx); + header->set_datasource(parentName_); + + auto visionInfo = vision.mutable_visioninfo(); + if (outputDataFormat == "YUV") { + visionInfo->set_format(MXBASE_PIXEL_FORMAT_YUV_SEMIPLANAR_420); + } else { + if (outputDataFormat == "RGB") { + visionInfo->set_format(MXBASE_PIXEL_FORMAT_RGB_888); + } else { + visionInfo->set_format(MXBASE_PIXEL_FORMAT_BGR_888); + } + } + // visionInfo->set_format(outputPixelFormat_); + visionInfo->set_height(mat.rows); + visionInfo->set_heightaligned(mat.rows); + visionInfo->set_width(mat.cols); + visionInfo->set_widthaligned(mat.cols); + auto visionData = vision.mutable_visiondata(); + LogInfo << "elemSize = " << mat.elemSize(); + LogInfo << "col = " << mat.cols; + LogInfo << "rows = " << mat.rows; + LogInfo << "size = " << mat.size(); + visionData->set_datasize(mat.cols * mat.rows * mat.elemSize()); + MemoryData memoryDataDst(visionData->datasize(), MemoryData::MEMORY_HOST, deviceId_); + MemoryData memoryDataStr(mat.data, visionData->datasize(), MemoryData::MEMORY_HOST_MALLOC); + APP_ERROR ret = MemoryHelper::MxbsMallocAndCopy(memoryDataDst, memoryDataStr); + if (ret != APP_ERR_OK) { + LogError << "copy memory error."; + return ret; + } + visionData->set_dataptr((uint64)memoryDataDst.ptrData); + visionData->set_deviceid(deviceId_); + visionData->set_memtype(MxTools::MXPI_MEMORY_HOST); + visionData->set_datatype(MxTools::MxpiDataType::MXPI_DATA_TYPE_UINT8); + LogInfo << "Mat2MxpiVision done"; + return APP_ERR_OK; +} + + +// area is the upper left corner coordinate and width height of the cutting area +void MxpiPNetPreprocess::crop_img(cv::Mat &img, cv::Mat &crop_img, std::vector &area) { + int crop_x1 = std::max(0, area[0]); + int crop_y1 = std::max(0, area[1]); + int crop_x2 = std::min(img.cols -1, area[0] + area[2] - 1); + int crop_y2 = std::min(img.rows - 1, area[1] + area[3] - 1); + + crop_img = img(cv::Range(crop_y1, crop_y2+1), cv::Range(crop_x1, crop_x2 + 1)); +} + + + +APP_ERROR MxpiPNetPreprocess::Bgr2Yuv(cv::Mat &yuv_mat, cv::Mat &img_nv12) { + uint8_t *yuv = yuv_mat.ptr(); + img_nv12 = cv::Mat(256 * YUV_V / YUV_U, 256, CV_8UC1); + uint8_t *ynv12 = img_nv12.ptr(); + int32_t uv_height = 256 / 2; + int32_t uv_width = 256 / 2; + int32_t y_size = 256 * 256; + memcpy(ynv12, yuv, y_size); + uint8_t *nv12 = ynv12 + y_size; + uint8_t *u_data = yuv + y_size; + uint8_t *v_data = u_data + uv_height * uv_width; + for (int32_t i = 0; i < uv_width * uv_height; i++) { + *nv12++ = *u_data++; + *nv12++ = *v_data++; + } + return APP_ERR_OK; +} + + +APP_ERROR MxpiPNetPreprocess::Mat2MxpiVisionDvpp(size_t idx, const cv::Mat& mat, MxTools::MxpiVision& vision) { + LogInfo << "Mat2MxpiVision begin"; + auto header = vision.add_headervec(); + header->set_memberid(idx); + header->set_datasource(parentName_); + + auto visionInfo = vision.mutable_visioninfo(); + visionInfo->set_format(outputPixelFormat_); + visionInfo->set_height(mat.rows*YUV_U/YUV_V); + visionInfo->set_heightaligned(mat.rows*YUV_U/YUV_V); + visionInfo->set_width(mat.cols); + visionInfo->set_widthaligned(mat.cols); + + auto visionData = vision.mutable_visiondata(); + LogInfo << "elemSize = " << mat.elemSize(); + LogInfo << "col = " << mat.cols; + LogInfo << "rows = " << mat.rows; + LogInfo << "size = " << mat.size(); + visionData->set_datasize(mat.cols * mat.rows * mat.elemSize()); + MemoryData memoryDataDst(visionData->datasize(), MemoryData::MEMORY_DVPP, deviceId_); + MemoryData memoryDataStr(mat.data, visionData->datasize(), MemoryData::MEMORY_HOST_MALLOC); + APP_ERROR ret = MemoryHelper::MxbsMallocAndCopy(memoryDataDst, memoryDataStr); + if (ret != APP_ERR_OK) { + LogError << "copy memory error."; + return ret; + } + visionData->set_dataptr((uint64)memoryDataDst.ptrData); + visionData->set_deviceid(deviceId_); + visionData->set_memtype(MxTools::MXPI_MEMORY_DVPP); + visionData->set_datatype(MxTools::MxpiDataType::MXPI_DATA_TYPE_UINT8); + LogInfo << "Mat2MxpiVision done"; + return APP_ERR_OK; +}; + + +cv::Mat MxpiPNetPreprocess::get_affine_transform(nc::NdArray center, float scale,float rot, + int output_size[2],nc::NdArray shift = {0, 0}, int inv = 0) { + nc::NdArray scales = { scale * 200, scale * 200 }; + nc::NdArray scale_tmp = scales; + float src_w = scale_tmp[0]; + int dst_w = output_size[0]; + int dst_h = output_size[1]; + float rot_rad = nc::constants::pi * rot / 180; + nc::NdArray src_dir = get_dir(nc::NdArray { 0, float(src_w * -0.5) }, rot_rad); + nc::NdArray dst_dir = { 0, float(dst_w * -0.5) }; + nc::NdArray src = nc::zeros(3, 2); + nc::NdArray dst = nc::zeros(3, 2); + nc::NdArray temp; + + temp = center + scale_tmp * shift; + src(0, 0) = temp(0, 0); + src(0, 1) = temp(0, 1); + temp = center + src_dir + scale_tmp * shift; + src(1, 0) = temp(0, 0); + src(1, 1) = temp(0, 1); + temp = dst_w * 0.5, dst_h * 0.5; + dst(0, 0) = temp(0, 0); + dst(0, 1) = temp(0, 1); + temp = nc::NdArray {float(dst_w * 0.5), float(dst_h * 0.5)} + dst_dir; + dst(1, 0) = temp(0, 0); + dst(1, 1) = temp(0, 1); + temp = get_3rd_point(src(0, src.cSlice()), src(1, src.cSlice())); + src(2, 0) = temp(0, 0); + src(2, 1) = temp(0, 1); + temp = get_3rd_point(dst(0, dst.cSlice()), dst(1, dst.cSlice())); + dst(2, 0) = temp(0, 0); + dst(2, 1) = temp(0, 1); + + cv::Mat trans; + cv::Point2f SRC[3]; + cv::Point2f DST[3]; + SRC[0] = cv::Point2f(src(0, 0), src(0, 1)); + SRC[1] = cv::Point2f(src(1, 0), src(1, 1)); + SRC[2] = cv::Point2f(src(2, 0), src(2, 1)); + DST[0] = cv::Point2f(dst(0, 0), dst(0, 1)); + DST[1] = cv::Point2f(dst(1, 0), dst(1, 1)); + DST[2] = cv::Point2f(dst(2, 0), dst(2, 1)); + if (1 == inv) { + trans = cv::getAffineTransform(DST, SRC); + } + else + { + trans = cv::getAffineTransform(SRC, DST); + } + return trans; +} + + +nc::NdArray MxpiPNetPreprocess::get_dir(nc::NdArray src_point, float rot_rad) { + float sn = nc::sin(rot_rad); + float cs = nc::cos(rot_rad); + nc::NdArray src_result = {0, 0}; + src_result[0] = src_point[0] * cs - src_point[1] * sn; + src_result[1] = src_point[0] * sn + src_point[1] * cs; + return src_result; +} + + +nc::NdArray MxpiPNetPreprocess::get_3rd_point(nc::NdArray a, nc::NdArray b) { + nc::NdArray direct = a - b; + nc::NdArray c = b + nc::NdArray { -direct[1], direct[0] }; + return c; +} + + +APP_ERROR MxpiPNetPreprocess::Process(std::vector& mxpiBuffer) { + LogInfo << "MxpiPNetPreprocess::Process start"; + MxpiBuffer* buffer = mxpiBuffer[0]; + MxpiMetadataManager mxpiMetadataManager(*buffer); + MxpiErrorInfo mxpiErrorInfo; + ErrorInfo_.str(""); + auto errorInfoPtr = mxpiMetadataManager.GetErrorInfo(); + if (errorInfoPtr != nullptr) { + ErrorInfo_ << GetError(APP_ERR_COMM_FAILURE, pluginName_) << "MxpiPNetPreprocess process is not implemented"; + mxpiErrorInfo.ret = APP_ERR_COMM_FAILURE; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + LogError << "MxpiPNetPreprocess process is not implemented"; + return APP_ERR_COMM_FAILURE; + } + // Get the (image) data from buffer + shared_ptr metadata = mxpiMetadataManager.GetMetadata(parentName_); + if (metadata == nullptr) { + ErrorInfo_ << GetError(APP_ERR_METADATA_IS_NULL, pluginName_) << "Metadata of tensor is NULL, failed"; + mxpiErrorInfo.ret = APP_ERR_METADATA_IS_NULL; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return APP_ERR_METADATA_IS_NULL; // self define the error code + } + // Check the proto struct name + google::protobuf::Message* msg = (google::protobuf::Message*)metadata.get(); + const google::protobuf::Descriptor* desc = msg->GetDescriptor(); + if (desc->name() != VISION_KEY) { + ErrorInfo_ << GetError(APP_ERR_PROTOBUF_NAME_MISMATCH, pluginName_) + << "Proto struct name is not MxpiVisionList, failed"; + mxpiErrorInfo.ret = APP_ERR_PROTOBUF_NAME_MISMATCH; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return APP_ERR_PROTOBUF_NAME_MISMATCH; // self define the error code + } + LogInfo << "MxpiPNetPreprocess::Get Original Image Completed"; + + // Generate WHENet output + shared_ptr srcMxpiVisionListSptr = static_pointer_cast(metadata); + shared_ptr dstMxpiVisionListSptr = make_shared(); + APP_ERROR ret = GenerateVisionList(*srcMxpiVisionListSptr, *dstMxpiVisionListSptr); + if (ret != APP_ERR_OK) { + LogError << GetError(ret, pluginName_) << "MxpiPNetPreprocess gets inference information failed."; + mxpiErrorInfo.ret = ret; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return ret; + } + + ret = mxpiMetadataManager.AddProtoMetadata(pluginName_, static_pointer_cast(dstMxpiVisionListSptr)); + if (ret != APP_ERR_OK) { + ErrorInfo_ << GetError(ret, pluginName_) << "MxpiPNetPreprocess add metadata failed."; + mxpiErrorInfo.ret = ret; + mxpiErrorInfo.errorInfo = ErrorInfo_.str(); + SetMxpiErrorInfo(*buffer, pluginName_, mxpiErrorInfo); + return ret; + } + // Send the data to downstream plugin + SendData(0, *buffer); + LogInfo << "MxpiPNetPreprocess::Process end"; + return APP_ERR_OK; +} + + +std::vector> MxpiPNetPreprocess::DefineProperties() { + // Define an A to store properties + std::vector> properties; + // Set the type and related information of the properties, and the key is the name + auto parentNameProSptr = std::make_shared>(ElementProperty{ + STRING, "dataSource", "name", "the name of previous plugin", "mxpi_imagedecoder0", "NULL", "NULL"}); + auto outputPixelFormatProSptr = std::make_shared>(ElementProperty{ + STRING, "outputFormat", "name", "the format of output image", "YUV", "NULL", "NULL"}); + auto descriptionMessageProSptr = std::make_shared>(ElementProperty{ + STRING, "descriptionMessage", "message", "Description mesasge of plugin", "This is MxpiSamplePlugin", "NULL", "NULL"}); + properties.push_back(parentNameProSptr); + properties.push_back(outputPixelFormatProSptr); + properties.push_back(descriptionMessageProSptr); + + return properties; +} + +// Register the Sample plugin through macro +MX_PLUGIN_GENERATE(MxpiPNetPreprocess) \ No newline at end of file diff --git a/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h new file mode 100755 index 000000000..53ecafe0b --- /dev/null +++ b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h @@ -0,0 +1,118 @@ +/* + * Copyright(C) 2022. Huawei Technologies Co.,Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SDKMEMORY_MXPIPNETPREPROCESS_H +#define SDKMEMORY_MXPIPNETPREPROCESS_H +#include "MxTools/PluginToolkit/base/MxPluginGenerator.h" +#include "MxTools/PluginToolkit/base/MxPluginBase.h" +#include "MxTools/PluginToolkit/metadata/MxpiMetadataManager.h" +#include "MxTools/Proto/MxpiDataType.pb.h" +#include "MxBase/PostProcessBases/PostProcessDataType.h" +#include "MxBase/ErrorCode/ErrorCode.h" +#include "opencv2/opencv.hpp" +#include +#include + +#if defined(__cpp_lib_math_special_functions) || !defined(DNUMCPP_NO_USE_BOOST) +#include "NumCpp/Core/Internal/StaticAsserts.hpp" +#include "NumCpp/Core/Internal/StlAlgorithms.hpp" +#include "NumCpp/NdArray.hpp" +#include "NumCpp/Functions.hpp" +#endif +#include + +#ifndef __cpp_lib_math_special_functions +#include +#else +#include "boost/math/special_functions/bessel.hpp" +#endif + + +/** +* @api +* @brief Definition of MxpiPoseEstNetPrepostPlugin class. +*/ +namespace MxPlugins { + class MxpiPNetPreprocess : public MxTools::MxPluginBase { + public: + /** + * @api + * @brief Initialize configure parameter. + * @param configParamMap + * @return APP_ERROR + */ + APP_ERROR Init(std::map>& configParamMap) override; + /** + * @api + * @brief DeInitialize configure parameter. + * @return APP_ERROR + */ + APP_ERROR DeInit() override; + /** + * @api + * @brief Process the data of MxpiBuffer. + * @param mxpiBuffer + * @return APP_ERROR + */ + APP_ERROR Process(std::vector& mxpiBuffer) override; + /** + * @api + * @brief Definition the parameter of configure properties. + * @return std::vector> + */ + static std::vector> DefineProperties(); + /** + * @api + * @brief Get the number of class id and confidence from model inference. + * @param key + * @param buffer + * @return APP_ERROR + */ + + APP_ERROR GenerateVisionList(const MxTools::MxpiVisionList srcMxpiVisionList, + MxTools::MxpiVisionList& dstMxpiVisionList); + + APP_ERROR Mat2MxpiVisionOpencv(size_t idx, const cv::Mat& mat, MxTools::MxpiVision& vision); + + APP_ERROR Bgr2Yuv(cv::Mat &yuv_mat, cv::Mat &img_nv12); + + APP_ERROR Mat2MxpiVisionDvpp(size_t idx, const cv::Mat& mat, MxTools::MxpiVision& vision); + + void crop_img(cv::Mat &img, cv::Mat &crop_img, std::vector &area); + + APP_ERROR DoAffineTransform(size_t idx, const MxTools::MxpiVision srcMxpiVision, + MxTools::MxpiVision& dstMxpiVision); + + cv::Mat get_affine_transform(nc::NdArray center, float scale, float rot, int output_size[2], + nc::NdArray shift, int inv); + + nc::NdArray get_dir(nc::NdArray src_point, float rot_rad); + + nc::NdArray get_3rd_point(nc::NdArray a, nc::NdArray b); + + private: + APP_ERROR SetMxpiErrorInfo(MxTools::MxpiBuffer& buffer, const std::string pluginName, + const MxTools::MxpiErrorInfo mxpiErrorInfo); + std::string parentName_; + std::string descriptionMessage_; + std::string outputDataFormat; + std::ostringstream ErrorInfo_; + mindxsdk_private::protobuf::uint32 outputPixelFormat_; + }; +} + + +#endif //SDKMEMORY_MXPIPNETPREPROCESS_H diff --git a/contrib/PoseEstNet/plugins/preprocess/build.sh b/contrib/PoseEstNet/plugins/preprocess/build.sh new file mode 100755 index 000000000..162319a9d --- /dev/null +++ b/contrib/PoseEstNet/plugins/preprocess/build.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Copyright 2022 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License.mitations under the License. + +set -e + +current_folder="$( cd "$(dirname "$0")" ;pwd -P )" + +function build_plugin() { + build_path=$current_folder/build + if [ -d "$build_path" ]; then + rm -rf "$build_path" + else + echo "file $build_path is not exist." + fi + mkdir -p "$build_path" + cd "$build_path" + cmake .. + make -j + cd .. + exit 0 +} + +build_plugin +exit 0 diff --git "a/contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" "b/contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" new file mode 100644 index 000000000..3eff40519 --- /dev/null +++ "b/contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" @@ -0,0 +1,224 @@ + + +# MindX SDK -- 车辆姿态识别参考设计案例 + +## 1 案例概述 + +### 1.1 概要描述 + +本开发样例基于MindX SDK实现了姿态估计网络(PoseEstNet),用于检测并预测车辆36个关键点坐标以及生成热点图。 +      [PoseEstNet论文地址](https://arxiv.org/pdf/2005.00673.pdf) +      [PoseEstNet代码地址](https://github.com/NVlabs/PAMTRI/tree/master/PoseEstNet) + + +### 1.2 特性及适用场景 +本开发样例适用于对输入的.jpg图片中的车辆进行检测,并且对其进行姿态识别 +### 1.3 模型介绍 +车辆姿态识别先采用了yolov3模型将图片中的车辆检测出来,然后利用PoseEstNet模型预测车辆36个关键点坐标。 + +yolov3模型:      [原始模型下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/yolov3_tensorflow_1.5.pb) +      [配置文件下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/aipp_nv12.cfg) + +PoseEstNet模型:[pth权重文件下载链接](https://docs.google.com/uc?export=download&id=1vD08fh-za3mgTJ9UkK1ASCTJAqypW0RL) +[onnx模型下载链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/PoseEstNet/PoseEstNet.onnx) + +VeRi数据集: +      [下载链接](https://vehiclereid.github.io/VeRi/) + +### 1.4 实现流程 +项目流程图: + +![项目流程图](image/project_tree.png) + +技术流程图: +![技术流程图](image/plugin_tree.png) +## 2 软件方案介绍 + +### 2.1 技术原理 +本开发样例基于姿态估计网络(PoseEstNet),PoseEstNet是高分辨率网络(HRNet)的延伸,用于预测关键点坐标(有置信度/可见度)和生成热图/分段。 + + +### 2.2 项目方案架构介绍 + +(功能模块图) + +表1 系统方案中各模块功能: + +| 序号 | 子系统 | 功能描述 | +| ---- | ------ | ------------ | +| 1 | 目标检测模块 | 使用yolov3模型对图片中的车辆进行目标检测,并提取出来裁剪后送入车辆姿态识别模型进行检测 | +| 2 | 车辆姿态识别模块 | 对输入的车辆图片进行姿态识别,预测36个关键点 | + + +## 3 开发环境搭建 + +### 3.1 依赖安装 +环境依赖说明 + +| 软件名称 | 版本 | +| :--------: | :------: | +|ubuntu 18.04|18.04.1 LTS | +|CANN|5.0.4| +|MindX SDK|2.0.4| +|Python| 3.9.12| +|numpy | 1.22.4 | +|opencv_python|4.6.0| +|cmake|3.5+| +请注意MindX SDK使用python版本为3.9.12,如出现无法找到python对应lib库请在root下安装python3.9开发库 +``` +apt-get install libpython3.9 +``` + +### 3.2 工程创建 +本工程名称为PoseEstNet,工程目录如下图所示: + +``` +PoseEstNet +|---- models +| | |---- aipp_nv12.cfg +| | |---- coco.names +| | |---- PoseEstNet.om +| | |---- yolov3.cfg +| | |---- yolov3.om +| | |---- aipp_hrnet_256_256.aippconfig +|---- pipeline // 流水线配置文件夹 +| | |---- eval_PoseEstNet.pipeline +| | |---- PoseEstNet.pipeline +|---- plugins // 插件文件夹 +|---- data +|---- data_eval +| | |---- images +| | |---- labels +|---- output // 结果保存文件夹 +|---- output_eval +|---- main.py +|---- eval.py +|---- README.md +``` + +### 3.3 开发环境搭建 + +[IDE开发环境搭建参考指南](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/quick_start/1-2IDE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md) + +## 4 编译与运行 + +**步骤1** 配置环境变量 +``` +export MX_SDK_HOME=${SDK安装路径}/mxVision + +export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ + +export PYTHONPATH=${MX_SDK_HOME}/python + +export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner + +export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins +``` +**步骤2** 安装插件编译所需要的NumCpp库 +``` +cd plugins +git clone https://github.com/dpilger26/NumCpp +mkdir include +cp -r NumCpp/include/NumCpp ./include/ +``` + +**步骤3** 编译插件 +``` +bash build.sh +``` +**步骤4** 切换到插件目录更新权限 +``` +cd ${MX_SDK_HOME}/lib/plugins +chmod 640 libmxpi_pnetpostprocessplugin.so +chmod 640 libmxpi_pnetpreprocessplugin.so +``` +**步骤5** 切换回根目录,创建文件夹 +``` +cd (项目根目录) +mkdir data +mkdir data_eval +mkdir output +mkdir output_eval +``` +**步骤6** 配置pipeline +``` + # 配置mxpi_tensorinfer插件的yolov3.om模型加载路径(lines 26-33) + lines 26-33: + "mxpi_tensorinfer0": { + "props": { + "dataSource": "mxpi_imageresize0", + "modelPath": "models/yolov3.om(这里根据你的命名或路径进行更改)" + }, + "factory": "mxpi_tensorinfer", + "next": "mxpi_objectpostprocessor0" + }, + # 配置mxpi_objectpostprocessor插件的yolov3.cfg配置文件加载路径以及SDN的安装路径(lines 34-43) + lines 34-43: + "mxpi_objectpostprocessor0": { + "props": { + "dataSource": "mxpi_tensorinfer0", + "postProcessConfigPath": "models/yolov3.cfg(这里根据你的命名或路径进行更改)", + "labelPath": "models/coco.names", + "postProcessLibPath": "${SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so" + }, + "factory": "mxpi_objectpostprocessor", + "next": "mxpi_imagecrop0" + }, + # 配置mxpi_tensorinfer插件的PoseEstNet.om模型加载路径(lines 68-75 以及 92-99) + lines 68-75: + "mxpi_tensorinfer2":{ + "props": { + "dataSource": "mxpi_preprocess1", + "modelPath": "models/PoseEstNet.om(这里根据你的命名或路径进行更改)" + }, + "factory":"mxpi_tensorinfer", + "next":"mxpi_postprocess1" + }, + +``` +**步骤7** 运行及输出结果 + +业务代码main.py结果在output文件夹 +``` +python3 main.py --inputPath data +``` +评估代码的具体结果在output_eval文件夹 +``` +python3 eval.py --inputPath data_eval/images/ --labelPath data_eval/labels/label_test.csv +``` + +## 5 指标验证 + +### 5.1 性能测试 + +**步骤1** 进入PoseEstNet项目目录,将待检测图片放入data文件夹中 + +**步骤2** 执行 +``` +python3 main.py --inputPath data +``` + +### 5.2 精度测试 + +**步骤1** 下载VeRi数据集,进入PoseEstNet项目目录,将images_train和images_test这两个文件夹里的图片作为测试集放入data_eval/images文件夹中 + +**步骤2** 执行 +``` +python3 eval.py --inputPath data_eval/images/ --labelPath data_eval/labels/label_test.csv +``` + +### 5.3 精度结果对比 +项目精度: +![项目精度](image/output_eval.png) +目标精度: +![目标精度](image/oral_eval.png) + +## 6 常见问题 + +**问题描述:** + +在运行main.py时出现"[DVPP: image width out of range] The crop width of image is out of range [32,4096]" + +**解决方案:** + +这里的错误是因为yolov3模型检测到的目标过小,抠图后放大的比例超过系统给定的阈值,更新“项目所在目录/models/yolov3.cfg”文件,将OBJECTNESS_THRESH适度调大可解决该问题 \ No newline at end of file -- Gitee From 2004135abd941849d5db5cb08ec57915f6e85a2c Mon Sep 17 00:00:00 2001 From: LOO YO Date: Fri, 9 Sep 2022 20:23:43 +0800 Subject: [PATCH 05/11] update code --- .DS_Store | Bin 10244 -> 10244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.DS_Store b/.DS_Store index fce2dcded98251649bbcc3c08d5bd5f1519703f5..5434f7f639265f3d1de04c6889207edeae766e20 100644 GIT binary patch delta 107 zcmZn(XbIS$DiAj@VKV~*0}F#5LpnnyLrHGFi%U{YeiBfOqdmy<)aKM9j;Qh}c;yQ+ W41<&Na|?ia7(7HDY;G246bAq?iXAur delta 107 zcmZn(XbIS$DiGK0dX#~IfrUYjA)O(Up(Hoo#U&{xKM5$tvGW6y>!#Erj;Qh}c;yQ+ W41<&Na|?ia7(Dm{Ha812iUR;MX&it6 -- Gitee From 24ffe881c40a6b447f090452042a56da0ab84549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E7=92=90=E9=81=A5?= Date: Fri, 9 Sep 2022 12:29:50 +0000 Subject: [PATCH 06/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntrib/PoseEstNet/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/PoseEstNet/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/PoseEstNet/.keep diff --git a/contrib/PoseEstNet/.keep b/contrib/PoseEstNet/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 4cea6f1878ff25783348cb2bc92c0b8f06e22820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E7=92=90=E9=81=A5?= Date: Fri, 9 Sep 2022 12:29:56 +0000 Subject: [PATCH 07/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntrib/PoseEstNet/.DS=5FStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/PoseEstNet/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/PoseEstNet/.DS_Store diff --git a/contrib/PoseEstNet/.DS_Store b/contrib/PoseEstNet/.DS_Store deleted file mode 100644 index b5bb5dff21c752543656712e78838f2cf2e306b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOHRWu5FM9F1hFYQmKG-dA`0`(GAEi5Q3hq4T%b81JkC0jiCK6s$Q%u=>6Pkcl~*HgH~dEi zbaQ*`TTeCZ?ca0P_L}h37cj&4z^CoXa?x}P8Kd;@UVq#j_FMkSuYbv_-I@_o(K*&^ zXhSPGRd0N%b{?NMV~=4@^k_N#n5XUbGdkuq$S2%#J}%CHGvExI3InLwEZL=^x6Xhw z;0$aT;O|3(G8TqOQ9d1LKAWX}uoa2?O xwvJwoYi)!+L0Q-@DQ-j1kx~p_F2&bS5!fSlfQ4aFgazV10z!i~&cL5C@C~qIOp*Wq -- Gitee From 1a127dd01ea581e9d455786d0aae45dcea41a445 Mon Sep 17 00:00:00 2001 From: LOO YO Date: Fri, 9 Sep 2022 20:51:37 +0800 Subject: [PATCH 08/11] update readme.md --- .DS_Store | Bin 10244 -> 10244 bytes contrib/.DS_Store | Bin 20484 -> 20484 bytes contrib/PoseEstNet/.DS_Store | Bin 0 -> 6148 bytes contrib/PoseEstNet/README.md | 1 - 4 files changed, 1 deletion(-) create mode 100644 contrib/PoseEstNet/.DS_Store diff --git a/.DS_Store b/.DS_Store index 5434f7f639265f3d1de04c6889207edeae766e20..071c1984a3148714b0b4595f694d84fba87f1c32 100644 GIT binary patch delta 150 zcmZn(XbIS$CJ@{Cf`Ng7g+Y%YogtHvjnSp_Ug+Y%YogtHdCf7J~vF^*!71}G5e5J(Cn}5p delta 138 zcmZo!z}T{YaYLgM6Ra`KaavdF>`n=d*mux$S1&dxgdy@W5gG*KPXfAf?ePSTdRT8l1kI=`6j-B6Cc8N@ElvyLN|#M zg2|SgmpXRhyh?RVL~gdJr$iGXDxi#`a}0Zg*I5TLQVYkqv`15~m+c~icHnDnUe7aCoi#9CM8pZp!=KXfRU;QJ$ z{(1LIkFDqoIkmJwx}4QI&+6lP=#l3{51P}reY&ul(IKxaA9us~m>2`bfHCmz7(mTt zDJ}$UGzN?TV_?ewe;+)Qu~dwL>C=HBwE(~|%tx1VyPGfu>x@t3Y1W%EryeD z*uDCdicwI)$)%IAkDlzbLviVJ*nM&*R|?u_3>X7B11Iu0;rf4fxc|?C?8z7~29AmW zH?HQ@3|G?HI=CFyS`U4Mvanwi+=gJ1N-=!76kkD;!0vehEES_5ED-w Date: Wed, 14 Sep 2022 13:38:35 +0000 Subject: [PATCH 09/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20co?= =?UTF-8?q?ntrib/PoseEstNet/.DS=5FStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/PoseEstNet/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/PoseEstNet/.DS_Store diff --git a/contrib/PoseEstNet/.DS_Store b/contrib/PoseEstNet/.DS_Store deleted file mode 100644 index 0762b6522fcd11b69225d7722895e7b191b4d689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!A`?440Xm3MO?;>W5gG*KPXfAf?ePSTdRT8l1kI=`6j-B6Cc8N@ElvyLN|#M zg2|SgmpXRhyh?RVL~gdJr$iGXDxi#`a}0Zg*I5TLQVYkqv`15~m+c~icHnDnUe7aCoi#9CM8pZp!=KXfRU;QJ$ z{(1LIkFDqoIkmJwx}4QI&+6lP=#l3{51P}reY&ul(IKxaA9us~m>2`bfHCmz7(mTt zDJ}$UGzN?TV_?ewe;+)Qu~dwL>C=HBwE(~|%tx1VyPGfu>x@t3Y1W%EryeD z*uDCdicwI)$)%IAkDlzbLviVJ*nM&*R|?u_3>X7B11Iu0;rf4fxc|?C?8z7~29AmW zH?HQ@3|G?HI=CFyS`U4Mvanwi+=gJ1N-=!76kkD;!0vehEES_5ED-w Date: Wed, 14 Sep 2022 22:29:15 +0800 Subject: [PATCH 10/11] update code --- contrib/PoseEstNet/README.md | 8 +- contrib/PoseEstNet/eval.py | 133 ++++++----- contrib/PoseEstNet/main.py | 117 +++++---- contrib/PoseEstNet/plugins/._postprocess | Bin 0 -> 4096 bytes contrib/PoseEstNet/plugins/._preprocess | Bin 0 -> 4096 bytes .../postprocess/MxpiPNetPostprocess.cpp | 61 ++--- .../plugins/postprocess/MxpiPNetPostprocess.h | 2 +- .../plugins/preprocess/MxpiPNetPreprocess.cpp | 56 ++--- .../plugins/preprocess/MxpiPNetPreprocess.h | 2 +- ...10\344\276\213\345\210\206\344\272\253.md" | 224 ------------------ 10 files changed, 192 insertions(+), 411 deletions(-) create mode 100644 contrib/PoseEstNet/plugins/._postprocess create mode 100644 contrib/PoseEstNet/plugins/._preprocess delete mode 100644 "contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" diff --git a/contrib/PoseEstNet/README.md b/contrib/PoseEstNet/README.md index 49e75194c..ae0e59a33 100755 --- a/contrib/PoseEstNet/README.md +++ b/contrib/PoseEstNet/README.md @@ -51,8 +51,8 @@ apt-get install libpython3.9 4.1 yolov3的模型转换: **步骤1** 获取yolov3的原始模型(.pb文件)和相应的配置文件(.cfg文件) -      [原始模型下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/yolov3_tensorflow_1.5.pb) -      [配置文件下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/aipp_nv12.cfg) +      [原始模型下载链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/PoseEstNet/yolov3_tensorflow_1.5.pb) +      [配置文件下载链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/PoseEstNet/aipp_nv12.cfg) **步骤2** 将获取到的yolov3模型.pb文件和.cfg文件存放至:“项目所在目录/models” @@ -161,6 +161,8 @@ ATC run success, welcome to the next use. ## 6 测试 6.1 配置环境变量 + +运行cann和sdk的set_env.sh脚本 ``` export MX_SDK_HOME=${SDK安装路径}/mxVision @@ -271,8 +273,10 @@ python3 eval.py --inputPath data_eval/images/ --labelPath data_eval/labels/label ## 7 精度对比 + 项目精度: ![项目精度](image/output_eval.png) + 目标精度: ![目标精度](image/oral_eval.png) diff --git a/contrib/PoseEstNet/eval.py b/contrib/PoseEstNet/eval.py index aecbb64a9..dfef46d41 100755 --- a/contrib/PoseEstNet/eval.py +++ b/contrib/PoseEstNet/eval.py @@ -19,21 +19,18 @@ limitations under the License. import argparse import os -import cv2 +import stat import numpy as np -import io import csv import math -from PIL import Image +import MxpiDataType_pb2 as MxpiDataType +from StreamManagerApi import StreamManagerApi, MxDataInput, StringVector YUV_BYTES_NU = 3 YUV_BYTES_DE = 2 -import MxpiDataType_pb2 as MxpiDataType -from StreamManagerApi import StreamManagerApi, MxDataInput, StringVector - -POSTESTNET_STREAM_NAME = b'PoseEstNetProcess' +POSEESTNET_STREAM_NAME = b'PoseEstNetProcess' IN_PLUGIN_ID = 0 @@ -45,45 +42,45 @@ def initialize_stream(): :return: Stream api """ - streamApi = StreamManagerApi() - streamState = streamApi.InitManager() - if streamState != 0: - errorMessage = "Failed to init Stream manager, streamState=%s" % str(streamState) - print(errorMessage) + stream_api = StreamManagerApi() + stream_state = stream_api.InitManager() + if stream_state != 0: + error_message = "Failed to init Stream manager, stream_state=%s" % str(stream_state) + print(error_message) exit() # creating stream based on json strings in the pipeline file: 'ReID.pipeline' with open("pipeline/eval_PoseEstNet.pipeline", 'rb') as f: pipeline = f.read().replace(b'\r', b'').replace(b'\n', b'') - pipelineString = pipeline + pipeline_string = pipeline - streamState = streamApi.CreateMultipleStreams(pipelineString) - if streamState != 0: - errorMessage = "Failed to create Stream, streamState=%s" % str(streamState) - print(errorMessage) + stream_state = stream_api.CreateMultipleStreams(pipeline_string) + if stream_state != 0: + error_message = "Failed to create Stream, stream_state=%s" % str(stream_state) + print(error_message) exit() - return streamApi + return stream_api -def get_result(inputPath, labelPath, streamApi): +def get_result(input_path, label_path, stream_api): # constructing the results returned by the stream - pluginNames = [b"mxpi_postprocess1"] - pluginNameVector = StringVector() - for key in pluginNames: - pluginNameVector.push_back(key) + plugin_names = [b"mxpi_postprocess1"] + plugin_name_vector = StringVector() + for key in plugin_names: + plugin_name_vector.push_back(key) # check the file - if os.path.exists(inputPath) != 1: - errorMessage = 'The file of input images does not exist.' - print(errorMessage) + if os.path.exists(input_path) != 1: + error_message = 'The file of input images does not exist.' + print(error_message) exit() - if len(os.listdir(inputPath)) == 0: - errorMessage = 'The file of input images is empty.' - print(errorMessage) + if len(os.listdir(input_path)) == 0: + error_message = 'The file of input images is empty.' + print(error_message) exit() - label_csv = open(labelPath) + label_csv = open(label_path) reader = csv.reader(label_csv, delimiter=',') hash_annot = {} for row in reader: @@ -106,38 +103,38 @@ def get_result(inputPath, labelPath, streamApi): if not image_name.lower().endswith((".jpg")): print('Input image only support jpg') exit() - img_path = os.path.join(inputPath, image_name) + img_path = os.path.join(input_path, image_name) queryDataInput = MxDataInput() with open(img_path, 'rb') as f: queryDataInput.data = f.read() # send the prepared data to the stream - uniqueId = streamApi.SendData(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, queryDataInput) - if uniqueId < 0: - errorMessage = 'Failed to send data to queryImageProcess stream.' - print(errorMessage) + unique_id = stream_api.SendData(POSEESTNET_STREAM_NAME, IN_PLUGIN_ID, queryDataInput) + if unique_id < 0: + error_message = 'Failed to send data to queryImageProcess stream.' + print(error_message) exit() # get infer result - inferResult = streamApi.GetProtobuf(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, pluginNameVector) + infer_result = stream_api.GetProtobuf(POSEESTNET_STREAM_NAME, IN_PLUGIN_ID, plugin_name_vector) # checking whether the infer results is valid or not - if inferResult.size() == 0: - errorMessage = 'Unable to get effective infer results, please check the stream log for details' - print(errorMessage) + if infer_result.size() == 0: + error_message = 'Unable to get effective infer results, please check the stream log for details' + print(error_message) exit() - if inferResult[0].errorCode != 0: - errorMessage = "GetProtobuf error. errorCode=%d, errorMessage=%s" % (inferResult[0].errorCode, - inferResult[0].messageName) - print(errorMessage) + if infer_result[0].errorCode != 0: + error_message = "GetProtobuf error. errorCode=%d, error_message=%s" % (infer_result[0].errorCode, + infer_result[0].messageName) + print(error_message) exit() # get the output - objectList = MxpiDataType.MxpiObjectList() - objectList.ParseFromString(inferResult[0].messageBuf) - for index in range(len(objectList.objectVec)): - x = objectList.objectVec[index].x0 - y = objectList.objectVec[index].y0 - vision = objectList.objectVec[index].x1 + object_list = MxpiDataType.MxpiObjectList() + object_list.ParseFromString(infer_result[0].messageBuf) + for index in range(len(object_list.objectVec)): + x = object_list.objectVec[index].x0 + y = object_list.objectVec[index].y0 + vision = object_list.objectVec[index].x1 all_preds[idx + batch_count, index, 0] = x all_preds[idx + batch_count, index, 1] = y all_preds[idx + batch_count, index, 2] = vision @@ -150,22 +147,23 @@ def get_result(inputPath, labelPath, streamApi): batch_count += 1 # output pose in CSV format - output_pose = open('output_eval/pose_test.csv', 'w') - - for p in range(len(all_preds)): - output_pose.write("%s," % (image_names[p])) - for k in range(len(all_preds[p])-1): - output_pose.write("%.3f,%.3f,%.3f," % (all_preds[p][k][0], - all_preds[p][k][1], - all_preds[p][k][2])) - output_pose.write("%.3f,%.3f,%.3f\n" % (all_preds[p][len(all_preds[p])-1][0], - all_preds[p][len(all_preds[p])-1][1], - all_preds[p][len(all_preds[p])-1][2])) - output_pose.close() + preds_length = len(all_preds) + output_pose = os.open('output_eval/pose_test.csv', os.O_RDWR | os.O_CREAT, stat.S_IRWXU | stat.S_IRGRP) + for p in range(preds_length): + os.write(output_pose, ("%s," % (image_names[p])).encode()) + key_point_num = len(all_preds[p]) + for k in range(key_point_num-1): + os.write(output_pose, ("%.3f,%.3f,%.3f," % (all_preds[p][k][0], + all_preds[p][k][1], + all_preds[p][k][2])).encode()) + os.write(output_pose, ("%.3f,%.3f,%.3f\n" % (all_preds[p][len(all_preds[p])-1][0], + all_preds[p][len(all_preds[p])-1][1], + all_preds[p][len(all_preds[p])-1][2])).encode()) + os.close(output_pose) def evaluate(label_path): - SC_BIAS = 0.25 + sc_bias = 0.25 threshold = 0.5 preds_read = [] @@ -209,7 +207,7 @@ def evaluate(label_path): uv_error = pos_pred_src - pos_gt_src uv_err = np.linalg.norm(uv_error, axis=1) area_sqrts = np.linalg.norm(area_sqrts, axis=0) - area_sqrts *= SC_BIAS + area_sqrts *= sc_bias scale = np.multiply(area_sqrts, np.ones((len(uv_err), 1))) scaled_uv_err = np.divide(uv_err, scale) scaled_uv_err = np.multiply(scaled_uv_err, jnt_visible) @@ -220,13 +218,14 @@ def evaluate(label_path): # save rng = np.arange(0, 0.5 + 0.01, 0.01) - pckAll = np.zeros((len(rng), 36)) + pck_all = np.zeros((len(rng), 36)) - for r in range(len(rng)): + length_rng = len(rng) + for r in range(length_rng): threshold = rng[r] less_than_threshold = np.multiply((scaled_uv_err <= threshold), jnt_visible) - pckAll[r, :] = np.divide(100. * np.sum(less_than_threshold, axis=1), + pck_all[r, :] = np.divide(100. * np.sum(less_than_threshold, axis=1), jnt_count) PCKh = np.ma.array(PCKh, mask=False) @@ -243,7 +242,7 @@ def evaluate(label_path): 'WindshieldBack': (1.0 / 4.0) * (PCKh[12] + PCKh[13] + PCKh[30] + PCKh[31]), 'WindshieldFront': (1.0 / 4.0) * (PCKh[14] + PCKh[15] + PCKh[32] + PCKh[33]), 'Mean': np.sum(PCKh * jnt_ratio), - 'Mean@0.1': np.sum(pckAll[11, :] * jnt_ratio) + 'Mean@0.1': np.sum(pck_all[11, :] * jnt_ratio) } _print_name_value(name_value, 'PoseEstNet') diff --git a/contrib/PoseEstNet/main.py b/contrib/PoseEstNet/main.py index a2cf3aeee..3043ea10a 100755 --- a/contrib/PoseEstNet/main.py +++ b/contrib/PoseEstNet/main.py @@ -20,14 +20,13 @@ limitations under the License. import argparse import os import cv2 -import numpy as np -import io -from PIL import Image -YUV_BYTES_NU = 3 -YUV_BYTES_DE = 2 import MxpiDataType_pb2 as MxpiDataType from StreamManagerApi import StreamManagerApi, MxDataInput, StringVector + +YUV_BYTES_NU = 3 +YUV_BYTES_DE = 2 + POSTESTNET_STREAM_NAME = b'PoseEstNetProcess' IN_PLUGIN_ID = 0 @@ -42,28 +41,28 @@ def initialize_stream(): :return: Stream api """ - streamApi = StreamManagerApi() - streamState = streamApi.InitManager() - if streamState != 0: - errorMessage = "Failed to init Stream manager, streamState=%s" % str(streamState) - print(errorMessage) + stream_api = StreamManagerApi() + stream_state = stream_api.InitManager() + if stream_state != 0: + error_message = "Failed to init Stream manager, stream_state=%s" % str(stream_state) + print(error_message) exit() # creating stream based on json strings in the pipeline file: 'PoseEstNet.pipeline' with open("pipeline/PoseEstNet.pipeline", 'rb') as f: pipeline = f.read().replace(b'\r', b'').replace(b'\n', b'') - pipelineString = pipeline + pipeline_string = pipeline - streamState = streamApi.CreateMultipleStreams(pipelineString) - if streamState != 0: - errorMessage = "Failed to create Stream, streamState=%s" % str(streamState) - print(errorMessage) + stream_state = stream_api.CreateMultipleStreams(pipeline_string) + if stream_state != 0: + error_message = "Failed to create Stream, stream_state=%s" % str(stream_state) + print(error_message) exit() - return streamApi + return stream_api -def process(inputPath, streamApi): +def process(input_path, stream_api): """ :arg: queryPath: the directory of query images @@ -75,77 +74,77 @@ def process(inputPath, streamApi): """ # constructing the results returned by the queryImageProcess stream - pluginNames = [b"mxpi_distributor0_0", b"mxpi_postprocess1"] + plugin_names = [b"mxpi_distributor0_0", b"mxpi_postprocess1"] - pluginNameVector = StringVector() - for key in pluginNames: - pluginNameVector.push_back(key) + plugin_name_vector = StringVector() + for key in plugin_names: + plugin_name_vector.push_back(key) # check the query file - if os.path.exists(inputPath) != 1: - errorMessage = 'The file of input images does not exist.' - print(errorMessage) + if os.path.exists(input_path) != 1: + error_message = 'The file of input images does not exist.' + print(error_message) exit() - if len(os.listdir(inputPath)) == 0: - errorMessage = 'The file of input images is empty.' - print(errorMessage) + if len(os.listdir(input_path)) == 0: + error_message = 'The file of input images is empty.' + print(error_message) exit() # extract the features for all images in query file - for root, dirs, files in os.walk(inputPath): + for root, dirs, files in os.walk(input_path): for file in files: if not file.endswith('.jpg'): print('Input image only support jpg') exit() - queryDataInput = MxDataInput() - filePath = os.path.join(root, file) - with open(filePath, 'rb') as f: - queryDataInput.data = f.read() + query_data_input = MxDataInput() + file_path = os.path.join(root, file) + with open(file_path, 'rb') as f: + query_data_input.data = f.read() # send the prepared data to the stream - uniqueId = streamApi.SendData(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, queryDataInput) - if uniqueId < 0: - errorMessage = 'Failed to send data to queryImageProcess stream.' - print(errorMessage) + unique_id = stream_api.SendData(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, query_data_input) + if unique_id < 0: + error_message = 'Failed to send data to queryImageProcess stream.' + print(error_message) exit() # get infer result - inferResult = streamApi.GetProtobuf(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, pluginNameVector) + infer_result = stream_api.GetProtobuf(POSTESTNET_STREAM_NAME, IN_PLUGIN_ID, plugin_name_vector) # checking whether the infer results is valid or not - if inferResult.size() == 0: - errorMessage = 'Unable to get effective infer results, please check the stream log for details' - print(errorMessage) + if infer_result.size() == 0: + error_message = 'Unable to get effective infer results, please check the stream log for details' + print(error_message) exit() - if inferResult[0].errorCode != 0: - errorMessage = "GetProtobuf error. errorCode=%d, errorMessage=%s" % (inferResult[0].errorCode, - inferResult[0].messageName) - print(errorMessage) + if infer_result[0].errorCode != 0: + error_message = "GetProtobuf error. errorCode=%d, error_message=%s" % (infer_result[0].errorCode, + infer_result[0].messageName) + print(error_message) exit() # get the output information of "mxpi_objectpostprocessor0" plugin - car_objectList = MxpiDataType.MxpiObjectList() - car_objectList.ParseFromString(inferResult[0].messageBuf) - car_num = len(car_objectList.objectVec) + car_object_list = MxpiDataType.MxpiObjectList() + car_object_list.ParseFromString(infer_result[0].messageBuf) + car_num = len(car_object_list.objectVec) # get the output information of "mxpi_objectpostprocessor0" plugin - keypoint_objectList = MxpiDataType.MxpiObjectList() - keypoint_objectList.ParseFromString(inferResult[1].messageBuf) - keypoint_num = len(keypoint_objectList.objectVec) + keypoint_object_list = MxpiDataType.MxpiObjectList() + keypoint_object_list.ParseFromString(infer_result[1].messageBuf) + keypoint_num = len(keypoint_object_list.objectVec) if keypoint_num // car_num != 36: - errorMessage = 'Failed to map the inferred key points to the detected cars.' - print(errorMessage) + error_message = 'Failed to map the inferred key points to the detected cars.' + print(error_message) exit() - orignal_img = cv2.imread(filePath) - for index in range(len(keypoint_objectList.objectVec)): - orignal_x = int(car_objectList.objectVec[index // 36].x0) + keypoint_objectList.objectVec[index].x0 - orignal_y = int(car_objectList.objectVec[index // 36].y0) + keypoint_objectList.objectVec[index].y0 - visible = keypoint_objectList.objectVec[index].x1 + original_img = cv2.imread(file_path) + for index in range(len(keypoint_object_list.objectVec)): + original_x = int(car_object_list.objectVec[index // 36].x0) + keypoint_object_list.objectVec[index].x0 + original_y = int(car_object_list.objectVec[index // 36].y0) + keypoint_object_list.objectVec[index].y0 + visible = keypoint_object_list.objectVec[index].x1 if round(visible): - cv2.circle(orignal_img, (int(orignal_x), int(orignal_y)), 2, [255, 0, 0], 2) - cv2.imwrite("output/result_{}".format(str(file)), orignal_img) + cv2.circle(original_img, (int(original_x), int(original_y)), 2, [255, 0, 0], 2) + cv2.imwrite("output/result_{}".format(str(file)), original_img) if __name__ == '__main__': diff --git a/contrib/PoseEstNet/plugins/._postprocess b/contrib/PoseEstNet/plugins/._postprocess new file mode 100644 index 0000000000000000000000000000000000000000..e28521c38eac08999d8964d32fdb2bc4189a61dc GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vvYvJF zKST$^3ZQZ=G%bukK2%&KIX_n~v7jI)RWCQSBrzqiB+)89+t`{6&1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU_^xgsEY{iCd!3mWELwFr55Lx7A2=Dq~#Z7D`e)Cq~?`m=I15m$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vvYvJF zKST$^3ZQZ=G%bukK2%&KIX_n~v7jI)RWCQSBrzqiB+)89+t`{6&1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU_^xgsEY{iCd!3mWELwFr55Lx7A2=Dq~#Z7D`e)Cq~?`m=I15m tensors = {}; - GetTensors(srcMxpiTensorPackage, tensors); - // LogInfo << "Till now is ok"; auto tensor_size = tensors.size(); - - for(int i = 0; i < tensor_size; i++){ + for (int i = 0; i < tensor_size; i++){ auto dataPtr = (float *)tensors[i].GetBuffer(); auto tensor_shape = tensors[i].GetShape(); @@ -110,18 +111,18 @@ APP_ERROR MxpiPNetPostprocess::GenerateHeadPoseInfo(const MxpiTensorPackageList auto orignal_height = srcMxpiVisionPackage.visionvec()[i].visioninfo().height(); int keypoint_nums, hm_h, hm_w; keypoint_nums = tensor_shape[1]; - hm_h = tensor_shape[2]; - hm_w = tensor_shape[3]; + hm_h = tensor_shape[ER]; + hm_w = tensor_shape[SAN]; nc::NdArray coordinate; - coordinate = nc::zeros(keypoint_nums, 2); + coordinate = nc::zeros(keypoint_nums, ER); nc::NdArray maxval; maxval = nc::zeros(keypoint_nums, 1); - for(auto j = 0; j < keypoint_nums; j++){ + for (auto j = 0; j < keypoint_nums; j++){ nc::NdArray heatmap; heatmap = nc::zeros(1, hm_h*hm_w); - for(auto k = 0; k < hm_h*hm_w; k++){ + for (auto k = 0; k < hm_h*hm_w; k++){ heatmap(0, k) = dataPtr[j*hm_h*hm_w + k]; } auto index = nc::argmax(heatmap); @@ -136,20 +137,20 @@ APP_ERROR MxpiPNetPostprocess::GenerateHeadPoseInfo(const MxpiTensorPackageList auto py = floor(coordinate(j, 1) + 0.5); heatmap = heatmap.reshape(hm_h, hm_w); - if((1 < px < hm_w - 1) and (1 < py < hm_h - 1)){ + if ((1 < px < hm_w - 1) and (1 < py < hm_h - 1)){ auto diff_x = heatmap(py, px + 1) - heatmap(py, px - 1); auto diff_y = heatmap(py + 1, px) - heatmap(py - 1, px); if( diff_x > 0) { - coordinate(j, 0) = coordinate(j, 0) + 0.25; + coordinate(j, 0) = coordinate(j, 0) + LING_DIAN_ER_WU; } else if( diff_x < 0 ) { - coordinate(j, 0) = coordinate(j, 0) - 0.25; + coordinate(j, 0) = coordinate(j, 0) - LING_DIAN_ER_WU; } else { coordinate(j, 0) = coordinate(j, 0); } - if( diff_y > 0) { - coordinate(j, 1) = coordinate(j, 1) + 0.25; - } else if( diff_y < 0 ) { - coordinate(j, 1) = coordinate(j, 1) - 0.25; + if ( diff_y > 0) { + coordinate(j, 1) = coordinate(j, 1) + LING_DIAN_ER_WU; + } else if ( diff_y < 0 ) { + coordinate(j, 1) = coordinate(j, 1) - LING_DIAN_ER_WU; } else { coordinate(j, 1) = coordinate(j, 1); } @@ -163,7 +164,7 @@ APP_ERROR MxpiPNetPostprocess::GenerateHeadPoseInfo(const MxpiTensorPackageList int w_h[2] = { hm_w, hm_h }; nc::NdArray final_coordinate = transform_preds(coordinate, center, scale, w_h); - for(auto it = 0; it < keypoint_nums; it++){ + for (auto it = 0; it < keypoint_nums; it++){ auto dstMxpiHObjectInfoPtr = dstMxpiObjectListSptr.add_objectvec(); MxpiMetaHeader* dstMxpiMetaHeaderList = dstMxpiHObjectInfoPtr->add_headervec(); dstMxpiMetaHeaderList->set_datasource(parentName_); @@ -193,7 +194,7 @@ nc::NdArray MxpiPNetPostprocess::transform_preds(nc::NdArray coord } for (int p = 0; p < coords.shape().rows; p++) { target_coords_temp = nc::copy(affine_transform(coords(p, {0, 2}), trans_NdArray)); - for (int q = 0; q < 2; q++) { + for (int q = 0; q < ER; q++) { target_coords(p, q) = target_coords_temp(q, 0); } } @@ -204,7 +205,7 @@ nc::NdArray MxpiPNetPostprocess::affine_transform(nc::NdArray pt, nc::NdArray new_pt = {pt(0, 0), pt(0, 1), 1.0}; new_pt = new_pt.transpose(); nc::NdArray new_pt_dot = nc::dot(t, new_pt); - nc::NdArray my_pt_dot = new_pt_dot( {0, 2}, 0); + nc::NdArray my_pt_dot = new_pt_dot({0, 2}, 0); return my_pt_dot; } @@ -228,28 +229,28 @@ cv::Mat MxpiPNetPostprocess::get_affine_transform(nc::NdArray center, flo temp = center + src_dir + scale_tmp * shift; src(1, 0) = temp(0, 0); src(1, 1) = temp(0, 1); - temp = dst_w * 0.5, dst_h * 0.5; + temp = dst_w * LING_DIAN_WU, dst_h * LING_DIAN_WU; dst(0, 0) = temp(0, 0); dst(0, 1) = temp(0, 1); temp = nc::NdArray {float(dst_w * 0.5), float(dst_h * 0.5)} + dst_dir; dst(1, 0) = temp(0, 0); dst(1, 1) = temp(0, 1); temp = get_3rd_point(src(0, src.cSlice()), src(1, src.cSlice())); - src(2, 0) = temp(0, 0); - src(2, 1) = temp(0, 1); + src(ER, 0) = temp(0, 0); + src(ER, 1) = temp(0, 1); temp = get_3rd_point(dst(0, dst.cSlice()), dst(1, dst.cSlice())); - dst(2, 0) = temp(0, 0); - dst(2, 1) = temp(0, 1); + dst(ER, 0) = temp(0, 0); + dst(ER, 1) = temp(0, 1); cv::Mat trans; cv::Point2f SRC[3]; cv::Point2f DST[3]; SRC[0] = cv::Point2f(src(0, 0), src(0, 1)); SRC[1] = cv::Point2f(src(1, 0), src(1, 1)); - SRC[2] = cv::Point2f(src(2, 0), src(2, 1)); + SRC[ER] = cv::Point2f(src(ER, 0), src(ER, 1)); DST[0] = cv::Point2f(dst(0, 0), dst(0, 1)); DST[1] = cv::Point2f(dst(1, 0), dst(1, 1)); - DST[2] = cv::Point2f(dst(2, 0), dst(2, 1)); + DST[ER] = cv::Point2f(dst(ER, 0), dst(ER, 1)); if (1 == inv) { trans = cv::getAffineTransform(DST, SRC); } @@ -365,11 +366,11 @@ std::vector> MxpiPNetPostprocess::DefineProperties() { // Define an A to store properties std::vector> properties; // Set the type and related information of the properties, and the key is the name - auto parentNameProSptr = std::make_shared>(ElementProperty{ + auto parentNameProSptr = std::make_shared> (ElementProperty{ STRING, "dataSource", "name", "the name of previous plugin", "mxpi_tensorinfer2", "NULL", "NULL"}); - auto infoPlugProSptr = std::make_shared>(ElementProperty{ + auto infoPlugProSptr = std::make_shared> (ElementProperty{ STRING, "InfoSource", "name", "the name of needed decoder/crop plugin", "mxpi_imagedecoder0", "NULL", "NULL"}); - auto descriptionMessageProSptr = std::make_shared>(ElementProperty{ + auto descriptionMessageProSptr = std::make_shared> (ElementProperty{ STRING, "descriptionMessage", "message", "Description mesasge of plugin", "This is MxpiSamplePlugin", "NULL", "NULL"}); properties.push_back(parentNameProSptr); properties.push_back(infoPlugProSptr); diff --git a/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h b/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h index 0787c5a1c..fa82dede9 100755 --- a/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h +++ b/contrib/PoseEstNet/plugins/postprocess/MxpiPNetPostprocess.h @@ -108,4 +108,4 @@ namespace MxPlugins { } -#endif //SDKMEMORY_MXPIPNETPOSTPROCESS_H +#endif // SDKMEMORY_MXPIPNETPOSTPROCESS_H diff --git a/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp index 3c7ec99f6..f97d67ecc 100755 --- a/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp +++ b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.cpp @@ -30,6 +30,9 @@ namespace { const mindxsdk_private::protobuf::uint32 MXBASE_PIXEL_FORMAT_BGR_888 = 13; const int YUV_U = 2; const int YUV_V = 3; + const int ER = 2; + const int ER_WU_LIU = 256 + const float LING_DIAN_WU = 0.5 } @@ -92,8 +95,8 @@ APP_ERROR MxpiPNetPreprocess::GenerateVisionList(const MxpiVisionList srcMxpiVis APP_ERROR MxpiPNetPreprocess::DoAffineTransform(size_t idx, - const MxTools::MxpiVision srcMxpiVision, - MxTools::MxpiVision& dstMxpiVision) { + const MxTools::MxpiVision srcMxpiVision, + MxTools::MxpiVision& dstMxpiVision) { LogInfo << "Till now is ok"; auto &visionInfo = srcMxpiVision.visioninfo(); auto &visionData = srcMxpiVision.visiondata(); @@ -120,7 +123,7 @@ APP_ERROR MxpiPNetPreprocess::DoAffineTransform(size_t idx, // check the format of the input image, decode it accordingly. outputPixelFormat_ = visionInfo.format(); LogInfo << outputPixelFormat_; - if (outputPixelFormat_ == MXBASE_PIXEL_FORMAT_YUV_SEMIPLANAR_420){ + if (outputPixelFormat_ == MXBASE_PIXEL_FORMAT_YUV_SEMIPLANAR_420) { LogInfo << "the format of input image is YUV, using dvpp to decode."; imgRGB = cv::Mat(visionInfo.height(), visionInfo.width(), CV_8UC3); orignal_width = visionInfo.width(); @@ -131,10 +134,10 @@ APP_ERROR MxpiPNetPreprocess::DoAffineTransform(size_t idx, cv::cvtColor(src, transedImgRBG, cv::COLOR_YUV2RGB_NV12); vector cropRange; - cropRange.push_back(0); //x_0 - cropRange.push_back(0); //y_0 - cropRange.push_back(orignal_width); //x_1 - cropRange.push_back(orignal_height); //y_1 + cropRange.push_back(0); // x_0 + cropRange.push_back(0); // y_0 + cropRange.push_back(orignal_width); // x_1 + cropRange.push_back(orignal_height); // y_1 crop_img(transedImgRBG, imgRGB, cropRange); } else { imgRGB = cv::Mat(visionInfo.heightaligned(), visionInfo.widthaligned(), CV_8UC3); @@ -155,8 +158,8 @@ APP_ERROR MxpiPNetPreprocess::DoAffineTransform(size_t idx, auto pixel_std = 200; nc::NdArray center = {float(orignal_width / 2.0), float(orignal_height / 2.0)}; float scale = MAX(orignal_width, orignal_height) * 1.25 / pixel_std; - int outputSize[2] = { 256, 256 }; - cv::Size dstSize = { 256, 256 }; + int outputSize[2] = { ER_WU_LIU, ER_WU_LIU }; + cv::Size dstSize = { ER_WU_LIU, ER_WU_LIU }; cv::Mat trans = get_affine_transform(center, scale, 0, outputSize, {0, 0}, 0); cv::warpAffine(imgRGB, dst, trans, dstSize); @@ -165,7 +168,7 @@ APP_ERROR MxpiPNetPreprocess::DoAffineTransform(size_t idx, cv::Mat img_nv12; if (outputDataFormat == "YUV") { LogInfo << "output in yuv"; - imgYuv = cv::Mat(256, 256, CV_8UC1); + imgYuv = cv::Mat(ER_WU_LIU, ER_WU_LIU, CV_8UC1); cv::cvtColor(dst, imgYuv, cv::COLOR_RGB2YUV_I420); yuv_mat = imgYuv.clone(); Bgr2Yuv(yuv_mat, img_nv12); @@ -176,7 +179,7 @@ APP_ERROR MxpiPNetPreprocess::DoAffineTransform(size_t idx, ret = Mat2MxpiVisionOpencv(idx, dst, dstMxpiVision); } else { LogInfo <<"output in bgr"; - imgBGR = cv::Mat(256, 256, CV_8UC3); + imgBGR = cv::Mat(ER_WU_LIU, ER_WU_LIU, CV_8UC3); cv::cvtColor(dst, imgBGR, cv::COLOR_RGB2BGR); ret = Mat2MxpiVisionOpencv(idx, imgBGR, dstMxpiVision); } @@ -207,7 +210,7 @@ APP_ERROR MxpiPNetPreprocess::Mat2MxpiVisionOpencv(size_t idx, const cv::Mat& ma visionInfo->set_format(MXBASE_PIXEL_FORMAT_BGR_888); } } - // visionInfo->set_format(outputPixelFormat_); + visionInfo->set_height(mat.rows); visionInfo->set_heightaligned(mat.rows); visionInfo->set_width(mat.cols); @@ -245,10 +248,9 @@ void MxpiPNetPreprocess::crop_img(cv::Mat &img, cv::Mat &crop_img, std::vector(); - img_nv12 = cv::Mat(256 * YUV_V / YUV_U, 256, CV_8UC1); + img_nv12 = cv::Mat(ER_WU_LIU * YUV_V / YUV_U, ER_WU_LIU, CV_8UC1); uint8_t *ynv12 = img_nv12.ptr(); int32_t uv_height = 256 / 2; int32_t uv_width = 256 / 2; @@ -300,8 +302,8 @@ APP_ERROR MxpiPNetPreprocess::Mat2MxpiVisionDvpp(size_t idx, const cv::Mat& mat, }; -cv::Mat MxpiPNetPreprocess::get_affine_transform(nc::NdArray center, float scale,float rot, - int output_size[2],nc::NdArray shift = {0, 0}, int inv = 0) { +cv::Mat MxpiPNetPreprocess::get_affine_transform(nc::NdArray center, float scale, float rot, + int output_size[2], nc::NdArray shift = {0, 0}, int inv = 0) { nc::NdArray scales = { scale * 200, scale * 200 }; nc::NdArray scale_tmp = scales; float src_w = scale_tmp[0]; @@ -320,28 +322,28 @@ cv::Mat MxpiPNetPreprocess::get_affine_transform(nc::NdArray center, floa temp = center + src_dir + scale_tmp * shift; src(1, 0) = temp(0, 0); src(1, 1) = temp(0, 1); - temp = dst_w * 0.5, dst_h * 0.5; + temp = dst_w * LING_DIAN_WU, dst_h * LING_DIAN_WU; dst(0, 0) = temp(0, 0); dst(0, 1) = temp(0, 1); - temp = nc::NdArray {float(dst_w * 0.5), float(dst_h * 0.5)} + dst_dir; + temp = nc::NdArray {float(dst_w * LING_DIAN_WU), float(dst_h * LING_DIAN_WU)} + dst_dir; dst(1, 0) = temp(0, 0); dst(1, 1) = temp(0, 1); temp = get_3rd_point(src(0, src.cSlice()), src(1, src.cSlice())); - src(2, 0) = temp(0, 0); - src(2, 1) = temp(0, 1); + src(ER, 0) = temp(0, 0); + src(ER, 1) = temp(0, 1); temp = get_3rd_point(dst(0, dst.cSlice()), dst(1, dst.cSlice())); - dst(2, 0) = temp(0, 0); - dst(2, 1) = temp(0, 1); + dst(ER, 0) = temp(0, 0); + dst(ER, 1) = temp(0, 1); cv::Mat trans; cv::Point2f SRC[3]; cv::Point2f DST[3]; SRC[0] = cv::Point2f(src(0, 0), src(0, 1)); SRC[1] = cv::Point2f(src(1, 0), src(1, 1)); - SRC[2] = cv::Point2f(src(2, 0), src(2, 1)); + SRC[ER] = cv::Point2f(src(ER, 0), src(ER, 1)); DST[0] = cv::Point2f(dst(0, 0), dst(0, 1)); DST[1] = cv::Point2f(dst(1, 0), dst(1, 1)); - DST[2] = cv::Point2f(dst(2, 0), dst(2, 1)); + DST[ER] = cv::Point2f(dst(ER, 0), dst(ER, 1)); if (1 == inv) { trans = cv::getAffineTransform(DST, SRC); } @@ -438,11 +440,11 @@ std::vector> MxpiPNetPreprocess::DefineProperties() { // Define an A to store properties std::vector> properties; // Set the type and related information of the properties, and the key is the name - auto parentNameProSptr = std::make_shared>(ElementProperty{ + auto parentNameProSptr = std::make_shared>(ElementProperty { STRING, "dataSource", "name", "the name of previous plugin", "mxpi_imagedecoder0", "NULL", "NULL"}); - auto outputPixelFormatProSptr = std::make_shared>(ElementProperty{ + auto outputPixelFormatProSptr = std::make_shared>(ElementProperty { STRING, "outputFormat", "name", "the format of output image", "YUV", "NULL", "NULL"}); - auto descriptionMessageProSptr = std::make_shared>(ElementProperty{ + auto descriptionMessageProSptr = std::make_shared>(ElementProperty { STRING, "descriptionMessage", "message", "Description mesasge of plugin", "This is MxpiSamplePlugin", "NULL", "NULL"}); properties.push_back(parentNameProSptr); properties.push_back(outputPixelFormatProSptr); diff --git a/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h index 53ecafe0b..af6f82e57 100755 --- a/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h +++ b/contrib/PoseEstNet/plugins/preprocess/MxpiPNetPreprocess.h @@ -115,4 +115,4 @@ namespace MxPlugins { } -#endif //SDKMEMORY_MXPIPNETPREPROCESS_H +#endif // SDKMEMORY_MXPIPNETPREPROCESS_H diff --git "a/contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" "b/contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" deleted file mode 100644 index 3eff40519..000000000 --- "a/contrib/PoseEstNet/\350\275\246\350\276\206\345\247\277\346\200\201\350\257\206\345\210\253\346\241\210\344\276\213\345\210\206\344\272\253.md" +++ /dev/null @@ -1,224 +0,0 @@ - - -# MindX SDK -- 车辆姿态识别参考设计案例 - -## 1 案例概述 - -### 1.1 概要描述 - -本开发样例基于MindX SDK实现了姿态估计网络(PoseEstNet),用于检测并预测车辆36个关键点坐标以及生成热点图。 -      [PoseEstNet论文地址](https://arxiv.org/pdf/2005.00673.pdf) -      [PoseEstNet代码地址](https://github.com/NVlabs/PAMTRI/tree/master/PoseEstNet) - - -### 1.2 特性及适用场景 -本开发样例适用于对输入的.jpg图片中的车辆进行检测,并且对其进行姿态识别 -### 1.3 模型介绍 -车辆姿态识别先采用了yolov3模型将图片中的车辆检测出来,然后利用PoseEstNet模型预测车辆36个关键点坐标。 - -yolov3模型:      [原始模型下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/yolov3_tensorflow_1.5.pb) -      [配置文件下载链接](https://c7xcode.obs.myhuaweicloud.com/models/YOLOV3_coco_detection_picture_with_postprocess_op/aipp_nv12.cfg) - -PoseEstNet模型:[pth权重文件下载链接](https://docs.google.com/uc?export=download&id=1vD08fh-za3mgTJ9UkK1ASCTJAqypW0RL) -[onnx模型下载链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/PoseEstNet/PoseEstNet.onnx) - -VeRi数据集: -      [下载链接](https://vehiclereid.github.io/VeRi/) - -### 1.4 实现流程 -项目流程图: - -![项目流程图](image/project_tree.png) - -技术流程图: -![技术流程图](image/plugin_tree.png) -## 2 软件方案介绍 - -### 2.1 技术原理 -本开发样例基于姿态估计网络(PoseEstNet),PoseEstNet是高分辨率网络(HRNet)的延伸,用于预测关键点坐标(有置信度/可见度)和生成热图/分段。 - - -### 2.2 项目方案架构介绍 - -(功能模块图) - -表1 系统方案中各模块功能: - -| 序号 | 子系统 | 功能描述 | -| ---- | ------ | ------------ | -| 1 | 目标检测模块 | 使用yolov3模型对图片中的车辆进行目标检测,并提取出来裁剪后送入车辆姿态识别模型进行检测 | -| 2 | 车辆姿态识别模块 | 对输入的车辆图片进行姿态识别,预测36个关键点 | - - -## 3 开发环境搭建 - -### 3.1 依赖安装 -环境依赖说明 - -| 软件名称 | 版本 | -| :--------: | :------: | -|ubuntu 18.04|18.04.1 LTS | -|CANN|5.0.4| -|MindX SDK|2.0.4| -|Python| 3.9.12| -|numpy | 1.22.4 | -|opencv_python|4.6.0| -|cmake|3.5+| -请注意MindX SDK使用python版本为3.9.12,如出现无法找到python对应lib库请在root下安装python3.9开发库 -``` -apt-get install libpython3.9 -``` - -### 3.2 工程创建 -本工程名称为PoseEstNet,工程目录如下图所示: - -``` -PoseEstNet -|---- models -| | |---- aipp_nv12.cfg -| | |---- coco.names -| | |---- PoseEstNet.om -| | |---- yolov3.cfg -| | |---- yolov3.om -| | |---- aipp_hrnet_256_256.aippconfig -|---- pipeline // 流水线配置文件夹 -| | |---- eval_PoseEstNet.pipeline -| | |---- PoseEstNet.pipeline -|---- plugins // 插件文件夹 -|---- data -|---- data_eval -| | |---- images -| | |---- labels -|---- output // 结果保存文件夹 -|---- output_eval -|---- main.py -|---- eval.py -|---- README.md -``` - -### 3.3 开发环境搭建 - -[IDE开发环境搭建参考指南](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/quick_start/1-2IDE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md) - -## 4 编译与运行 - -**步骤1** 配置环境变量 -``` -export MX_SDK_HOME=${SDK安装路径}/mxVision - -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -export PYTHONPATH=${MX_SDK_HOME}/python - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins -``` -**步骤2** 安装插件编译所需要的NumCpp库 -``` -cd plugins -git clone https://github.com/dpilger26/NumCpp -mkdir include -cp -r NumCpp/include/NumCpp ./include/ -``` - -**步骤3** 编译插件 -``` -bash build.sh -``` -**步骤4** 切换到插件目录更新权限 -``` -cd ${MX_SDK_HOME}/lib/plugins -chmod 640 libmxpi_pnetpostprocessplugin.so -chmod 640 libmxpi_pnetpreprocessplugin.so -``` -**步骤5** 切换回根目录,创建文件夹 -``` -cd (项目根目录) -mkdir data -mkdir data_eval -mkdir output -mkdir output_eval -``` -**步骤6** 配置pipeline -``` - # 配置mxpi_tensorinfer插件的yolov3.om模型加载路径(lines 26-33) - lines 26-33: - "mxpi_tensorinfer0": { - "props": { - "dataSource": "mxpi_imageresize0", - "modelPath": "models/yolov3.om(这里根据你的命名或路径进行更改)" - }, - "factory": "mxpi_tensorinfer", - "next": "mxpi_objectpostprocessor0" - }, - # 配置mxpi_objectpostprocessor插件的yolov3.cfg配置文件加载路径以及SDN的安装路径(lines 34-43) - lines 34-43: - "mxpi_objectpostprocessor0": { - "props": { - "dataSource": "mxpi_tensorinfer0", - "postProcessConfigPath": "models/yolov3.cfg(这里根据你的命名或路径进行更改)", - "labelPath": "models/coco.names", - "postProcessLibPath": "${SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so" - }, - "factory": "mxpi_objectpostprocessor", - "next": "mxpi_imagecrop0" - }, - # 配置mxpi_tensorinfer插件的PoseEstNet.om模型加载路径(lines 68-75 以及 92-99) - lines 68-75: - "mxpi_tensorinfer2":{ - "props": { - "dataSource": "mxpi_preprocess1", - "modelPath": "models/PoseEstNet.om(这里根据你的命名或路径进行更改)" - }, - "factory":"mxpi_tensorinfer", - "next":"mxpi_postprocess1" - }, - -``` -**步骤7** 运行及输出结果 - -业务代码main.py结果在output文件夹 -``` -python3 main.py --inputPath data -``` -评估代码的具体结果在output_eval文件夹 -``` -python3 eval.py --inputPath data_eval/images/ --labelPath data_eval/labels/label_test.csv -``` - -## 5 指标验证 - -### 5.1 性能测试 - -**步骤1** 进入PoseEstNet项目目录,将待检测图片放入data文件夹中 - -**步骤2** 执行 -``` -python3 main.py --inputPath data -``` - -### 5.2 精度测试 - -**步骤1** 下载VeRi数据集,进入PoseEstNet项目目录,将images_train和images_test这两个文件夹里的图片作为测试集放入data_eval/images文件夹中 - -**步骤2** 执行 -``` -python3 eval.py --inputPath data_eval/images/ --labelPath data_eval/labels/label_test.csv -``` - -### 5.3 精度结果对比 -项目精度: -![项目精度](image/output_eval.png) -目标精度: -![目标精度](image/oral_eval.png) - -## 6 常见问题 - -**问题描述:** - -在运行main.py时出现"[DVPP: image width out of range] The crop width of image is out of range [32,4096]" - -**解决方案:** - -这里的错误是因为yolov3模型检测到的目标过小,抠图后放大的比例超过系统给定的阈值,更新“项目所在目录/models/yolov3.cfg”文件,将OBJECTNESS_THRESH适度调大可解决该问题 \ No newline at end of file -- Gitee From de78a5b0e4e8b8f04473d4a983c5c45eeb1b11ce Mon Sep 17 00:00:00 2001 From: chunglooyo Date: Wed, 14 Sep 2022 22:38:40 +0800 Subject: [PATCH 11/11] add pth2onnx.py --- contrib/PoseEstNet/pth2onnx.py | 134 +++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 contrib/PoseEstNet/pth2onnx.py diff --git a/contrib/PoseEstNet/pth2onnx.py b/contrib/PoseEstNet/pth2onnx.py new file mode 100644 index 000000000..237cbc8e6 --- /dev/null +++ b/contrib/PoseEstNet/pth2onnx.py @@ -0,0 +1,134 @@ +# ------------------------------------------------------------------------------ +# pose.pytorch +# Copyright (c) 2018-present Microsoft +# Licensed under The Apache-2.0 License [see LICENSE for details] +# Written by Bin Xiao (Bin.Xiao@microsoft.com) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import os +import pprint + +import torch +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.optim +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms + +import _init_paths +from config import cfg +from config import update_config +from core.loss import JointsMSELoss +from core.function import validate, output_preds +from utils.utils import create_logger + +import dataset +import models + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train keypoints network') + # general + parser.add_argument('--cfg', + help='experiment configure file name', + required=True, + type=str) + + parser.add_argument('opts', + help="modify config options using the command-line", + default=None, + nargs=argparse.REMAINDER) + + parser.add_argument('--evaluate', + help="flag of evaluating with ground-truth labels", + default=False, + action='store_true') + parser.add_argument('--outputPreds', + help="flag of output predicted pose (keypoints), heatmaps and segments", + default=False, + action='store_true') + + parser.add_argument('--modelDir', + help='model directory', + type=str, + default='') + parser.add_argument('--logDir', + help='log directory', + type=str, + default='') + parser.add_argument('--dataDir', + help='data directory', + type=str, + default='') + parser.add_argument('--prevModelDir', + help='prev model directory', + type=str, + default='') + parser.add_argument('--outputDir', + help='output directory', + type=str, + default='') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + update_config(cfg, args) + + logger, final_output_dir, tb_log_dir = create_logger( + cfg, args.cfg, 'valid') + + logger.info(pprint.pformat(args)) + logger.info(cfg) + + # cudnn related setting + cudnn.benchmark = cfg.CUDNN.BENCHMARK + torch.backends.cudnn.deterministic = cfg.CUDNN.DETERMINISTIC + torch.backends.cudnn.enabled = cfg.CUDNN.ENABLED + + model = eval('models.'+cfg.MODEL.NAME+'.get_pose_net')( + cfg, is_train=False + ) + + if cfg.TEST.MODEL_FILE: + logger.info('=> loading model from {}'.format(cfg.TEST.MODEL_FILE)) + model.load_state_dict(torch.load(cfg.TEST.MODEL_FILE), strict=False) + else: + model_state_file = os.path.join( + final_output_dir, 'final_state.pth' + ) + logger.info('=> loading model from {}'.format(model_state_file)) + model.load_state_dict(torch.load(model_state_file)) + + model.eval() + + device = torch.device("cpu") + dummy_input = torch.randn(1, 3, 256, 256, device=device) + + input_names = ["image"] + output_names = ["class"] + dynamic_axes = {'image': {0: '-1'}, 'class': {0: '-1'}} + export_onnx_file = "PoseEstNet.onnx" + + torch.onnx.export(model, dummy_input, export_onnx_file, input_names=input_names, dynamic_axes=dynamic_axes, + output_names=output_names, opset_version=11, verbose=True) + + output = model(dummy_input) + print(output) + print(output.size()) + print(output.shape[0]) + print(output.shape[1]) + print(output.shape[2]) + print(output.shape[3]) + + +if __name__ == '__main__': + main() -- Gitee