分享

opencvdnn分类网络调用-python版

 行走在理想边缘 2023-02-27 发布于四川

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

1、加载DNN模型

  1. def load_model(onnx_model):
  2. net = cv2.dnn.readNetFromONNX(onnx_model)
  3. net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
  4. net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
  5. 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训练集中。

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

3、dnn推理

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

4、完整调用逻辑

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

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

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

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

  11. # Get a class with a highest score.
  12. out = out.flatten()
  13. classId = np.argmax(out)
  14. confidence = out[classId]
  15. print(classId, confidence)
  16. onnx_test()

5、一次处理多张图像

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

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

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

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

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

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

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

  20. onnx_test()

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多