opencv dnn分类网络调用-python版
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)retur
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()
更多推荐
所有评论(0)