打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
opencvdnn分类网络调用-python版

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()

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
在OpenCV-Python 中用YOLO 目标检测
OpenCV4.5.x DNN YOLOv5 C 推理
Python+OpenCV 十几行代码模仿世界名画
千呼万唤始出来,OpenCV 4.0正式发布!
(附链接) 实战 | 超准确人脸检测(带关键点)YOLO5Face C 工程
Tensorrt踩坑日记 | python、pytorch 转 onnx 推理加速
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服