• [问题求助] 【MindX SDK样例开发】【模型转换】atc run failed E29999: Inner Error!
    【功能模块】【操作步骤&问题现象】根据官方操作文档进行模型转换的时候,没有看到历史下载如下:于是下载了模型1.6版本在本地进行配置的时候我只有这个yolov3_tf_aipp.cfg后缀的配置文件,与官方aippconfig后缀不一致;即下图(为官方案例图)最后得到了E29999的错误。【截图信息【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【MindStudio】【MindX SDK功能】Settings菜单没有MindX SDK菜单
    版本:MindStudio5.0.RC1 打开Settings菜单,搜索MindX SDK菜单,没有搜索结果
  • [MindX SDK] 基于MindX SDK的风格转换推理(航拍图到卫星图的转换)
    # MindX SDK -- 参考设计案例 ## 1 案例概述 ### 1.1 概要描述 本文中风格转换实现了从航拍地图到卫星地图的转换。它通过一种无监督的少样本的学习方式的风格转换。 论文原文:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 测试集下载地址:https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/maps.zip 初始模型、推理模型及转换脚本下载:https://www.hiascend.com/zh/software/modelzoo/detail/1/3ba3b04fd4964d9b81974381b73f491d 本项目地址:https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/contrib/StyleTransfer ### 1.3 模型介绍 本案例使用了基于CycleGAN网络的风格转换模型。 ### 1.4 实现流程 1、基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver 2、pipeline的编排与配置 3、模型转换:Pytorch模型转昇腾离线模型:.pth --> .onnx --> .om 5、python推理流程代码开发 ## 2 软件方案介绍 ### 2.1 项目方案架构介绍 各插件的功能 ``` | 序号 | 子系统 | 功能描述 | | 1 | 图像输入 | 调用MindX SDK的appsrc输入图片| | 2 | 图像解码 | 调用MindX SDK的mxpi_imagedecoder对图像解码| | 3 | 图像放缩 | 调用MindX SDK的mxpi_imageresize,放缩到256*256大小 | | 4 | 图像推理 | 调用MindX SDK的mxpi_tensorinfer推理图像| | 5 | 结果输出 | 输出图片信息| ``` ### 2.2 代码目录结构与说明 本参考设计工程名称为StyleTransfer,工程目录如下图所示: ``` StyleTransfer . ├── README.md ├── README_img │ └── pic.png //README流程图 ├── models │ └── aipp_CycleGAN_pth.config //aipp配置文件 ├── pipeline │ └── styletransfer.pipeline └── src └── main.py ``` ### 2.3 项目实现流程 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/18/1658108077648289961.png) 项目的主要流程: (1)输入类型是图片数据(jpg图片序列) (2)通过调用MindX SDK提供的图像解码接口mxpi_imagedecoder,解码后获取图像数据。 (3)然后进行图像尺寸大小变换,调用MindX SDK提供的图像尺寸大小变换接口mxpi_imageresize插件,输入图像大小要求高256,宽256。 (4)模型后处理,调用MindX SDK提供的模型推理插件mxpi_modelinfer。然后调用MindX SDK提供的appsink将结果取出。 (5)模型输出经过后处理后,得到图片数组并写入图片。 场景限制: 输入的图像应为卫星航拍图,在清晰度较好的情况下,能取得较好的推理效果。 ## 3 开发环境准备 ### 3.1 环境依赖说明 | 软件名称 | 版本 | | :-----------: | :---------: | | ubuntu | 18.04.5 LTS | | MindX SDK | 2.0.4 | | Python | 3.9.2 | | CANN | 5.0.4 | | numpy | 1.22.3 | | opencv-python | 4.5.5 | ### 3.2 环境搭建 #### 3.2.1 环境变量设置 运行MindXSDK与ascend-toolkit下的set_env.sh设置环境变量 MindXSDK:${MX_SDK_HOME}/set_env.sh ascend-toolkit:/usr/local/Ascend/ascend-toolkit/set_env.sh ``` bash set_env.sh ``` ### 3.3 pipeline编排 ``` appsrc # 输入 mxpi_imagedecoder # 图像解码 mxpi_imageresize # 图像缩放 mxpi_tensorinfer # 模型推理 appsink # 输出 ``` ### 3.4 模型转换及实现 **步骤1** 在ModelZoo上下载latest_net_G_A.pth模型以及pth->onnx转换脚本。下载地址:https://www.hiascend.com/zh/software/modelzoo/detail/1/3ba3b04fd4964d9b81974381b73f491d **步骤2** 转换pth模型->onnx模型 ``` python3 CycleGAN_onnx_export.py --model_ga_path=latest_net_G_A.pth --model_gb_path=latest_net_G_B.pth --onnx_path=./onnxmodel/ --model_ga_onnx_name=model_Ga.onnx --model_gb_onnx_name=model_Gb.onnx ``` **步骤3** AIPP设置 由于pipeline中图片解码为yuv格式且数据类型不同,所以需要在atc转换时使用aipp预处理,aipp配置内容如下。 具体的aipp配置可以参考:https://support.huawei.com/enterprise/zh/doc/EDOC1100191944/3e66a3c#:~:text=AIPP配置文件,输入时进行说明%E3%80%82 ``` aipp_op{ aipp_mode:static input_format : YUV420SP_U8 csc_switch : true rbuv_swap_switch : true src_image_size_w : 256 src_image_size_h : 256 min_chn_0 : 127.5 min_chn_1 : 127.5 min_chn_2 : 127.5 var_reci_chn_0: 0.007843137254901 var_reci_chn_1: 0.007843137254901 var_reci_chn_2: 0.007843137254901 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 } ``` 保存在/models下的aipp_CycleGAN_pth.config文件中。 **步骤4** 转换onnx->到om模型 进入models目录并准备好onnx模型文件 ``` atc --framework=5 --model=model_Ga.onnx --output=sat2map --input_format=NCHW --input_shape="img_sat_maps:1,3,256,256" --out_nodes="maps" --log=debug --soc_version=Ascend310 --insert_op_conf=aipp_CycleGAN_pth.config ``` 转换完成后的生成的sat2map.om模型文件在存放在/models中。 **步骤5** 下载测试集 在文章介绍中下载maps测试集,然后将测试集中testA文件夹复制到/StyleTransfer目录下 更改测试图片可以通过更改main.py脚本的IMG_PATH变量。默认的测试图片是/StyleTransfer/testA/sat.jpg **步骤6** 运行程序 ``` python3 main.py ``` ### 运行结果 生成的卫星地图存放在result目录中。 ``` ls ../result/map.jpg ```
  • [问题求助] CloudLink Kit_21.0.0.6 JSSDK无法隐藏软终端视频页面按钮,跪求大佬们帮忙
    使用了CloudLink Kit_21.0.0.6的DEMO,修改其中tsdkClient初始化方法中的相关UI组件参数。但是没有生效全系列CloudLink Kit_21.0.0.6的demo配套sdkCloudLink Kit_21.0.0.6升级说明支持按钮定制CloudLink Kit_21.0.0.6JSSDK说明支持按钮的控制事实上两个参数的值全部设置成1隐藏也没有生效
  • [二次开发] 关于android SDKdemo 崩溃问题的小结
    在开发者二次开发的过程中可能遇到过安卓端的崩溃问题,请开发者参考以下指导;由于gradle版本引起的崩溃:由于开发者对gradle版本有项目级别的要求,修改了gradle版本号,导致编译出来的版本在运行过程中崩溃,这种崩溃,请开发者按照https://support.huaweicloud.com/sdkreference-meeting/sdk_demo_0002.html的指导,重新配置一下运行环境。第二类崩溃
  • SDK FAQ 发布专题
    2022.7.11   SDK北向对接问题统一收纳到FAQ2022.09.05 更新案例,具体更新内容参见:SDK更新点.txt2022.10.28:案例更新2022.12.08:发布1.0.4版本,案例更新,排版优化;
  • [问题求助] CloudLink Kit_21.0.0.6_SDK iOS版包含私有api不能上架App Store
    CloudLink Kit_21.0.0.6_SDK包含私有api,不能上架App Store被拒原因如下:ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/tsdk_service.framework/tsdk_service: _rdft. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/
  • [其他] CloudLink Kit_21.0.0.6_SDK iOS版包含私有api不能上架App Store
    CloudLink Kit_21.0.0.6_SDK包含私有api,不能上架App Store被拒原因如下:ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/tsdk_service.framework/tsdk_service: _rdft. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/
  • [问题求助] C# 用HWPuSDK配置M2241-QL摄像头 OSD
    镜头型号:M2241-QL软件版本:SDC_3519A_8.0.2.SPC119HWPuSDK版本:SDC Development Kit 8.0.RC3网页可以设置OSD水印距离左上,左下,右上,右下多少个像素,字体大小可以手动输入大小问题:C# 用HWPuSDK 怎么实现?使用 IVS_PU_GetOsdTextExV3 获取OSD修改文字以后 使用IVS_PU_SetOsdTextExV3 ,OSD位置与大小就就都变样了有没有配置OSD方面的demo呢?
  • [问题求助] 【物联网应用侧开发SDK产品】【node.js 功能】构建npm报错
    【功能模块】我想使用开发微信小程序连接华为云的物联网平台,就简单的数据收发就行,我看有官方的node.js sdk,然后我npm install后,构建npm会报下面的错,有大神知道吗?【操作步骤&问题现象】1、npm install @huaweicloud/huaweicloud-sdk-core2、npm install @huaweicloud/huaweicloud-sdk-iotda3、构建npm【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【mindx SDK产品】【pipeline功能】已经加载的pipeline如何切换输入源
    使用mindx SDK对视频片段进行推理时,加载pipeline文件后会对模型进行加载等工作。我有一个场景,是同一个模型对若干个视频片段进行识别,每推理一个视频片段时不重新加载pipeline,只切换视频源。
  • [MindX SDK] sdk版本为MindX SDK 2.0.2 配置YOLOV5推理, 推理PNG图像格式报错
    【功能模块】sdk版本为MindX SDK 2.0.2 配置YOLOV5推理, 推理PNG图像格式报错,查看推理配置Pipline文件相关的"mxpi_imagedecoder0": {      "factory": "mxpi_imagedecoder",      "next": "mxpi_imageresize0"    }, 仅支持jpg???【操作步骤&问题现象】1、推理报错:2、如何才能支持PNG格式推理,谢谢求助【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【Atlas 800 3010产品】【MindX SDK推理】进行FairMot的推理时出现无法初始化所有设备的问题
    【功能模块】推理:在atlas 800 3010上进行fairmot的MindX SDK推理【操作步骤&问题现象】1、从Ascend modelzoo下载fairmot的脚本和模型权重2、启动docker3、进入fairmot源码的infer目录,运行bash run.sh4、出现无法初始化所有设备的报错:【截图信息】【日志信息】(可选,上传日志内容或者附件)call drvMngGetConsoleLogLevel failed , g_conLogLevel = 3[EVENT] PROFILING(18,python3.7):2022-06-24-08:23:17.086.500 [msprof_callback_impl.cpp:151] >>> (tid:18) Started to register profiling callbacks to aclThe device id: 0.Begin to initialize Log.The output directory of logs file doesn't exist.Create directory to save logs information.Save logs information to specified directory.I0624 08:23:17.097687    18 MxStreamManagerDptr.cpp:354] Set the default value of "GST_PLUGIN_SCANNER" based on "MX_SDK_HOME".I0624 08:23:17.097805    18 MxStreamManagerDptr.cpp:354] Set the default value of "GST_PLUGIN_PATH" based on "MX_SDK_HOME".I0624 08:23:17.097939    18 MxStreamManagerDptr.cpp:475] log rotate day(7).I0624 08:23:17.098004    18 MxStreamManagerDptr.cpp:484] log rotate file number(50).call drvMngGetConsoleLogLevel failed , g_conLogLevel = 3[EVENT] PROFILING(32,gst-plugin-scanner):2022-06-24-08:23:17.207.374 [msprof_callback_impl.cpp:151] >>> (tid:32) Started to register profiling callbacks to acl[EVENT] IDEDH(32,gst-plugin-scanner):2022-06-24-08:23:17.301.604 [adx_server_manager.cpp:27][tid:32]>>> start to deconstruct adx server managerI0624 08:23:17.345232    18 MxsmStream.cpp:1569] Validates appsink0 element successfully.I0624 08:23:17.346163    18 MxsmElement.cpp:410] Gets appsrc factory successfully.I0624 08:23:17.346279    18 MxsmStream.cpp:1569] Validates appsrc0 element successfully.I0624 08:23:17.348372    18 MxsmElement.cpp:410] Gets mxpi_dataserialize factory successfully.I0624 08:23:17.348438    18 MxsmStream.cpp:1569] Validates mxpi_dataserialize0 element successfully.I0624 08:23:17.351769    18 MxsmElement.cpp:410] Gets mxpi_modelinfer factory successfully.I0624 08:23:17.351886    18 MxsmStream.cpp:1569] Validates mxpi_modelinfer0 element successfully.I0624 08:23:17.352079    18 MxsmStream.cpp:583] Gets the value of stream_config deviceId(0).I0624 08:23:17.352180    18 MxsmStream.cpp:641] Add element to stream, element name is appsink0I0624 08:23:17.352468    18 MxsmElement.cpp:97] Sets element(appsink0) to async.I0624 08:23:17.352499    18 MxsmElement.cpp:186] Handles appsink factory successfully.I0624 08:23:17.352546    18 MxsmElement.cpp:321] Sets element(appsink0) properties successfully.I0624 08:23:17.352576    18 MxsmElement.cpp:356] Creates appsink0 element successfully.I0624 08:23:17.352681    18 MxsmStream.cpp:428] Adds appsink0 element to Stream successfully.I0624 08:23:17.352703    18 MxsmStream.cpp:641] Add element to stream, element name is appsrc0I0624 08:23:17.352766    18 MxsmElement.cpp:186] Handles appsrc factory successfully.I0624 08:23:17.352823    18 MxsmElement.cpp:220] Sets block property successfully.I0624 08:23:17.352849    18 MxsmElement.cpp:220] Sets max-bytes property successfully.I0624 08:23:17.352869    18 MxsmElement.cpp:220] Sets blocksize property successfully.I0624 08:23:17.352880    18 MxsmElement.cpp:321] Sets element(appsrc0) properties successfully.I0624 08:23:17.352890    18 MxsmElement.cpp:356] Creates appsrc0 element successfully.I0624 08:23:17.352921    18 MxsmStream.cpp:428] Adds appsrc0 element to Stream successfully.I0624 08:23:17.352941    18 MxsmStream.cpp:641] Add element to stream, element name is mxpi_dataserialize0I0624 08:23:17.353083    18 MxsmElement.cpp:186] Handles mxpi_dataserialize factory successfully.I0624 08:23:17.353116    18 MxsmElement.cpp:220] Sets deviceId property successfully.I0624 08:23:17.353132    18 MxsmElement.cpp:240] Sets element(mxpi_dataserialize0) to use stream_config deviceId(0).I0624 08:23:17.353161    18 MxsmElement.cpp:220] Sets outputDataKeys property successfully.I0624 08:23:17.353230    18 MxsmElement.cpp:321] Sets element(mxpi_dataserialize0) properties successfully.I0624 08:23:17.353242    18 MxsmElement.cpp:356] Creates mxpi_dataserialize0 element successfully.I0624 08:23:17.353296    18 MxsmStream.cpp:428] Adds mxpi_dataserialize0 element to Stream successfully.I0624 08:23:17.353333    18 MxsmStream.cpp:641] Add element to stream, element name is mxpi_modelinfer0I0624 08:23:17.353493    18 MxsmElement.cpp:186] Handles mxpi_modelinfer factory successfully.I0624 08:23:17.353529    18 MxsmElement.cpp:220] Sets deviceId property successfully.I0624 08:23:17.353544    18 MxsmElement.cpp:240] Sets element(mxpi_modelinfer0) to use stream_config deviceId(0).I0624 08:23:17.353580    18 MxsmElement.cpp:220] Sets dataSource property successfully.I0624 08:23:17.353619    18 MxsmElement.cpp:220] Sets modelPath property successfully.I0624 08:23:17.353652    18 MxsmElement.cpp:220] Sets tensorFormat property successfully.I0624 08:23:17.353668    18 MxsmElement.cpp:321] Sets element(mxpi_modelinfer0) properties successfully.I0624 08:23:17.353690    18 MxsmElement.cpp:356] Creates mxpi_modelinfer0 element successfully.I0624 08:23:17.353719    18 MxsmStream.cpp:428] Adds mxpi_modelinfer0 element to Stream successfully.I0624 08:23:17.353906    18 MxsmStream.cpp:544] Links all elements successfully.I0624 08:23:17.353940    18 MxsmElement.cpp:878] Element(appsink0) register probe function successfully.I0624 08:23:17.353952    18 MxsmElement.cpp:870] Element(appsrc0) register probe function successfully.I0624 08:23:17.354074    18 MxGstBase.cpp:783] element(mxpi_dataserialize0) gst_change_state NULL_TO_READY.[ERROR] RUNTIME(18,python3.7):2022-06-24-08:23:17.379.561 [runtime.cc:626]18 InitSocType:[INIT][DEFAULT]Call halGetDeviceInfo failed: drvRetCode=4, module type=0, info type=1.[ERROR] RUNTIME(18,python3.7):2022-06-24-08:23:17.379.636 [runtime.cc:704]18 Init:[INIT][DEFAULT]Init SocType failed.[ERROR] RUNTIME(18,python3.7):2022-06-24-08:23:17.379.708 [api_c.cc:2330]18 rtGetSocVersion:[INIT][DEFAULT]ErrCode=507000, desc=[null instance pointer], InnerCode=0x70b0001[ERROR] ASCENDCL(18,python3.7):2022-06-24-08:23:17.379.752 [acl.cpp:167]18 InitSocVersion: [INIT][DEFAULT][Get][SocVersion]get soc version failed, runtime result is 507000[ERROR] ASCENDCL(18,python3.7):2022-06-24-08:23:17.379.778 [acl.cpp:100]18 aclInit: [INIT][DEFAULT][Init][Version]init soc version failed, ret = 507000E0624 08:23:17.379801    18 DeviceManager.cpp:54] Failed to initialize all devices: Error code unknown.E0624 08:23:17.379974    18 MxGstBase.cpp:590] [mxpi_dataserialize0][507000][Error code unknown] Initialize devices failed.E0624 08:23:17.379997    18 MxGstBase.cpp:785] element(mxpi_dataserialize0) MxGstBaseStart error.E0624 08:23:17.380059    18 MxsmStream.cpp:700] [6003][stream change state fail] Failed to set the state of the Stream, named: im_fairmot.E0624 08:23:17.380110    18 MxStreamManagerDptr.cpp:425] [6003][stream change state fail] create stream(im_fairmot) failed.I0624 08:23:17.380126    18 MxsmStream.cpp:753] Begin to destroy stream(im_fairmot).I0624 08:23:17.380151    18 MxsmStream.cpp:809] Send custom eos to the Stream successfully.I0624 08:23:17.380172    18 MxsmStream.cpp:815] Send eos to the Stream successfully.W0624 08:23:17.380190    18 MxsmStream.cpp:823] Failed to flush the Stream data.I0624 08:23:17.380292    18 MxsmStream.cpp:800] Destroys the stream(im_fairmot) successfully.Failed to create stream, ret=6003.I0624 08:23:17.380596    18 MxStreamManager.cpp:76] Begin to destroy management threads.I0624 08:23:17.382032    18 MxStreamManager.cpp:243] Destroy streams successfully.[EVENT] IDEDH(18,python3.7):2022-06-24-08:23:17.409.650 [adx_server_manager.cpp:27][tid:18]>>> start to deconstruct adx server manager
  • [MindX SDK] YOLOX推理应用参考设计案例分享
    # MindX SDK -- YOLOX推理应用参考设计案例 ## 1 案例概述 ### 1.1 概要描述 YOLOX 推理应用是对图片中的不同类目标进行检测,将检测得到的不同类的目标用不同颜色的矩形框标记。输入一幅图像,可以检测得到图像中大部分类别目标的位置。本方案使用在 COCO2017 数据集上训练得到的 YOLOX-Nano 模型进行目标检测,数据集中共包含 80 个目标类,包括行人、自行车、公共汽车、手机、沙发、猫、狗等,可以对不同类别、不同角度、不同密集程度的目标进行检测,并在COCO VAL 2017数据集达到25.3%的准确度。 ### 1.2 模型介绍 YOLOX模型于2021年由开发者Zheng Ge,Songtao Liu,Feng Wang,Zeming Li,Jian Sun在《YOLOX: Exceeding YOLO Series in 2021》首次提出。YOLOX对YOLO系列的进行一些改进,形成了一种新的高性能探测器。配备了一些新的先进检测技术,即解耦头、无锚点和先进的标签分配策略,YOLOX在速度和精度之间实现了更好的平衡,比所有型号尺寸的其他同类产品都好。 ### 1.3 实现流程 YOLOX 的后处理插件接收模型推理插件输出的特征图,该特征图为三张不同分辨率的特征图拼接而成,形状大小为1 x n x 85,其中 n 为三张网络模型输出特征图的像素点数总和,85 为 80 (数据集分类数)+ 4 (目标框回归坐标点)+ 1 (正类置信度)。本项目方案技术流程图如下。 ![pipeline](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/23/1655970638217646084.png) ### 1.4 代码地址 本项目的代码地址为:https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/contrib/YOLOX ## 2 软件方案介绍 ### 2.1 项目方案架构介绍 本系统设计了不同的功能模块。主要流程为:图片经过预处理之后传入流中,利用YOLOX的检测模型初步检测出目标,检测结果输入到后处理插件中,经过阈值筛选,非极大值抑制后得到最终预测结果,最终在原图上进行可视化操作。各模块功能描述如表2.1所示: 表2.1 系统方案中各模块功能: | 序号 | 子系统 | 功能描述 | | ---- | ------ | ------------ | | 1 | 图像输入 | 调用MindX SDK的appsrc输入图片 | | 2 | 模型推理 | 利用yolox的检测模型对原图进行预测 | | 3 | 模型后处理 | 利用yolox后处理插件对推理结果进行处理,得到最终预测结果 | | 4 | 结果输出 | 将目标的位置信息,识别置信度输出 | ### 2.2 代码目录结构与说明 本工程名称为YOLOX,工程目录如下图所示: ``` . ├── build.sh ├── images │   ├── DetectionPipeline.png │   ├── EvaluateInfo.png │   ├── EvaluateInfoPrevious.png │   ├── warning.png │   └── VersionError.png ├── postprocess │   ├── build.sh │   ├── CMakeLists.txt │   ├── YoloxPostProcess.cpp │   └── YoloxPostProcess.h ├── python │   ├── Main │   │   ├── eval_nopre_post.py │   │   ├── eval_pre_post.py │   │   ├── nopre_post.py │   │   ├── pre_post.py │   │   ├── pre_post.py │   │   └── preprocess.py │   ├── models │   │   ├── aipp-configs │   │   │ └── yolox_bgr.cfg │   │   ├── conversion-scripts # 下载的onnx模型存放在该文件夹下 │   │   ├── yolox_eval.cfg │   │   └── coco.names #需要下载,下载链接在下方 │   ├── test │   │   ├── data # 下载的数据集存放在此文件下 │   │   ├── map_calculate.py │   │   └── parse_coco.py #需要下载,下载链接在下方 │   ├── test_img │   │   └── test.jpg # 需要用户自行添加测试数据 │   └── pipeline │   ├── nopre_post.pipeline │   └── pre_post.pipeline └── README.md ``` 注:coco.names文件与parse_coco.py文件分别源于[链接](https://gitee.com/ascend/ModelZoo-PyTorch/tree/master/ACL_PyTorch/built-in/cv/Yolov3_for_Pytorch)的coco2014.names文件和[项目](https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/contrib/FireDetection)中test文件夹下的parse_COCO.py文件,将这两个文件下载之后,分别放到python/models目录下和python/test目录下。 ## 3 开发环境准备 ### 3.1 环境依赖说明 推荐系统为ubuntu 18.04,环境依赖软件和版本如下表: | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.5+ | | mxVision | 2.0.4 | | python | 3.9.2 | 确保环境中正确安装mxVision SDK。 在编译运行项目前,需要设置环境变量: MindSDK 环境变量: ``` . ${SDK-path}/set_env.sh ``` CANN 环境变量: ``` . ${ascend-toolkit-path}/set_env.sh ``` - 环境变量介绍 ``` SDK-path: mxVision SDK 安装路径 ascend-toolkit-path: CANN 安装路径。 ``` ### 3.3 模型转换 本项目中采用的模型是 YOLOX 模型,参考实现代码:https://github.com/Megvii-BaseDetection/YOLOX , 选用的模型是该 pytorch 项目中提供的模型 yolox-Nano.onnx,模型下载链接:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/YOLOX/yolox_nano.onnx 。本项目使用模型转换工具 ATC 将 onnx 模型转换为 om 模型,模型转换工具相关介绍参考链接:https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0005.html 。 1. 从上述项目链接中下载 onnx 模型 yolox_nano.onnx 至 ``python/models/conversion-scripts`` 文件夹下。 2. 将该模型转换为om模型,具体操作为: ``python/models/conversion-scripts`` 文件夹下,执行atc指令: ``` atc --model=yolox_nano.onnx --framework=5 --output=./yolox_nopre_nopost --output_type=FP32 --soc_version=Ascend310 --input_shape="images:1, 3, 416, 416" ``` 若终端输出为: ``` ATC start working now, please wait for a moment. ATC run success, welcome to the next use. W11001: Op [Slice_29] does not hit the high-priority operator information library, which might result in compromised performance. W11001: Op [Slice_9] does not hit the high-priority operator information library, which might result in compromised performance. W11001: Op [Slice_39] does not hit the high-priority operator information library, which might result in compromised performance. W11001: Op [Slice_19] does not hit the high-priority operator information library, which might result in compromised performance. ``` 表示命令执行成功。 ## 4 编译与运行 **步骤1** 在项目根目录执行命令: ``` bash build.sh chmod 640 postprocess/build/libYoloxPostProcess.so cp postprocess/build/libYoloxPostProcess.so ${MX_SDK_HOME}/lib/modelpostprocessors/ ``` **步骤2** 放入待测图片。将一张图片放在路径``python/test_img``下,命名为 test.jpg。 **步骤3** 图片检测。在项目路径``python/Main``下运行命令: ``` python3 nopre_post.py ``` 命令执行成功后在目录``python/test_img``下生成检测结果文件 nopre_post.jpg,查看结果文件验证检测结果。 ## 5 精度测试 **步骤1** 在项目根目录执行命令: ``` bash build.sh cp postprocess/build/libYoloxpostprocess.so ${MX_SDK_HOME}/lib/modelpostprocessors/ ``` **步骤2** 更改``python/Main``路径下的 shell 文件 run.sh 的运行指令为: ``` python nopre_post.py ``` **步骤3** 图片检测。将一张图片放在路径``python/test_img``下,命名为 test.jpg,在该图片上进行检测,**从 ```python/Main/nopre_post.py``` 中找到使用的 pipeline 文件路径,将其中 mxpi_objectpostprocessor0 插件的 postProcessLibPath 属性值中的 ${MX_SDK_HOME} 值改为具体路径值**,然后执行命令: ``` cd python/Main bash run.sh ``` 命令执行成功后在目录``python/test_img``下生成检测结果文件 test_nopre_post.jpg,查看结果文件验证检测结果。 **步骤4** 精度测试。下载COCO VAL 2017数据集和标注文件。 1. 下载COCO VAL 2017[验证数据集](http://images.cocodataset.org/zips/val2017.zip )和[标注文件](http://images.cocodataset.org/annotations/stuff_annotations_trainval2017.zip),并保存在项目目录``python/test/data``下,此文件夹下的组织形式应如下图所示: ``` . ├── annotations │   └── instances_val2017.json └── val2017 ``` 其中:val2017文件夹下应存放有5000张待测图片。 2. 修改``python/models``下的文件 yolox_eval.cfg 的参数 OBJECTNESS_THRESH=0.01 IOU_THRESH=0.65 3. 使用以下指令运行路径``python/test``下的文件 parse_coco.py: ``` python3 parse_coco.py --json_file=data/annotations/instances_val2017.json --img_path=data/val2017 ``` 若运行成功,会在该目录下生成文件夹ground_truth,其中包含每张图像上提取的目标框真实位置与类别的txt文件。 接下来将每张图的预测结果转为txt文件,并保存在同一文件夹下,其步骤如下: 4. 进入``python/Main``路径,运行命令: ``` python3 eval_nopre_post.py ``` 若运行成功,会在``python/test`` 路径下生成 test_nopre_post 文件夹,该目录下包含有每张图像上的检测结果的 txt 文件。 5. 在``python/test``路径下,运行命令: ``` python3 map_calculate.py --npu_txt_path="./test_nopre_post" ``` 若运行成功则得到最终检测精度,结果如下: ![result](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/23/1655970593220319171.png) 注:在pipeline中加图像预处理与不加预处理的验证结果不同的原因为:YOLOX的图像预处理中,Resize方式为按长边缩放,而Mindx SDK默认使用dvpp的图像解码方式,没有按长边缩放的方法,因此本项目将"resizeType"属性设置为 "Resizer_KeepAspectRatio_Fit",这样会导致精度下降。 ## 6 常见问题 ### 5.1 源项目的测试精度为24.3,达不到本项目的精度25.3 源项目的后处理默认使用类间 nms, 而本项目的 nms 调用 MxBase::NmsSort 方法,该方法为类内 nms,若要对齐源项目精度,只需将 源项目代码中的方法 multiclass_nms 的参数 class_agnostic 改为 False 即可。 ### 5.2 未修改 pipeline 文件中的 ${MX_SDK_HOME} 值为具体值 运行demo前需要正确导入环境变量,否则会报错,如下图所示: ![MindXSDKValueError](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/23/1655970561821656350.png) **解决方案:** 检查Mindx SDK安装包的位置,并使用第二章介绍的指令正确导入环境变量。 ### 5.3 后处理插件权限问题 运行检测 demo 和评测时都需要将生成的YOLOX后处理动态链接库的权限修改,否则将会报权限错误,如下图所示: ![permissionerror](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/23/1655970539724819900.png) **解决方案:** 在YOLOX后处理的动态链接库的路径下运行命令: ``` chmod 640 libYoloxPostProcess.so ``` ### 5.4 模型转换时会警告缺slice算子 YOLOX在图像输入到模型前会进行slice操作,而ATC工具缺少这样的算子,因此会报出如图所示的警告: ![warning](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/23/1655970505955986509.png) **解决方案:** 常规的做法是修改slice算子,具体操作可参考[安全帽检测](https://gitee.com/booyan/mindxsdk-referenceapps/tree/master/contrib/HelmetIdentification)的开源项目。 由于在本项目下是否修改算子并不影响检测结果,因此默认不做处理。
  • [问题求助] 【SDC】【二次开发】获取SDK开发代码DEMO
    【功能模块】SDK二次开发【操作步骤&问题现象】1、获得代码DEMO,方便快速开发2、【截图信息】【日志信息】(可选,上传日志内容或者附件)