Python нейронная сеть кошка или собака

Кошка или собака — классификация изображений с помощью сверточной нейронной сети

Дата публикации May 3, 2019

Цель этого поста — показать, как работает Connet (CNN — Convolutional Neural Network). Я буду использовать классический пример классификации кошек / собак, описанный в книге Франсуа Шоле -Глубокое обучение с Python, Исходный код для этого примера доступен на Франсуа ШолеGitHub, Я использую этот исходный код для запуска эксперимента.

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

Модель классификации изображений должна быть обучена с использованием этогоблокнот(там вы найдете описание, откуда можно скачать набор изображений с изображениями кошек и собак). Модель используется и прогнозирование классификации используется в этомблокнот, Для удобства я загрузил свои собственные записные книжки (на основе кода изГлубокое обучение с Pythonкнига) кGitHub,

Я запускал блокнот в образе Jupyter Docker, должен быть обновлен путь к набору данных (см. Пример кода в моем репозитории GitHub), вы должны использовать путь, настроенный Docker, в качестве корневого для получения изображений набора данных с диска:

Читайте также:  Вирус панлейкопении кошек что это такое

Модель построена с использованием подмножества данных:

  1. 1000 изображений кошек и 1000 собак для дрессировки
  2. 500 изображений кошек и 500 собак для проверки
  3. 500 изображений кошек и 500 собак для тестирования

Первая попытка обучения модели выполняется непосредственно с использованием доступных изображений из набора данных. Convnet обучает идентифицировать кошек и собак, используя Keras и TensorFlow. Но переоснащение происходит на ранних итерациях. Это результат обучения, проведенного мной — эффективность проверки не улучшается, когда производительность обучения улучшается — Convnet корректируется в соответствии с данными обучения и не так хорошо работает с данными проверки:

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

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

Классификация изображений на основе модели Connet выполняется в конечной точкеблокнот, Хорошей практикой является сохранение обученной модели, а затем ее повторное открытие для задачи классификации:

Я буду тестировать модель с изображениями наших собак. Давайте посмотрим на основании результатов классификации моделей, насколько близко наша собака выглядит как собака 🙂 (ну, по крайней мере, на основе этих 1000 фотографий собак, использованных для тренировки коннета).

Я буду использовать 11 картинок, все они будут загружены в репозиторий GitHub вместе с записными книжками Python. Первая картинка:

Используя код изГлубокое обучение с Pythonкнига для преобразования изображения в формат для отправкиmodel.predictфункция:

Может быть полезно отобразить преобразованное изображение размером 150×150 пикселей:

Результат классификации: 58% собака. Я думаю, что это хороший результат, все, что больше 50% — это хорошо для собаки, меньше 50% -> внешний вид кошки.

Повторяем одни и те же шаги (звонимmodel.predictфункция) с большим количеством фотографий.

Резюме: convnet был обучен на небольшом наборе данных, и все же он может предложить фантастические результаты классификации (подтверждено фотографиями моей собаки 🙂

Источник

Машинное зрение на Python. Учим нейросеть отличать медведей от слонов

Содержание статьи

В предыдущей статье я показывал примеры простейших нейросетей и демонстрировал, как научить нейронку распознавать цифры. А из статьи «Исходный кот. Как заставить нейронную сеть ошибиться» ты узнаешь, как обмануть машинное зрение.

Бинарная классификация

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

Подключим необходимые библиотеки.

Создадим модель нейросети.

У нашей нейронки только один выход, поскольку результатом ее работы будет бинарная величина: единица — собака, ноль — кошка.

Теперь нейросеть следует обучить. В исходном датасете — 25 тысяч изображений. Мы разделим его на две части для обучения и верификации, а каждое изображение обработаем. Размер изображения должен быть 128 × 128 пикселей, а цвет в диапазоне от нуля до единицы.

Теперь мы запускаем обучение модели и сохраняем результаты в файл:

На моем компьютере с видеокартой GeForce 1060 обучение сети заняло примерно восемь минут.

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

Попробуем распознать эти изображения
Результат

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Источник

Python нейронная сеть кошка или собака

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

Технология переноса обучения (transfer learning) позволяет использовать готовые нейронные сети для решения задач нового типа, не тех, для которых сети предварительно обучались. В этой статье я расскажу как использовать перенос обучения для задач компьютерного зрения в Keras. Мы рассмотрим как с помощью сети VGG16 распознавать собак и кошек на фотографиях.

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

Keras включает набор предварительно обученных нейронных сетей в модуле Keras Applications. Среди наиболее популярных сети VGG16 и VGG19, разработанные в Oxford Visual Geometry Group, InceptionV3 компании Google и ResNet50 компании Microsoft. В каждой новой версии Keras повяляется все больше предварительно обученных сетей.

Многие нейронные сети для задач классификации объектов на изображениях обучены на наборе данных ImageNet. Этот набор данных включает 14 миллионов изображений, относящихся к 21 тысяче классов. Однако нейронные сети обучают не на всем наборе ImageNet, а на его части из 1000 классов объектов. Ежегодно проводятся соревнования Large Scale Visual Recognition Challenge по распознаванию именно этих 1000 классов из набора данных ImageNet.

Распознавание собак и кошек

В качестве примера мы рассмотрим, как можно применить предварительно обученные нейронные сети не для распознавания объектов из набора данных ImageNet, а для более простой задачи распознавания собак и кошек. Данные мы возьмем из соревнования Kaggle «Cats vs Dogs». Задача соревнования — определить, кто находится на фотографии: кот или собака. Классов всего два, поэтому задача бинарной классификации. Вот примеры фотографий:

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

В отдельной статье я рассказывал, как подготовить данные с фотографиями кошек и собак для обучения глубокой нейронной сети в Keras. Если вы еще не подготовили данные, то можете сделать это сейчас.

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

Нейронные сети, обученные для решения задач классификации изображений, состоят из двух частей:

  • Сверточная часть используется для выделения характерных признаков из изображения.
  • Полносвязная часть реализует классификацию — определяет, что за объект находится на изображении на основе признаков, которые извлекла сверточная часть.

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

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

Сверточная часть сети VGG16 состоит из пяти каскадов свертки и подвыборки. В первых двух каскадах используются по два слоя свертки и слой подвыборки с выбором максимального значения (max pooling). На трех следующих каскадах по три слоя свертки и один слой подвыборки. Размер ядер во всех слоях свертки 3х3.

Полносвязная часть сети VGG16 включает три уровня. На выходном уровне 1000 нейронов по количеству классов объектов. Используется формат one-hot encoding: значение только одного выходного нейрона должно быть близко к единице, остальные близки к нулю. Класс объекта на картинке соответствует нейрону, значение которого близко к единице. Перед выходным слоем в сети VGG16 еще два полносвязных слоя по 4096 нейронов.

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

Второй этап: к сверточной части сети VGG16 добавляем новый классификатор для распознавания собак и кошек:

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

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

Реализация переноса обучения на Keras

Давайте рассмотрим, как реализовать перенос обучения для распознавания собак и кошек в Keras. В репозитории примеров кода курса можно найти Jupyter ноутбук с полной версией программы.

Для начала подключаем необходимые модули Keras. Для TensorFlow версии 1.4 и выше, которая уже содержит Keras:

Если Keras установлен отдельно от TensorFlow, в том числе с другим бэкендом:

Фотографии собак и кошек должны быть разделены на три набора данных: для обучения, проверки и тестирования, которые находятся в трех каталогах. Как это сделать, подробно описано в статье.

Загружаем предварительно обученную нейронную сеть

Для загрузки сети VGG16 используем следующую команду:

Обратите внимание, что мы используем параметр include_top=False , который говорит Keras, что не нужно загружать часть сети VGG16, отвечающую за классификацию. Будет загружена только сверточная часть сети.

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

Для запрещения обучения сети VGG16 устанавливаем значение поля trainable в False .

В выводе диагностической информации видно, что количество параметров (то есть весов входов в нейроны) в сети 14,714,688, но количество обучаемых параметров равно нулю ( Trainable params: 0 ).

Создаем составную сеть

Наша новая сеть будет включать сверточную часть VGG16 и новый классификатор для распознавания собак и кошек. Для создания такой составной сети мы будем использовать последовательную ( Sequential ) модель Keras. Модель задается следующим образом:

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

После этого мы добавляем в модель слой Flatten , который преобразует двумерные вектора признаков, полученные от сверточной части сети VGG16, в одномерный вектор. Полносвязные слои, используемые для классификации, не могут работать с двумерными данными на входе, им нужен одномерный вектор. Первый полносвязный ( Dense ) слой содержит 256 нейронов, функция активации полулинейная. Затем идет слой Dropout , который используется для снижения переобучения.

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

Напечатаем информацию о составной сети:

Видно, что первый слой в сети — это отдельная модель. Всего в сети 16,812,353 парметров, из них обучаемых — 2,097,665. Все обучаемые параметры относятся к полносвязным слоям (2,097,408 параметров на слое dense_1 и 257 параметров на выходном слое dense_2 ).

Обучаем составную сеть на новом наборе данных

Перед обучением сеть необходимо скомпилировать:

В качестве функции ошибки указываем binary_crossentropy , потому что у нас задача бинарной классификации. Если классов больше, чем два, то нужно использовать categorical_crossentropy .

Часть сети у нас уже предварительно обучена, поэтому для новой части нужно использовать небольшую скорость обучения, иначе алгоритм обучения может не сойтись. Параметр скорости обучения мы указываем при создании оптимизатора Adam в параметре lr (сокращение от learning rate, скорость обучения). Значение параметра lr в примере единица на десять в минус пятой степени (для оптимизатора Adam по умолчанию lr=0.001 , на два порядка больше).

Обучать сеть мы будем при помощи генераторов изображений Keras. Как это делается подробно объяснено в статье. Создаем генераторы для обучающего, проверочного, и тестового набора данных:

Обучаем сеть с использованием генераторов:

Диагностический вывод обучения сети:

Сеть обучается достаточно долго. У меня на GPU NVIDIA GTX 1050Ti одна эпоха обучения занимает примерно 450 секунд, общее время обучения примерно 75 минут. На центральном процессоре время обучения будет значительно больше. Поэтому не рекомендуется обучать такую сеть без GPU.

После 10 эпох обучения аккуратность на обучающем наборе данных составляет 99,83%, на проверочном наборе — 97,56%.

Оцениваем качество обучения сети

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

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

С другой стороны, при обучении сверточной нейронной сети распознавать кошек и собак с нуля, аккуратность на тестовом наборе данных была 84.30%. Использование предварительно обученной сверточной нейронной сети VGG16 позволило нам поднять точность работы более чем на 10%.

Мы научились использовать технологию переноса обучения (transfer learning) для применения предварительно обученных сетей к новым типам задач. Краткая схема переноса обучения для задач компьютерного зрения:

  1. Выбрать предварительно обученную нейронной сети и взять от нее только сверточную часть, удалив полносвязную. В Keras нужно указать параметр include_top=False при создании сети.
  2. Создать составную сеть на основе предварительно обученной сети и нового классификатора, который создается для нашей задачи. Предварительно обученную сеть можно добавить в составную сеть таким же образом, как добавляем отдельные слои.
  3. Обучить составную сеть на новом наборе данных. Обучать нужно только веса добавленного в сеть классификатора, предварительно обученная сверточная часть должна быть «заморожена».

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

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

Источник

Оцените статью