Искажение изображения при использовании PIL против opencv - PullRequest
0 голосов
/ 23 апреля 2020

Редактировать- Присоединение случайных картинок из набора данных Flickr8k с использованием тех же преобразований, что и обсуждалось (не могу поделиться исходными изображениями - личный набор данных)

Вывод изображения RGB при загрузке с использованием Генератор Keras с преобразованием изображения массива PIL , используя следующую функцию предварительной обработки:

def myFunc(image):
  image = np.array(image)
  rgb = Image.fromarray(image,mode='RGB')
  return rgb

Вывод изображения RGB при загрузке с использованием генератора Keras без изображения массива PIL преобразование с использованием следующей функции предварительной обработки

def myFunc(image):
  image = np.array(image)
  return image

Вывод изображения HSV при загрузке с использованием генератора Keras с преобразованием изображения массива PIL с использованием следующей предварительной обработки функция обработки:

def myFunc(image):
  image = np.array(image)
  hsv_image = cv2.cvtColor(image,cv2.COLOR_RGB2HSV)
  hsv = Image.fromarray(hsv_image,mode='HSV')
  return hsv

Вывод изображения HSV при загрузке с использованием генератора Keras без преобразования массива PIL в изображение с использованием следующей функции предварительной обработки

def myFunc(image):
  image = np.array(image)
  hsv_image = cv2.cvtColor(image,cv2.COLOR_RGB2HSV)
  return hsv_image

Generator-

testgen=ImageDataGenerator(preprocessing_function=myFunc)

Я выполняю некоторые бинарные и мультиклассовые классификационные задачи по медикам л набор данных изображения. Я использую Keras ImageDataGenerator и flow_from_directory для загрузки изображений в пакетном режиме. Также выполняем на лету предварительную обработку и увеличение. Я попробовал две вещи:

  1. Использование opencv для преобразования цветового пространства и подачу полученного массива 3D numpy в модель
  2. Использование opencv для преобразования цветового пространства и затем преобразование результирующий массив 3D numpy для изображения с использованием модуля PIL Image и соответствующего цветового режима

Итак, когда я загружаю изображение через генератор Keras и просматриваю его - один раз с помощью PIL, а другой - без использования PIL, что интересно, модуль PIL Image + генератор Keras вместе полностью искажают изображение. Это похоже на шум. Если я просто читаю изображение с помощью opencv и пропускаю его через функцию предварительной обработки - преобразование цветового пространства с помощью opencv и arraytoimage с использованием PIL - возвращаемое изображение не искажается. Кроме того, если я загружаю изображение через генератор Keras и устраняю шаг преобразования изображения массива PIL - снова возвращаемое изображение оказывается хорошим. Так или иначе, комбинация генератора и функции PIL, кажется, искажает изображение неизвестными способами. Это не зависит от цветового пространства - даже изображение RGB искажается, если я загружаю его с помощью генератора и обрабатываю его с помощью opencv, а затем PIL. Самая запутанная часть - точность моей модели резко отличается в обоих случаях.

Эта функция предварительной обработки дает мне точность теста 95% и выше, но полностью искажает изображение. Функциональные карты не имеют смысла. (Это когда я использовал генератор Keras для загрузки изображений)

def myFunc(image):
  image = np.array(image)
  hsv_image = cv2.cvtColor(image,cv2.COLOR_RGB2HSV)
  hsv= Image.fromarray(hsv_image,mode='HSV')
  return hsv

Эта функция предварительной обработки дает мне точность теста всего 75, но она не искажает изображение. Функциональные карты имеют полный смысл.

def myFunc(image):
  image = np.array(image)
  hsv_image = cv2.cvtColor(image,cv2.COLOR_RGB2HSV)
  return hsv_image

Я получаю гораздо лучшие результаты как для двоичной, так и для мультиклассовой классификации как для проверочных, так и для тестовых наборов с искаженными изображениями с шумом в качестве входных данных, что явно неверно, поскольку я не могу обосновать свои результаты таким образом , Но это не совсем случайное / неправильное преобразование - оно последовательно дает отличные результаты после изменения нескольких параметров. Есть ли способ проанализировать это случайное преобразование? Есть ли здесь какая-то реальная возможность сохранения информации, которая повышает точность моей модели? Я не хочу отбрасывать результаты без надлежащего анализа. Но я не уверен, как go об этом! Любая помощь будет высоко ценится.

...