使用 cv2.dnn.blobFromImage() 将输入馈送到 OpenCV DNN
Feeding input to OpenCV DNN using cv2.dnn.blobFromImage()
我正在使用 OpenCV 4.3.0。我有一个 Tensorflow python 实现在工作,我正在尝试将它移植到 python.
中的 OpenCV DNN
我的 Tensorflow Python 实现:
image = cv2.imread("1.jpg")
image_resized = cv2.resize(image, (64, 64), interpolation = cv2.INTER_AREA)
image_normalized = np.add(image, -127) #normalization of the input
feed_dict = {self.tf_pitch_input_vector : image_normalized}
out = self._sess.run([self.cnn_pitch_output], feed_dict=feed_dict)
在我的网络的开头有一个重塑层,
X = tf.reshape(data, shape=[-1, 64, 64, 3])
图像通过 feed_dict 馈送并在第一层中如上所示重新整形,然后网络继续进行。
这个 (Tensorflow python) 运行良好。
我的 OpenCV DNN 实现:
image = cv2.imread("1.jpg")
net = cv2.dnn.readNetFromTensorflow("model.pb")
resized = cv2.resize(image, (64, 64), interpolation=cv2.INTER_AREA)
input_blob = cv2.dnn.blobFromImage(resized, 1, (64,64), -127, swapRB=False, crop=False)
print("blob: shape {}".format(input_blob.shape))
input_blob = input_blob.reshape(-1, 64, 64, 3)
print("blob: new shape {}".format(input_blob.shape))
net.setInput(input_blob)
out = net.forward()
上面代码打印的形状输出如下所示,
blob: shape (1, 3, 64, 64)
blob: new shape (1, 64, 64, 3)
问题: 问题是 Tensorflow Python 和 OpenCV DNN 之间的网络输出不匹配。调试后,我发现与 Tensorflow python 实施相比,OpenCV DNN 中提供的数据不同。我确定 blobFromImage() 或之后有问题。
有人可以让我知道我的 OPenCV DNN 代码中缺少什么吗?
提前致谢!
我解决了这个问题。问题出在 blobFromImage()
input_blob = cv2.dnn.blobFromImage(resized, 1, (64,64), -127, swapRB=False, crop=False)
OpenCV 文档说,
mean -scalar with mean values which are subtracted from channels.
Values are intended to be in (mean-R, mean-G, mean-B) order if image
has BGR ordering and swapRB is true.
我使用的平均值是错误的。我的假设是 passin "-127" 会减去 127。但实际上 blobFromImage 在我们只传递 127 时会减去 127。
此外,我只使用了 127,我们必须为所有 3 个通道传递 (127,127,127)
RTFM:)
我正在使用 OpenCV 4.3.0。我有一个 Tensorflow python 实现在工作,我正在尝试将它移植到 python.
中的 OpenCV DNN我的 Tensorflow Python 实现:
image = cv2.imread("1.jpg")
image_resized = cv2.resize(image, (64, 64), interpolation = cv2.INTER_AREA)
image_normalized = np.add(image, -127) #normalization of the input
feed_dict = {self.tf_pitch_input_vector : image_normalized}
out = self._sess.run([self.cnn_pitch_output], feed_dict=feed_dict)
在我的网络的开头有一个重塑层,
X = tf.reshape(data, shape=[-1, 64, 64, 3])
图像通过 feed_dict 馈送并在第一层中如上所示重新整形,然后网络继续进行。
这个 (Tensorflow python) 运行良好。
我的 OpenCV DNN 实现:
image = cv2.imread("1.jpg")
net = cv2.dnn.readNetFromTensorflow("model.pb")
resized = cv2.resize(image, (64, 64), interpolation=cv2.INTER_AREA)
input_blob = cv2.dnn.blobFromImage(resized, 1, (64,64), -127, swapRB=False, crop=False)
print("blob: shape {}".format(input_blob.shape))
input_blob = input_blob.reshape(-1, 64, 64, 3)
print("blob: new shape {}".format(input_blob.shape))
net.setInput(input_blob)
out = net.forward()
上面代码打印的形状输出如下所示,
blob: shape (1, 3, 64, 64)
blob: new shape (1, 64, 64, 3)
问题: 问题是 Tensorflow Python 和 OpenCV DNN 之间的网络输出不匹配。调试后,我发现与 Tensorflow python 实施相比,OpenCV DNN 中提供的数据不同。我确定 blobFromImage() 或之后有问题。
有人可以让我知道我的 OPenCV DNN 代码中缺少什么吗?
提前致谢!
我解决了这个问题。问题出在 blobFromImage()
input_blob = cv2.dnn.blobFromImage(resized, 1, (64,64), -127, swapRB=False, crop=False)
OpenCV 文档说,
mean -scalar with mean values which are subtracted from channels. Values are intended to be in (mean-R, mean-G, mean-B) order if image has BGR ordering and swapRB is true.
我使用的平均值是错误的。我的假设是 passin "-127" 会减去 127。但实际上 blobFromImage 在我们只传递 127 时会减去 127。
此外,我只使用了 127,我们必须为所有 3 个通道传递 (127,127,127)
RTFM:)