Чтобы проиллюстрировать, как методы Computer Vision (CV) и Machine Learning (ML) могут использоваться для решения проблем, я решил поэкспериментировать с примером, который известен большинству из нас…

Будучи слегка дальтоником, я решил попробовать сам и найти подход, позволяющий компьютеру интерпретировать тестовое изображение дальтонизма «Исихара». Поскольку онлайн-ресурсы по этой теме также кажутся ограниченными, это выглядело как сложный эксперимент.

Надеюсь, эта статья даст вам некоторые идеи о том, как справиться с такой задачей CV под рукой. Фрагменты кода Python также включены, однако статья старается оставаться на высоком уровне, описывая следующий подход и не вдаваясь в подробности каждого из различных шагов. Однако я считаю, что любой, кто достаточно хорошо разбирается в Python, сможет реализовать его самостоятельно.

Будучи слегка «красно-зеленым» дальтоником, я иногда ничего не видел в тестах «Исихара». Тестовая пластина для дальтонизма «Исихара» состоит из точечной цветовой палитры, в которой человек без нарушения цветового зрения должен видеть «число» или «цифру» другого цвета, чем фон. Набор примеров показан ниже:

Поскольку тип красно-зеленый дальтонизм, по-видимому, гораздо более распространен и затрагивает до 6% мужчин северо-западного европейского происхождения (а также сам принадлежит к этой группе), я решил сосредоточиться на этот тип. Намного реже встречаются варианты сине-желтый и полный дальтонизм (https://www.color-blindness.com/deuteranopia-red-green-color-blindness/)

(I) Предварительная обработка изображений (OpenCV2)

Ниже описаны 5 шагов предварительной обработки, которые можно применить с библиотекой OpenCV2, специализирующейся на компьютерном зрении, для преобразования в черно-белые изображения с выделяющимися «скрытыми» фигурами:

[1]Преобразование в цветовое пространство «LAB»:

Большинство цветов в изображениях преобразуются в числовое представление с использованием популярных цветовых пространств «RGB» (красный-зеленый-синий) или «BGR» (синий-зеленый-красный). Однако эти цветовые пространства кажутся неподходящими для получения «красно-зеленой» информации из изображений. Кажется, что лучше преобразовывать изображения из классических цветовых пространств BGR или RGB в цветовое пространство «LAB» с помощью OpenCV2 и сохранять только матричную информацию цветового канала «A», которая содержит соответствующую информацию о «красном цвете». зеленый» цветовой спектр.

(подробнее о цветовом пространстве LAB: https://en.wikipedia.org/wiki/CIELAB_color_space).

[1] Код Фрагмент — Шаг 1, его можно применить после чтения изображения в виде массива numpy с помощью метода cv2.imread() в библиотеке OpenCV2.

[2]Увеличение контрастности

Увеличение контрастности цветового канала «А», чтобы сделать различия в «красно-зеленом» спектре более четкими:

[2]Фрагмент кода – шаг 2. Увеличение контраста с помощью кода, описанного ниже:

[3] Размытие

Трюк, который, как я обнаружил экспериментально, хорошо работает, заключался в применении Размытие по Гауссу в цикле несколько раз, экспериментальный цикл 5 раз оказался приемлемым, а затем применялся Размытие по медиану один раз. Это уменьшает шум, вызванный цветными «точками», а также границами и промежутками между точками.

[4] Пороговое значение

Для получения бинарного черно-белого изображения применяется соответствующее Пороговое значение.

[5] Морфологические операции

[5] Морфологические операции по удалению шума с изображения (подробнее о типичных морфологических операциях (размывание/расширение») в OpenCV2: https://docs.opencv.org/master/d9 /d61/tutorial_py_morphological_ops.html)

[3], [4], [5] Фрагмент кода

Что происходит за кулисами?

Чтобы понять, что происходит после применения шагов [1–5], мы можем визуализировать результат обработки тестовых изображений на дальтонизм «12», отображаемых в верхней части:

На изображении выше показаны «12» черно-белых изображений, полученных в результате применения шагов предварительной обработки. Это показывает, что после выполнения шагов мы можем четко видеть цифры, которые были «спрятаны» в тестах. Подход с предварительной обработкой кажется успешным во многих случаях, независимо от того, используются ли в тесте «однозначные», «двузначные» или любые другие типы цифр. В качестве примечания, было личным сюрпризом увидеть, что число «74» было скрыто, например, в левом среднем тесте, поскольку я не мог сам увидеть число 😊.

Что конкретно делают эти шаги?

Чтобы более подробно понять, как работают разные шаги, давайте возьмем пример теста и визуализируем эффект от реализации каждого из разных шагов:

Извлечение цветового канала «A» (1) после преобразования изображения в цветовую шкалу «LAB» уже делает число «74» видимым. Увеличение контраста (2) позволяет сделать «спрятанное» число еще более заметным. Следующее размытие (3) позволяет удалить «точки» и их края. Наконец, с помощью пороговой обработки и морфологических операций (4–5), чтобы получить бинарное черно-белое изображение с выделенным числом «74».

Фрагмент кода —объединение всех шагов предварительной обработки в одном классе Python показано ниже:

Фрагмент кода. Предварительную обработку одного изображения, найденного в «PathTo/ColorBlindTestImage.png», можно выполнить с помощью приведенного ниже фрагмента кода; обратите внимание, что этот код изменяет размер каждого входного изображения до изображения размером 300 x 300 перед обработкой, а затем изменяет размер изображения до 28 x 28.

(2) Обучение вашей модели — распознавание «одной цифры» (Keras-TensorFlow)

Теперь, когда мы предварительно обработали изображение до бинарного черно-белого изображения, мы можем передать его модели ML, которая способна интерпретировать отображаемое. Чтобы проиллюстрировать идею, только модель будет обучена распознавать тесты на дальтонизм с «однозначными» цифрами 0, 1, 2, …, 9, а «двузначные» тесты цифр и цифр пока не учитываются.

Мы можем использовать существующий набор данных MNIST для обучения нашей модели, которая содержит изображения рукописных цифр размером 28 x 28 пикселей [0–9], как показано ниже (дополнительная информация http://yann.lecun.com /exdb/mnist/):

Поскольку набор данных MNIST уже содержит большое количество «черно-белых» рукописных «однозначных» изображений, мы можем использовать его для обучения более крупной модели ML. Здесь мы используем модель на основе ConvNet (сверточной нейронной сети), которая представляет собой классическую модель нейронной сети, которая может быть разработана для выполнения такой задачи классификации изображений, как эта. Для обучения такой нейронной сети необходимо достаточное количество выборок.

Теперь также может стать очевидным, почему нам понадобились предыдущие шаги предварительной обработки изображения. Поскольку нам потребуются достаточно большие объемы данных для обучения модели ML, и, похоже, не существует конкретной большой коллекции данных с пометками «1», «2», «3»,… доступны однозначные тесты «Исихара» ( по крайней мере, я не нашел ни одного общедоступного), необходимо было преобразовать изображения, чтобы они выглядели как изображения MNIST, чтобы передать их обученной модели «MNIST» и сделать прогнозы возможными. Если бы у нас был большой набор данных с помеченными однозначными тестовыми изображениями «Ишарара», можно было бы также передать необработанные тестовые данные «Ишихара» непосредственно в модель ConvNet и посмотреть, как она работает. Однако, как правило, лучше также выполнить некоторую предварительную обработку (поскольку это также поможет вам лучше понять, что происходит).

Можем ли мы теперь просто выбрать модель для обучения, и все готово? Ну, не совсем так, имейте в виду, что модели машинного обучения, такие как тип ConvNet здесь; обучаются делать именно так, как им подсказывали обучающие данные. Набор данных MNISTвыше имеет изображения только «белых» цифр на «черном» фоне, однако предварительная обработка наших тестовых изображений на дальтонизм приводит к тому, что обе «белые» цифры отображаются на «черный» фон, а также «черные» цифры на «белом» фоне. Если мы хотим, чтобы обученная модель распознавала цифру «3» на левом изображении, показанном ниже, мы должны научить нашу модель делать это во время обучения…

Обогащение обучающих данных. Поэтому мы обогащаем набор данных MNIST путем инвертирования пикселей каждого изображения; белый пиксель становится черным и наоборот; и добавление его в качестве дополнительного изображения к набору данных, фактически удваивая обучающие данные; например, для изображений с цифрами «5» и «0»:

Включите дополнительный шум, который часто используется для обучения более надежной модели; другие приемы включают поворот всех изображений на 10 градусов; добавление случайных зашумленных «точечных» пикселей и т. д. Однако это указывает на проблему машинного обучения в реальном мире, когда иногда может иметь место нехватка обучающих данных, и вам нужен необходимый творческий подход, чтобы обойти это…

Фрагмент кода — класс DataLoading.py ниже показывает, как вы можете создать необходимые обучающие данные для обучения вашей модели:

Фрагмент кода. Приведенный ниже класс TrainingModel.py можно использовать для обучения многоуровневой модели CNN, оптимизированной с помощью объединения слоев и пакетной нормализации для повышения надежности и ускорения обучения (дополнительная информация о CNN:

Фрагмент кода — объедините классы TrainingModel.py и DataLoading.py в следующем скрипте для обучения и сохранения модели CNN:

(3) Собираем все вместе — прогнозирование теста на дальтонизм «Одна цифра»:

Фрагмент кода — ниже позволяет прочитать тестовое изображение «Исихара» для дальтоников, содержащее одну цифру, указанную в пути, и предсказать отображаемое число:

Где это FAIL?

При испытании нового подхода также важно определить, когда он не удался, чтобы улучшить его в следующей итерации. Несмотря на то, что модель работает достаточно хорошо, на изображении ниже показаны две ситуации, когда либо модель, либо этап предварительной обработки по-прежнему не работают:

Мы видим, что модель иногда терпит неудачу при предсказании «6», поскольку ее иногда путают с цифрой «8». Для последнего теста на дальтонизм мы видим, что он уже идет не так на этапе предварительной обработки; это в основном связано с тем, что эта предварительная обработка фокусируется на получении тестов «красно-зеленого» дальтонизма, а последний тест имеет слишком мало «красно-зеленых» цветов в своем спектре, что делает шаг преобразования цветовой шкалы «LAB» менее успешным. Здорово! Понимание того, когда он терпит неудачу, позволяет улучшить его в следующей итерации…

Вывод

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

Будущая работа может быть сосредоточена на:

  • Применение распознавания красно-зеленых цветов: распознавание красно-зеленых цветов автомобилей, распознавание того, являются ли помидоры красными или зелеными, что часто является проблемой для умеренно «красно-зеленых» дальтоников, таких как я, для которых это становится трудно увидеть, созрели помидоры или нет, и т. д.
  • Пользовательский интерфейс — может быть разработан с помощью фреймворков Python Flask и Django, чтобы сделать его доступным для тестирования; чтобы также получить обратную связь и переобучить, чтобы сделать его умнее
  • Улучшение предварительной обработки для включения других цветовых шкал за пределами «красно-зеленого» спектра (~ «красно-зеленый» дальтонизм встречается гораздо чаще, чем более редкие недостатки «сине-фиолетового» дальтонизма)
  • Обогащайте обучающие данные, чтобы повысить надежность модели и выполнить точную настройку для пограничных случаев, таких как путаница с цифрами «6–8» и, возможно, путаница с цифрами «1–7».
  • Расширить обучающие данные, чтобы построить и обучить модель, чтобы она могла распознавать двузначные числа; другие символы «а», «б» или даже целые слова…
  • Оставайтесь с нами для будущих улучшений, часть II.

Спасибо за чтение!

Люблю слышать ваши отзывы и предложения, спасибо!! 😊

Оставаться здоровым!

Гитхаб: https://github.com/SimonDL94/Цветовая слепота