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

Я выполнил этот проект, работая над наностепеней Udacity, и он также определит, человек это или собака.

когда Udacity предоставил мне на выбор несколько различных проектов для получения степени Data Scientist Nano, я выбрал «Проект классификатора пород собак». Это очень популярный проект среди программ глубокого обучения и искусственного интеллекта Nanodegree, предлагаемых Udacity.

Обзор

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

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

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

Шаг 1: Обнаружение людей

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

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

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

Шаг 5: Напишите свой алгоритм

Шаг 6: проверьте свой алгоритм

В этом проекте я использовал Pytorch для создания сверточной нейронной сети (CNN), чтобы делать прогнозы.

Чтобы выполнить шаги, вы можете загрузить или клонировать блокнот из моего репозитория GitHub. В репозитории есть dog_app.ipynb, который также работает на графическом процессоре, если он есть.

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

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

Набор данных собаки и Набор данных человека

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

Шаг 1: Обнаружение людей

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

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

Вывод этого кода:

Напишите детектор человеческого лица

Мы можем использовать эту процедуру для написания функции, которая возвращает True, если на изображении обнаружено человеческое лицо, и False в противном случае. Эта функция с метким названием face_detector принимает строковый путь к файлу изображения в качестве входных данных и появляется в блоке кода ниже.

В идеале нам нужно 100% изображений людей с обнаруженным лицом и 0% изображений собак с обнаруженным лицом. наш алгоритм не соответствует этой цели. Лицо обнаружено на 98 % изображений людей и на 17 % изображений собак.

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

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

Получите предварительно обученную модель VGG-16

Загрузите модель VGG-16 вместе с весами, которые были обучены в ImageNet, очень большом и очень популярном наборе данных, используемом для классификации изображений и других задач зрения. ImageNet содержит более 10 миллионов URL-адресов, каждая из которых ведет к изображению, содержащему объект из одной из 1000 категорий.

Затем я создал функцию, которая принимает путь к изображению в качестве входных данных и возвращает индекс, соответствующий классу ImageNet, предсказанному предварительно обученной моделью VGG-16. Выход всегда должен быть целым числом от 0 до 999 включительно. Этот метод также выполняет нормализацию и предварительную обработку входного изображения с использованием Pytorch.

‹script src="https://gist.github.com/gunanksood/22b152675dbef458073e0cb519089f84.js'›‹/script›

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

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

Архитектура сверточной нейронной сети

Почему я использую эту архитектуру CNN?

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

Добавлено 3 слоя свертки с размером ядра 3x3 и отступом 1, которые используются во многих базовых архитектурах CNN, которые я исследовал в Интернете. с 32 фильтрами на первом слое, 64 на втором слое и 128 слоями в последнем слое свертки.

Добавлен слой MaxPool размером 2x2, который вдвое меньше размера карты характеристик на каждом слое. После 3 слоев CNN и слоев Maxpool мы получили 2828 изображений с глубиной 128. После выравнивания я получил 100352 (2828*128) в качестве входных данных для 3 полносвязных слоев.

Не использовал softmax на последнем слое FC, потому что я использовал CrossEntropyLoss для расчета потерь, которые сочетают в себе функцию softmax и функцию потерь с отрицательным логарифмическим правдоподобием.

Я использовал CrossEntropyLoss в качестве функции потерь и Stochastic Gradient Descent Optimizer.

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

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

Я выбрал ResNet в качестве предварительно обученной модели, потому что это современная модель для классификации изображений. Я изучил структуру и функции ResNet. ResNet представляет «соединение с ярлыком идентификации», которое пропускает один или несколько слоев. Это предотвращает переоснащение во время обучения, что помогает повысить точность.

Я заморозил веса и заменил полносвязные слои выводом 133 породы собак.

После обучения и тестирования этой модели с той же функцией потерь я получил точность 70%.

Шаг 5: Напишите свой алгоритм

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

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

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

Шаг 6: Проверьте свой алгоритм

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

Каждый пример содержит входное изображение и выходную породу собаки.

Вывод

Я построил модель CNN для классификации пород собак. С помощью Pytorch нам легко не только создать модель CNN, но и протестировать различные предварительно обученные модели трансферного обучения, чтобы проверить производительность нашей модели и повысить точность классификации наших объектов. В этом проекте я попробовал CNN с нуля, и мне пришлось использовать модели обучения передачи VGG-16, Resnet50 и Inception, чтобы проверить их точность с помощью тестовых данных. Я упомянул некоторые моменты о том, как улучшить производительность нашей модели, для получения дополнительной информации вы должны проверить мой репозиторий GitHub

Я создал этот блог как часть проекта для моей научной степени Udacity Data Scientist.

Не стесняйтесь связаться со мной на Linkedin. Спасибо