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

Этот проект является частью моей нано-степени от Udacity.

Обзор

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

Шаги по проекту

  • Шаг 0: импорт наборов данных
  • Шаг 1. Обнаружение людей
  • Шаг 2: обнаружение собак
  • Шаг 3. Создайте CNN для классификации пород собак (с нуля)
  • Шаг 4. Используйте CNN для классификации пород собак (с использованием трансферного обучения)
  • Шаг 5: Создайте CNN для классификации пород собак (с использованием трансферного обучения)
  • Шаг 6: напишите свой алгоритм
  • Шаг 7: проверьте свой алгоритм

Данные

Для решения этой проблемы нам нужно много разных данных, давайте начнем с их загрузки:
1. Изображения собак
2. Изображения людей
3. Возможности ResNet50
4. Модель распознавания лица OpenCV

Теперь мы продвигаемся вперед в создании приложения для собак, шаг за шагом.

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

Шаг 2. После этого начинается основная процедура - обнаружение человека и собаки.

  1. Детектор человека

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

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

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

Итак, в результате

100.0% images of the first 100 human_files were detected as human face.
11.0% images of the first 100 dog_files were detected as human face.

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

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

2. Детектор собак

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

Итак, в результате

0.0% images of the first 100 human_files were detected as dog.
100.0% images of the first 100 dog_files were detected as dog.

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

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

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

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

2. Используемые фильтры: 16, 32, 64 в каждом сверточном слое.

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

4. Количество узлов в полностью связанном слое: 133.

5. Функция активации Softmax для получения вероятности предсказания для полностью соединенного слоя.

6. Для всех остальных уровней используется функция активации Relu.

Шаг 4. Использование CNN для классификации пород собак

В этой части трансферное обучение используется для обучения нашей собственной CNN, и этот шаг включает в себя следующее:

Сначала получите характеристики узких мест, а затем смоделируйте, используя предварительно обученную модель VGG-16 в качестве экстрактора фиксированных признаков, где последний сверточный выходной сигнал VGG-16 подается в качестве входных данных для нашей модели. где общие параметры - 68 229, обучаемые параметры - 68 229, а необучаемые - 0.

Затем скомпилируйте, обучите, загрузите модель с потерей проверки и, наконец, протестируйте модель. Я получил точность теста 46,17%. И спрогнозируйте породу собаки по модели.

Шаг 5. Передача обучения для создания CNN для классификации пород собак

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

Для этого шага я использую следующее:

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

Теперь веса нового полностью связанного слоя рандомизированы.

Сеть обучена обновлять веса нового полностью связанного слоя.

В основном я использовал модель Xception, которая дала лучший результат. Я также добавил:

  1. полностью связанный слой с 500 узлами.
  2. функция активации ReLU для обнаружения большего количества шаблонов.
  3. Отсев во избежание проблем с переобучением.

На этот раз я получил точность теста 82,5359%.

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

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

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

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

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

Для этого шага я пишу свой алгоритм и тестирую его с помощью Test_images.

Сначала я пишу свой алгоритм, который содержит две функции: одна - display_img, которая дает изображение, а другая - pred_breed, предсказывает следующее:

  1. Определите оценку любого изображения, предоставленного пользователем в качестве входных данных, если это изображение собаки или изображение человека или ни человека, ни собаки.
  2. Затем, если это изображение собаки, он дает оценку: «Это изображение собаки, а также оценивает, к какой породе принадлежит эта собака.
  3. И если это человеческое изображение, результат будет: «Это изображение человека», а также предположение, на какую породу собак похож этот человек, т.е. «И… если это собака, то я думаю, это будет… . (название породы собак) ».
  4. А если изображение не человека или собаки, то результат будет следующим: «Это не собака и не человек».

Вопрос: Результат лучше, чем вы ожидали :)? Или того хуже :(? Укажите как минимум три возможных варианта улучшения вашего алгоритма.

Ответ: Да! Это лучше, чем я ожидал. Но есть одна ошибка в одном предсказании test_img_6, которое является человеческим изображением, но не предсказано ни как собака, ни как человек. Так что здесь нужны улучшения.

Улучшения:

  1. Дайте больше данных для обучения
  2. Дайте более плотные естественные сети
  3. Также можно использовать разные библиотеки, такие как pytorch

Здесь я показываю некоторые результаты:

И вот test_img_6, обнаружение которого неверно, и поэтому моему приложению нужны некоторые улучшения, как упомянуто выше, или любые другие

Итак, вот и конец моей истории. Пожалуйста, поделитесь своими ценными отзывами. Хорошего дня :) !!