dnn测试使用示例,以分类网络为例实现。

1、加载DNN模型

def load_model(onnx_model):
    net = cv2.dnn.readNetFromONNX(onnx_model)
    net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
    net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
    return net

2、图像数据预处理

函数说明:blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True,crop=False,ddepth = CV_32F )

输入:

  • image:需要进行处理的图像。

  • scalefactor:执行完减均值后,需要缩放图像,默认是1。

  • size:输出图像的空间尺寸,如size=(200,300)表示高h=300,宽w=200。

  • mean:要减去的均值,可以是R,G,B均值三元组,或者是一个值,每个通道都减这值。如果执行减均值,通道顺序是R、G、B。 如果,输入图像通道顺序是B、G、R,那么请确保swapRB = True,交换通道。

  • swapRB:OpenCV认为图像通道顺序是B、G、R,而减均值时顺序是R、G、B,为了解决这个矛盾,设置swapRB=True即可。

  • crop:图像裁剪,默认为False.当值为True时,先按比例缩放,然后从中心裁剪成size尺寸。

  • ddepth:输出blob的深度,可选CV_32F or CV_8U。

返回值:

  • 返回一个4通道的blob(blob可以简单理解为一个N维的数组,用于神经网络的输入。

在这里,由于我们训练使用的数据尺寸都是112*112,量化到0~1,所以在测试的时候也要是112*112。在ImageNet训练集中。

# img to blob
blob = cv2.dnn.blobFromImage(img, 1 / 255.0, (112, 112), crop=False)

3、dnn推理

net.setInput(blob)
out = net.forward()
print("out:", out, type(out), out.shape)

4、完整调用逻辑

def onnx_test():
    img = cv2.imread(r"/home/code/c++project/data/000020.jpg")

    onnx_model = r"/home/code/c++project/data/resnet21.onnx"
    net = load_model(onnx_model)

    # img to blob
    blob = cv2.dnn.blobFromImage(img, 1 / 255.0, (112, 112), crop=False)

    # Run a model
    net.setInput(blob)
    out = net.forward()
    print("out:", out, type(out), out.shape)

    # Get a class with a highest score.
    out = out.flatten()
    classId = np.argmax(out)
    confidence = out[classId]
    print(classId, confidence)
    
onnx_test()

5、一次处理多张图像

使用cv2.dnn.blobFromImages对多张图,推理输出多个维度。

def onnx_test():
    img = cv2.imread(r"/home/code/c++project/data/000020.jpg")

    onnx_model = r"/home/code/c++project/data/resnet21.onnx"
    net = load_model(onnx_model)

    # img to blob
    images = [img, img, img]
    blob = cv2.dnn.blobFromImages(images, 1 / 255.0, (112, 112), crop=False)
    print("blob shape: {}".format(blob.shape))

    # Run a model
    net.setInput(blob)
    out = net.forward()
    print("out:", out, type(out), out.shape)

    # Get a class with a highest score.
    classId = np.argmax(out, axis=1)
    print("classId:", classId)

    confidence = []
    for i, cid in enumerate(classId):
        confidence.append(out[i][cid])
    print("confidence:", np.array(confidence))

onnx_test()

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐