更新时间:2022-02-22 GMT+08:00

示例-模型管理

模型管理示例如下:

#! /usr/bin/python3.7

import hilens
import numpy as np
def run():

    # 构造摄像头
    cap = hilens.VideoCapture()
    # 获取一帧画面,自带摄像头获取图像为YUV_NV21格式,默认分辨率720p
    frame = cap.read()

    # 加载模型
    # filepath不能只是文件名,如果模型与程序在同一个目录,取相对路径则应当写作"./my_model.om"
    # 如果模型是在技能开发页面中附加进来的,则使用hilens.get_model_dir()可以得到模型所在目录,应当写为:
    # model = hilens.Model(hilens.get_model_dir() + "my_model.om")
    # 如果有多个模型,需要分别加载
    model1 = hilens.Model("./my_model1.om")
    model2 = hilens.Model("./my_model2.om")
    model3 = hilens.Model("./my_model3.om")

    # 假设模型1的输入是一张480*480的YUV_NV21图片,数据类型为uint8
    pro = hilens.Preprocessor()
    input1 = pro.resize(frame, 480, 480, 1)
    input1 = input1.flatten() 
    # 进行推理
    output1 = model1.infer([input1])

    # 假设模型2的输入为模型1的输出(已经是list),数据类型为float32
    input2 = output1 
    # 进行推理
    output2 = model2.infer(input2)

    # 假设模型3的输入是多输入,数据类型为float32
    ip_0 = (sample_data[0]).transpose(0, 3, 1, 2).astype(np.float32).flatten()
    ip_1 = (sample_data[1]).transpose(0, 3, 1, 2).astype(np.float32).flatten()
    ip_2 = (sample_data[2]).transpose(0, 3, 1, 2).astype(np.float32).flatten()
    ip_3 = (sample_data[3]).transpose(0, 3, 1, 2).astype(np.float32).flatten()
    ip_4 = (sample_data[4]).transpose(0, 3, 1, 2).astype(np.float32).flatten()
    # 进行推理
    output3 = model3.infer([ip_0, ip_1, ip_2, ip_3, ip_4])

    # 其他处理
    pass

if __name__ == '__main__':
    hilens.init("hello")
    run()
    hilens.terminate()

如果推理的实际输入与模型输入大小不一致,推理将会失败。此时infer的返回值将是一个int的错误码,日志会报出错误信息,开发者可以通过错误信息来定位错误。如下所示:

>>> input0 = np.zeros((480*480*3), dtype='uint8')
>>> outputs = model.infer([input0])
2019-09-30 18:44:24,075 [ERROR][SFW] Ascend 310: aiModelManager Process failed, please check your input. Model info:
inputTensorVec[0]: name=data n=1 c=3 h=480 w=480 size=345600
outputTensorVec[0]: name=output_0_reg_reshape_1_0 n=1 c=6750 h=1 w=1 size=27000
your input size:0: 691200;
>>> outputs
17
>>> type(outputs)
<class 'int'>