Мотивация проекта:

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

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

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

Постановка проблемы:

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

Показатели:

Test _Accuracy: это точность, рассчитанная для набора тестовых данных изображений, которая составляет приблизительно 82,655%. Обычно нужно убедиться, что точность теста набора данных выше 60%.

test_accuracy = 100*np.sum(np.array(Xception_predictions)==np.argmax(test_targets, axis=1))/len(Xception_predictions)
print('Точность теста: %.4f%%' % test_accuracy )

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

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

There are 133 total dog categories.
There are 8351 total dog images.

There are 6680 training dog images.
There are 835 validation dog images.
There are 836 test dog images.
There are 13233 total human images.

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

Этапы реализации:

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

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

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

Faces — это пустой массив обнаруженных лиц, где каждая строка соответствует обнаруженному лицу. Каждое обнаруженное лицо представляет собой одномерный массив с четырьмя элементами, указывающими ограничивающую рамку обнаруженного лица. Первые две записи в массиве (извлеченные в приведенном выше коде как x и y) определяют горизонтальное и вертикальное положение верхнего левого угла ограничивающей рамки. Последние две записи в массиве (извлеченные здесь как w и h) определяют ширину и высоту блока.

мы используем эти метрики для написания функции детектора лиц.

  • Какой процент из первых 100 изображений в human_files содержит обнаруженное человеческое лицо?
  • Какой процент из первых 100 изображений в dog_files содержит обнаруженное человеческое лицо?

В идеале нам нужно 100% изображений людей с обнаруженным лицом и 0% изображений собак с обнаруженным лицом. Вы увидите, что наш алгоритм не соответствует этой цели, но все же дает приемлемую производительность. Мы извлекаем пути к файлам для первых 100 изображений из каждого набора данных и сохраняем их в массивах human_files_short и dog_files_short.

100,0 % изображений из первых 100 файлов с изображением человека были распознаны как человеческое лицо.
11,0 % изображений из первых 100 файлов с собаками были распознаны как человеческое лицо.

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

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

Предварительно обработайте данные

При использовании TensorFlow в качестве серверной части, CNN Keras требуют в качестве входных данных массива 4D (который мы также будем называть тензором 4D) с формой

(nb_samples, строк, столбцов, каналов), (nb_samples, строк, столбцов, каналов),

где nb_samples соответствует общему количеству изображений (или выборок), а rows, columns и channels соответствуют количеству строк, столбцов и каналов для каждого изображения соответственно.

Приведенная ниже функция path_to_tensor принимает в качестве входных данных путь к файлу со строковым значением к цветному изображению и возвращает четырехмерный тензор, подходящий для передачи в Keras CNN. Сначала функция загружает изображение и изменяет его размер до квадратного изображения размером 224×224224×224 пикселя. Затем изображение преобразуется в массив, размер которого затем изменяется до четырехмерного тензора. В данном случае, поскольку мы работаем с цветными изображениями, каждое изображение имеет три канала. Точно так же, поскольку мы обрабатываем одно изображение (или образец), возвращаемый тензор всегда будет иметь форму

(1,224,224,3).(1,224,224,3).

Функция paths_to_tensor принимает в качестве входных данных пустой массив путей изображения со строковым значением и возвращает четырехмерный тензор с формой

(nb_samples,224,224,3).(nb_samples,224,224,3).

Здесь nb_samples — это количество выборок или количество изображений в предоставленном массиве путей к изображениям. Лучше всего думать о nb_samples как о количестве трехмерных тензоров (где каждый трехмерный тензор соответствует другому изображению) в вашем наборе данных!

3. Делаем прогнозы с ResNet-50

Подготовка 4D-тензора к ResNet-50 и любой другой предварительно обученной модели в Keras требует дополнительной обработки. Сначала изображение RGB преобразуется в BGR путем переупорядочения каналов. Все предварительно обученные модели имеют дополнительный шаг нормализации, заключающийся в том, что средний пиксель (выраженный в RGB как [103,939,116,779,123,68][103,939,116,779,123,68] и рассчитанный из всех пикселей во всех изображениях в ImageNet) должен вычитаться из каждого пикселя. в каждом изображении. Это реализовано в импортированной функции preprocess_input.

Теперь, когда у нас есть способ отформатировать наше изображение для передачи в ResNet-50, мы готовы использовать модель для извлечения прогнозов. Это достигается с помощью метода predict, который возвращает массив, ii-я запись которого представляет собой прогнозируемую моделью вероятность того, что изображение принадлежит к ii-й категории ImageNet. Это реализовано в функции ResNet50_predict_labels.

Написать детектор собак

При просмотре словаря вы заметите, что категории, соответствующие собакам, появляются в непрерывной последовательности и соответствуют ключам словаря 151–268 включительно, включая все категории от 'Chihuahua' до 'Mexican hairless'. Таким образом, чтобы проверить, предсказывает ли предварительно обученная модель ResNet-50, что изображение содержит собаку, нам нужно только проверить, возвращает ли вышеприведенная функция ResNet50_predict_labels значение от 151 до 268 (включительно).

Мы используем эти идеи для завершения приведенной ниже функции dog_detector, которая возвращает True, если на изображении обнаружена собака (и False, если нет).

После обучения детектора собак мы нашли ответы на следующие вопросы

  • На каком проценте изображений в human_files_short обнаружена собака?
  • На каком проценте изображений в dog_files_short обнаружена собака?

Ответы

0,0% изображений из первых 100 файлов_людей были обнаружены как собаки.
100,0% изображений из первых 100 файлов_собак были обнаружены как собаки.

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

  • Создаются 3 сверточных слоя с 3 максимальными объединяющими слоями между ними, чтобы изучить иерархию функций высокого уровня. Добавлен слой максимального пула, чтобы уменьшить размерность.
  • Добавлен слой Flatten, чтобы преобразовать матрицу в вектор-строку. Это связано с тем, что полносвязный слой принимает только вектор-строку.
  • Использовались фильтры 16, 32, 64 в каждом из сверточных слоев.
  • Отсев использовался вместе со сглаживающим слоем перед использованием полносвязного слоя, чтобы уменьшить переоснащение и обеспечить хорошее обобщение сети.
  • Количество нодеров в последнем полностью подключенном слое было установлено равным 133 вместе с функцией активации softmax для получения вероятностей прогноза.
  • Функция активации Relu использовалась для всех остальных слоев.

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

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

Архитектура модели

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

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

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

мы использовали трансферное обучение для создания CNN с использованием узких мест VGG-16. При этом вы должны использовать узкие места из другой предварительно обученной модели. Чтобы упростить вам задачу, мы предварительно вычислили функции для всех сетей, которые в настоящее время доступны в Keras.

Теперь снова получите узкие места для тестовых и проверочных наборов поездов, а затем начните с создания CNN.

Новый набор данных небольшой и похож на исходные обучающие данные, поэтому конец сети отсекается, и добавляется полносвязный слой, соответствующий количеству классов в новом наборе данных. Затем рандомизируются веса нового полносвязного слоя; Все веса из предварительно обученной сети заморожены. Наконец, сеть обучена обновлять веса нового полносвязного слоя. В целом, я использовал модель Xception, которая дала лучший результат (точность 85,17% и 84,2 с ResNet-50). Я также добавил полностью подключенный слой с 500 узлами и функцией активации ReLU для обнаружения большего количества шаблонов и Dropout, чтобы избежать переобучения.

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

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

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

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

7. Проверьте свой алгоритм:

После выполнения тестов результат довольно хорош по сравнению с тем, что я ожидал. Наблюдается аномалия, хотя для прогноза в случае ввода 75 (тестовое изображение: 7) это должно было быть предсказано как собака. А остальные выходы работают отлично! Фактически, он смог точно идентифицировать человека с помощью фильтра собаки из приложения Snapchat в случае тестового изображения 17.

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

Результаты

После тестирования нашего алгоритма были получены следующие результаты:

Hey, It's a dog!
And I guess the Breed of this dog is a in/006.American_eskimo_dog

Hey, It's a dog!
And I guess the Breed of this dog is a in/115.Papillon

Hum... seems this neither dog, nor human; must be something else .

Hey, It's a human!
Mmmmmm....If you were a dog, I guess you would be a ... in/110.Norwegian_lundehund!!

Вывод:

Точно так же было получено гораздо больше результатов, и мы смогли достичь точности примерно 82,66 и успешно проверить работу нашего алгоритма. Таким образом, мы научились использовать CNN, а также использовать предварительно обученные нейронные сети. как VGG16 Bottleneck_features для создания этого проекта предиктора собак. Это был отличный опыт обучения, хотелось бы продолжить изучение и изучение таких проектов.

Будущие улучшения/объем:

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