From d4ca53d40fdecbef7dd8d500ac53bac1f040912c Mon Sep 17 00:00:00 2001 From: xu Date: Tue, 3 Dec 2024 20:43:50 +0800 Subject: [PATCH 1/3] yunet case --- contrib/VideoGestureRecognition/README.md | 2 +- contrib/yunet/README.md | 273 +++++-------- contrib/yunet/build.sh | 3 +- contrib/yunet/images/fps.png | Bin 7917 -> 0 bytes contrib/yunet/images/fps1.png | Bin 89893 -> 0 bytes contrib/yunet/images/fps2.png | Bin 5544 -> 0 bytes contrib/yunet/images/problem.png | Bin 38377 -> 0 bytes contrib/yunet/images/process1.png | Bin 12709 -> 0 bytes contrib/yunet/kpmain.py | 80 ---- contrib/yunet/main.py | 3 +- contrib/yunet/pipeline/KPYunet.pipeline | 64 --- contrib/yunet/pipeline/PluginTest.pipeline | 363 ------------------ contrib/yunet/pipeline/Yunet.pipeline | 8 +- contrib/yunet/plugin/CMakeLists.txt | 2 +- contrib/yunet/plugin/YunetPostProcess.cpp | 19 +- contrib/yunet/plugin/YunetPostProcess.h | 16 +- .../yunet/{plugin3 => plugin1}/CMakeLists.txt | 2 +- .../TotalYunetPostProcess.cpp | 37 +- .../TotalYunetPostProcess.h | 18 +- contrib/yunet/{plugin2 => plugin1}/build.sh | 0 contrib/yunet/plugin2/CMakeLists.txt | 31 -- contrib/yunet/plugin2/KPYunetPostProcess.cpp | 235 ------------ contrib/yunet/plugin2/KPYunetPostProcess.h | 75 ---- contrib/yunet/plugin3/build.sh | 36 -- 24 files changed, 155 insertions(+), 1112 deletions(-) delete mode 100644 contrib/yunet/images/fps.png delete mode 100644 contrib/yunet/images/fps1.png delete mode 100644 contrib/yunet/images/fps2.png delete mode 100644 contrib/yunet/images/problem.png delete mode 100644 contrib/yunet/images/process1.png delete mode 100644 contrib/yunet/kpmain.py delete mode 100644 contrib/yunet/pipeline/KPYunet.pipeline delete mode 100644 contrib/yunet/pipeline/PluginTest.pipeline rename contrib/yunet/{plugin3 => plugin1}/CMakeLists.txt (95%) rename contrib/yunet/{plugin3 => plugin1}/TotalYunetPostProcess.cpp (92%) rename contrib/yunet/{plugin3 => plugin1}/TotalYunetPostProcess.h (88%) rename contrib/yunet/{plugin2 => plugin1}/build.sh (100%) delete mode 100644 contrib/yunet/plugin2/CMakeLists.txt delete mode 100644 contrib/yunet/plugin2/KPYunetPostProcess.cpp delete mode 100644 contrib/yunet/plugin2/KPYunetPostProcess.h delete mode 100644 contrib/yunet/plugin3/build.sh diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index 3a1e63396..8dd5ce45e 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -91,7 +91,7 @@ export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-pl export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins ``` -### 3 准备模型 +## 3 准备模型 **步骤1:** 下载Resnet18模型权重和网络以及cfg文件。[下载地址](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/VideoGestureRecognition/model.zip) diff --git a/contrib/yunet/README.md b/contrib/yunet/README.md index 216cfe967..cb80a7709 100644 --- a/contrib/yunet/README.md +++ b/contrib/yunet/README.md @@ -1,22 +1,16 @@ -## yunet实时人脸检测 +# 实时人脸检测 -## 1介绍 +## 1 介绍 -yunet基于MindXSDK开发,在昇腾芯片上进行人脸检测,并实现可视化呈现。输入3路视频,对其进行推理,输出推理结果。 - -### 1.1 支持的产品 - -本产品以昇腾310(推理)卡为硬件平台。 +### 1.1 简介 -### 1.2 支持的版本 - -CANN:7.0.0 +yunet基于MindXSDK开发,在昇腾芯片上进行人脸检测,并实现可视化呈现。输入3路视频,对其进行推理,输出推理结果。 -SDK:mxVision 5.0.0(可通过cat SDK目录下的 version.info 查看) +技术实现流程图如下: -### 1.3 软件方案介绍 +![process](images/process.png) -表1.1 系统方案各子系统功能描述: +表 1.1 系统方案各子系统功能描述: | 序号 | 子系统 | 功能描述 | | ---- | -------------- | ------------------------------------------------------------ | @@ -31,9 +25,26 @@ SDK:mxVision 5.0.0(可通过cat SDK目录下的 version.info 查看) | 9 | OSD可视化插件 | 实现对视频流的每一帧图像进行绘制。 | | 10 | 视频编码插件 | 用于将OSD可视化插件输出的图片进行视频编码,输出视频。 | +### 1.2 支持的产品 +本项目支持昇腾Atlas 300I pro、 Atlas 300V pro -### 1.4 代码目录结构与说明 +### 1.3 支持的版本 + +本样例配套的MxVision版本、CANN版本、Driver/Firmware版本如下所示: + +| MxVision版本 | CANN版本 | Driver/Firmware版本 | +| --------- | ------------------ | -------------- | +| 6.0.RC3 | 8.0.RC3 | 24.1.RC3 | + +### 1.4 三方依赖 + +| 软件名称 | 版本 | 说明 | 使用教程 | +| -------- | ----- | ------------------------------ | ------------------------------------------------------------ | +| live555 | 1.09 | 实现视频转rstp进行推流 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Live555%E7%A6%BB%E7%BA%BF%E8%A7%86%E9%A2%91%E8%BD%ACRTSP%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md) | +| ffmpeg | 4.2.1 | 实现mp4格式视频转为264格式视频 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/pc%E7%AB%AFffmpeg%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md#https://ffmpeg.org/download.html) | + +### 1.5 代码目录结构说明 本项目名为yunet实时人脸检测,项目目录如下所示: @@ -42,242 +53,150 @@ SDK:mxVision 5.0.0(可通过cat SDK目录下的 version.info 查看) ├── config │ ├── face_yunet.cfg # yunet配置文件 │ └── Yunet.aippconfig # 模型转换aipp配置文件 -├── kpmain.py # 关键点信息输出代码 +├── images +│ ├── error1.png +│ ├── error2.png +│ └── process.png ├── main.py # 单路视频输出代码 ├── test.py # 三路后处理性能测试代码 -├── models -│ └── Yunet.onnx +├── models # 用于存放模型,需用户自己创建目录 ├── pipeline │ ├── InferTest.pipeline # 三路后处理性能测试pipeline -│ ├── PluginTest.pipeline # 原方案插件性能测试pipeline -│ ├── KPYunet.pipeline # 关键点信息输出pipeline │ └── Yunet.pipeline # 单路视频输出pipeline ├── plugin │ ├── build.sh │ ├── CMakeLists.txt │ ├── YunetPostProcess.cpp # 人脸检测框后处理代码 │ └── YunetPostProcess.h -├── plugin2 -│ ├── build.sh -│ ├── CMakeLists.txt -│ ├── KPYunetPostProcess.cpp # 人脸关键点后处理代码 -│ ├── KPYunetPostProcess.h -├── plugin3 +├── plugin1 │ ├── build.sh │ ├── CMakeLists.txt │ ├── TotalYunetPostProcess.cpp # 人脸检测框与关键点后处理代码(以供可视化) │ └── TotalYunetPostProcess.h +├── test # 需用户自己创建目录 ├── README.md └── run.sh ```` - - -### 1.5 技术实现流程图 - -![process](images/process.png) - -### 1.6 特性及适用场景 +### 1.6 相关约束 本项目适用于单人及多人正脸视频。对于人脸侧面视频,可以将人脸位置正确标出,但关键点信息标注准确率较低。本项目可以适用于仰卧人脸,但不适用于侧卧人脸。 -特别地,在无人脸的情况下,我们在视频左上角设置了红色提示点。当左上角像素出现红色时,说明此场景没有检测出人脸。(下面给出该特殊点检测框的数据信息) - -```` -"MxpiObject":[{"classVec":[{"classId":3,"className":"","confidence":0,"headerVec":[]}],"x0":0,"x1":0,"y0":0,"y1":0}] -```` -另外,本项目要求输入视频为1920*1080 25fps视频,不支持25帧率以上视频。 - - - - -## 2 环境依赖 - -推荐系统为ubuntu 18.04,环境软件和版本如下: - -| 软件名称 | 版本 | 说明 | 获取方式 | -| ------------------- |-------| ----------------------------- | :-------------------------------------------------------- | -| MindX SDK | 5.0.0 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| ubuntu | 18.04 | 操作系统 | 请上ubuntu官网获取 | -| Ascend-CANN-toolkit | 7.0.0 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | - - - -在编译运行项目前,需要设置环境变量: - -MindXSDK 环境变量: - -``` -. ${SDK-path}/set_env.sh -``` - -CANN 环境变量: - -``` -. ${ascend-toolkit-path}/set_env.sh -``` +另外,本项目要求输入视频为 1920*1080 25fps 视频,不支持25帧率以上视频。 -- 环境变量介绍 +## 2 设置环境变量 +```bash +. /usr/local/Ascend/ascend-toolkit/set_env.sh # toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh # sdk安装路径,根据实际安装路径修改 ``` -SDK-path: mxVision SDK 安装路径 -ascend-toolkit-path: CANN 安装路径。 -``` - - - - -## 3 软件依赖说明 +## 3 准备模型 +**步骤1:** yunet模型下载。本项目中使用的模型是yunet模型,onnx模型可以直接下载,[下载链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/yunet/yunet.onnx) -| 软件名称 | 版本 | 说明 | 使用教程 | -| -------- | ----- | ------------------------------ | ------------------------------------------------------------ | -| live555 | 1.09 | 实现视频转rstp进行推流 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Live555%E7%A6%BB%E7%BA%BF%E8%A7%86%E9%A2%91%E8%BD%ACRTSP%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md) | -| ffmpeg | 4.2.1 | 实现mp4格式视频转为264格式视频 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/pc%E7%AB%AFffmpeg%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md#https://ffmpeg.org/download.html) | - +**步骤2:** 将获取到的文件存放至样例项目所在目录`/models/`下 -设置视频源,此处用rtsp拉流,将视频源转化为.264格式。 +**步骤3:** 模型转换。`cd`到`models`文件夹,使用模型转换工具ATC将onnx模型转换为om模型,命令如下: ```` -ffmpeg -i xxx.mp4 -vcodec h264 -bf 0 -g 25 -r 25 -s 1920*1080 -an -f h264 xxx.264 +atc --framework=5 --model=yunet.onnx --output=yunet --input_format=NCHW --input_shape="input:1,3,120,160" --log=debug --soc_version=Ascend310P3 --insert_op_conf=../config/Yunet.aippconfig ```` -将转化后的.264视频用live555产生rtsp拉流。 +执行该命令后会在`/models/`下生成项目指定模型文件`yunet.om`。若模型转换成功则输出: -由于本项目是支持端对端3路推理,故设置3个视频源,请使用者自行将pipeline中的对应位置修改为自己所使用的的服务器和文件名。 +``` +ATC start working now, please wait for a moment. +ATC run success, welcome to the next use. +``` +## 4 编译与运行 +**步骤1:** 准备测试视频。视频流格式为264,放入 `test/` 文件夹下。 -## 4 模型转化 +**步骤2:** 在 `test/` 文件夹下拉起Live555服务。[Live555拉流教程](../../docs/参考资料/Live555离线视频转RTSP说明文档.md) -本项目中使用的模型是yunet模型,onnx模型可以直接[下载](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/yunet/yunet.onnx)。下载后使用模型转换工具ATC将onnx模型转换为om模型,模型转换工具相关介绍参考[链接](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md) +**步骤3:** 修改`pipeline/Yunet.pipeline`文件: -模型转换步骤如下: +①:将文件中第8、196、282行的 “rtspUrl” 字段值替换为可用的 rtsp 流源地址(目前只支持264格式的rtsp流,例:"rtsp://xxx.xxx.xxx.xxx:xxx/xxx.264", 其中xxx.xxx.xxx.xxx:xxx为ip和端口号,端口号需同Live555服务的起流端口号一致,xxx.264为待测视频流文件名); -按照2环境依赖设置环境变量 +②:将文件中第4行的 “deviceId” 字段值替换为实际使用的device的id值,可用的 device id 值可以使用命令:`npu-smi info` 查看 -`cd`到`models`文件夹,运行 +注意:由于本项目是支持端对端3路推理,故需设置3个视频源,请使用者自行将pipeline中的所有对应位置修改为自己所使用的源流地址和文件名。 -```` -atc --framework=5 --model=yunet.onnx --output=yunet --input_format=NCHW --input_shape="input:1,3,120,160" --log=debug --soc_version=Ascend310 --insert_op_conf=../config/Yunet.aippconfig -```` +**步骤4:** 编译。在项目根目录下,先执行命令`bash ${MX_SDK_HOME}/operators/opencvosd/generate_osd_om.sh`编译opencv_osd算子,然后再执行命令`bash build.sh` -执行该命令后会在指定输出.om模型路径生成项目指定模型文件`yunet.om`。若模型转换成功则输出: +**步骤5:** 拷贝so文件至MindXSDK安装路径的`lib/modelpostprocessors/`目录下。在根目录下执行命令: -``` -ATC start working now, please wait for a moment. -ATC run success, welcome to the next use. +```bash +chmod 640 plugin/build/libyunetpostprocess.so +cp plugin/build/libyunetpostprocess.so ${MX_SDK_HOME}/lib/modelpostprocessors/ ``` -aipp文件配置如下: +**步骤6:** 运行。在项目根目录下,执行命令`bash run.sh`,即可在根目录下得到输出结果`result.264`。 -``` -aipp_op { - related_input_rank : 0 - src_image_size_w : 160 - src_image_size_h : 120 - crop : false - aipp_mode: static - input_format : YUV420SP_U8 - csc_switch : true - rbuv_swap_switch : false - matrix_r0c0 : 256 - matrix_r0c1 : 454 - matrix_r0c2 : 0 - matrix_r1c0 : 256 - matrix_r1c1 : -88 - matrix_r1c2 : -183 - matrix_r2c0 : 256 - matrix_r2c1 : 0 - matrix_r2c2 : 359 - input_bias_0 : 0 - 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 : 1.0 - var_reci_chn_1 : 1.0 - var_reci_chn_2 : 1.0 -} -``` +使用`ctrl + c`终止程序运行。 +## 5 性能验证 +在第 4 节的基础上,继续进行如下步骤 -## 5 编译运行 +**步骤1:** 修改`pipeline/InferTest.pipeline`文件。操作方式参考[第4节步骤3](#4-编译与运行) -`main.py`:用来生成端对端单路推理的可视化视频,以提供单路推理结果可视化的应用样例 +**步骤2:** 拷贝so文件至MindXSDK安装路径的`lib/modelpostprocessors/`目录下。在根目录下执行命令: -`kpmain.py`:用来生成单路关键点后处理的数据结果(用来确保关键点类型后处理的实现成功,关键点效果看main.py的可视化结果) +```bash +chmod 640 plugin1/build/libtotalyunetpostprocess.so +cp plugin1/build/libtotalyunetpostprocess.so ${MX_SDK_HOME}/lib/modelpostprocessors/ +``` -(`kpmain.py`在此项目中不是必须的,当前没有keypoint类型osd支持下,仅给出单路pipeline输出数据信息供参考) +**步骤3:** 性能测试。修改根目录下`run.sh`文件中第32行,由`python3 main.py`改为`python3 test.py`,再次在根目录下运行`bash run.sh`,即可获得`libtotalyunetpostprocess.so`的性能结果。 -`test.py`:用来输出端对端三路推理的后处理结果,以检测三路推理性能是否达标 +因为性能检测结果实时输出,使用者在`test.py`运行过程中可以实时查看检测结果,并且在需要时可以在输出帧率后立刻按`ctrl + c`终止程序运行,以查看帧率。 -需要注意的是,本项目后处理插件支持三路视频推理的后处理,但由于mxVision-2.0.4暂不支持三路后处理输出,所以此处采取单路视频可视化和三路推理性能检测两部分,分别提供可视化应用与性能检测的功能。 +## 6 常见问题 -1.编译后处理插件 +### 6.1 视频解码器负荷过高,报内存相关错误 -`cd`到`plugin`目录,`mkdir`新建文件夹`build` +**问题描述:** -`cd`到`build`,运行 +若视频解码器负荷过高则会出现以下问题: -```` -cmake .. -make -j -make install -```` +![error1](images/error1.png) +![error2](images/error2.png) -将生成的模型后处理so拷贝至MindXSDK安装路径的`lib/modelpostprocessors`目录。如果权限问题,`cd`到MindXSDK安装路径的`lib/modelpostprocessors`目录,将`libyunetpostprocess.so`的权限更改为`640`。 +**解决方案:** -对于`plugin2`、`plugin3`目录也同样处理。 +导致此问题的可能原因为:视频帧率过高、视频尺寸过大或解码器正在同时解码过多其他视频 -2.`config/face_yunet.cfg` 确认权限`640`。 +解决方案:确保三路视频都为 1920*1080 25fps 并且减少其它任务的运行 -3.运行`main.py`程序 +### 6.2 无法打开视频流 -`cd`到根目录,运行 +**问题描述:** -```` -bash run.sh -```` +在运行的过程中,无法打开视频流 -最后会得到`result.264`即为输出结果 +**解决方案:** +pipeline中需要配置多路rtsp视频地址,完善pipeline中的配置项 +### 6.3 未编译opencv_osd算子 -## 6 性能检测 -修改`run.sh`中 -```` -python3 main.py -```` -改为 -```` -python3 test.py -```` -运行 -```` -bash run.sh -```` -测试插件`libtotalyunetpostprocess.so`的性能: +**问题描述:** -![fps](images/fps2.png) +未编译opencv_osd算子,运行过程中报错`Realpath parsing failed` -因为性能检测结果实时输出,使用者在`test.py`运行过程中可以实时查看检测结果,并且在需要时,可以在输出帧率后立刻按CTRL+C停止,以查看帧率。 -性能检测结果如上。本项目三路推理的3秒平均帧率在74.0-75.0之间,满足端对端三路25fps的需求。 +**解决方案:** +在项目根目录下,执行命令`bash ${MX_SDK_HOME}/operators/opencvosd/generate_osd_om.sh`编译opencv_osd算子 +### 6.4 推流失败 +**问题描述:** -## 7 常见问题 +运行过程中报错`streamInstance GetResult return nullptr.` -若视频解码器负荷过高则会出现以下问题: -![error1](images/error1.png) -![error2](images/error2.png) +**解决方案:** -导致此问题的可能原因为:视频帧率过高、视频尺寸过大或解码器正在同时解码过多其他视频 -解决方案:确保三路视频都为1920*1080 25fps并且减少其它任务的运行 \ No newline at end of file +检查pipeline中的配置项中rtsp流地址是否正确,如确认正确则重新起流(可能由于某些原因导致已启动的live555服务不可用) \ No newline at end of file diff --git a/contrib/yunet/build.sh b/contrib/yunet/build.sh index cfc0863e3..aaf1d35df 100644 --- a/contrib/yunet/build.sh +++ b/contrib/yunet/build.sh @@ -19,8 +19,7 @@ current_folder="$( cd "$(dirname "$0")" ;pwd -P )" SAMPLE_FOLDER=( /plugin/ -/plugin2/ -/plugin3/ +/plugin1/ ) diff --git a/contrib/yunet/images/fps.png b/contrib/yunet/images/fps.png deleted file mode 100644 index 74298b8f2d4d6ced6dcfe6d311bad1934ca8f331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7917 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 diff --git a/contrib/yunet/images/fps1.png b/contrib/yunet/images/fps1.png deleted file mode 100644 index d74eb5d5135be53640bfe765d165e521e46400d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89893 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 `x(^c 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%0DOTz#=gm3AI{qfbtcJUE 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 diff --git a/contrib/yunet/images/fps2.png b/contrib/yunet/images/fps2.png deleted file mode 100644 index b789954e015dd0b6ff280d8177268bc836f93d3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5544 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 CUrNUS diff --git a/contrib/yunet/images/problem.png b/contrib/yunet/images/problem.png deleted file mode 100644 index bb0be089d78b65bac13cddedd9cd3af9eb34b967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38377 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ⅆ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 JN|mi%|1U$sLV5rI diff --git a/contrib/yunet/kpmain.py b/contrib/yunet/kpmain.py deleted file mode 100644 index c9db943a5..000000000 --- a/contrib/yunet/kpmain.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 - -""" -Copyright(C) 2021. 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. -""" - -import sys -import re -import json -import os -import stat -import random -import signal -import datetime -import threading -import cv2 -import numpy as np -import MxpiDataType_pb2 as MxpiDataType -from PIL import Image -from StreamManagerApi import StreamManagerApi, MxDataInput, StringVector - - -def sigint_handler(signum, frame): - signum = signum - frame = frame - global ISSIGINTUP - ISSIGINTUP = True - print("catched interrupt signal") - -signal.signal(signal.SIGINT, sigint_handler) -signal.signal(signal.SIGHUP, sigint_handler) -signal.signal(signal.SIGTERM, sigint_handler) -ISSIGINTUP = False - -if __name__ == '__main__': - - # init stream manager - STREAM_MANAGER_API = StreamManagerApi() - ret = STREAM_MANAGER_API.InitManager() - if ret != 0: - print("Failed to init Stream manager, ret=%s" % str(ret)) - exit() - - # create streams by pipeline config file - with open("./pipeline/KPYunet.pipeline", 'rb') as f: - pipelineStr = f.read() - ret = STREAM_MANAGER_API.CreateMultipleStreams(pipelineStr) - if ret != 0: - print("Failed to create Stream, ret=%s" % str(ret)) - exit() - - # get result from stream and write - STREAM_NAME = b'KPYunet' - IN_PLUGIN_ID = 0 - FRAME_COUNT = 0 - - while FRAME_COUNT <= 100: - FRAME_COUNT += 1 - inferResult = STREAM_MANAGER_API.GetResult(STREAM_NAME, IN_PLUGIN_ID) - print(inferResult.data) - if ISSIGINTUP: - print("Exit") - break - - - # destroy streams - STREAM_MANAGER_API.DestroyAllStreams() \ No newline at end of file diff --git a/contrib/yunet/main.py b/contrib/yunet/main.py index 451a269f2..6513d8471 100644 --- a/contrib/yunet/main.py +++ b/contrib/yunet/main.py @@ -74,10 +74,11 @@ if __name__ == '__main__': FLAGS = os.O_WRONLY | os.O_CREAT MODES = stat.S_IWUSR | stat.S_IRUSR with os.fdopen(os.open('./result.264', FLAGS, MODES), 'wb') as fp: - while FRAME_COUNT <= 100: + while True: FRAME_COUNT += 1 inferResult = STREAM_MANAGER_API.GetResult(STREAM_NAME, IN_PLUGIN_ID) fp.write(inferResult.data) + print("%d frame has been processed and saved" % FRAME_COUNT) if ISSIGINTUP: print("Exit") break diff --git a/contrib/yunet/pipeline/KPYunet.pipeline b/contrib/yunet/pipeline/KPYunet.pipeline deleted file mode 100644 index 9b30eadb0..000000000 --- a/contrib/yunet/pipeline/KPYunet.pipeline +++ /dev/null @@ -1,64 +0,0 @@ -{ - "KPYunet": { - "stream_config": { - "deviceId": "1" - }, - "mxpi_rtspsrc0": { - "props": { - "rtspUrl": "rtsp://xxx.xxx.xxx.xxx:xxxx/xxx.264", - "channelId": "0" - }, - "factory": "mxpi_rtspsrc", - "next": "mxpi_videodecoder0" - }, - "mxpi_videodecoder0": { - "props": { - "inputVideoFormat": "H264", - "outputImageFormat": "YUV420SP_NV12", - "vdecChannelId": "0" - }, - "factory": "mxpi_videodecoder", - "next": "mxpi_imageresize0" - }, - - "mxpi_imageresize0": { - "props": { - "dataSource": "mxpi_videodecoder0", - "resizeHeight": "120", - "resizeWidth": "160" - }, - "factory": "mxpi_imageresize", - "next": "mxpi_tensorinfer0" - }, - "mxpi_tensorinfer0": { - "props": { - "modelPath": "./models/yunet.om", - "singleBatchInfer": "1", - "outputHasBatchDim": "0" - }, - "factory": "mxpi_tensorinfer", - "next": "mxpi_keypointpostprocessor0" - }, - "mxpi_keypointpostprocessor0": { - "props": { - "dataSource": "mxpi_tensorinfer0", - "postProcessConfigPath": "./config/face_yunet.cfg", - "postProcessLibPath": "libkpyunetpostprocess.so" - }, - "factory": "mxpi_keypointpostprocessor", - "next": "mxpi_dataserialize0" - }, - "mxpi_dataserialize0": { - "props": { - "outputDataKeys": "mxpi_keypointpostprocessor0" - }, - "factory": "mxpi_dataserialize", - "next": "appsink0" - }, - - "appsink0": { - "factory": "appsink" - } - - } -} diff --git a/contrib/yunet/pipeline/PluginTest.pipeline b/contrib/yunet/pipeline/PluginTest.pipeline deleted file mode 100644 index 8b206a158..000000000 --- a/contrib/yunet/pipeline/PluginTest.pipeline +++ /dev/null @@ -1,363 +0,0 @@ -{ - "Yunet": { - "stream_config": { - "deviceId": "0" - }, - "mxpi_rtspsrc0": { - "props": { - "rtspUrl": "rtsp://xxx.xxx.xx.xxx:xxxx/xxx.264", - "channelId": "0" - }, - "factory": "mxpi_rtspsrc", - "next": "mxpi_videodecoder0" - }, - "mxpi_videodecoder0": { - "props": { - "inputVideoFormat": "H264", - "outputImageFormat": "YUV420SP_NV12", - "vdecChannelId": "0" - }, - "factory": "mxpi_videodecoder", - "next": "mxpi_imageresize0" - }, - - "mxpi_imageresize0": { - "props": { - "dataSource": "mxpi_videodecoder0", - "resizeHeight": "120", - "resizeWidth": "160" - }, - "factory": "mxpi_imageresize", - "next": "tee0" - }, - "tee0":{ - "factory":"tee", - "next":[ - "queue1", - "queue2" - ] - }, - "queue1":{ - "props":{ - "max-size-buffers":"20000" - }, - "factory":"queue", - "next":"mxpi_tensorinfer0" - }, - "queue2":{ - "props":{ - "max-size-buffers":"20000" - }, - "factory":"queue", - "next":"mxpi_imageresize11" - }, - "mxpi_tensorinfer0": { - "props": { - "modelPath": "./models/yunet.om", - "singleBatchInfer": "1", - "outputHasBatchDim": "0" - }, - "factory": "mxpi_tensorinfer", - "next": "mxpi_objectpostprocessor0" - }, - "mxpi_objectpostprocessor0": { - "props": { - "dataSource": "mxpi_tensorinfer0", - "postProcessConfigPath": "./config/face_yunet.cfg", - "postProcessLibPath": "libtotalyunetpostprocess.so" - }, - "factory": "mxpi_objectpostprocessor", - "next": "mxpi_object2osdinstances0" - }, - - "mxpi_object2osdinstances0":{ - "props":{ - "colorMap":"100,100,100|200,200,200|0,128,255|255,0,0", - "fontFace":"16", - "fontScale":"0.5", - "fontThickness":"2", - "fontLineType":"16", - "rectThickness":"2", - "rectLineType":"16", - "createText":"0" - }, - "factory":"mxpi_object2osdinstances", - "next":"mxpi_channelosdcoordsconverter0:1" - }, - "mxpi_imageresize11": { - "props": { - "dataSource": "mxpi_videodecoder0", - "resizeHeight": "1080", - "resizeWidth": "1920" - }, - "factory": "mxpi_imageresize", - "next": "queue11" - }, - "queue11":{ - "props":{ - "max-size-buffers":"500" - }, - "factory":"queue", - "next":"mxpi_channelimagesstitcher0:0" - }, - "mxpi_imageresize12": { - "props": { - "dataSource": "mxpi_videodecoder1", - "resizeHeight": "1080", - "resizeWidth": "1920" - }, - "factory": "mxpi_imageresize", - "next": "queue12" - }, - "queue12":{ - "props":{ - "max-size-buffers":"500" - }, - "factory":"queue", - "next":"mxpi_channelimagesstitcher0:1" - }, - "mxpi_imageresize13": { - "props": { - "dataSource": "mxpi_videodecoder2", - "resizeHeight": "1080", - "resizeWidth": "1920" - }, - "factory": "mxpi_imageresize", - "next": "queue13" - }, - "queue13":{ - "props":{ - "max-size-buffers":"500" - }, - "factory":"queue", - "next":"mxpi_channelimagesstitcher0:2" - }, - "mxpi_channelimagesstitcher0":{ - "factory":"mxpi_channelimagesstitcher", - "props":{ - "channelIds":"0,1,2", - "outputWidth":"1920", - "outputHeight":"1080" - }, - "next":["mxpi_opencvosd0:0","mxpi_channelosdcoordsconverter0:0"] - }, - "mxpi_channelosdcoordsconverter0":{ - "props":{ - "dataSourceStitchInfo":"mxpi_channelimagesstitcher0_1", - "channelIds":"0,1,2", - "enableFixedArea":"1" - }, - "factory":"mxpi_channelosdcoordsconverter", - "next":"mxpi_opencvosd0:1" - }, - "mxpi_opencvosd0":{ - "props":{ - "dataSourceImage":"mxpi_channelimagesstitcher0_0", - "dataSourceOsd":"mxpi_channelosdcoordsconverter0" - }, - "factory":"mxpi_opencvosd", - "next":"mxpi_imageresize10" - }, - "mxpi_imageresize10": { - "props": { - "dataSource": "mxpi_opencvosd0", - "resizeHeight": "1080", - "resizeWidth": "1920" - }, - "factory": "mxpi_imageresize", - "next": "mxpi_videoencoder0" - }, - "mxpi_videoencoder0":{ - "props":{ - "dataSource":"mxpi_imageresize10", - "inputFormat":"YUV420SP_NV12", - "fps":"1", - "iFrameInterval":"25", - "vencChannelId":"0" - }, - "factory":"mxpi_videoencoder", - "next":"queue0" - }, - "queue0":{ - "factory":"queue", - "next":"appsink0" - }, - "appsink0":{ - "factory":"appsink" - }, - - - - - - - "mxpi_rtspsrc1": { - "props": { - "rtspUrl": "rtsp://xxx.xxx.xx.xxx:xxxx/xxx.264", - "channelId": "1" - }, - "factory": "mxpi_rtspsrc", - "next": "mxpi_videodecoder1" - }, - "mxpi_videodecoder1": { - "props": { - "inputVideoFormat": "H264", - "outputImageFormat": "YUV420SP_NV12", - "vdecChannelId": "1" - }, - "factory": "mxpi_videodecoder", - "next": "mxpi_imageresize2" - }, - "mxpi_imageresize2": { - "props": { - "dataSource": "mxpi_videodecoder1", - "resizeHeight": "120", - "resizeWidth": "160" - }, - "factory": "mxpi_imageresize", - "next": "tee1" - }, - "tee1":{ - "factory":"tee", - "next":[ - "queue3", - "queue4" - ] - }, - "queue3":{ - "props":{ - "max-size-buffers":"20000" - }, - "factory":"queue", - "next":"mxpi_tensorinfer1" - }, - "queue4":{ - "props":{ - "max-size-buffers":"20000" - }, - "factory":"queue", - "next":"mxpi_imageresize12" - }, - "mxpi_tensorinfer1": { - "props": { - "modelPath": "./models/yunet.om", - "singleBatchInfer": "1", - "outputHasBatchDim": "0" - }, - "factory": "mxpi_tensorinfer", - "next": "mxpi_objectpostprocessor1" - }, - "mxpi_objectpostprocessor1": { - "props": { - "dataSource": "mxpi_tensorinfer1", - "postProcessConfigPath": "./config/face_yunet.cfg", - "postProcessLibPath": "libtotalyunetpostprocess.so" - }, - "factory": "mxpi_objectpostprocessor", - "next": "mxpi_object2osdinstances1" - }, - - "mxpi_object2osdinstances1":{ - "props":{ - "colorMap":"100,100,100|200,200,200|0,128,255|255,0,0", - "fontFace":"16", - "fontScale":"0.5", - "fontThickness":"2", - "fontLineType":"16", - "rectThickness":"2", - "rectLineType":"16", - "createText":"0" - }, - "factory":"mxpi_object2osdinstances", - "next":"mxpi_channelosdcoordsconverter0:2" - }, - - - - - - - "mxpi_rtspsrc2": { - "props": { - "rtspUrl": "rtsp://xxx.xxx.xx.xxx:xxxx/xxx.264", - "channelId": "2" - }, - "factory": "mxpi_rtspsrc", - "next": "mxpi_videodecoder2" - }, - "mxpi_videodecoder2": { - "props": { - "inputVideoFormat": "H264", - "outputImageFormat": "YUV420SP_NV12", - "vdecChannelId": "2" - }, - "factory": "mxpi_videodecoder", - "next": "mxpi_imageresize4" - }, - "mxpi_imageresize4": { - "props": { - "dataSource": "mxpi_videodecoder2", - "resizeHeight": "120", - "resizeWidth": "160" - }, - "factory": "mxpi_imageresize", - "next": "tee2" - }, - "tee2":{ - "factory":"tee", - "next":[ - "queue6", - "queue7" - ] - }, - "queue6":{ - "props":{ - "max-size-buffers":"20000" - }, - "factory":"queue", - "next":"mxpi_tensorinfer2" - }, - "queue7":{ - "props":{ - "max-size-buffers":"20000" - }, - "factory":"queue", - "next":"mxpi_imageresize13" - }, - "mxpi_tensorinfer2": { - "props": { - "modelPath": "./models/yunet.om", - "singleBatchInfer": "1", - "outputHasBatchDim": "0" - }, - "factory": "mxpi_tensorinfer", - "next": "mxpi_objectpostprocessor2" - }, - "mxpi_objectpostprocessor2": { - "props": { - "dataSource": "mxpi_tensorinfer2", - "postProcessConfigPath": "./config/face_yunet.cfg", - "postProcessLibPath": "libtotalyunetpostprocess.so" - }, - "factory": "mxpi_objectpostprocessor", - "next": "mxpi_object2osdinstances2" - }, - - "mxpi_object2osdinstances2":{ - "props":{ - "colorMap":"100,100,100|200,200,200|0,128,255|255,0,0", - "fontFace":"16", - "fontScale":"0.5", - "fontThickness":"2", - "fontLineType":"16", - "rectThickness":"2", - "rectLineType":"16", - "createText":"0" - }, - "factory":"mxpi_object2osdinstances", - "next":"mxpi_channelosdcoordsconverter0:3" - } - - - } -} diff --git a/contrib/yunet/pipeline/Yunet.pipeline b/contrib/yunet/pipeline/Yunet.pipeline index f811d978b..349cbf57f 100644 --- a/contrib/yunet/pipeline/Yunet.pipeline +++ b/contrib/yunet/pipeline/Yunet.pipeline @@ -1,7 +1,7 @@ { "Yunet": { "stream_config": { - "deviceId": "1" + "deviceId": "0" }, "mxpi_rtspsrc0": { "props": { @@ -64,7 +64,7 @@ "props": { "dataSource": "mxpi_tensorinfer0", "postProcessConfigPath": "./config/face_yunet.cfg", - "postProcessLibPath": "libtotalyunetpostprocess.so" + "postProcessLibPath": "libyunetpostprocess.so" }, "factory": "mxpi_objectpostprocessor", "next": "mxpi_object2osdinstances0" @@ -251,7 +251,7 @@ "props": { "dataSource": "mxpi_tensorinfer1", "postProcessConfigPath": "./config/face_yunet.cfg", - "postProcessLibPath": "libtotalyunetpostprocess.so" + "postProcessLibPath": "libyunetpostprocess.so" }, "factory": "mxpi_objectpostprocessor", "next": "mxpi_object2osdinstances1" @@ -337,7 +337,7 @@ "props": { "dataSource": "mxpi_tensorinfer2", "postProcessConfigPath": "./config/face_yunet.cfg", - "postProcessLibPath": "libtotalyunetpostprocess.so" + "postProcessLibPath": "libyunetpostprocess.so" }, "factory": "mxpi_objectpostprocessor", "next": "mxpi_object2osdinstances2" diff --git a/contrib/yunet/plugin/CMakeLists.txt b/contrib/yunet/plugin/CMakeLists.txt index 24a8f2ba6..057acccc7 100644 --- a/contrib/yunet/plugin/CMakeLists.txt +++ b/contrib/yunet/plugin/CMakeLists.txt @@ -18,7 +18,7 @@ include_directories(${MX_SDK_HOME}/opensource/include/opencv4) link_directories(${MX_SDK_HOME}/opensource/lib/) link_directories(${MX_SDK_HOME}/lib) -add_compile_options(-std=c++11 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations) +add_compile_options(-std=c++14 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations) add_compile_options("-DPLUGIN_NAME=${PLUGIN_NAME}") add_definitions(-DENABLE_DVPP_INTERFACE) diff --git a/contrib/yunet/plugin/YunetPostProcess.cpp b/contrib/yunet/plugin/YunetPostProcess.cpp index 236c30585..c91943b3e 100644 --- a/contrib/yunet/plugin/YunetPostProcess.cpp +++ b/contrib/yunet/plugin/YunetPostProcess.cpp @@ -68,25 +68,25 @@ namespace MxBase { cv::Mat& res) { auto shape = tensors[0].GetShape(); - float width_resize_scale = (float)resizedImageInfos[0].widthResize / resizedImageInfos[0].widthOriginal; - float height_resize_scale = (float)resizedImageInfos[0].heightResize / resizedImageInfos[0].heightOriginal; + float widthResizeScale = (float)resizedImageInfos[0].widthResize / resizedImageInfos[0].widthOriginal; + float heightResizeScale = (float)resizedImageInfos[0].heightResize / resizedImageInfos[0].heightOriginal; uint32_t batchSize = shape[0]; - uint32_t VectorNum = shape[1]; + uint32_t vectorNum = shape[1]; for (uint32_t i = 0; i < batchSize; i++) { std::vector objectInfo, objectInfoSorted; auto dataPtr_Conf = (float *) tensors[1].GetBuffer() + i * tensors[1].GetByteSize() / batchSize; - for (uint32_t j = 0; j < VectorNum; j++) { + for (uint32_t j = 0; j < vectorNum; j++) { float* begin_Conf = dataPtr_Conf + j * 2; float conf = *(begin_Conf + 1); if (conf> confThresh_) { ObjectInfo objInfo; objInfo.confidence = j; - objInfo.x0 = res.at(j, LEFTTOPX) * IMAGE_WIDTH / width_resize_scale; - objInfo.y0 = res.at(j, LEFTTOPY) * IMAGE_HEIGHT / height_resize_scale; - objInfo.x1 = res.at(j, RIGHTTOPX) * IMAGE_WIDTH / width_resize_scale; - objInfo.y1 = res.at(j, RIGHTTOPY) * IMAGE_HEIGHT / height_resize_scale; + objInfo.x0 = res.at(j, LEFTTOPX) * IMAGE_WIDTH / widthResizeScale; + objInfo.y0 = res.at(j, LEFTTOPY) * IMAGE_HEIGHT / heightResizeScale; + objInfo.x1 = res.at(j, RIGHTTOPX) * IMAGE_WIDTH / widthResizeScale; + objInfo.y1 = res.at(j, RIGHTTOPY) * IMAGE_HEIGHT / heightResizeScale; objInfo.classId = RECTANGLE_COLOR; objectInfo.push_back(objInfo); @@ -198,7 +198,8 @@ namespace MxBase { * @param resize_scale_factor: The factor of min(WidthOriginal/WidthResize, HeightOriginal/HeightResize) * @param boxes: The matrix which contains detection box coordinates(x0,y0,x1,y1), shape[21824,4] */ - cv::Mat YunetPostProcess::decode_for_loc(cv::Mat &loc, cv::Mat &prior) { + cv::Mat YunetPostProcess::decode_for_loc(cv::Mat &loc, cv::Mat &prior) + { cv::Mat loc_first = loc.colRange(0, 2); cv::Mat loc_last = loc.colRange(2, 4); cv::Mat prior_first = prior.colRange(0, 2); diff --git a/contrib/yunet/plugin/YunetPostProcess.h b/contrib/yunet/plugin/YunetPostProcess.h index 99e23ef66..dd197e953 100644 --- a/contrib/yunet/plugin/YunetPostProcess.h +++ b/contrib/yunet/plugin/YunetPostProcess.h @@ -14,18 +14,20 @@ * limitations under the License. */ -#ifndef Yunet_POST_PROCESS_H -#define Yunet_POST_PROCESS_H +#ifndef YUNET_POST_PROCESS_H +#define YUNET_POST_PROCESS_H #include "MxBase/PostProcessBases/ObjectPostProcessBase.h" #include "MxBase/CV/ObjectDetection/Nms/Nms.h" #include "opencv2/opencv.hpp" -#define DEFAULT_OBJECT_CONF_TENSOR 1 -#define DEFAULT_OBJECT_INFO_TENSOR 0 -#define DEFAULT_IOU_THRESH 0.3 -#define DEFAULT_CONFIDENCE_THRESH 0.9 + +constexpr uint32_t DEFAULT_OBJECT_CONF_TENSOR = 1; +constexpr uint32_t DEFAULT_OBJECT_INFO_TENSOR = 0; +constexpr float DEFAULT_IOU_THRESH = 0.3; +constexpr float DEFAULT_CONFIDENCE_THRESH = 0.9; namespace MxBase { - bool operator<(const ObjectInfo &a, const ObjectInfo &b) { + bool operator<(const ObjectInfo &a, const ObjectInfo &b) + { return a.confidence < b.confidence; } diff --git a/contrib/yunet/plugin3/CMakeLists.txt b/contrib/yunet/plugin1/CMakeLists.txt similarity index 95% rename from contrib/yunet/plugin3/CMakeLists.txt rename to contrib/yunet/plugin1/CMakeLists.txt index 46341a0c1..6fd40a222 100644 --- a/contrib/yunet/plugin3/CMakeLists.txt +++ b/contrib/yunet/plugin1/CMakeLists.txt @@ -18,7 +18,7 @@ include_directories(${MX_SDK_HOME}/opensource/include/opencv4) link_directories(${MX_SDK_HOME}/opensource/lib/) link_directories(${MX_SDK_HOME}/lib) -add_compile_options(-std=c++11 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations) +add_compile_options(-std=c++14 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations) add_compile_options("-DPLUGIN_NAME=${PLUGIN_NAME}") add_definitions(-DENABLE_DVPP_INTERFACE) diff --git a/contrib/yunet/plugin3/TotalYunetPostProcess.cpp b/contrib/yunet/plugin1/TotalYunetPostProcess.cpp similarity index 92% rename from contrib/yunet/plugin3/TotalYunetPostProcess.cpp rename to contrib/yunet/plugin1/TotalYunetPostProcess.cpp index 1c5440c0d..7189c2277 100644 --- a/contrib/yunet/plugin3/TotalYunetPostProcess.cpp +++ b/contrib/yunet/plugin1/TotalYunetPostProcess.cpp @@ -70,25 +70,25 @@ namespace MxBase { cv::Mat& res) { auto shape = tensors[0].GetShape(); - float width_resize_scale = (float)resizedImageInfos[0].widthResize / resizedImageInfos[0].widthOriginal; - float height_resize_scale = (float)resizedImageInfos[0].heightResize / resizedImageInfos[0].heightOriginal; + float widthResizeScale = (float)resizedImageInfos[0].widthResize / resizedImageInfos[0].widthOriginal; + float heightResizeScale = (float)resizedImageInfos[0].heightResize / resizedImageInfos[0].heightOriginal; uint32_t batchSize = shape[0]; - uint32_t VectorNum = shape[1]; + uint32_t vectorNum = shape[1]; for (uint32_t i = 0; i < batchSize; i++) { std::vector objectInfo, objectInfoSorted; auto dataPtr_Conf = (float *) tensors[1].GetBuffer() + i * tensors[1].GetByteSize() / batchSize; - for (uint32_t j = 0; j < VectorNum; j++) { + for (uint32_t j = 0; j < vectorNum; j++) { float* begin_Conf = dataPtr_Conf + j * 2; float conf = *(begin_Conf + 1); if (conf> confThresh_) { ObjectInfo objInfo; objInfo.confidence = j; - objInfo.x0 = res.at(j, LEFTTOPX) * IMAGE_WIDTH / width_resize_scale; - objInfo.y0 = res.at(j, LEFTTOPY) * IMAGE_HEIGHT / height_resize_scale; - objInfo.x1 = res.at(j, RIGHTTOPX) * IMAGE_WIDTH / width_resize_scale; - objInfo.y1 = res.at(j, RIGHTTOPY) * IMAGE_HEIGHT / height_resize_scale; + objInfo.x0 = res.at(j, LEFTTOPX) * IMAGE_WIDTH / widthResizeScale; + objInfo.y0 = res.at(j, LEFTTOPY) * IMAGE_HEIGHT / heightResizeScale; + objInfo.x1 = res.at(j, RIGHTTOPX) * IMAGE_WIDTH / widthResizeScale; + objInfo.y1 = res.at(j, RIGHTTOPY) * IMAGE_HEIGHT / heightResizeScale; objInfo.classId = RECTANGLE_COLOR; objectInfo.push_back(objInfo); @@ -103,10 +103,10 @@ namespace MxBase { objectInfo[j].confidence = conf; objectInfoSorted.push_back(objectInfo[j]); - for (int k = 0; k < KEYPOINTNUM; k++) - { - float x = res.at(keypoint_Pos, RECTANGLEPOINT + k * DIM) * IMAGE_WIDTH / width_resize_scale; - float y = res.at(keypoint_Pos, RECTANGLEPOINT + k * DIM + 1) * IMAGE_HEIGHT / height_resize_scale; + for (int k = 0; k < KEYPOINTNUM; k++) { + float x = res.at(keypoint_Pos, RECTANGLEPOINT + k * DIM) * IMAGE_WIDTH / widthResizeScale; + float y = res.at(keypoint_Pos, RECTANGLEPOINT + k * DIM + 1) * + IMAGE_HEIGHT / heightResizeScale; // use [(x-2,y-2),(x+2,y+2)] object rectangle to draw keypoints ObjectInfo objInfo; objInfo.x0= x - POINT_SIZE; @@ -225,7 +225,8 @@ namespace MxBase { * @param resize_scale_factor: The factor of min(WidthOriginal/WidthResize, HeightOriginal/HeightResize) * @param boxes: The matrix which contains detection box coordinates(x0,y0,x1,y1), shape[21824,4] */ - cv::Mat TotalYunetPostProcess::decode_for_loc(cv::Mat &loc, cv::Mat &prior) { + cv::Mat TotalYunetPostProcess::decode_for_loc(cv::Mat &loc, cv::Mat &prior) + { cv::Mat loc_first = loc.colRange(0, 2); cv::Mat loc_last = loc.colRange(2, 4); cv::Mat prior_first = prior.colRange(0, 2); @@ -240,12 +241,14 @@ namespace MxBase { boxes2 = boxes2 + boxes1; cv::Mat boxes3; - for (int i = 0; i < KEYPOINTNUM; i++) - { + for (int i = 0; i < KEYPOINTNUM; i++) { cv::Mat singlepoint = facepoint.colRange(i * 2, (i + 1) * 2); singlepoint = prior_last + (singlepoint * VARIANCE[0]).mul(prior_first); - if (i == 0) boxes3 = singlepoint; - else cv::hconcat(boxes3, singlepoint, boxes3); + if (i == 0) { + boxes3 = singlepoint; + } else { + cv::hconcat(boxes3, singlepoint, boxes3); + } } cv::Mat boxes; diff --git a/contrib/yunet/plugin3/TotalYunetPostProcess.h b/contrib/yunet/plugin1/TotalYunetPostProcess.h similarity index 88% rename from contrib/yunet/plugin3/TotalYunetPostProcess.h rename to contrib/yunet/plugin1/TotalYunetPostProcess.h index 60753ed03..7b234592c 100644 --- a/contrib/yunet/plugin3/TotalYunetPostProcess.h +++ b/contrib/yunet/plugin1/TotalYunetPostProcess.h @@ -14,21 +14,23 @@ * limitations under the License. */ -#ifndef TotalYunet_POST_PROCESS_H -#define TotalYunet_POST_PROCESS_H +#ifndef TOTAL_YUNET_POST_PROCESS_H +#define TOTAL_YUNET_POST_PROCESS_H #include "MxBase/PostProcessBases/ObjectPostProcessBase.h" #include "MxBase/CV/ObjectDetection/Nms/Nms.h" #include "opencv2/opencv.hpp" -#define DEFAULT_OBJECT_CONF_TENSOR 1 -#define DEFAULT_OBJECT_INFO_TENSOR 0 -#define DEFAULT_IOU_THRESH 0.3 -#define DEFAULT_CONFIDENCE_THRESH 0.9 + +constexpr uint32_t DEFAULT_OBJECT_CONF_TENSOR = 1; +constexpr uint32_t DEFAULT_OBJECT_INFO_TENSOR = 0; +constexpr float DEFAULT_IOU_THRESH = 0.3; +constexpr float DEFAULT_CONFIDENCE_THRESH = 0.9; namespace MxBase { - bool operator<(const ObjectInfo &a, const ObjectInfo &b) { + bool operator<(const ObjectInfo &a, const ObjectInfo &b) + { return a.confidence < b.confidence; } - + class TotalYunetPostProcess : public ObjectPostProcessBase { public: TotalYunetPostProcess() = default; diff --git a/contrib/yunet/plugin2/build.sh b/contrib/yunet/plugin1/build.sh similarity index 100% rename from contrib/yunet/plugin2/build.sh rename to contrib/yunet/plugin1/build.sh diff --git a/contrib/yunet/plugin2/CMakeLists.txt b/contrib/yunet/plugin2/CMakeLists.txt deleted file mode 100644 index aa4df178c..000000000 --- a/contrib/yunet/plugin2/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -cmake_minimum_required(VERSION 3.5.2) -project(kpyunetpostprocess) - -add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) -add_definitions(-Dgoogle=mindxsdk_private) - -set(PLUGIN_NAME "kpyunetpostprocess") -set(TARGET_LIBRARY ${PLUGIN_NAME}) -set(MX_SDK_HOME "$ENV{MX_SDK_HOME}") - -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) - -link_directories(${MX_SDK_HOME}/opensource/lib/) -link_directories(${MX_SDK_HOME}/lib) - -add_compile_options(-std=c++11 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations) -add_compile_options("-DPLUGIN_NAME=${PLUGIN_NAME}") - -add_definitions(-DENABLE_DVPP_INTERFACE) -add_library(${TARGET_LIBRARY} SHARED KPYunetPostProcess.cpp) - -target_link_libraries(${TARGET_LIBRARY} glib-2.0 gstreamer-1.0 gobject-2.0 gstbase-1.0 gmodule-2.0) -target_link_libraries(${TARGET_LIBRARY} plugintoolkit mxpidatatype mxbase opencv_world) -target_link_libraries(${TARGET_LIBRARY} -Wl,-z,relro,-z,now,-z,noexecstack -s) - -install(TARGETS ${TARGET_LIBRARY} LIBRARY DESTINATION ${MX_SDK_HOME}/lib/modelpostprocessors) diff --git a/contrib/yunet/plugin2/KPYunetPostProcess.cpp b/contrib/yunet/plugin2/KPYunetPostProcess.cpp deleted file mode 100644 index dd66886b8..000000000 --- a/contrib/yunet/plugin2/KPYunetPostProcess.cpp +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. 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 "KPYunetPostProcess.h" -#include "MxBase/Log/Log.h" - -namespace { - const uint32_t LEFTTOPX = 0; - const uint32_t LEFTTOPY = 1; - const uint32_t RIGHTTOPX = 2; - const uint32_t RIGHTTOPY = 3; - const int PRIOR_PARAMETERS[4][3] = {{10, 16, 24}, {32, 48, -1}, {64, 96, -1}, {128, 192, 256}}; - const int PRIOR_PARAMETERS_COUNT = 3; - const float IMAGE_WIDTH = 160.0; - const float IMAGE_HEIGHT = 120.0; - const float STEPS[4] = {8.0, 16.0, 32.0, 64.0}; - const float VARIANCE[2] = {0.1, 0.2}; - const uint32_t RECTANGLEPOINT = 4; - const uint32_t KEYPOINTNUM = 5; - const uint32_t DIM = 2; - const uint32_t RECTANGLE_COLOR = 1; - const uint32_t KEYPOINT_COLOR = 2; - const uint32_t DIV_TWO = 2; -} -namespace MxBase { - KPYunetPostProcess& KPYunetPostProcess::operator=(const KPYunetPostProcess& other) - { - if (this == &other) { - return *this; - } - KeypointPostProcessBase::operator=(other); - return *this; - } - - APP_ERROR KPYunetPostProcess::Init(const std::map & postConfig) - { - LogDebug << "Start to Init KPYunetPostProcess."; - APP_ERROR ret = KeypointPostProcessBase::Init(postConfig); - if (ret != APP_ERR_OK) { - LogError << GetError(ret) << "Fail to superInit in KeypointPostProcessBase."; - return ret; - } - LogDebug << "End to Init KPYunetPostProcess."; - return APP_ERR_OK; - } - - APP_ERROR KPYunetPostProcess::DeInit() - { - return APP_ERR_OK; - } - - void KPYunetPostProcess::generate_keypointInfos(const std::vector & tensors, - std::vector >& keypointInfos, - const std::vector & resizedImageInfos, - cv::Mat& res) - { - auto shape = tensors[0].GetShape(); - float width_resize_scale = (float)resizedImageInfos[0].widthResize / resizedImageInfos[0].widthOriginal; - float height_resize_scale = (float)resizedImageInfos[0].heightResize / resizedImageInfos[0].heightOriginal; - uint32_t batchSize = shape[0]; - uint32_t VectorNum = shape[1]; - - for (uint32_t i = 0; i < batchSize; i++) { - std::vector objectInfo, objectInfoSorted; - std::vector keypointInfoSorted; - auto dataPtr_Conf = (float *) tensors[1].GetBuffer() + i * tensors[1].GetByteSize() / batchSize; - for (uint32_t j = 0; j < VectorNum; j++) { - float* begin_Conf = dataPtr_Conf + j * 2; - float conf = *(begin_Conf + 1); - - if (conf> confThresh_) { - ObjectInfo objInfo; - objInfo.confidence = j; - objInfo.x0 = res.at(j, LEFTTOPX) * IMAGE_WIDTH / width_resize_scale; - objInfo.y0 = res.at(j, LEFTTOPY) * IMAGE_HEIGHT / height_resize_scale; - objInfo.x1 = res.at(j, RIGHTTOPX) * IMAGE_WIDTH / width_resize_scale; - objInfo.y1 = res.at(j, RIGHTTOPY) * IMAGE_HEIGHT / height_resize_scale; - objInfo.classId = RECTANGLE_COLOR; - - objectInfo.push_back(objInfo); - } - } - MxBase::NmsSort(objectInfo, iouThresh_); - for (uint32_t j = 0; j < objectInfo.size(); j++) { - KeyPointDetectionInfo kpInfo; - int keypoint_Pos = (int)objectInfo[j].confidence; - float* begin_Conf = dataPtr_Conf + keypoint_Pos * 2; - kpInfo.score = *(begin_Conf + 1); - - for (int k = 0; k < KEYPOINTNUM; k++) - { - float x = res.at(keypoint_Pos, RECTANGLEPOINT + k * DIM) * IMAGE_WIDTH / width_resize_scale; - float y = res.at(keypoint_Pos, RECTANGLEPOINT + k * DIM + 1) * IMAGE_HEIGHT / height_resize_scale; - kpInfo.keyPointMap[k].push_back(x); - kpInfo.keyPointMap[k].push_back(y); - } - keypointInfoSorted.push_back(kpInfo); - } - keypointInfos.push_back(keypointInfoSorted); - } - } - - void KPYunetPostProcess::KeypointDetectionOutput(const std::vector & tensors, - std::vector >& keypointInfos, - const std::vector & resizedImageInfos) - { - LogDebug << "KPYunetPostProcess start to write results."; - - auto loc = tensors[0].GetBuffer(); - auto conf = tensors[1].GetBuffer(); - auto shape = tensors[0].GetShape(); - auto iou = tensors[2].GetBuffer(); - - cv::Mat PriorBox; - cv::Mat location = cv::Mat(shape[1], shape[2], CV_32FC1, tensors[0].GetBuffer()); - GeneratePriorBox(PriorBox); - cv::Mat res = decode_for_loc(location, PriorBox); - generate_keypointInfos(tensors, keypointInfos, resizedImageInfos, res); - - LogDebug << "KPYunetPostProcess write results successed."; - } - APP_ERROR KPYunetPostProcess::Process(const std::vector &tensors, - std::vector> &KeypointInfos, - const std::vector &resizedImageInfos, - const std::map> &configParamMap) - { - LogDebug << "Start to Process KPYunetPostProcess."; - APP_ERROR ret = APP_ERR_OK; - auto inputs = tensors; - ret = CheckAndMoveTensors(inputs); - if (ret != APP_ERR_OK) { - LogError << "CheckAndMoveTensors failed. ret=" << ret; - return ret; - } - KeypointDetectionOutput(inputs, KeypointInfos, resizedImageInfos); - LogDebug << "End to Process KPYunetPostProcess."; - return APP_ERR_OK; - } - - /* - * @description: Generate prior boxes for detection boxes decoding - * @param anchors A Matrix used to save prior boxes that contains box coordinates(x0,y0,x1,y1), shape[21824,4] - */ - void KPYunetPostProcess::GeneratePriorBox(cv::Mat &anchors) - { - std::vector>feature_maps(RECTANGLEPOINT, std::vector(DIM)); - for (int i = 0; i < feature_maps.size(); i++) { - feature_maps[i][0] = IMAGE_HEIGHT / STEPS[i]; - feature_maps[i][1] = IMAGE_WIDTH / STEPS[i]; - } - for (int k = 0; k < feature_maps.size(); k++) { - auto f = feature_maps[k]; - float step = (float)STEPS[k]; - for (int i = 0; i < f[0]; i++) { - for (int j = 0; j < f[1]; j++) { - for (int l = 0; l < PRIOR_PARAMETERS_COUNT && PRIOR_PARAMETERS[k][l] != -1; l++) { - float min_size = PRIOR_PARAMETERS[k][l]; - cv::Mat anchor(1, RECTANGLEPOINT, CV_32F); - float center_x = (j + 0.5f) * step; - float center_y = (i + 0.5f) * step; - - float xmin = (center_x - min_size / 2.f) / IMAGE_WIDTH; - float ymin = (center_y - min_size / 2.f) / IMAGE_HEIGHT; - float xmax = (center_x + min_size / 2.f) / IMAGE_WIDTH; - float ymax = (center_y + min_size / 2.f) / IMAGE_HEIGHT; - - float prior_width = xmax - xmin; - float prior_height = ymax - ymin; - float prior_center_x = (xmin + xmax) / 2; - float prior_center_y = (ymin + ymax) / 2; - - anchor.at(0, LEFTTOPX) = prior_width; - anchor.at(0, LEFTTOPY) = prior_height; - anchor.at(0, RIGHTTOPX) = prior_center_x; - anchor.at(0, RIGHTTOPY) = prior_center_y; - - anchors.push_back(anchor); - } - } - } - } - } - - cv::Mat KPYunetPostProcess::decode_for_loc(cv::Mat &loc, cv::Mat &prior) { - cv::Mat loc_first = loc.colRange(0, 2); - cv::Mat loc_last = loc.colRange(2, 4); - cv::Mat prior_first = prior.colRange(0, 2); - cv::Mat prior_last = prior.colRange(2, 4); - cv::Mat facepoint = loc.colRange(4, 14); - - cv::Mat boxes1 = prior_last + (loc_first * VARIANCE[0]).mul(prior_first); - cv::Mat boxes2; - cv::exp(loc_last * VARIANCE[1], boxes2); - boxes2 = boxes2.mul(prior_first); - boxes1 = boxes1 - boxes2 / DIV_TWO; - boxes2 = boxes2 + boxes1; - - cv::Mat boxes3; - for (int i = 0; i < KEYPOINTNUM; i++) - { - cv::Mat singlepoint = facepoint.colRange(i * 2, (i + 1) * 2); - singlepoint = prior_last + (singlepoint * VARIANCE[0]).mul(prior_first); - if (i == 0) boxes3 = singlepoint; - else cv::hconcat(boxes3, singlepoint, boxes3); - } - - cv::Mat boxes; - cv::hconcat(boxes1, boxes2, boxes); - cv::hconcat(boxes, boxes3, boxes); - return boxes; - } - - extern "C" { - std::shared_ptr GetKeypointInstance() - { - LogInfo << "Begin to get KPYunetPostProcess instance."; - auto instance = std::make_shared(); - LogInfo << "End to get KPYunetPostProcess instance."; - return instance; - } - } -} \ No newline at end of file diff --git a/contrib/yunet/plugin2/KPYunetPostProcess.h b/contrib/yunet/plugin2/KPYunetPostProcess.h deleted file mode 100644 index 88496062b..000000000 --- a/contrib/yunet/plugin2/KPYunetPostProcess.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. 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 KPYunet_POST_PROCESS_H -#define KPYunet_POST_PROCESS_H -#include "MxBase/PostProcessBases/KeypointPostProcessBase.h" -#include "MxBase/PostProcessBases/ObjectPostProcessBase.h" -#include "MxBase/CV/ObjectDetection/Nms/Nms.h" -#include "opencv2/opencv.hpp" -#define DEFAULT_OBJECT_CONF_TENSOR 1 -#define DEFAULT_OBJECT_INFO_TENSOR 0 -#define DEFAULT_IOU_THRESH 0.3 -#define DEFAULT_CONFIDENCE_THRESH 0.9 - -namespace MxBase { - bool operator<(const KeyPointDetectionInfo &a, const KeyPointDetectionInfo &b) { - return a.score < b.score; - } - bool operator<(const ObjectInfo &a, const ObjectInfo &b) { - return a.confidence < b.confidence; - } - - class KPYunetPostProcess : public KeypointPostProcessBase { - public: - KPYunetPostProcess() = default; - - ~KPYunetPostProcess() = default; - - KPYunetPostProcess(const KPYunetPostProcess& other); - - KPYunetPostProcess& operator=(const KPYunetPostProcess& other); - - APP_ERROR Init(const std::map & postConfig) override; - - APP_ERROR DeInit() override; - - APP_ERROR Process(const std::vector &tensors, std::vector> &keypointInfos, - const std::vector &resizedImageInfos = {}, - const std::map> &configParamMap = {}) override; - - protected: - void GeneratePriorBox(cv::Mat &anchors); - cv::Mat decode_for_loc(cv::Mat &loc, cv::Mat &prior); - void KeypointDetectionOutput(const std::vector & tensors, - std::vector >& ketpointInfos, - const std::vector & resizedImageInfos = {}); - void generate_keypointInfos(const std::vector & tensors, - std::vector >& keypointInfos, - const std::vector & resizedImageInfos, - cv::Mat &res); - private: - uint32_t objectConfTensor_ = DEFAULT_OBJECT_CONF_TENSOR; - uint32_t objectInfoTensor_ = DEFAULT_OBJECT_INFO_TENSOR; - float iouThresh_ = DEFAULT_IOU_THRESH; - float confThresh_ = DEFAULT_CONFIDENCE_THRESH; - }; - - extern "C" { - std::shared_ptr GetKetpointInstance(); - } -} -#endif diff --git a/contrib/yunet/plugin3/build.sh b/contrib/yunet/plugin3/build.sh deleted file mode 100644 index 006f86ba8..000000000 --- a/contrib/yunet/plugin3/build.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# Copyright 2021 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 \ No newline at end of file -- Gitee From d323e5acc9c1b5cf8d58041257f7bea73fb993fe Mon Sep 17 00:00:00 2001 From: xu Date: Wed, 4 Dec 2024 18:04:15 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=A3=80=E8=A7=86=E6=84=8F=E8=A7=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/VideoGestureRecognition/README.md | 2 +- contrib/yunet/README.md | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index 8dd5ce45e..f16e9b9ad 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -26,7 +26,7 @@ | live555 | 1.10 | 实现视频转rstp进行推流 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Live555%E7%A6%BB%E7%BA%BF%E8%A7%86%E9%A2%91%E8%BD%ACRTSP%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md) | | ffmpeg | 4.2.1 | 实现mp4格式视频转为264格式视频 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/pc%E7%AB%AFffmpeg%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md#https://ffmpeg.org/download.html) | -**注意:** +**注意:** ffmpeg需要用户到相关网址下载源码编译安装。 第三方库默认全部安装到/usr/local/下面,全部安装完成后,请设置环境变量 ```bash diff --git a/contrib/yunet/README.md b/contrib/yunet/README.md index cb80a7709..f8f6b9196 100644 --- a/contrib/yunet/README.md +++ b/contrib/yunet/README.md @@ -44,6 +44,8 @@ yunet基于MindXSDK开发,在昇腾芯片上进行人脸检测,并实现可 | live555 | 1.09 | 实现视频转rstp进行推流 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Live555%E7%A6%BB%E7%BA%BF%E8%A7%86%E9%A2%91%E8%BD%ACRTSP%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md) | | ffmpeg | 4.2.1 | 实现mp4格式视频转为264格式视频 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/pc%E7%AB%AFffmpeg%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md#https://ffmpeg.org/download.html) | +注:ffmpeg需要用户到相关网址下载源码编译安装。 + ### 1.5 代码目录结构说明 本项目名为yunet实时人脸检测,项目目录如下所示: @@ -133,9 +135,9 @@ chmod 640 plugin/build/libyunetpostprocess.so cp plugin/build/libyunetpostprocess.so ${MX_SDK_HOME}/lib/modelpostprocessors/ ``` -**步骤6:** 运行。在项目根目录下,执行命令`bash run.sh`,即可在根目录下得到输出结果`result.264`。 +**步骤6:** 运行。在项目根目录下,执行命令`bash run.sh`,可手动执行`ctrl + c`终止程序运行。 -使用`ctrl + c`终止程序运行。 +**步骤7:** 查看结果。在根目录下得到输出结果`result.264`。 ## 5 性能验证 @@ -152,7 +154,7 @@ cp plugin1/build/libtotalyunetpostprocess.so ${MX_SDK_HOME}/lib/modelpostprocess **步骤3:** 性能测试。修改根目录下`run.sh`文件中第32行,由`python3 main.py`改为`python3 test.py`,再次在根目录下运行`bash run.sh`,即可获得`libtotalyunetpostprocess.so`的性能结果。 -因为性能检测结果实时输出,使用者在`test.py`运行过程中可以实时查看检测结果,并且在需要时可以在输出帧率后立刻按`ctrl + c`终止程序运行,以查看帧率。 +**步骤4:** 查看结果。因为性能检测结果实时输出,使用者在`test.py`运行过程中可以实时查看检测结果,并且在需要时可以在输出帧率后立刻按`ctrl + c`终止程序运行,以查看帧率。 ## 6 常见问题 -- Gitee From 4ebadc1a8922c9332af1e67ecb4c14831a9c38e4 Mon Sep 17 00:00:00 2001 From: xu Date: Wed, 4 Dec 2024 19:05:53 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=A1=A5=E5=85=85=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/VideoGestureRecognition/README.md | 21 +++++---------------- contrib/yunet/README.md | 2 +- mxVision/InferOfflineVideo/README.md | 2 +- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index 91c8b4fad..065f60276 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -27,7 +27,7 @@ | live555 | 1.10 | 实现视频转rstp进行推流 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Live555%E7%A6%BB%E7%BA%BF%E8%A7%86%E9%A2%91%E8%BD%ACRTSP%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md) | | ffmpeg | 4.2.1 | 实现mp4格式视频转为264格式视频 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/pc%E7%AB%AFffmpeg%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md#https://ffmpeg.org/download.html) | -**注意:** ffmpeg需要用户到相关网址下载源码编译安装。 +**注意:** live555和ffmpeg需要用户到相关网址下载源码编译安装。 第三方库默认全部安装到/usr/local/下面,全部安装完成后,请设置环境变量 ```bash @@ -75,21 +75,10 @@ export LD_LIBRARY_PATH=/usr/local/ffmpeg/lib:$LD_LIBRARY_PATH ## 2 设置环境变量 -``` -# 请确认install_path路径是否正确 -# Set environment PATH (Please confirm that the install_path is correct). - -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:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - -export MX_SDK_HOME=${SDK安装路径} -export FFMPEG_PATH=${FFMPEG安装路径} -LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${FFMPEG_PATH}/lib:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ -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 +```bash +. /usr/local/Ascend/ascend-toolkit/set_env.sh # toolkit 默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh # sdk 安装路径,根据实际安装路径修改 +export FFMPEG_PATH=/usr/local/ffmpeg # ffmpeg 默认安装路径,根据实际安装路径修改 ``` ## 3 准备模型 diff --git a/contrib/yunet/README.md b/contrib/yunet/README.md index f8f6b9196..5716e6442 100644 --- a/contrib/yunet/README.md +++ b/contrib/yunet/README.md @@ -44,7 +44,7 @@ yunet基于MindXSDK开发,在昇腾芯片上进行人脸检测,并实现可 | live555 | 1.09 | 实现视频转rstp进行推流 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Live555%E7%A6%BB%E7%BA%BF%E8%A7%86%E9%A2%91%E8%BD%ACRTSP%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md) | | ffmpeg | 4.2.1 | 实现mp4格式视频转为264格式视频 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/pc%E7%AB%AFffmpeg%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md#https://ffmpeg.org/download.html) | -注:ffmpeg需要用户到相关网址下载源码编译安装。 +注:live555和ffmpeg需要用户到相关网址下载源码编译安装。 ### 1.5 代码目录结构说明 diff --git a/mxVision/InferOfflineVideo/README.md b/mxVision/InferOfflineVideo/README.md index d871a7b95..c01eb228e 100644 --- a/mxVision/InferOfflineVideo/README.md +++ b/mxVision/InferOfflineVideo/README.md @@ -27,7 +27,7 @@ | live555 | 1.10 | 实现视频转rstp进行推流 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Live555%E7%A6%BB%E7%BA%BF%E8%A7%86%E9%A2%91%E8%BD%ACRTSP%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md) | | ffmpeg | 4.2.1 | 实现mp4格式视频转为264格式视频 | [链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/pc%E7%AB%AFffmpeg%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md#https://ffmpeg.org/download.html) | -**注意:** +**注意:** live555和ffmpeg需要用户到相关网址下载源码编译安装。 第三方库默认全部安装到/usr/local/下面,全部安装完成后,请设置环境变量 ```bash -- Gitee