使用 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:)