Обзор проекта

Будучи специалистом по данным, глубокое обучение является одним из обязательных знаний и навыков. Этот проект предназначен для программы Udacity Data Scientist по разработке алгоритма и созданию CNN (сверточных нейронных сетей) с двумя задачами:

1. Обнаружить объект на предоставленном изображении как собаку, человека или ни то, ни другое.

2. Если бы объект был обнаружен как собака, на основе заданных классов мировых пород собак модель смогла бы идентифицировать породу собаки.

Зачем нужна модель сверточных нейронных сетей?

CNN является одной из самых искусственных нейронных сетей в качестве регуляризованных версий MLP (многослойных персептронов). Итак, стандартная CNN состоит из сверточных слоев, слоев выборки, за которыми следуют полносвязные слои (т. е. каждый нейрон в одном слое связан со всеми нейронами в следующем слое).

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

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

Доступно несколько пакетов для построения модели CNN, таких как PyTorch, Keras и т. д. В этом проекте мы используем библиотеку Keras для идентификации породы собак.

(https://keras.io/getting-started/sequential-model-guide/)

Метрика

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

Какая модель тренировочного процесса лучше всего?

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

Keras использует метрическую функцию для оценки производительности модели. Функция метрики возвращает одно значение тензора как среднее значение выходного массива по всем точкам данных. Наиболее популярными метриками, используемыми в CNN, являются «точность», «двоичная_точность», «категориальная_точность», «разреженная_категориальная_точность» и т. д.

Точность — это отношение количества правильных прогнозов к общему количеству входных выборок. Однако он работает хорошо, только если есть равное количество образцов, принадлежащих каждому классу.

В этом проекте всего 133 породы собак в качестве ярлыков классов. Основываясь на выбранном распределении обучения/валидации/тестирования (подробности см. в разделе «Шаг 0: Импорт наборов данных»), классы были примерно равномерно распределены, за исключением пары классов. Следовательно, мы должны иметь возможность использовать метрику «точность» в обучении.

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

Подготовка библиотеки

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

Процесс проекта

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

Ниже показан процесс построения модели.

Шаг 0. Импорт наборов данных

Шаг 1. Обнаружение человека

Шаг 2. Обнаружение собак

Шаг 3. Создайте CNN для классификации пород собак (с нуля)

Шаг 4. Используйте CNN для классификации пород собак (с помощью трансферного обучения)

Шаг 5. Создайте CNN для классификации пород собак (с помощью трансферного обучения)

Шаг 6. Напишите собственный алгоритм

Шаг 7. Протестируйте собственный алгоритм

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

Шаг 0: Импорт наборов данных

В этом проекте используются два основных данных: изображение собаки и изображение человека.

1. Изображение собаки

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

С данными у нас есть всего 8 351 изображение документа и 133 категории собак (из dog_names), которые будут использоваться в окончательной классификации.

С данными у нас есть всего 8 351 изображение документа и 133 категории собак (из dog_names), которые будут использоваться в окончательной классификации.

  • train_files, valid_files, test_files — пустые массивы, содержащие пути файлов к изображениям.
  • train_targets, valid_targets, test_targets – пустые массивы, содержащие классификационные метки с горячим кодированием.
  • dog_names — список названий пород собак со строковым значением для перевода этикеток.

Как упоминалось в разделе «Метрики», мы используем «Точность» для измерения производительности модели, что требует равномерного распределения классов в данных. Основываясь на диаграмме, мы можем подтвердить, что обучающий набор данных в основном распределен равномерно (за исключением пары классов), в то время как в наборах данных для проверки и тестирования отсутствуют некоторые классы из-за ограничения размера данных. Учитывая, что данные для обучения достаточно хороши, мы все еще можем использовать эту точность в качестве измерения, но можем улучшить ее за счет большего количества данных проверки и тестирования при разработке модели в будущем.

2. Другой набор данных из 13 233 изображений человека был импортирован и использован для детектора человеческого лица.

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

Шаг 1: Обнаружение человека

На этом этапе реализация OpenCV каскадных классификаторов на основе признаков Хаара используется для обнаружения человеческих лиц на изображениях. OpenCV предоставляет множество предварительно обученных детекторов лиц, и мы загрузили один из таких детекторов для этого проекта, Haarcascade_frontalface_alt.xml.

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

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

Результат использования этого детектора лиц для данного изображения выглядит следующим образом:

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

Итак, что мы должны сделать, чтобы лучше идентифицировать собак?

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

Распределение интенсивности изображения представляет собой график со значениями пикселей (не всегда в диапазоне от 0 до 255) по оси X и соответствующим количеством пикселей в изображении по оси Y.

Шаг 2: Обнаружение собак

Мы используем одну из самых популярных предварительно обученных моделей ResNet-50 для обнаружения собак на изображениях. ResNet-50 был предварительно обучен более чем 10 миллионам изображений с 1000 категориями.

Учитывая, что TensorFlow используется в качестве серверной части, CNN Keras требуют в качестве входных данных массива 4D (также известного как «тензор 4D»), в то время как каждое измерение представляет количество строк, столбцов и каналов для каждого изображения.

Предопределенная функция path_to_tensor получает в качестве входных данных путь к файлу цветного изображения и возвращает 4D-тензор, подходящий для Keras CNN. Функция сначала загружает изображение и изменяет его размер до квадратного изображения с разрешением 224×224 пикселя, а затем преобразует изображение в массив, который затем преобразуется в четырехмерный тензор. В этом случае цветные изображения имеют три канала, такие как (224,224,3), представляющие цвета. Эта функция принимает в качестве входных данных массив строковых путей к изображениям и возвращает четырехмерный тензор с формой (nb_samples, 224, 224, 3), а nb_samples представляет количество изображений.

Чтобы использовать ResNet-50, также требуется дополнительная обработка, такая как преобразование изображения RGB в RBG и нормализация. Нормализация заключается в вычитании среднего пикселя, рассчитанного из всех пикселей во всех изображениях, из каждого пикселя в каждом изображении. Это реализовано с помощью импортированной функции preprocess_input.

Выполнив этот шаг, мы можем начать использовать ResNet-50 для обнаружения собак на изображении.

Из прогнозируемого вектора вероятности для ResNet50 мы получаем целое число, соответствующее классу прогнозируемого объекта, которое используется для идентификации категории из предопределенного словаря. Замечено, что категории, соответствующие собакам, появляются в непрерывной последовательности и соответствуют ключам словаря 151–268. Поэтому проверка того, возвращает ли функция ResNet50_predict_labels значение от 151 до 268 (включительно), даст нам, обнаружено ли изображение с собакой.

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

Теперь у нас есть функции для идентификации собаки по изображению.

Далее мы разработаем метод классификации породы собак, если на изображении была обнаружена собака.

Шаг 3: Создайте CNN для классификации пород собак (с нуля)

Неудивительно, что определение породы собак по изображениям является исключительно сложной задачей. Многие породы выглядят очень похожими или похожими, и, с другой стороны, некоторые собаки одной породы, но разного окраса могут выглядеть по-разному. Учитывая, что было предоставлено только 133 категории собак, мы ожидаем точность около 1%.

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

Опять же, прежде чем разрабатывать модель CNN, нам нужно обработать данные, чтобы они лучше соответствовали CNN. Мы изменим масштаб изображения, разделив каждый пиксель каждого изображения на 255. Почему?

Для большинства данных изображения значения пикселей представляют собой целые числа со значениями от 0 до 255. Известно, что нейронные сети обрабатывают входные данные, используя малые значения веса, а входные данные с большими целочисленными значениями могут замедлить процесс обучения. Поэтому хорошо нормализовать значения пикселей в значения в диапазоне 0–1, и тогда изображения можно будет просматривать в обычном режиме. Таким образом, деление пикселя на 255 вернет значение от 0 до 1.

Создайте архитектуру модели, сочетая слои

CNN как регуляризованные версии многослойных персептронов состоят из слоя свертки, слоя объединения, плотного слоя и т. д.

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

Я протестировал несколько разных слоев в модели.

Тестовая модель № 1, замените слой GlobalAveragePooling на Flatten(): он нарушил пространственную структуру, потребовал много высоких параметров, а затем потребовал очень много времени, но привел к гораздо большим потерям и меньшей точности.

Тестовая модель № 2, добавьте плотный слой с активацией «relu» в первых трех наборах слоя свертки и максимального объединения и отрегулируйте размерность массива до 300: он соединил передние слои и сгладил их. Более ранний плотный слой не помог улучшить модель.

Тестовая модель № 3, добавьте пакетную норморлизацию: это немного помогло уменьшить потери, но отняло очень много времени. По сравнению с другими более эффективными улучшениями, в модели данного проекта оно не реализовано.

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

Последний плотный слой как полносвязный слой действует как классификатор со 133 узлами для идентификации породы собак на основе предоставленных 133 категорий.

Общее количество обучаемых параметров или весов для этой модели составляет 130 тыс.

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

Модель обучалась с 10 эпохами. Я также протестировал обучение модели с 5 эпохами, что дает более низкую точность и более высокие потери.

После загрузки с наилучшей потерей при проверке модель была протестирована на тестовых данных и показала точность 5,5% без какой-либо точной настройки параметров и без какой-либо аугментации данных.

Но я хочу знать, как модель работала в каждую из эпох?

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

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

Шаг 4: Используйте CNN для классификации пород собак

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

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

Последняя карта признаков активации в модели VGG16 дает нам признаки узкого места, которые затем можно передать в нашу модель для классификатора. Функции узких мест можно загрузить с ресурса, как показано в разделе «Подготовка библиотеки».

На этом этапе модель VGG-16 использовалась в качестве экстрактора фиксированных признаков, а последний результат свертки будет подан в качестве входных данных в нашу модель CNN для идентификации породы собак. В качестве классификатора были добавлены только один слой GAP и полносвязный слой (с softmax).

Модель VGG16 показала точность теста 42,6%, что намного выше, чем результат предыдущей модели CNN с нуля, но все же не так, как хотелось бы 60% от Udacity. .

Вот кривая потерь и точности для модели VGG16, показывающая, как модель обучалась. По-видимому, модель не так хорошо работала при проверке данных, как при обучении.

Шаг 5: Создайте CNN для классификации пород собак (с использованием трансферного обучения)

На этом этапе, аналогично тому, как использовалась модель VGG16, я буду применять трансферное обучение для создания CNN с использованием другой предварительно обученной модели, доступной в Keras, InceptionV3.

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

Судя по кривой потерь, модель плохо работала для проверочных данных. И модель начала переоснащаться после 10-й эпохи.

Предсказатель создается для следующего шага.

Шаг 6 и 7: Напишите и протестируйте свой собственный алгоритм

На этом этапе я разработаю алгоритм, который принимает путь изображения.

Первая задача — определить, содержит ли данное изображение собаку, человека или ни то, ни другое.

Следующее задание это

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

· если на изображении обнаружен человек, вернуть похожую породу собаки.

· если на изображении не обнаружено ни того, ни другого, предоставьте вывод, указывающий на ошибку.

Функция классификатора построена, как показано ниже.

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

Для этого мы применяем функцию numpy argmax для извлечения класса/индекса наивысшей вероятности и используем наши метки с самого начала блокнота, чтобы получить название породы собак.

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

Результаты и уточнение модели

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

  • Изображения № 1 и № 2 были правильно идентифицированы как собаки и их породы.
  • Тем не менее, #.3 был ротвейлером, но был ошибочно предсказан как бордовый, как #.2.
  • Изображения № 4 и № 7 были правильно классифицированы.
  • Остальные изображения, включая изображения людей, картонные коробки, изображения собак и людей, были успешно идентифицированы как собаки.
  • Последнее изображение представляет собой человеческое лицо в маске/закрытое, но модель все еще работала. Это означало, что модель смогла уловить ключевую особенность и характер изображения.

Есть несколько способов улучшить модель, включая, помимо прочего, следующие:

  • Увеличивайте породы и тренируйте больше изображений
  • Увеличить количество эпох
  • Увеличение обучающих данных
  • Настройте некоторые параметры модели

Отражение

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

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

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

Есть также некоторые элементы, которые я буду тестировать на модели CNN в будущем, чтобы улучшить производительность, в том числе:

1. Тренируйте больше изображений, особенно более четких изображений.

2. Оптимизатор, функция потерь и другие дополнения, используемые при составлении модели.

3. Расширить классификацию пород собак.

Ссылка:

1. https://en.wikipedia.org/wiki/Сверточная_нейронная_сеть

2. http://deeplearning.net/tutorial/lenet.html

3. http://deeplearning.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/