Этот проект предоставляет хороший обзор концепций и приложений CNN для новичков в этой области

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

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

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

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

набор данных

Набор данных, используемый для этого проекта, состоит из различных изображений людей и собак. Изображения людей — набор данных изображений людей можно скачать здесь. Следовательно, изображения собак — dog-image dataset — можно скачать здесь.

Исследование данных

Изучение набора данных покажет, что набор данных изображений собак содержит 8351 изображение собак, принадлежащих к 133 различным категориям. Следовательно, было выполнено хорошее разделение набора данных для обучения и проверки, чтобы получить 6680 изображений для обучения, 835 изображений для проверки и 836 изображений для тестирования модели ML. Отдельные наборы данных проверки и тестирования помогут нам выбрать лучшую модель ML, одновременно сохраняя модель в неведении о наборе данных тестирования.

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

Распознавание лиц

В первой части проекта мы создаем приложение для обнаружения лиц, которое может обнаруживать лица людей и морды собак на любом предоставленном изображении. Мы используем реализацию OpenCV каскадных классификаторов на основе признаков Хаара для обнаружения человеческих лиц на изображениях. OpenCV предоставляет множество предварительно обученных детекторов лиц, хранящихся в виде XML-файлов на github.

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

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

Следовательно, мы используем предварительно обученную модель ResNet-50 для обнаружения собак на изображениях. Модель ResNet-50 была обучена на ImageNet, очень большом и очень популярном наборе данных, используемом для классификации изображений и других задач зрения. ImageNet содержит более 10 миллионов URL-адресов, каждая из которых ведет к изображению, содержащему объект из одной из 1000 категорий. При наличии изображения эта предварительно обученная модель ResNet-50 возвращает прогноз (полученный из доступных категорий в ImageNet) для объекта, содержащегося в изображении.

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

Проектирование CNN (с нуля)

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

Поскольку я разрабатывал такую ​​модель с нуля, первым шагом было проведение интернет-исследования того, как эти модели обычно строятся. Сначала я построил очень простую модель CNN, которая работала очень плохо. После дополнительного анализа я пришел к выводу, что мне нужна более глубокая архитектура, чтобы получить лучшие результаты. В конце концов я пришел к архитектуре модели, которая казалась разумной и давала приемлемую точность. В качестве примечания, использование отсева 0,25–0,5, по-видимому, обеспечивает очень хорошую рандомизацию и помогает предотвратить систематическую ошибку.

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

Обучение такой глубокой модели CNN требует значительных ресурсов. Одна партия обучения на процессоре занимает около 26 минут. Однако, используя мощность графических процессоров, предоставляемых платформой Udacity, время обучения пакета может быть значительно сокращено до 2 минут. При выполнении на совершенно невидимом наборе тестовых данных модель CNN имела точность тестирования 15%, правильно классифицируя 128 из 836 изображений собак.

Выявление породы собак — невероятно сложная задача даже для человека. Следовательно, иметь машину, обученную делать это, действительно здорово!

Проектирование CNN (с использованием трансферного обучения)

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

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

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

Используя этот подход к трансфертному обучению, модель теперь достигает очень хорошей точности. Хотя время обучения по-прежнему остается более или менее одинаковым, а архитектура графического процессора определенно необходима для достижения разумного времени обучения, модель теперь работает с точностью тестирования 83%, правильно классифицируя 697 из 836 изображений собак.

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

Собираем вместе

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

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

Заключение и выводы

Выявление породы собак — невероятно сложная задача даже для человека. Я, например, не могу посмотреть на изображение собаки и предсказать породу животного. Следовательно, иметь машину, обученную делать это, было действительно круто!

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

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

Этот проект во всей красе размещен на Github. Любые отзывы или предложения будут высоко оценены.