• [问题求助] 【OBS SDK C产品】【option功能】OBS 服务器地址为IP地址,该如何配置
    【功能模块】OBS 对象存储--OBS-SDK-C【操作步骤&问题现象】1、第三方提供的OBS的host_name为210.76.75.21:5443,将demo中的host_name改为该IP后,访问失败     但用obs-browser-plus访问是正常的提示为NameLookupError【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【对象存储】【OBS BrowserJS SDK】如何使用OBS BrowserJs SDK调用第三方存储服务S3接口
    【对象存储】【OBS BrowserJS SDK】如何使用OBS BrowserJs SDK调用第三方存储服务S3接口
  • [问题求助] SDK太难找了 1小时找不到SDK页面 真是日了
    SDK太难找了   我就想问问 买了你们的设备 就要被你们折磨吗?为什么不能简单直接容易查找的方式展示页面 非要搞的乱七八糟的  
  • [问题求助] sdk更新问题
    【功能模块】obs存储【操作步骤&问题现象】1、下载新的SDK包替换原来的包,还是在应用侧直接改版本号后自动下载更新【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【MindStudio】【MindX SDK pipline】报错
    【功能模块】MindStudio Windows版MindX SDK pipline报错【操作步骤&问题现象】1、点击打开MindX SDK pipline2、插件不显示且下方报错【截图信息】【日志信息】(可选,上传日志内容或者附件)2022-05-31 16:13:08  WARNING: Logging before InitGoogleLogging() is written to STDERRW20220531 16:13:08.317605 19260 FileUtils.cpp:365] Check Owner group permission: Current permission is 5, but required no greater than 4.I20220531 16:13:08.317709 19260 PluginInspector.cpp:1130] Exporting all plugins...E20220531 16:13:08.317719 19260 FileUtils.cpp:316] realpath parsing failed.W20220531 16:13:08.317723 19260 PluginInspector.cpp:1018] Failed to get pluginsListFile file path.W20220531 16:13:08.317723 19260 PluginInspector.cpp:1133] Whitelist filtering not used.I20220531 16:13:08.317749 19260 PluginInspector.cpp:965] Plugin index: 0 .I20220531 16:13:08.325656 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.325681 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.325778 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.326468 19260 PluginInspector.cpp:965] Plugin index: 1 .I20220531 16:13:08.327435 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.327471 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.327502 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.327955 19260 PluginInspector.cpp:965] Plugin index: 2 .I20220531 16:13:08.329177 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.329205 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.329252 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.329690 19260 PluginInspector.cpp:965] Plugin index: 3 .I20220531 16:13:08.329733 19260 PluginInspector.cpp:965] Plugin index: 3 .I20220531 16:13:08.329739 19260 PluginInspector.cpp:965] Plugin index: 3 .I20220531 16:13:08.329743 19260 PluginInspector.cpp:965] Plugin index: 3 .I20220531 16:13:08.331122 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.331151 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.331185 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.331610 19260 PluginInspector.cpp:965] Plugin index: 4 .I20220531 16:13:08.333123 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.333153 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.333187 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.333699 19260 PluginInspector.cpp:965] Plugin index: 5 .I20220531 16:13:08.335197 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.335227 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.335265 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.335763 19260 PluginInspector.cpp:965] Plugin index: 6 .I20220531 16:13:08.338567 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.338605 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.338668 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.339283 19260 PluginInspector.cpp:965] Plugin index: 7 .I20220531 16:13:08.341122 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.341152 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.341279 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.341696 19260 PluginInspector.cpp:965] Plugin index: 8 .I20220531 16:13:08.342808 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.342836 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.342872 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.343251 19260 PluginInspector.cpp:965] Plugin index: 9 .I20220531 16:13:08.344394 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.344439 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.344501 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.345026 19260 PluginInspector.cpp:965] Plugin index: 10 .I20220531 16:13:08.346320 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.346349 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.346395 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.346777 19260 PluginInspector.cpp:965] Plugin index: 11 .I20220531 16:13:08.348325 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.348353 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.348395 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.348999 19260 PluginInspector.cpp:965] Plugin index: 12 .I20220531 16:13:08.351778 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.351835 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.351941 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.352665 19260 PluginInspector.cpp:965] Plugin index: 13 .I20220531 16:13:08.354979 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.355007 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.355145 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.355588 19260 PluginInspector.cpp:965] Plugin index: 14 .I20220531 16:13:08.357370 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.357403 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.357471 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.358117 19260 PluginInspector.cpp:965] Plugin index: 15 .I20220531 16:13:08.359640 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.359669 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intoI20220531 16:13:08.359812 19260 MxGstBase.cpp:155] End to create element instance.[WARNING] PluginInspector.cpp:161use sprintf_s secure function write 8 characters, but expect write 0 characters. I20220531 16:13:08.360391 19260 PluginInspector.cpp:965] Plugin index: 16 .I20220531 16:13:08.361689 19260 MxGstBase.cpp:105] Begin to create element instance.I20220531 16:13:08.361717 19260 MxGstBase.cpp:107] Element instance: MxGstBaseInit intomindstudio_tmp/mindstudio_9f847199-dd80-41f1-8822-55b704c040f4/5FDEBF18-0DD4-481E-B179-3A77058251DD.sh:行 1: 19260 段错误               (核心已转储) /home/fan/Ascend/mindx_sdk/mxVision_2.0.4/linux-x86_64/mxVision-2.0.4/bin/InspectAllPlugins2022-05-31 16:13:08  Scan plugins info failed.2022-05-31 16:13:08  File 'D:\NOGiveUp\Project\MyApp1\AllPluginsInfo.json' does not exist
  • [问题求助] 【MindStudio】【MindX SDK pipline】无法正常显示左侧可选插件并报错
    【功能模块】使用mindstudio 的可视化pipeline【操作步骤&问题现象】1、按照文档安装MindStudio及其相关环境依赖2、已安装对应SDK3、点击Ascend->MindX SDK Pipeline之后,左侧插件库为空并且在终端上报错错误信息如下:5月 31, 2022 12:56:23 下午 com.mxgraph.swing.util.mxGraphTransferable <clinit>严重: Error initializing dataFlavorjava.lang.ClassNotFoundException: com/mxgraph/swing/util/mxGraphTransferable    at java.base/java.lang.Class.forName0(Native Method)    at java.base/java.lang.Class.forName(Class.java:398)    at java.datatransfer/java.awt.datatransfer.DataFlavor.tryToLoadClass(DataFlavor.java:156)    at java.datatransfer/java.awt.datatransfer.DataFlavor.initialize(DataFlavor.java:529)    at java.datatransfer/java.awt.datatransfer.DataFlavor.<init>(DataFlavor.java:496)    at com.mxgraph.swing.util.mxGraphTransferable.<clinit>(mxGraphTransferable.java:531)    at com.huawei.mindstudio.ascend.mindxpipeline.ui.widget.graph.EditorGraph.<clinit>(EditorGraph.java:46)    at com.huawei.mindstudio.ascend.mindxpipeline.ui.PipelineEditorDialog.<init>(PipelineEditorDialog.java:119)    at com.huawei.mindstudio.ascend.mindxpipeline.fileeditor.PipelineFileEditor.getComponent(PipelineFileEditor.java:43)    at com.intellij.openapi.fileEditor.impl.EditorComposite.createEditorComponent(EditorComposite.java:201)    at com.intellij.openapi.fileEditor.impl.EditorComposite.<init>(EditorComposite.java:131)    at com.intellij.openapi.fileEditor.impl.EditorWithProviderComposite.<init>(EditorWithProviderComposite.java:18)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.createComposite(FileEditorManagerImpl.java:1112)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileImpl4Edt(FileEditorManagerImpl.java:1001)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.lambda$openFileImpl4$17(FileEditorManagerImpl.java:954)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.runBulkTabChange(FileEditorManagerImpl.java:1766)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.lambda$openFileImpl4$18(FileEditorManagerImpl.java:953)    at com.intellij.openapi.application.impl.ApplicationImpl.invokeAndWait(ApplicationImpl.java:415)    at com.intellij.openapi.application.impl.ApplicationImpl.invokeAndWait(ApplicationImpl.java:433)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileImpl4(FileEditorManagerImpl.java:952)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileImpl3(FileEditorManagerImpl.java:898)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.lambda$openFileImpl2$14(FileEditorManagerImpl.java:879)    at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:216)    at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:172)    at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:162)    at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:148)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileImpl2(FileEditorManagerImpl.java:879)    at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileWithProviders(FileEditorManagerImpl.java:765)    at com.intellij.openapi.fileEditor.ex.FileEditorManagerEx.openFile(FileEditorManagerEx.java:128)    at com.huawei.mindstudio.ascend.mindxpipeline.action.PipelineTabPageAction.openTabPageByFilename(PipelineTabPageAction.java:48)    at com.huawei.mindstudio.ascend.mindxpipeline.action.PipelineTabPageAction.openNewTabPage(PipelineTabPageAction.java:69)    at com.huawei.mindstudio.ascend.mindxpipeline.action.PipelineAction.actionPerformed(PipelineAction.java:52)    at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performActionDumbAware$5(ActionUtil.java:273)    at com.intellij.util.SlowOperations.lambda$allowSlowOperations$0(SlowOperations.java:77)    at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:64)    at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:76)    at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:273)    at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:310)    at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:286)    at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:77)    at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:299)    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)    at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:110)    at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:95)    at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:110)    at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:515)    at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:545)    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6654)    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)    at java.desktop/java.awt.Component.processEvent(Component.java:6419)    at java.desktop/java.awt.Container.processEvent(Container.java:2263)    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5029)    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4861)    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2790)    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4861)    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)    at java.base/java.security.AccessController.doPrivileged(Native Method)    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)    at java.base/java.security.AccessController.doPrivileged(Native Method)    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)    at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969)    at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:906)    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:836)    at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449)    at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808)    at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)    at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781)    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【SMC3.0】【SDK】SMC2.0有sdksmc3.0会开放sdk吗
    【功能模块】sdk java版本【操作步骤&问题现象】1、smc2.0与3.0 api 或者sdk 功能是否会兼容2、smc2.0与3.0是否会使用同一个sdk,2.0的sdk 是否调用smc3.03、smc3.0是否会开发sdk【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] OBS C SDK 如何关闭日志打印
    在使用 obs c sdk 过程中,默认 会生成obs sdk日志  如何关闭打印日志功能呢?
  • [MindX SDK] MindX SDK -- 车型识别参考设计案例
    # 1 案例概述 ## 1.1 概要描述 在本系统中,目的是基于MindX SDK,在华为云昇腾平台上,开发端到端**车型识别**的参考设计,实现**对图像中的车辆进行车型识别**的功能,达到功能要求 注:由于GoogLeNet_cars模型限制,仅支持识别在`./models/vehicle/car.names`文件中的 **431** 种车辆。 ## 1.2 模型介绍 本项目主要用到了两个模型,分别是: 用于目标检测的YOLOv3模型(TensorFlow) 和 用于车型识别的GoogLeNet_cars模型(Caffe) 上述两个模型的om模型文件可以在此处下载:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/VehicleIdentification/models.zip ## 1.3 实现流程 1、基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver 2、模型转换:TensorFlow模型转昇腾离线模型:yolov3.pb --> yolov3.om Caffe模型转昇腾离线模型:googlenet.caffemodel deploy.prototxt --> googlenet.om 3、业务流程编排与配置 4、mxpi_classpostprocessor插件的后处理库开发 5、python推理流程代码开发 技术流程图如下: ![pipeline.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/24/1653404969717939647.jpg) ## 1.4 代码地址 > 本项目的代码地址为:https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/contrib/VehicleIdentification # 2 软件方案介绍 ## 2.1 项目方案架构介绍 本系统设计了不同的功能模块。主要流程为:图片传入流中,利用Yolov3的检测模型检测车辆,将检测出车辆的图像外扩并放缩至特定尺寸,再利用车型识别模型GoogLeNet_cars检测车型,最后以键值对形式输出识别结果。各模块功能描述如表2.1所示: 表2.1 系统方案中各模块功能: | 序号 | 子系统 | 功能描述 | | :--- | :------- | :----------------------------------------------------------- | | 1 | 图像输入 | 调用MindX SDK的appsrc输入图片 | | 2 | 图像放缩 | 调用MindX SDK的mxpi_imageresize,放缩到416*416大小 | | 3 | 车辆检测 | 利用yolov3的检测模型,配合后处理插件,检测出图片中车辆 | | 4 | 数据分发 | 将yolov3检测到的car和truck进行数据分发到下个插件 | | 5 | 抠图 | 调用MindX_SDK的mxpi_imagecrop,将所有car和truck抠出,并四周外扩0.2,缩放至224*224 | | 6 | 车型检测 | 通过车型识别模型对抠出的车辆图片提取车型信息,选取的模型为caffe框架下的GoogLeNet_cars,需要先升级模型结构,再使用转换工具转化 | | 7 | 结果输出 | 将车辆位置信息,车型结果,识别置信度输出 | ## 2.2 代码目录结构与说明 本工程名称为VehicleIdentification,工程目录如下图所示: ``` ├── models │ ├── googlenet │ │ ├── car.names │ │ ├── googlenet.om │ │ ├── updatemodel.py # caffemodel旧版本升级新版本 │ │ ├── insert_op.cfg # googlenet aipp转换配置 │ │ └── vehiclepostprocess.cfg # googlenet后处理配置 │ ├── yolo │ │ ├── aipp_yolov3_416_416.aippconfig │ │ ├── coco.names │ │ ├── yolov3_tf_bs1_fp16.cfg # yolov3后处理配置 │ │ └── yolov3_tf_bs1_fp16.om ├── pipeline │ └── identification.pipeline # pipeline文件 ├── vehiclePostProcess # 车型识别后处理库 │ ├── CMakeLists.txt │ ├── VehiclePostProcess.cpp │ └── VehiclePostProcess.h ├── input │ ├── xxx.jpg # 待检测文件 │ └── yyy.jpg ├── result │ ├── xxx_result.jpg # 运行程序后生成的结果图片 │ └── yyy_result.jpg ├── main.py └── build.sh # 编译车型识别后处理插件脚本 ``` # 3 开发准备 ## 3.1 环境依赖说明 环境依赖软件和版本如下表: | 软件名称 | 版本 | | :-----------: | :---------: | | Ubuntu | 18.04.1 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 环境变量设置 ```bash # 执行如下命令,打开.bashrc文件 vi .bashrc # 在.bashrc文件中添加以下环境变量 export MX_SDK_HOME=${SDK安装路径} export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/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 export PYTHONPATH=${MX_SDK_HOME}/python:$PYTHONPATH # 保存退出.bashrc文件 # 执行如下命令使环境变量生效 source ~/.bashrc #查看环境变量 env ``` ## 3.3 模型转换 ### 3.3.1 YOLO模型转换 **步骤1** 在ModelZoo上下载YOLOv3模型。下载地址:https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4 **步骤2** 将获取到的YOLOv3模型pb文件存放至`./models/yolo/`。 **步骤3** 模型转换 在`./models/yolo`目录下执行一下命令 ```bash # 设置环境变量(请确认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 # 执行,转换YOLOv3模型 # Execute, transform YOLOv3 model. atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input/input_data: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" # 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 ``` 执行完模型转换脚本后,会生成相应的yolov3_tf_bs1_fp16.om模型文件。 ### 3.3.2 GoogLeNet_cars模型转换 > 注:步骤2只适用于从步骤1中下载的初始模型权重文件,在华为obs上下载的after-modify.caffemodel是已经更新到新版本caffe的权重文件,可跳过步骤1&2 **步骤1** 下载googlenet模型权重文件。下载地址:http://mmlab.ie.cuhk.edu.hk/datasets/comp_cars/googlenet_finetune_web_car_iter_10000.caffemodel **步骤2** 更新caffemodel文件: 由于此模型为老版本模型,atc不支持转换,需要将模型权重文件与结构文件更新,结构文件更新规则如下: ``` 一、换每个层的tpye: DATA -> "Data" CONVOLUTION -> "Convolution" RELU -> "ReLU" POOLING -> "Pooling" CONCAT -> "Concat" ACCURACY -> "Accuracy" SOFTMAX -> "Softmax" LRN -> "LRN" INNER_PRODUCT -> "InnerProduct" DROP_OUT -> "Dropout" 二、将 blobs_lr: 1 blobs_lr: 2 weight_decay: 1 weight_decay: 0 转换为: param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } 三、将layers转换为layer 四、将input层改写为layer 改写前: input: "data" input_dim: 10 input_dim: 3 input_dim: 224 input_dim: 224 ================ 改写后: layer { name: "data" type: "Input" top: "data" input_param { shape: { dim: 1 dim: 3 dim: 224 dim: 224 } } } ``` > 参考原文链接:https://blog.csdn.net/lsn_sgj/article/details/70482401 改写deploy.prototxt文件后,在安装caffe的环境下执行: ```python import caffe net = caffe.Net('deploy.prototxt', 'googlenet_finetune_web_car_iter_10000.caffemodel', 'test'); net.save('after-modify.caffemodel'); ``` 得到新版caffe权重文件`after-modify.caffemodel`。 >若环境没有安装caffe,也可以在此处: https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/VehicleIdentification/models.zip 获得已经转换好的`after-modify.caffemodel`文件。 **步骤3** AIPP配置 由于caffe模型的输入为bgr格式,pipeline中的图像解码为yuv格式,且数据类型不同,需要在atc转换模型时使用aipp预处理,aipp配置内容如下: ```json aipp_op { related_input_rank: 0 src_image_size_w: 224 src_image_size_h: 224 crop: false input_format: YUV420SP_U8 aipp_mode: static csc_switch: true rbuv_swap_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 } ``` **步骤4** 模型转换: 在`./models/googlenet`目录下执行一下命令 ```bash # 环境变量配置如3.1 atc --framework=0 --model=./deploy.prototxt --weight=./after-modify.caffemodel --input_shape="data:1,3,224,224" --input_format=NCHW --insert_op_conf=./insert_op.cfg --output=./googlenet --output_type=FP32 --soc_version=Ascend310 ``` 执行完模型转换脚本后,会生成相应的googlenet.om模型文件。 > 模型转换使用了ATC工具,如需更多信息请参考: https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0005.html # 4 车型推理流程开发实现 ## 4.1 pipeline编排 ``` appsrc # 输入 mxpi_imagedecoder # 图像解码 mxpi_imageresize # 图像缩放 mxpi_tensorinfer # 模型推理(车辆检测) mxpi_objectpostprocessor # 模型后处理(yolov3) mxpi_distributor # 数据分发(car/truck) mxpi_imagecrop # 抠图缩放 mxpi_tensorinfer # 模型推理(车型检测) mxpi_classpostprocessor # 模型后处理(googlenet) appsink # 输出 ``` ## 4.2 车型检测后处理库开发 参考分类识别模型后处理库开发。 > 参考链接:https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/quick_start/4-2%E6%A8%A1%E5%9E%8B%E5%90%8E%E5%A4%84%E7%90%86%E5%BA%93(%E5%86%85%E7%BD%AE%E7%B1%BB%E5%9E%8B)%E5%BC%80%E5%8F%91%E8%B0%83%E8%AF%95%E6%8C%87%E5%AF%BC.md ## 4.3 主程序开发 1、初始化流管理。 2、加载图像,进行推理。 3、获取pipeline各插件输出结果,解析输出结果。 4、根据识别结果在图上标出车辆车型信息和置信度 5、销毁流 详细流程参考如下流程图: ![流程图](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/10/1652184917082435270.png) ## 4.4 参数调节 | 参数名称 | 参数介绍 | 修改方法 | 默认值 | | ----------------- | -------------------------------------------------------- | ------------------------------------------------------------ | ------ | | CLASS_NUM | 车型识别模型能够识别的车型种类数量 | 在models/googlenet/vehiclepostprocess.cfg文件中修改CLASS_NUM的大小即可 | 431 | | SOFTMAX | 是否对车型识别模型的输出矩阵进行Softmax归一化 | 在models/googlenet/vehiclepostprocess.cfg文件中修改SOFTMAX为true或false | false | | SCORE_THRESH | 是否为框的阈值,大于此值才认定为框 | 在models/yolo/yolov3_tf_bs1_fp16.cfg文件中修改SCORE_THRESH的大小即可 | 0.6 | | IOU_THRESH | 两个框的IOU阈值,超过此值则被认定为同一个框,用于nms算法 | 在models/yolo/yolov3_tf_bs1_fp16.cfg文件中修改IOU_THRESH的大小即可 | 0.45 | | OBJECTNESS_THRESH | 识别目标置信度的阈值,大于阈值才会认定为目标 | 在models/yolo/yolov3_tf_bs1_fp16.cfg文件中修改OBJECTNESS_THRESH的大小即可 | 0.3 | # 5 编译与运行 示例步骤如下: **步骤1** 后处理插件库编译:在项目目录下执行 ```bash bash build.sh ``` 编译成功后,生成的`libvehiclepostprocess.so`后处理库文件位于`./lib`目录下。执行后终端输出为: ![plugin.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/10/1652167610354543985.jpg) **步骤2** 修改so文件权限: ```bash chmod 640 ./lib/libvehiclepostprocess.so ``` **步骤3** 自行选择一张或多张jpg文件,放入新建`./input`目录下,再执行 ```bash python3 main.py ``` 执行后会在终端按顺序输出车辆的车型信息和置信度 生成的结果图片中添加方框框出车辆,在方框左上角标出车型信息和置信度,按 **{原名}_result.jpg** 的命名规则存储在`./result`目录下,查看结果文件验证检测结果。 结果展示: ![resultlog.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/10/1652167682397901720.jpg) ![result.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/30/1651325336505330207.jpg) # 6 常见问题 ## 6.1 后处理库权限问题 **问题描述:** 提示Check Owner permission failed: Current permission is 7, but required no greater than 6. ![nochmod.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/10/1652167734036605149.jpg) **解决方案:** 后处理库so文件权限太高,需要降低权限至640:chmod 640 ./lib/libvehiclepostprocess.so ## 6.2 图片格式问题 **问题描述:** 提示Get picture description(width, height) failed. DVPP only support jpg. Device Soc: 310 ![png-jpg.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/30/1651325414073510392.jpg) **解决方案:** 输入图片不是真正的jpg格式,由png等文件强制转后缀而来,ACL不支持,需要转存为原生jpg格式 # 7 参考链接 > 用于车型识别的GoogLeNet_cars模型,参考链接:https://gist.github.com/bogger/b90eb88e31cd745525ae
  • [问题求助] 【OBS产品】【安装】Angular项目集成 OBS的对于的sdk,编译报错,无法使用
    安装 obs,使用的 npm install esdk-obs-nodejs 进行安装安装之后,项目编译就报错了(Angular12项目)在使用下面语句引入时,就会报错了var ObsClient = require('esdk-obs-nodejs');有没有遇到同样问题的,烦请大佬帮忙解答一下啊,感谢~
  • [问题求助] 【OBS】【生成下载对象的URL】c-sdk获取下载对象的临时URL无法使用浏览器访问
    【功能模块】c-sdk 生成下载对象的URL【操作步骤&问题现象】1、参考c-sdk的demo写了一个获取下载对象的临时url函数static void test_gen_signed_url_get_object(char *bucket_name, char *key, char *versionid)2、获取到的url不能直接在浏览器中访问【截图信息】个人代码:std::pair<obs_status, tempAuthResult>HuaWeiOBS::getObjectTemporaryAuth(const std::string &bucketName,                                  const std::string &keyName,                                  const std::string &versionId){    std::pair<obs_status, tempAuthResult> urlPair =        std::make_pair(OBS_STATUS_BUTT, tempAuthResult());    // obs options configure    m_obsOptions.bucket_options.bucket_name = const_cast<char *>(bucketName.data());    obs_options option;    init_obs_options(&option);    option.bucket_options.bucket_name = const_cast<char *>(bucketName.data());    option.bucket_options.access_key = m_accessKey.data();    option.bucket_options.secret_access_key = m_secretAccessKey.data();    option.bucket_options.host_name = m_hostName.data();    // key info configure    obs_object_info objectInfo;    memset(&objectInfo, 0, sizeof(objectInfo));    objectInfo.key = const_cast<char *>(keyName.data());    objectInfo.version_id  = NULL;    // condition    obs_get_conditions getcondition;    memset(&getcondition, 0, sizeof(obs_get_conditions));    init_get_properties(&getcondition);    getcondition.start_byte = 0;    getcondition.byte_count = 100;    // callback prepair    std::string objectContent;    objectContent.reserve(1024);    get_object_callback_data data{objectContent, OBS_STATUS_BUTT};    // 定义下载的回调函数    obs_get_object_handler getObjectHandler = {        {&response_properties_callback, &get_object_complete_callback},        &get_object_data_callback};    // down object    tempAuthResult ptrResult;    temp_auth_configure tempauth;    tempauth.callback_data = (void *)(&ptrResult);    tempauth.expires = 10;    tempauth.temp_auth_callback = &object_temp_auth_callback;    option.temp_auth = &tempauth;    get_object(&option, &objectInfo, &getcondition, 0, &getObjectHandler, &data);    if (OBS_STATUS_OK == data.ret_status)    {        printf("gen key: %s object temporary url successfully.\n", keyName.data());    }    else    {        printf("en key: %s object temporary url faied(%s).\n", keyName.data(), obs_get_status_name(data.ret_status));    }    urlPair.first = data.ret_status;    urlPair.second = ptrResult;    return urlPair;}【日志信息】(可选,上传日志内容或者附件)2022-05-18 10:45:38 657| CRIT|[140132699154304]==============log start============2022-05-18 10:45:38 657| WARN|[140132699154304]|obs_initialize OBS SDK Version= 3.21.82022-05-18 10:45:38 658| WARN|[140132699154304]|curl_easy_setopt curl path= https://dtu.obs.cn-south-1.myhuaweicloud.com/?apiversion2022-05-18 10:45:38 774| WARN|[140132699154304]|enter request perform!!!2022-05-18 10:45:38 774| WARN|[140132699154304]|src for urlEncode is NULL.2022-05-18 10:45:38 774| WARN|[140132699154304]|request_perform status = 02022-05-18 10:45:38 774| WARN|[140132699154304]|enter request perform!!!2022-05-18 10:45:38 774| WARN|[140132699154304]|src for urlEncode is NULL.2022-05-18 10:45:38 774| WARN|[140132699154304]|compose_auth_header request_perform : StringToSign:  HEADx-amz-date:Wed, 18 May 2022 02:45:38 GMT/dtu/Test_HuangLi/DTU/3F000000010010031A8200012022-05-18 10:45:38 845| WARN|[140132699154304]|Content-Type:2022-05-18 10:45:38 845| WARN|[140132699154304]|User-Agent: obs-sdk-c-3.21.82022-05-18 10:45:38 845| WARN|[140132699154304]|x-amz-date: Wed, 18 May 2022 02:45:38 GMT2022-05-18 10:45:38 845| WARN|[140132699154304]|request_finish request_finish status = 0,httpResponseCode = 4042022-05-18 10:45:38 845| WARN|[140132699154304]|Message: (null)2022-05-18 10:45:38 845| WARN|[140132699154304]|Request Id: 00000180D50E7F6C930F8F0EEAA391DC2022-05-18 10:45:38 845| WARN|[140132699154304]|Reserved Indicator: (null)2022-05-18 10:45:38 846| WARN|[140132699154304]|enter request perform!!!2022-05-18 10:45:38 846| WARN|[140132699154304]|src for urlEncode is NULL.2022-05-18 10:45:38 846| WARN|[140132699154304]|compose_auth_header request_perform : StringToSign:  HEADx-amz-date:Wed, 18 May 2022 02:45:38 GMT/dtu/Test_HuangLi/DTU/3F000000010010031A820001/DeviceDescription2022-05-18 10:45:38 908| WARN|[140132699154304]|obs_initialize OBS SDK Version= 3.21.82022-05-18 10:45:38 908| WARN|[140132699154304]|obs_initialize OBS SDK Version= 3.21.82022-05-18 10:45:38 908| WARN|[140132699154304]|curl_easy_setopt curl path= https://dtu.obs.cn-south-1.myhuaweicloud.com/?apiversion2022-05-18 10:45:38 962| WARN|[140132699154304]|enter request perform!!!2022-05-18 10:45:38 962| WARN|[140132699154304]|src for urlEncode is NULL.2022-05-18 10:45:38 962| WARN|[140132699154304]|src for urlEncode is NULL.2022-05-18 10:45:38 962| WARN|[140132699154304]|compose_auth_header request_perform : StringToSign:  GETx-obs-date:Wed, 18 May 2022 02:45:38 GMT/dtu/2022-05-18 10:47:28 622| CRIT|[140737353881472]==============log start============2022-05-18 10:47:28 622| WARN|[140737353881472]|obs_initialize OBS SDK Version= 3.21.82022-05-18 10:47:51 501| WARN|[140737353881472]|curl_easy_setopt curl path= https://dtu.obs.cn-south-1.myhuaweicloud.com/?apiversion2022-05-18 10:47:51 639| WARN|[140737353881472]|enter request perform!!!2022-05-18 10:47:51 639| WARN|[140737353881472]|src for urlEncode is NULL.2022-05-18 10:49:11 035| WARN|[140737353881472]|request_perform status = 0
  • [问题求助] 【OBS】【安装SDK】composer无法安装
    【功能模块】安装SDK【操作步骤&问题现象】php版本7.4  composer版本2.3.51、运行composer require obs/esdk-obs-php执行安装。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [行业资讯] 发布新版物联网软件开发工具包-Gecko SDK v4.0
    Silicon Labs(亦称“芯科科技”)近期发布了 Gecko软件开发工具包( GSDK)的 v4.0新版本。 GSDK是我们专注于物联网的软件开发平台,最新发布的 GSDK使开发者能够构建具有先进智能家居生态系统功能、新的无线协议和强大安全性的物联网设备与应用程序。以下是 GSDK v4.0的重点新增功能,您可以点击文末的 阅读原文或通过下方链接访问 Silicon Labs在线社群阅读完整内容: https://community.silabs.com/s/share/a5U8Y000000MbJeUAK/new-iot-software-development-kit-release-silicon-labs-gecko-sdk-v40?language=en_USGSDK v4.0的功能亮点Zigbee和Bluetooth® Low Energy动态多协议(DMP)代码大小缩减Silicon Labs GSDK 4.0启用了主机设备支持,并删除了使用 project IDE启用 Application RTOS任务的功能。在运行时使用来自主机的 EZSP命令增加 NCP内存分配大小的功能与 SLC架构不兼容,因此也被删除了。 Flash和 RAM的代码大小优化仍在继续。与 GSDK 3.1 (20Q4 SDK) 相比,动态多协议轻应用程序目前的状态是在 Flash中减少了 102kB,在 RAM中减少了 13kB。动态多协议解决方案对无线电进行时间切片,并快速更改配置,以使不同的无线协议能够同时可靠地运行。Wi-SUN边界路由器认证GSDK 4.0现在为开发者提供了 FAN 1.0认证的 Wi-SUN边界路由器参考设计和 Wi-SUN网络测量应用程序,允许 Wi-SUN网络和外部 IPv6网络之间的 IP通信。 Silicon Labs经 认证的 Wi-SUN FAN边界路由器基于 Linux主机 + 无线电协处理器 (Radio Co-Processor, RCP)架构,具有可扩展性和灵活性,允许在 Wi-SUN堆栈上开发应用程序层。通过 FAN认证的 Wi-SUN边界路由器参考解决方案扩展的 Wi-SUN组合,还允许客户开发、认证和部署商用边界路由器,从而加快上市时间并降低成本。Zigbee和Z-Wave—现在由通用配置器/通用平台(UC/UP) 支持Zigbee和 Z-Wave是可靠、可扩展和安全的低功耗网状无线网络协议,使用简单、可靠的无线电波,提供广泛的覆盖范围和可互操作的无线解决方案。随着 Zigbee和 Z-Wave转移到通用配置器 /通用平台 (UC/UP) , GSDK 4.0现在为开发者提供了搜索和过滤与目标设备一起工作的软件组件的能力。开发者还可以通过 GitHub或其他 SCM工具引入所有组件依赖项和初始化代码,并管理项目源代码。配置验证可用于提醒开发者错误或问题,从 Silicon Labs开发工具包到定制硬件的转换也已被简化了。GSDK发布现在可以通过GitHub访问GitHub是一个分布式版本控制和代码托管平台,允许开发者在任何地方一起构建软件并进行协作。它是一个用于所有 GSDK内容的简单易用的存储库,客户可以通过 Git客户端或 Simplicity Studio直接访问它。 Silicon Labs现在为开发者提供了使用他们喜欢的 Git客户端来克隆 GSDK最新版本(默认)或特定分支 /补丁 /版本。现在,开发者不再需要安装 Simplicity Studio IDE来访问 GSDK发行版。它还将支持只需要 SDK、 CLI工具和一个受支持的第三方嵌入式工具链的开发人员用例。蓝牙低功耗移动应用程序 “EFR Connect”Silicon Labs EFR Connect是一款 BLE移动应用程序,可以更快更轻松地开发 BLE应用程序。使用 EFR Connect,你可以快速排除蓝牙 LE嵌入式应用程序代码、无线 (Over-the-Air, OTA)固件更新、数据吞吐量以及与 Android和 iOS移动设备的互操作性问题。它通过蓝牙 LE提供了进行 Wi-Fi配置和调试的功能,这也可以通过 Silicon Labs RS9116W模块实现。请注意,发布包中提供了一些示例。 EFR Connect Bluetooth LE应用程序在移动设备上运行,使用移动设备上的蓝牙适配器扫描、连接附近的 Bluetooth LE硬件并与之交互,只需轻触移动设备即可。
  • [经验分享] 基于MindStudio的MindX SDK应用开发全流程
    基于MindStudio的MindX SDK应用开发全流程bilibili视频链接:基于MindStudio的MindX SDK应用开发全流程_哔哩哔哩_bilibili一、MindX SDK介绍MindX SDK提供昇腾AI处理器加速的各类AI软件开发套件(SDK),提供极简易用的API,加速AI应用的开发。应用开发旨在使用华为提供的SDK和应用案例快速开发并部署人工智能应用,是基于现有模型、使用pyACL提供的Python语言API库开发深度神经网络应用,用于实现目标识别、图像分类等功能。通过MindStudio实现SDK应用开发分为基础开发与深入开发,通常情况下用户关注基础开发即可,基础开发主要包含如何通过现有的插件构建业务流并实现业务数据对接,采用模块化的设计理念,将业务流程中的各个功能单元封装成独立的插件,通过插件的串接快速构建推理业务。图1 MindX SDK总体结构mxManufacture & mxVision关键特性:• 配置文件快速构建AI推理业务。• 插件化开发模式,将整个推理流程“插件化”,每个插件提供一种功能,通过组装不同的插件,灵活适配推理业务流程。• 提供丰富的插件库,用户可根据业务需求组合Jpeg解码、抠图、缩放、模型推理、数据序列化等插件。• 基于Ascend Computing Language(ACL),提供常用功能的高级API,如模型推理、解码、预处理等,简化Ascend芯片应用开发。• 支持自定义插件开发,用户可快速地将自己的业务逻辑封装成插件,打造自己的应用插件。二、MindX SDK安装1、Windows安装MindStudioMindStudio可以单独安装在Windows上。在安装MindStudio前需要在Linux服务器上安装部署好Ascend-cann-toolkit开发套件包,之后在Windows上安装MindStudio,安装完成后通过配置远程连接的方式建立MindStudio所在的Windows服务器与Ascend-cann-toolkit开发套件包所在的Linux服务器的连接,实现全流程开发功能。具体安装流程可以参考Windows安装MindStudio ,MindStudio环境搭建指导视频 。图1 开发运行场景(共部署形态)2、Windows安装MindX SDK步骤1 Windows场景下基于MindStuido的SDK应用开发,请先确保远端环境上MindX SDK软件包已安装完成,安装方式请参见《mxManufacture 用户指南》 和《mxVision 用户指南》 的“使用命令行方式开发”>“安装MindX SDK开发套件”章节。步骤2 在Windows本地进入工程创建页面,工具栏点击File > Settings > Appearance & Behavior > System Settings > MindX SDK进入MindX SDK管理界面。界面中MindX SDK Location为软件包的默认安装路径,默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。单击Install SDK进入Installation settings界面,如图2。• Remote Connection:远程连接的用户及IP。• Remote CANN Location:远端环境上CANN开发套件包的路径,请配置到版本号一级。• Remote SDK Location:远端环境上SDK的路径,请配置到版本号一级。IDE将同步该层级下的include、opensource、python、samples文件夹到本地Windows环境,层级选择错误将导致安装失败。• Local SDK Location:同步远端环境上SDK文件夹到本地的路径。默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。图2 Installation settings步骤3 单击OK结束,返回SDK管理界面,可查看安装后的SDK的信息,如图3所示,可单击OK结束安装流程。图3 安装完成后的MindX SDK管理界面三、推理业务开发与运行流程1、业务流程典型推理业务流程如图1所示,先通过目标检测获取目标坐标,然后通过图像分类识别目标属性。流程中有两次图像缩放的操作,两者主要区别在于设置的缩放宽高参数不同。图1 典型推理业务流程2、开发运行流程使用MindStudio开发和运行推理业务步骤如图 2 所示。其中插件开发和后处理模块开发输入为SDK高级特性,用户可以视情况选择。图2 推理业务开发与运行流程步骤1 确定业务流程:根据业务功能如目标检测、图像分类、属性识别等,将业务流程进行模块化。步骤2 寻找合适插件:首先根据已有SDK插件的功能描述和规格限制来匹配业务功能,如图3所示。当SDK提供的插件无法满足功能需求时,用户可以开发自定义插件。请参见插件开发 、准备文档 中《mxManufacture 用户指南》 或《mxVision 用户指南》 的“已有插件介绍”与“插件开发介绍”章节。图3 业务流程匹配插件步骤3 准备推理模型文件与数据:详见本文档8、准备输入图片和下载模型 ,9、模型转换功能介绍,相关按钮菜单功能和操作步骤讲解 。步骤4 流程编排:详见本文档4、可视化流程编排介绍 。步骤5 业务集成:编写C++程序或Python程序,调用业务流管理的API(MxStreamManager),先进行初始化,再加载业务流配置文件(*.pipeline),然后根据stream配置文件中的StreamName往指定Stream获取输出数据,最后销毁Stream。可用API请参见《mxManufacture 用户指南》 或《mxVision 用户指南》 的“API参考(C++)”章节与“API参考(Python)”章节。步骤6 编译与运行应用:详见本文档10、编译基本概念介绍和MindStudio 编译相关按钮菜单功能和操作步骤讲解 ,11、运行基本概念介绍和MindStudio 运行相关按钮菜单功能和操作步骤讲解 。四、可视化流程编排介绍1、SDK基础概念通过stream(业务流)配置文件,Stream manager(业务流管理模块)可识别需要构建的element(功能元件)以及element之间的连接关系,并启动业务流程。Stream manager对外提供接口,用于向stream发送数据和获取结果,帮助用户实现业务对接。Plugin(功能插件)表示业务流程中的基础模块,通过element的串接构建成一个stream。Buffer(插件缓存)用于内部挂载解码前后的视频、图像数据,是element之间传递的数据结构,同时也允许用户挂载Metadata(插件元数据),用于存放结构化数据(如目标检测结果)或过程数据(如缩放后的图像)。图1 SDK业务流程相关基础单元2、可视化流程编排MindX SDK实现功能的最小粒度是插件,每一个插件实现特定的功能,如图片解码、图片缩放等。流程编排是将这些插件按照合理的顺序编排,实现负责的功能。可视化流程编排是以可视化的方式,开发数据流图,生成pipeline文件供应用框架使用。图 2 为推理业务流Stream配置文件pipeline样例。配置文件以json格式编写,用户必须指定业务流名称、元件名称和插件名称,并根据需要,补充元件属性和下游元件名称信息。步骤1 进入工程创建页面,用户可通过以下方式开始流程编排。在顶部菜单栏中选择Ascend>MindX SDK Pipeline,打开空白的pipeline绘制界面绘制,也可打开用户自行绘制好的pipeline文件,如图3。绘制界面分为左侧插件库、中间编辑区、右侧插件属性展示区,具体参考pipeline绘制 。步骤2 在左侧编辑框选择插件,拖动至中间编辑框,按照用户的业务流程进行连接。如果拖动错误插件或者错误连线,选中错误插件或者错误连线单击键盘Del键删除。用户自定义的流水线绘制完成后,选中流水线中的所有插件,右键选择Set Stream Name设置Stream名称,如果有多条流水线则需要对每一条流水线设置Stream名称。绘制完成单击Save保存。图2 Detection and Classification配置pipeline样例图3 pipeline绘制界面五、Detection and Classification介绍目标检测和分类是推理应用开发中常见的功能,用户通过调用API,向推理业务发送图像或视频,等待推理服务返回目标的坐标(目标检测插件输出)和图像分类结果。用于展示结果的图形界面,需要用户自行开发。图1 Detection and Classification推理业务图2 Detection and Classification六、创建工程1、新建应用工程方式步骤1 进入工程创建页面。首次登录MindStudio:单击New Project。非首次登录MindStudio:在顶部菜单栏中选择File > New > Project...。步骤2 在New Project窗口中,选择Ascend App,按图1配置工程。图1 创建工程配置点击Install后,远端CANN安装配置如图2所示,图2 远端CANN配置SSH连接配置如图3所示,配置好后点击Test Connection,出现 ”Sucessfully connected!“即配置成功。图3 SSH连接配置步骤3 单击Next,在New Project窗口中,选择工程类型。单击Finish,完成工程创建。如图4。若工程类型名称显示不全,鼠标悬停于工程类型名称处,则工程类型名称可以完整显示。2、导入应用工程方式首次登录MindStudio:在MindStudio欢迎界面中单击“Open”,选择需要导入的工程,单击“OK”确认导入。进入工程创建页面,在顶部菜单栏中选择File > Open...,选择现有工程打开。成功导入工程后,工程目录以树状呈现,请以实际创建结果为准。图4 基于MindX SDK开发的应用工程七、工程目录结构介绍以下两项为MindX SDK空白工程,仅包括开发框架的工程,不含具体的代码逻辑• MindX SDK Project(C/C++):├── 工程名├── build //存放cmake依赖文件│ └── cmake├── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件├── config│ ├── logging.conf //日志配置文件│ └── sdk.conf├── out //存放编译出的可执行文件│ └── config└── src├── CMakeLists.txt //编译脚本└── main.cpp //主函数的实现文件,当前主函数内无代码逻辑• MindX SDK Project(Python):├── 工程名├── models //存放模型相关文件│ ├── bert    │ ├── fasterrcnn│ ├── resnet50│ └── yolov3├── pipeline //存放pipeline文件│ ├── BertMultiPorts.pipeline│ ├── FasterRcnn.pipeline│ ├── Sample.pipeline│ ├── SamplePlugin.pipeline│ ├── SplitterNms.pipeline│ └── VideoObjectDetection.pipeline└── python //存放Python脚本文件├── main.py├── main_tensorinfer.py├── README.md└── run.sh以下两项为MindX SDK样例工程,基于MindX SDK开发的模板工程• Detection and Classification(C++):├── 工程名├── build //存放cmake依赖文件├── C++ //存放cmake依赖文件│ ├── bert_input│ ├── CMakeLists.txt //实际的编译脚本文件│ ├── main.cpp //样例入口│ ├── main_tensorinfer.cpp│ ├── README.md //样例代码说明│ └── run.sh├── models //存放模型相关文件│ ├── bert //此样例中未用到│ ├── fasterrcnn //此样例中未用到│ ├── resnet50│ └── yolov3└── pipeline //存放pipeline文件│ ├── BertMultiPorts.pipeline│ ├── FasterRcnn.pipeline│ ├── Sample.pipeline│ ├── SamplePlugin.pipeline│ ├── SplitterNms.pipeline│ └── VideoObjectDetection.pipeline└── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件• Detection and Classification(Python):├── 工程名├── models //存放模型相关文件│ ├── bert│ ├── fasterrcnn│ ├── resnet50│ └── yolov3├── pipeline //存放pipeline文件│ ├── BertMultiPorts.pipeline│ ├── FasterRcnn.pipeline│ ├── Sample.pipeline│ ├── SamplePlugin.pipeline│ ├── SplitterNms.pipeline│ └── VideoObjectDetection.pipeline└── python //存放Python脚本文件├── main.py //样例入口├── main_tensorinfer.py├── README.md //样例代码说明└── run.sh八、准备输入图片和下载模型根据插件的实际应用场景,添加用于推理的模型文件和数据集。本文档的输入图片和下载模型以Detection and Classification样例工程所需为例进行操作。• 准备推理数据MindX SDK样例工程需要用户下载样例的输入图片(例如一张包含动物的图片),命名为test.jpg。新建Detection and Classification(C++)请上传到工程文件夹的“C++”目录下,新建Detection and Classification(Python)请上传到工程文件夹的“python”目录下,若目录不存在请自行创建。• 添加模型文件在ModelZoo上下载YOLOv3模型pb文件 ,下载地址 ;ResNet50模型pb文件,下载地址 。进入模型页面后,关键词搜索:YOLOv3或者ResNet-50,应用级别:Released,框架:TensorFlow选择“历史版本”中版本1.1下载。九、 模型转换功能介绍,相关按钮菜单功能和操作步骤讲解用户使用Caffe/TensorFlow等框架训练好的第三方模型,可通过ATC工具将其转换为昇腾AI处理器支持的离线模型(*.om文件),模型转换过程中可以实现算子调度的优化、权重数据重排、内存使用优化等,可以脱离设备完成模型的预处理,详细架构如图1所示。图1 ATC工具功能架构Detection and Classification样例工程须在Python 3.9环境下运行,远端环境安装的MindX SDK为2.0.4版本,当前PythonV2接口仅支持在Python3.9的环境中使用。在模型转换和样例编译运行前请先准备环境,本地和服务器环境变量相关配置详见本文档12、FAQ 。模型转换步骤以Detection and Classification样例工程所需模型为例进行操作,MindStudio模型转换工具的详细使用和参数说明请参考MindStudio用户手册--模型转换 。可以通过如下两种方式进入模型转换界面:在菜单栏选择“Ascend > Model Converter”。在菜单栏选择“View > Appearance > Toolbar”,菜单栏下方会出现一行工具栏,选择。步骤1 打开模型转换页面,在“Model Information”页签中上传模型文件,加载成功后,会自动填充下列参数信息,页面参数配置指导如下:(Model Name是生成的om模型文件名称,如图是Detection and Classification样例工程代码中设置好的名称,用户可以根据需要自行修改名称。)• Model File:获取模型pb文件后,选择上传到环境中的模型pb文件路径。需要选择到pb文件一级。• Model Name:转换YOLOv3模型时请以yolov3_tf_bs1_fp16命名。转换ResNet50模型时请以resnet50_aipp_tf命名。• Target SoC Version:模型转换时指定芯片版本。转换YOLOv3模型与转换ResNet50模型无差异,请根据使用    的芯片类型选择。• Input Format:输入数据格式。转换YOLOv3模型与转换ResNet50模型无差异,请使用默认设置,不需    要修改。• input/input_data:转换YOLOv3模型时,输入Shape请使用1,416,416,3,输入Type请使用FP32。转换ResNet50模型时,输入Shape请使用1,224,224,3,输入Type请使用FP32。• Output Nodes:指定输出节点信息。转换YOLOv3模型时,请选择Conv_22/BiasAdd、Conv_14/BiasAdd、 Conv_6/BiasAdd三项。在搜索出的节点上,右击Select选中,单击“OK” 后,在“Output Nodes”参数下面会看到标记层的算子。转换ResNet50模型时,无需选择Output Nodes。图2 YOLOv3模型参数配置图3  YOLOv3模型图图4 ResNet50模型参数配置步骤2 单击Next,进入Data Pre-Processiong页面,参照图5作为示例配置参数。详细请参考配置数据预处理 。图5 Data Pre-Processiong步骤3 单击Next,进入Advanced Options Preview页面,参照图6配置参数。Additional Arguments处请填写模型aipp配置文件的绝对路径,请用户自行替换。Command Preview展示了模型转换使用的atc参数预览。转换YOLOv3模型时请配置:--insert_op_conf=${配置文件上传路径}/aipp_yolov3_416_416.aippconfig转换ResNet50模型时请配置:--insert_op_conf=${配置文件上传路径}/aipp_resnet50_224_224.aippconfig图6 Advanced Options Preview步骤4 单击Finish开始模型转换,在MindStudio界面下方,“Output”窗口会显示模型转换过程中的日志信息,如果提示**“Model converted successfully”**,则表示模型转换成功。“Output”窗口会显示模型转换所用的命令、所设置的环境变量、模型转换的结果、模型输出路径以及模型转换日志路径等信息。步骤5 转换完成的模型om文件生成在“$HOME/modelzoo”下,请分别移动放置于“工程文件根目录/models/resnet50”和“工程文件根目录/models/yolov3”下。十、 编译基本概念介绍和MindStudio 编译相关按钮菜单功能和操作步骤讲解若新建的工程为Python版本的应用工程,由于不需要执行“编译应用工程”,在MindStudio工程界面中“Build > Edit Build Configuration...”会置灰,不可以使用。远端编译时,会对工程文件夹进行目录拷贝到远端连接的环境,工程文件夹中dump、model、profiling目录不会被拷贝。步骤1 在MindStudio工程界面,依次选择“Build > Edit Build Configuration”,进入编译配置页面,配置完成后单击“Save”保存编译配置。图1 编译配置步骤2 单击“Build”编译工程。如果在编译过程中无错误提示,且编译进度到“100%”,则表示编译成功,如图。十一、 运行基本概念介绍和MindStudio 运行相关按钮菜单功能和操作步骤讲解步骤1 在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。选择“Ascend App > 工程名”配置应用工程运行参数,图1为配置示例。配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。步骤2 在MindStudio工程界面,依次选择“Run > Run...”。在弹出框中选择已创建好的运行配置信息,运行应用。图1 运行参数配置• 如果在运行过程中无错误提示,且提示“Running *** finished”,则表示运行结束,如图1。图2为SDK样例工程运行成功的返回示例。• 如果运行过程中有错误提示,且需要查看运行环境的详细日志时,请参见《日志参考》 :可参见“日志文件介绍”查看日志,日志文件路径默认为“$HOME/ascend/log ”。可参见“设置日志级别”查看或修改日志级别(默认为ERROR)。表1 运行配置参数说明图1 运行成功日志图2 分类检测结果输入:测试图片test.jpg输出:图片检测分类结果(className所示为猪在英语中的多种叫法)十二、FAQ• MindStudio导入应用工程后,提示“No Python interpreter configured for the module”解决方案:步骤1 在顶部菜单栏中选择File > Project Structure,在Project Structure窗口中,点击Platform Settings > SDKs,点击上方的“+”添加Python SDK,从本地环境中导入Python3.9。步骤2 点击Project Settings > Project,选择上一步添加的Python SDK。步骤3 点击Project Settings > Modules,选中“MyApp”,点击“+”后选择Python,为Python Interpreter选择上述添加的Python SDK。点击OK完成应用工程Python SDK配置。• Linux安装python3.9后没有共享库libpython3.9m.so.1.0,执行查找命令find / -name libpython3.9.so.1.0也没有解决方案:编译选项中,增加--with-ssl./configure --prefix=/usr/local/python3.9 --enable-shared --with-ssl安装python3.9后,将libpython3.9.so.1.0拷贝至/usr/lib64/路径下,没有lib64就放在lib下;执行以下命令清除历史缓存rm-/.cache/gstreamer-1.0/registry.x86_64.bin(根据具体运行环境选择x86_64.bin或者aarch64.bin)来清除gstreamer的历史缓存,再次运行程序。• 环境变量相关解决方案:在远程环境中使用env指令查看所需环境变量值,请仔细检查自己的环境变量与所给的环境变量是否有差别,若缺少路径,执行vi .bashrc命令,打开.bashrc文件,在.bashrc文件中添加缺少的环境变量。:wq!保存退出后,执行source ~/.bashrc命令使环境变量生效。# 远端环境上安装的SDK路径。与安装时的选择要一致。譬如安装时选择了远端环境的mxManufacture路径,此处如果配置mxVision路径将会导致失败MX_SDK_HOME=/usr/local/Ascend/mxVision-2.0.4LD_LIBRARY_PATH=/usr/local/python3.9/lib:/usr/local/Ascend/ascend-toolkit/5.0.4/x86_64-linux/runtime/lib64:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH}PYTHONPATH=/usr/local/python3.9/lib/python3.9/site-packages:/usr/local/Ascend/ascend-toolkit/5.0.4/x86_64-linux/python/site-packages/acl:${MX_SDK_HOME}/python:$PYTHONPATHPATH=/usr/local/python3.9/bin:$PATH# MindX SDK扫描插件程序的路径GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner# MindX SDK扫描并加载插件的路径GST_PLUGIN_PATH=${MX_SDK_HOME}/lib/plugins:${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${GST_PLUGIN_PATH}Python项目无需在Run > Configurations > Environment Variables中部署环境变量,在应用开发开始前修改远端环境中的.bashrc文件,添加下述内容:#如果用户环境存在多个python3版本,则指定使用python3.9版本export PATH=/usr/local/python3.9/bin:$PATH#添加python3.9库文件路径export LD_LIBRARY_PATH=/usr/local/python3.9/lib:$LD_LIBRARY_PATHexport PYTHONPATH=/usr/local/python3.9/lib/python3.9/site-packages:$PYTHONPATHsource /usr/local/Ascend/ascend-toolkit/set_env.shsource /usr/local/Ascend/mxVision-2.0.4/set_env.sh• om模型路径问题解决方案:没有模型文件,Detection and Classification样例工程所需resnet50和yolov3的om文件都要分别放到工程根目录中models的resnet50和yolov3目录下。欢迎大家到昇腾相关生态获取更多内容昇腾官网:昇腾社区-官网丨昇腾万里 让智能无所不及 (hiascend.com) 昇腾论坛:昇腾论坛_开发者论坛-华为云论坛 (huaweicloud.com)
  • [技术干货] 【昇腾AI系列】 在200DK上安装MindX SDK
    MindX SDK 是华为推出的软件开发套件(SDK),提供极简易用、高性能的API和工具,助力昇腾AI处理器赋能各应用场景。 安装SDK:在/home/HwHiAiUser目录下新建MindX_SDK文件夹。执行 ./Ascend-mindxsdk-mxvision_2.0.3_linux-aarch64.run --install 注意:这里我后面改成了2.0.3去安装了。我没安装2.0.4版本的MindX SDK是因为我的Python版本是3.7.5。之前安装2.0.4版本翻车了。无奈又重新卸载安装了2.0.3 安装后如下所示:mxVision是一个软链接,修改.bashrc文件我们来看一下mxVision文件夹下的内容:Mindx sdk的官方插件以及我们自己开发的插件以so包的形式存放在lib中,头文件在include中。 samples下有一个mxVision的案例,下面的内容如下:c++和python是样例程序pipeline是demo的样例models存放模型,样例中存放了如下模型:Streamserver是业务流的实现。通过stream配置文件, Stream manager可识别需要构建的element以及element之间的连接关系,并启动业务流程。 Stream manager对外提供接口,用于向stream发送数据和获取结果,帮助用户实现业务对接。plugin表示业务流程中的基础模块,通过element的串接构建成一个stream。 buffer用于内部挂载解码前后的视频、图像数据,是element之间传递的数据结构,同时也允许用户挂载元数据( Metadata),用于存放结构化数据(如目标检测结果)或过程数据(如缩放后的图像) 到这里,我们的MindX SDK就可以用了。  
总条数:685 到第
上滑加载中