Введение

Изучая ИИ в TechLabs, мы реализовали небольшой проект по классификации видов растений с помощью сверточной нейронной сети (CNN). Мы команда из четырех студентов из области делового администрирования, экономики и психологии, практически не имеющих опыта программирования до присоединения к сообществу TechLabs. Мы изучили необходимые навыки программирования для этого проекта на различных онлайн-курсах. Кроме того, мы не включаем явно какие-либо фрагменты кода в этот пост, но вы можете посетить наш GitHub, где мы предоставляем полный код. ["ссылка на сайт"]

В 2012 году Нирадж Кумар и др. разработала Leafsnap: система компьютерного зрения для автоматической идентификации видов растений, мобильное приложение, которое идентифицирует все 185 видов деревьев на северо-востоке США с помощью изображений их листьев. Процесс классификации основан на системе компьютерного зрения. Эта система отделяет лист от фона, выделяет изгибы контура листа и классифицирует его на 185 видов деревьев. С помощью этой процедуры достигается около 72% первой оценки (это означает, что в 72% случаев система компьютерного зрения правильно классифицирует древесные породы).

Используя тот же набор данных, что и авторы статьи

«Leafsnap: система компьютерного зрения для автоматической идентификации видов растений», Нирадж Кумар, Питер Н. Белхумер, Ариджит Бисвас, Дэвид У. Джейкобс, У. Джон Кресс, Ида К. Лопес, Жоао В.Б. Соареш, Proceedings of the 12-я Европейская конференция по компьютерному зрению (ECCV), октябрь 2012 г.

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

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

Поскольку сверточные нейронные сети являются новейшими технологиями для распознавания изображений, мы реализовали такую ​​сеть, чтобы применить ее к нашей задаче классификации листьев. Чтобы добиться максимального успеха в обучении, мы не использовали предварительно обученную CNN, а построили собственную сетевую архитектуру. Мы также хотели посмотреть, насколько хорошо CNN работает по сравнению с другими классификаторами, которые мы обучили. Итак, мы попробовали разные классификаторы и сравнили результаты:

Показатели точности в таблице выше являются средними значениями трехкратной перекрестной проверки каждого алгоритма. Как видите, мы получаем оценки точности от 29% до 84%. Из всех алгоритмов классификатора лучше всего работает алгоритм случайного леса (84%). Однако эта оценка точности не превышает оценку нашей обученной CNN, которая составляет около 89%, что указывает на то, что CNN действительно являются более эффективными алгоритмами с точки зрения распознавания изображений.

Архитектура CNN

Архитектура обычной нейронной сети обычно состоит из входного слоя, нескольких скрытых слоев и выходного слоя. Однако сверточные нейронные сети представляют собой особый вид нейронных сетей. Как уже указывает название, особенность CNN следует из ее сверточных слоев, что делает CNN наиболее часто применяемым алгоритмом для распознавания изображений.

Сверточный уровень обычно является первым уровнем CNN. Он состоит из нескольких фильтров, каждый из которых выполняет итерацию по отдельным частям, так называемым рецептивным полям входной матрицы. Входная матрица - это просто матрица, в которой каждое значение относится к одному пикселю изображения. Вы можете думать об этом как о «переводе» изображения на компьютерный язык. Итерационный процесс называется сверткой. Каждая комбинация фильтра с принимающими полями входной матрицы дает новую матрицу, также называемую картой характеристик. В частности, каждое значение в карте функций является результатом поэлементного умножения значений фильтра на значения в одном отдельном воспринимающем поле. Во время итерации фильтр начинается с воспринимающего поля в верхнем левом углу входной матрицы, а затем сдвигается на определенное количество пикселей вправо. Если край входной матрицы достигнут, фильтр сдвигает такое же количество пикселей в нижнюю часть входной матрицы и выполняет итерацию слева направо в следующей строке. Количество пикселей, смещенных во время свертки, обычно называется шагом, а поведение, когда фильтр достигает края входной матрицы, называется заполнением. Заполнение, или, что эквивалентно, заполнение нулями, означает присоединение определенного количества строк и столбцов с нулями вокруг входной матрицы. Если, например, входная матрица и матрица фильтра имеют размеры 6x6 и 2x2 соответственно, и если шаг и заполнение равны 1 и 0, свертка даст карту характеристик 5x5 для каждого фильтра.

Общая формула для вычисления размеров карт функций:

где W и F - размеры матрицы ввода и фильтра, P - значение заполнения, а S - значение шага. Затем карты функций передаются на следующий сверточный слой в качестве входных данных.

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

Последний уровень CNN - это полностью связанный уровень, как это обычно бывает для обычных нейронных сетей. Полностью связанный слой следует за последним уровнем объединения и имеет все нейроны, подключенные к входу и выходу.

Набор данных

Набор данных можно бесплатно получить по адресу http://leafsnap.com/dataset/. Он содержит все 185 видов деревьев северо-востока США. Всего имеется 30866 изображений, из которых 23147 лабораторных и 7719 полевых изображений соответственно. Лабораторные изображения высокого качества и представлены в версиях с контролируемой задней и передней подсветкой, по несколько образцов на вид. Поскольку полевые изображения взяты с мобильных устройств, качество обычно хуже, чем качество лабораторных изображений.

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

Видно, что для работы с большинством видов деревьев требуется примерно 100–150 изображений. Наименьшее количество изображений у вида составляет около 50 изображений, а максимальное количество изображений - около 350 изображений.

Предварительная обработка данных

Чтобы преобразовать изображения в читаемый ввод для нашей CNN, мы должны предварительно обработать изображения. Это включает в себя следующие шаги:

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

2. Создайте числовые ярлыки.

3. Измените размер изображений.

4. Считывать изображения как массивы RGB.

5. Произвольный порядок изображений.

6. Ввод изображения в один массив

7. Нормализовать входные функции (изображения) и метки быстрого кодирования.

8. Сохраните входные данные, метки и дополнительную информацию.

Разделите данные для обучения

Мы разбиваем наши массивы изображений (и соответствующие метки) на три части:

  1. train-set: данные, на которых мы обучаем модель (здесь 80%)
  2. development-set (dev-set): данные, которые мы используем для оценки эффективности обобщения модели (для новых, невидимых данных) во время обучения (здесь 10%).
  3. test-set: данные, которые мы хотим предсказать, используя нашу обученную модель (здесь 10%)
  • Для дальнейшей оценки результатов мы выделяем метки (латинские термины), числовые метки, имена файлов и источник (лаборатория / поле) для тестового набора.

Архитектура модели

Модель принимает в качестве входных изображений изображения размера (m, 64, 64, 3), то есть цветные изображения 64x64 (3 канала RGB).

В первом сверточном слое применяются 32 фильтра 5x5 с шагом 1 (так что каждый фильтр перемещается по изображению с шагом 1 пиксель) и без заполнения. Следовательно, выход этого сверточного слоя будет (m, 60, 60, 32). Это произойдет, если вы примените формулу, приведенную выше:

Он подается на уровень максимального объединения, в котором окно (2,2), выбирая каждый максимум, скользит по входу с шагом 2, сворачивая вход на выход (m, 30, 30, 32).

Следующий сверточный слой состоит из 64 фильтров 5x5, снова с шагом 1. Это генерирует выходной сигнал (m, 26, 26, 64), который через следующий слой объединения (спецификации, как в первом) сворачивается в размер (м, 13, 13, 64).

Выходные данные этого уровня объединения затем сглаживаются в матрицу (10816, m) (13x13x64 = 10816) и передаются на полностью подключенный уровень с 1000 узлов, который, в свою очередь, выводит (1000, m) на последний слой SoftMax с 185 узлов (185 классов), давая (185, m) в качестве окончательного результата.

Функция активации выпрямленного линейного устройства используется во всей сети (за исключением последнего уровня SoftMax). Он определяется как f (x) = max (0, x), поэтому он просто присваивает ноль отрицательным значениям и сохраняет положительные значения неизменными. Таким образом, функция ReLu учитывает нелинейность в наших более поздних результатах.

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

Модель обучалась с помощью оптимизатора Adam в качестве алгоритма оптимизации градиентного спуска. Скорость обучения была установлена ​​на 0,0001 со спадом на е-8 (для предотвращения выхода за глобальный минимум). В качестве функции потерь использовалась категориальная кросс-энтропийная стоимость.

Обучение

Наше обучение длилось 400 эпох. Точность быстро повышается до 40-й эпохи обучения. После этого можно будет наблюдать только медленное повышение точности.

Потеря ведет себя аналогично точности. Мы можем сильно сократить потери до 40-й эпохи. После этого потери уменьшаются очень маленькими шагами.

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

Оценка

С нашей лучшей моделью мы достигли точности на тестовом наборе около 89%.

Однако мы должны присмотреться к этому результату, потому что он является средним. Чтобы принять твердое решение, насколько хорошо работает наша модель, нам нужно знать ее слабые стороны. Поэтому мы должны спросить себя:

1. Имеет ли значение, получены изображения в лаборатории или в полевых условиях?

2. Какие классы мы можем особенно хорошо классифицировать с помощью нашей модели, а какие - особенно сложно?

Лаборатория или поле

Чтобы ответить на этот вопрос, мы подсчитали и сравнили количество неправильно классифицированных лабораторных снимков с количеством ошибочно классифицированных полевых снимков.

Количество ошибок лабораторных изображений: 0,058033780857514074

Изображения поля количества ошибок: 0.2570694087403599

Таким образом, мы знаем, что картинки с поля распознаются намного хуже, чем созданные в лаборатории.

«легкие» и «сложные» классы

Чтобы определить, по каким классам модель работала хорошо, а какие часто неправильно классифицировались, мы рассмотрели виды без ошибок и виды с самым высоким уровнем ошибок (10%).

Пример для (одного из видов с самым низким уровнем ошибок) (abies nordmanniana):

Пример для видов с наибольшим количеством ошибок (ulmus glabra):

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

Тепловая карта для видов с наименьшим количеством ошибок (abies nordmanniana):

Тепловая карта для видов с наибольшим количеством ошибок (ulmus glabra):

Примеры тепловых карт лабораторных изображений:

Примеры тепловых карт полевых снимков:

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

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

Заключение

Благодаря нашей простой архитектуре мы смогли повысить производительность по сравнению с алгоритмом компьютерного зрения. В частности, точность наивысшего уровня выросла с прибл. От 72% (алгоритм компьютерного зрения) до 89% (наша модель), обучая в среднем 133 примера для каждого из 185 классов древесных пород в Северо-Восточной Америке. Это подчеркивает, насколько многообещающим является подход CNN для классификации изображений.

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

Более того, можно использовать более крупный и в целом более сбалансированный набор данных для разных видов. Кроме того, может быть разумным использовать версии изображений с более высоким разрешением, чем 64x64 пикселя, в качестве входных данных для CNN для дальнейшего повышения производительности. В этом проекте, несмотря на использование Google Collaboratory, вычислительных ресурсов для этого было недостаточно. Этот подход может быть особенно полезен для древесных пород с относительно небольшими листьями.

После завершения проекта мы думаем о том, что узнали. Мы пришли к выводу, что кодирование выглядит сложнее и сложнее, чем оно есть на самом деле. Выучить основы программирования можно менее чем за 50 часов. Еще один момент заключается в том, что в Python можно найти полезные пакеты практически для всего. Вам не нужно разбираться в математике, лежащей в основе искусственного интеллекта. Тем не менее, очень полезно понимать математические основы в целом. Кроме того, мы считаем, что удобно иметь полные и чистые данные, потому что даже предварительная обработка может занять очень много времени.

В заключение мы хотим поблагодарить руководство TechLabs за их огромную поддержку в течение предыдущего полугодия!

Если у вас есть вопросы, не стесняйтесь обращаться к нам:

Матис Эриксен [email protected]

Крис Веннеманн [email protected]

Йенс Буртшайдт https://www.linkedin.com/in/jens-burtscheidt/

Дженнифер Хёллинг [email protected]