Как сопоставить cv2.imread с выводом keras image.img_load - PullRequest
0 голосов
/ 07 июня 2018

Я изучаю глубокое обучение.Обучил алгоритм классификации изображений.Проблема, однако, в том, что для обучения изображений я использовал:

test_image = image.load_img('some.png', target_size = (64, 64))
test_image = image.img_to_array(test_image)

В то время как для реального применения я использую:

test_image = cv2.imread('trick.png')
test_image = cv2.resize(test_image, (64, 64))

Но я обнаружил, что они дают другой ndarray (разные данные):

Последние записи из load_image:

  [ 64.  71.  66.]
  [ 64.  71.  66.]
  [ 62.  69.  67.]]]

Последние записи из cv2.imread:

  [ 15  23  27]
  [ 16  24  28]
  [ 14  24  28]]]

, поэтому система не работает.Есть ли способ сопоставить результаты одного с другим?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Помимо CV2 с использованием формата BGR и Keras (с использованием PIL в качестве бэкэнда) с использованием формата RGB, существуют также существенные различия в методах изменения размера CV2 и PIL с использованием тех же параметров.

В Интернете можно найти несколько ссылок, но общая идея заключается в том, что существуют тонкие различия в пиксельных системах координат, используемых в двух алгоритмах изменения размера, а также потенциальные проблемы с различными методами преобразования в плавающее положение в качестве промежуточного шага вАлгоритм интерполяции.Конечным результатом является визуально похожее изображение, но немного смещенное / возмущенное между версиями.

Прекрасный пример состязательной атаки, которая может вызвать огромные различия в точности, несмотря на небольшие входные различия.

0 голосов
/ 07 июня 2018

OpenCV считывает изображения в формате BGR, тогда как в керасе он представлен в RGB.Чтобы версия OpenCV соответствовала ожидаемому нами порядку (RGB), просто поменяйте местами каналы:

test_image = cv2.imread('trick.png')
test_image = cv2.resize(test_image, (64, 64))
test_image = test_image[...,::-1] # Added

Последняя строка меняет каналы в порядке RGB.Затем вы можете добавить это в свою модель keras.

Еще один момент, который я хотел бы добавить, это то, что cv2.imread обычно считывает изображения с точностью uint8.Изучив выходные данные загруженного в keras изображения, вы увидите, что данные имеют точность с плавающей запятой, поэтому вы также можете захотеть преобразовать их в представление с плавающей запятой, например float32:

import numpy as np
# ...
# ...
test_image = test_image[...,::-1].astype(np.float32)

Asпоследний момент, в зависимости от того, как вы тренировали свою модель, обычно принято нормализовать значения пикселей изображения до диапазона [0,1].Если вы сделали это с вашей моделью keras, убедитесь, что вы поделили свои значения на 255 в вашем изображении, считанном через OpenCV:

import numpy as np
# ...
# ...
test_image = (test_image[...,::-1].astype(np.float32)) / 255.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...