Подача ввода в OpenCV DNN с помощью cv2.dnn.blobFromImage () - PullRequest
0 голосов
/ 29 апреля 2020

Я использую OpenCV 4.3.0. У меня работает реализация Tensorflow python, и я пытаюсь перенести ее на DNC OpenCV в python.

Моя реализация 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) работает хорошо.

Моя реализация DNC OpenCV:

    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. После отладки я вижу, что данные, подаваемые в DNC OpenCV, отличаются от реализации Tensorflow python. Я уверен, что что-то не так в blobFromImage () или после этого.

Может кто-нибудь сообщить мне, чего не хватает в моем коде DNen OPenCV?

Заранее спасибо!

1 Ответ

0 голосов
/ 29 апреля 2020

Я исправил проблему. Проблема была в blobFromImage ()

input_blob = cv2.dnn.blobFromImage(resized, 1, (64,64), -127, swapRB=False, crop=False)

Документ OpenCV гласит:

среднее-скалярное со средними значениями, которые вычитаются из каналов. Значения должны быть в порядке (среднее-R, среднее-G, среднее-B), если изображение имеет порядок BGR и swapRB имеет значение true.

Среднее значение, которое я использовал, было неверным. Я предполагал, что passin "-127" вычтет 127. Но на самом деле blobFromImage вычитает 127, когда мы просто передаем 127.

Более того, я использовал только 127, мы должны пройти (127 127 127) для всех 3 каналов

RTFM:)

...