Обучение сверточной нейронной сети для определения породы собаки с использованием трансферного обучения.
Я выполнил этот проект, работая над наностепеней 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. Спасибо