您当前的位置: 首页 >  华为

RuiH.AI

暂无认证

  • 3浏览

    0关注

    274博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

华为昇腾Atlas200DK. CANN模型推理——目标检测结果不对(无检测结果)的问题解决

RuiH.AI 发布时间:2021-08-01 17:30:00 ,浏览量:3

目录
  • 前言
  • 问题描述
    • 问题排查1.后处理模块
    • 问题排查2.预处理模块
    • 问题排查3.模型
    • 问题排查4.算法bug
    • 问题排查5.AI板卡
    • 问题排查6.模型精度
    • 问题排查6.模型推理
  • 问题解决:模型输入数据与预处理不同
  • 后记

前言

上周我在华为昇腾Atlas200DK中部署nanodet和yolov5时,出现了目标检测结果不对(没有检测到任何物体),困扰了整整三天,最后找到原因并圆满解决,在这里记录一下debug过程。

以上测试均在python中完成。

问题描述

第一天上午,我首先将nanodet由pytorch的.pth模型转换为.onnx模型,并通过cv2.dnn模块实现仅依赖于opencv的nanodet推理部署main_nanodet.py,该部署文件能够得到正确的检测结果。

随后,我通过atlas_utils(上一篇博客中提到的CANN官方封装接口)将main_nanodet.py改造成在CANN上推理部署的acl_nanodet.py,并且仔细梳理了该acl实现的流程和细节,如下图所示:

#mermaid-svg-TnJK7eEA7rHSOpy3 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .label text{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .node rect,#mermaid-svg-TnJK7eEA7rHSOpy3 .node circle,#mermaid-svg-TnJK7eEA7rHSOpy3 .node ellipse,#mermaid-svg-TnJK7eEA7rHSOpy3 .node polygon,#mermaid-svg-TnJK7eEA7rHSOpy3 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-TnJK7eEA7rHSOpy3 .node .label{text-align:center;fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .node.clickable{cursor:pointer}#mermaid-svg-TnJK7eEA7rHSOpy3 .arrowheadPath{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-TnJK7eEA7rHSOpy3 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-TnJK7eEA7rHSOpy3 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-TnJK7eEA7rHSOpy3 .edgeLabel rect{opacity:0.9}#mermaid-svg-TnJK7eEA7rHSOpy3 .edgeLabel span{color:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-TnJK7eEA7rHSOpy3 .cluster text{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-TnJK7eEA7rHSOpy3 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-TnJK7eEA7rHSOpy3 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-TnJK7eEA7rHSOpy3 .actor-line{stroke:grey}#mermaid-svg-TnJK7eEA7rHSOpy3 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .sequenceNumber{fill:#fff}#mermaid-svg-TnJK7eEA7rHSOpy3 #sequencenumber{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .messageText{fill:#333;stroke:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-TnJK7eEA7rHSOpy3 .labelText,#mermaid-svg-TnJK7eEA7rHSOpy3 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-TnJK7eEA7rHSOpy3 .loopText,#mermaid-svg-TnJK7eEA7rHSOpy3 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-TnJK7eEA7rHSOpy3 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-TnJK7eEA7rHSOpy3 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-TnJK7eEA7rHSOpy3 .noteText,#mermaid-svg-TnJK7eEA7rHSOpy3 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-TnJK7eEA7rHSOpy3 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-TnJK7eEA7rHSOpy3 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-TnJK7eEA7rHSOpy3 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-TnJK7eEA7rHSOpy3 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .section{stroke:none;opacity:0.2}#mermaid-svg-TnJK7eEA7rHSOpy3 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-TnJK7eEA7rHSOpy3 .section2{fill:#fff400}#mermaid-svg-TnJK7eEA7rHSOpy3 .section1,#mermaid-svg-TnJK7eEA7rHSOpy3 .section3{fill:#fff;opacity:0.2}#mermaid-svg-TnJK7eEA7rHSOpy3 .sectionTitle0{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .sectionTitle1{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .sectionTitle2{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .sectionTitle3{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-TnJK7eEA7rHSOpy3 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .grid path{stroke-width:0}#mermaid-svg-TnJK7eEA7rHSOpy3 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-TnJK7eEA7rHSOpy3 .task{stroke-width:2}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskText:not([font-size]){font-size:11px}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-TnJK7eEA7rHSOpy3 .task.clickable{cursor:pointer}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskText0,#mermaid-svg-TnJK7eEA7rHSOpy3 .taskText1,#mermaid-svg-TnJK7eEA7rHSOpy3 .taskText2,#mermaid-svg-TnJK7eEA7rHSOpy3 .taskText3{fill:#fff}#mermaid-svg-TnJK7eEA7rHSOpy3 .task0,#mermaid-svg-TnJK7eEA7rHSOpy3 .task1,#mermaid-svg-TnJK7eEA7rHSOpy3 .task2,#mermaid-svg-TnJK7eEA7rHSOpy3 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutside0,#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutside2{fill:#000}#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutside1,#mermaid-svg-TnJK7eEA7rHSOpy3 .taskTextOutside3{fill:#000}#mermaid-svg-TnJK7eEA7rHSOpy3 .active0,#mermaid-svg-TnJK7eEA7rHSOpy3 .active1,#mermaid-svg-TnJK7eEA7rHSOpy3 .active2,#mermaid-svg-TnJK7eEA7rHSOpy3 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-TnJK7eEA7rHSOpy3 .activeText0,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeText1,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeText2,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeText3{fill:#000 !important}#mermaid-svg-TnJK7eEA7rHSOpy3 .done0,#mermaid-svg-TnJK7eEA7rHSOpy3 .done1,#mermaid-svg-TnJK7eEA7rHSOpy3 .done2,#mermaid-svg-TnJK7eEA7rHSOpy3 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-TnJK7eEA7rHSOpy3 .doneText0,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneText1,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneText2,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneText3{fill:#000 !important}#mermaid-svg-TnJK7eEA7rHSOpy3 .crit0,#mermaid-svg-TnJK7eEA7rHSOpy3 .crit1,#mermaid-svg-TnJK7eEA7rHSOpy3 .crit2,#mermaid-svg-TnJK7eEA7rHSOpy3 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCrit0,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCrit1,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCrit2,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCrit0,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCrit1,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCrit2,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-TnJK7eEA7rHSOpy3 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-TnJK7eEA7rHSOpy3 .milestoneText{font-style:italic}#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCritText0,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCritText1,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCritText2,#mermaid-svg-TnJK7eEA7rHSOpy3 .doneCritText3{fill:#000 !important}#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCritText0,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCritText1,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCritText2,#mermaid-svg-TnJK7eEA7rHSOpy3 .activeCritText3{fill:#000 !important}#mermaid-svg-TnJK7eEA7rHSOpy3 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-TnJK7eEA7rHSOpy3 g.classGroup text .title{font-weight:bolder}#mermaid-svg-TnJK7eEA7rHSOpy3 g.clickable{cursor:pointer}#mermaid-svg-TnJK7eEA7rHSOpy3 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-TnJK7eEA7rHSOpy3 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-TnJK7eEA7rHSOpy3 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-TnJK7eEA7rHSOpy3 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-TnJK7eEA7rHSOpy3 .dashed-line{stroke-dasharray:3}#mermaid-svg-TnJK7eEA7rHSOpy3 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 .commit-id,#mermaid-svg-TnJK7eEA7rHSOpy3 .commit-msg,#mermaid-svg-TnJK7eEA7rHSOpy3 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-TnJK7eEA7rHSOpy3 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-TnJK7eEA7rHSOpy3 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-TnJK7eEA7rHSOpy3 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-TnJK7eEA7rHSOpy3 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-TnJK7eEA7rHSOpy3 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-TnJK7eEA7rHSOpy3 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-TnJK7eEA7rHSOpy3 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-TnJK7eEA7rHSOpy3 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-TnJK7eEA7rHSOpy3 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-TnJK7eEA7rHSOpy3 .edgeLabel text{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-TnJK7eEA7rHSOpy3 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-TnJK7eEA7rHSOpy3 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-TnJK7eEA7rHSOpy3 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-TnJK7eEA7rHSOpy3 .note-edge{stroke-dasharray:5}#mermaid-svg-TnJK7eEA7rHSOpy3 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-TnJK7eEA7rHSOpy3 .error-icon{fill:#522}#mermaid-svg-TnJK7eEA7rHSOpy3 .error-text{fill:#522;stroke:#522}#mermaid-svg-TnJK7eEA7rHSOpy3 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-TnJK7eEA7rHSOpy3 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-TnJK7eEA7rHSOpy3 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-TnJK7eEA7rHSOpy3 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-TnJK7eEA7rHSOpy3 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-TnJK7eEA7rHSOpy3 .marker{fill:#333}#mermaid-svg-TnJK7eEA7rHSOpy3 .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-TnJK7eEA7rHSOpy3 { color: rgba(0, 0, 0, 0.75); font: ; }
Environment
Process
CANN模型加载
pyACL初始化
python模块导入
np后处理
CANN模型推理
np图像预处理
cv2读入图像数据

其中预处理模块如下:

    def pre_process(self, image):
        """
        preprocess
        """
        image_resized = self.padding_resize_image(image)
        image_norm = self._normalize(image_resized.astype(np.float32))
        image_inp = np.transpose(image_norm, (2, 0, 1))
        return image_inp

然后通过CANN atc工具将.onnx模型转换成为.om模型,并运行acl_nanodet.py,运行中无任何报错,后处理模块将输出结果保存在了outputs文件夹中

随后我通过ssh scp工具将结果拷贝到主机上,发现没有任何检测框,开始查错(踩坑)。

问题排查1.后处理模块

我将acl_nanodet.py中模型推理execute()的结果打印出来,发现模型推理有输出,而后处理没有检测出目标,合理怀疑时后处理出了问题,于是我仔细排查了acl_nanodet.py的后处理代码,发现没啥问题,因此我将main_nanodet.py中onnx模型推理的输出,通过np.save()保存下来,直接喂给acl_nanodet.py的后处理,结果outputs文件夹中得到了正确的检测结果,表明后处理没问题,bug在其他地方。

问题排查2.预处理模块

将main_nanodet.py预处理后的数据和acl_nanodet.py预处理后的数据通过np.save()保存后,进行比对,发现几乎没有区别,表明预处理没问题,bug在其他地方。

问题排查3.模型

将main_nanodet.py于acl_nanodet.py模型推理得到的输出通过np.save()保存,发现两者模型推理结果有很大差异,表明是模型推理出现问题。

合理怀疑atc模型转换出现问题,根据官方转换方法重新将.onnx模型转换成.om模型,然后测试,发现推理结果仍然不对,我十分疑惑。

此时我自己debug的经验已经吃不住了,到昇腾官方论坛寻找类似结果,未果。到华为atlas官方文档寻找资料,未果。

然后我将nanodet的onnx模型更换为nanodet_m的onnx模型,这两个模型只在层数和输出尺寸上有区别,因此acl_nanodet.py可以共用,修改超参数就行。

结果仍然不能获得目标检测结果。

问题排查4.算法bug

由于nanodet是较新的算法,可能有一些比较新的算子导致AI芯片计算出现问题,因此第二天我又将yolov5算法移植到atlas200dk中,发现仍然无法检测到目标????人比较懵了

问题排查5.AI板卡

由于后处理、预处理和模型都没问题,因此怀疑该AI板卡芯片出现bug。因此我把Ascend samples中的yolov4例程拷贝下来并进行测试,得到正确的检测结果,表明板卡没问题,此时心里是真的????不知所措

问题排查6.模型精度

根据我的嵌入式模型部署经验,一般模型精度从fp32到fp16不大影响检测结果,而fp16到int8则会造成检测精度掉点,但也不会完全检测不出来东西。

死马当活马医,使用atc模型,将精度设定flag为不改变原模型精度,但仍然没有检测结果,没啥心里感受(因为知道大概不是精度问题)

问题排查6.模型推理

经过了一整天的debug,仍然未找到问题,但由于预处理和后处理没问题,板卡没问题,因此一定是模型推理的问题。

第三日晚,偶然看到官方samples的issue里其他开发者提到无检测结果的问题,官方回复是检查预处理、模型和后处理。

想了想既然检查了预处理,那有没有可能输入模型的数据根本没有预处理,或者说只是”假预处理“?

于是将模型输入数据用np.save()保存下来,发现真的和main_nanodet.py的模型输入数据不同!

问题解决:模型输入数据与预处理不同

我是通过函数的方法,将imread读入的image通过pre_process(): return预处理结果image_inp,然后将预处理结果进行execute([image_inp, ]),但是execute的输入却与image_inp不同

然后我又查阅了pyACL的原生C接口,发现execute()这个函数封装的acl模型推理接口是直接读取内存中指定位置的数据,而execute()封装的实现是把image_inp这个数据的内存地址拷贝到模型读数据的内存地址,也就是说image_inp的内存地址储存的数据并没有进行预处理。

回到pre_process()的实现中,有一句

        image_inp = np.transpose(image_norm, (2, 0, 1))

numpy.transpose这个函数是个”lazy“函数,不对内存中的数据进行重排,仅仅改变读取方式(也就是读取轴顺序),这就导致了传入execute()中的image_inp实际上是没有真正transpose的。

解决方法很简单,为transpose后的image_inp开辟一块新内存就行了,比如numpy.copy()深拷贝:

    def pre_process(self, image):
        """
        preprocess
        """
        image_resized = self.padding_resize_image(image)
        image_norm = self._normalize(image_resized.astype(np.float32))
        image_inp = np.transpose(image_norm, (2, 0, 1))
        return image_inp.copy()
后记

踩坑很痛苦,解决很快乐~

关注
打赏
1658651101
查看更多评论
立即登录/注册

微信扫码登录

0.0462s