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)
函数说明: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。
返回值:
在这里,由于我们训练使用的数据尺寸都是112*112,量化到0~1,所以在测试的时候也要是112*112。在ImageNet训练集中。
blob = cv2.dnn.blobFromImage(img, 1 / 255.0, (112, 112), crop=False)
3、dnn推理
print("out:", out, type(out), out.shape)
4、完整调用逻辑
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)
blob = cv2.dnn.blobFromImage(img, 1 / 255.0, (112, 112), crop=False)
print("out:", out, type(out), out.shape)
# Get a class with a highest score. confidence = out[classId] print(classId, confidence)
5、一次处理多张图像
使用cv2.dnn.blobFromImages对多张图,推理输出多个维度。
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)
blob = cv2.dnn.blobFromImages(images, 1 / 255.0, (112, 112), crop=False) print("blob shape: {}".format(blob.shape))
print("out:", out, type(out), out.shape)
# Get a class with a highest score. classId = np.argmax(out, axis=1) print("classId:", classId)
for i, cid in enumerate(classId): confidence.append(out[i][cid]) print("confidence:", np.array(confidence))
|