Вступление

Общая цель извлечения признаков - представить необработанные данные в виде сокращенного набора функций, который лучше описывает их основные особенности и атрибуты [1]. Таким образом, мы можем уменьшить размерность исходных входных данных и использовать новые функции в качестве входных данных для обучения методам распознавания образов и классификации.

Хотя есть несколько функций, которые мы можем извлечь из изображения, локальные двоичные шаблоны (LBP) - это теоретически простой, но эффективный подход к классификации текстур, инвариантных к оттенкам серого и вращению. Они работают, потому что наиболее частые узоры соответствуют примитивным микроструктурам, таким как края, углы, пятна, плоские участки [2].

В [2] Ojala et al. показали, что дискретная гистограмма встречаемости однородных узоров является очень мощным признаком текстуры. Текстура изображения определяется как двухмерное явление, которое характеризуется двумя свойствами: (1) пространственной структурой (рисунком) и (2) контрастностью.

Методология

Кругово-симметричный набор соседей

Кругосимметричный сосед, установленный для данного пикселя gc, определяется точками с координатами (i, j), которые окружают центральную точку на окружности радиуса R, и количество элементов P.

Текстура

Мы определяем текстуру T как набор пикселей в полутоновом изображении.

где gp соответствует значению серого локального соседа p.

Интерполяция

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

Достижение инвариантности шкалы серого

Учитывая возможную потерю информации, можно превратить текстуру в стыковочную разность. Чтобы вычислить его, мы вычитаем значение серого центрального пикселя для всего набора соседей. Совместное разностное распределение - это очень разборчивый оператор текстуры. Он записывает появление различных паттернов в окрестности каждого пикселя в P-мерной гистограмме.

где gp - значение серого соседа p. Это распределение инвариантно относительно сдвигов шкалы серого.

Локальный двоичный шаблон

Оператор LBP_ {P, R} по определению инвариантен к любому монотонному преобразованию шкалы серого. Пока порядок значений серого остается неизменным, вывод оператора LBP_ {P, R} остается постоянным.

куда

Единообразные локальные двоичные шаблоны

В [2] Ojala упоминает, что из их практического опыта LBP не является хорошим дискриминатором. Они предлагают просто выбрать набор локальных двоичных паттернов так, чтобы количество пространственных переходов (побитовые изменения 0/1) не превышало 2. Например, паттерн '1111' имеет 0 пространственных переходов, шаблон '1100' имеет 1 пространственные переходы, а шаблон 1101 имеет 2 пространственных перехода. Каждому универсальному шаблону соответствует уникальный индекс. Формула для создания индекса позаимствована отсюда.

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

Подсказка: для простоты я не рассматриваю случай, когда выбранный индекс отрицательный (т.е. img_gray [-1] [0] возвращает последний пиксель первого столбца). Если мы хотим получить более точный расчет, мы должны рассмотреть этот случай и заняться им.

Код Cython

Предыдущий код не идеален; однако, что делает его действительно медленным, так это то, что мы перебираем все пиксели изображения. Ожидание 1 минуты и 10 секунд для расчета наших характеристик - это много, если мы примем во внимание, что нам также нужно обучить методику распознавания образов. Таким образом, нам нужна альтернативная реализация, которая должна быть намного быстрее для циклов. В этом случае мы будем использовать Cython. Код представлен на следующем изображении, это большой кусок кода. Некоторые части можно было бы улучшить, но это уже намного быстрее. Не стесняйтесь оставлять комментарии, если вы чего-то не понимаете в коде.

Код написан таким образом, что большая часть его полностью выполняется в C API. Эта стратегия значительно ускоряет выполнение, но также позволяет нам использовать параллельный модуль Cython. Мы разделим задание между несколькими ядрами ЦП.

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

Сравнение с похожим изображением

Давайте возьмем другое изображение кирпичей, но оно будет иметь другую текстуру.

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

Заключение

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

Блокнот Jupyter

Https://github.com/ocampor/notebooks/blob/master/notebooks/image/features/local-binary-patterns.ipynb

Библиография

[1] Маркес, О. (2011). Практическая обработка изображений и видео с помощью MATLAB. Джон Вили и сыновья.

[2] Ояла, Т., Пиетикяйнен, М., и Мяенпяя, Т. (2002). Классификация текстур с разным разрешением и инвариантной к вращению шкалой серого с локальными двоичными шаблонами. IEEE Transactions on Pattern Analysis and Machine Intelligence, 24 (7), 971–987.