流程编排与调用API推理结果不一样
收藏回复举报
流程编排与调用API推理结果不一样
t('forum.solved') 已解决
发表于2024-01-03 16:01:50
0 查看

使用同一模型,同一输入图片,同一后处理配置,流程编排与调用API结果不一样

以下是调用API推理的代码

import numpy as np  # 用于对多维数组进行计算
import cv2  # 图片处理三方库,用于对图片进行前后处理

from mindx.sdk import Tensor  # mxVision 中的 Tensor 数据结构
from mindx.sdk import base  # mxVision 推理接口
from mindx.sdk.base import post, ResizedImageInfo


'''初始化资源和变量'''
base.mx_init()  # 初始化 mxVision 资源
pic_path = 'horse.jpg'  # 单张图片

device_id = 0  # 指定运算的Device
config_path = 'model/yolov3_tf_bs1_fp16.cfg'  # 后处理配置文件
label_path = 'model/coco.names'  # 类别标签文件
img_size = 416

model_path = "model/yolov3_tf_bs1_fp16.om"  # 模型路径


'''加载图片'''
img_bgr = cv2.imread(pic_path)
H, W, C = img_bgr.shape

IP = base.ImageProcessor()
img = IP.decode(pic_path)
img = IP.resize(img, base.Size(416, 416))
img = img.get_tensor()

a = ResizedImageInfo()
a.heightOriginal = H
a.heightResize = 416
a.resizeType = base.resize_stretching
a.widthOriginal = W
a.widthResize = 416


'''模型推理'''
model = base.model(modelPath=model_path, deviceId=device_id)  # 初始化 base.model 类
output = model.infer([img])  # 执行推理。输入数据类型:


'''后处理'''
postprocessor = post.Yolov3PostProcess(config_path=config_path, label_path=label_path)  # 获取后处理对象
pred = postprocessor.process(output, a)
print(pred)

以下是流程编排的pipeline

{
	"stream0":{
		"appsrc0":{
			"factory":"appsrc",
			"next":"mxpi_imagedecoder0",
			"props":{
				"blocksize":"409600",
				"name":"test_appsrc"
			}
		},
		"mxpi_imagedecoder0":{
			"factory":"mxpi_imagedecoder",
			"next":"mxpi_imageresize0"
		},
		"mxpi_imageresize0":{
			"factory":"mxpi_imageresize",
			"next":"mxpi_tensorinfer0",
			"props":{
				"resizeWidth":"416",
				"resizeHeight":"416"
			}
		},
		"mxpi_tensorinfer0":{
			"factory":"mxpi_tensorinfer",
			"next":"mxpi_objectpostprocessor0",
			"props":{
				"modelPath":"/root/MindStudio-WorkSpace/MindX_RTSP_Multi_6103d0a9/model/yolov3_tf_bs1_fp16.om",
				"name":"test_mxpi_tensorinfer",
				"waitingTime":"5000",
				"dataSource":"auto"
			}
		},
		"mxpi_objectpostprocessor0":{
			"factory":"mxpi_objectpostprocessor",
			"next":"appsink1",
			"props":{
				"postProcessLibPath":"/root/MindStudio-WorkSpace/MindX_RTSP_Multi_6103d0a9/model/libyolov3postprocess.so",
				"funcLanguage":"c++",
				"labelPath":"/root/MindStudio-WorkSpace/MindX_RTSP_Multi_6103d0a9/model/coco.names",
				"postProcessConfigPath":"/root/MindStudio-WorkSpace/MindX_RTSP_Multi_6103d0a9/model/yolov3_tf_bs1_fp16.cfg"
			}
		},
		"appsink1":{
			"factory":"appsink"
		},
		"stream_config":{
			"deviceId":"0"
		}
	}
}

以下是流程编排的主函数:

import time

import numpy as np  # 用于对多维数组进行计算
import cv2  # 图片处理三方库,用于对图片进行前后处理
import os
# from quirt.sdk import Tensor  # mxVision 中的 Tensor 数据结构
from mindx.sdk import base  # mxVision 推理接口
from mindx.sdk.base import post  # post.Resnet50PostProcess 为 resnet50 后处理接口
from StreamManagerApi import StreamManagerApi, MxDataInput, StringVector, StringVector

base.mx_init()  # 初始化 mxVision 资源

streamManagerApi = StreamManagerApi()
ret = streamManagerApi.InitManager()
if ret != 0:
    print("Failed to init Stream manager, ret=%s" % str(ret))
    exit()
else:
    print("-----------------创建流管理StreamManager并初始化-----------------")

pipline_path = 'pipeline/picin.pipeline'

with open(pipline_path, 'rb') as f:
    print("-----------------正在读取读取pipeline-----------------")
    pipelineStr = f.read()
    print("-----------------成功读取pipeline-----------------")

ret = streamManagerApi.CreateMultipleStreams(pipelineStr)

if ret != 0:
    print("-----------------未能成功创建流-----------------")
    print("-----------------Failed to create Stream, ret=%s-----------------" % str(ret) )
else:
    print("-----------------成功创建流-----------------")
    print("-----------------Create Stream Successfully, ret=%s-----------------" % str(ret) )

STREAM_NAME = b'stream0'    # 流的名称


dataInput = MxDataInput()
picpath = 'horse.jpg'
with open(picpath, 'rb') as f:
    print("-----------------开始读取图片-----------------")
    dataInput.data = f.read()
    print("-----------------读取图片成功-----------------")
    uniqueId = streamManagerApi.SendData(STREAM_NAME, 0, dataInput)  # SendData接口将图片数据发送给appsrc元件

a = streamManagerApi.GetResult(STREAM_NAME, 0, 2000)
print(a.data.decode())


streamManagerApi.DestroyAllStreams()

使用API推理的结果:

cke_67588.png

使用流程编排推理结果:

cke_104715.png

结果为空,因此来证明推理方式结果不一样

我要发帖子