ВНУТРИ ИИ

Напишите свой собственный классификатор пород собак всего за 10 минут!

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

Это снова мы. На этот раз мы займемся разработкой собственного классификатора пород собак. Наша модель сможет автоматически определять собаку на картинке и предсказывать ее породу. Звучит безподобно! Давай нырнем… ..!

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

  • Используемая архитектура: CNN
  • Языки программирования, библиотеки и фреймворки: Python, NumPy, Pandas, Matplotlib, cv2, Keras [Tensorflow Backend]
  • Уровень экспертизы: в некоторой степени средний

Наша стратегия: -

Предсказать породу собаки - довольно сложная задача, но я расскажу вам о ней. Перво-наперво, модель должна уметь определять, есть ли собака на изображении или нет. Тогда он сможет предсказать породу этой собаки. Но пока давайте сосредоточимся на проблеме обнаружения собаки на изображении. Есть много способов решить эту проблему. Такой, что: -

  • Обучение нейронной сети на обнаружение собаки на изображении. Затем с помощью этой обученной модели и тонкой настройки предсказать породу этой собаки.
  • Использование подхода конечного глубокого обучения. Таким образом, вместо того, чтобы обнаруживать собаку и затем прогнозировать ее породу по отдельности, просто предоставьте CNN набор данных о породе собак и позвольте ей изучить обе функции одновременно.
  • Используйте предварительно обученную модель, например, VGG-19, EXCEPTION, RESNET, а затем используйте Transfer Learning, чтобы предсказать породу собаки.

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

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



Теперь переходим ко второму шагу. На первом этапе мы использовали предварительно обученную модель для определения присутствия собаки, но мы могли добиться чего-то более важного с помощью трансферного обучения. Это извлечение признаков. Если вы знакомы с CNN и с тем, как они работают, возможно, вы знакомы с концепцией извлечения признаков. Если нет, обратитесь к this.
Поскольку такие модели, как Xception и ResNet, достигли производительности человеческого уровня при классификации изображений, они являются неплохими экстракторами функций, и мы можем использовать это для наше преимущество. Итак, ниже приводится краткий обзор того, как мы подойдем к этой проблеме: -

  • Импорт набора данных.
  • Предварительная обработка набора данных.
  • Импорт предварительно обученной модели.
  • Внедрение трансферного обучения.
  • Визуализирую некоторые результаты.
  • Сравнение производительности.

Для этой задачи мы будем создавать нашу Модель, используя две разные предварительно обученные модели, а затем использовать Трансферное обучение. Мы будем использовать следующие модели: -
- XCEPTION
- RESNET152V2

Обе эти модели довольно мощные и глубокие, особенно вторая.

Примечание.
Я знаю, что у большинства из вас нет доступа к мощным машинам. Не волнуйся. Нам поможет Google. Как всегда!. Возможно, вы знакомы с google colab, он предоставляет вам среду, в которой вы можете запускать свои записные книжки jupyter. Ноутбуки Colab выполняют код на облачных серверах Google, что означает, что вы можете использовать мощь оборудования Google, включая графические процессоры и TPU.

Прежде чем переходить к реализации модели, убедитесь, что ваша система / компьютер / ноутбук удовлетворяет следующим требованиям, если вы хотите запустить эту модель на своем локальном компьютере.
- GPU
- около 24 ГБ ОЗУ
- Около 40 ГБ свободного места

Так что вам не о чем беспокоиться. Просто перейдите на colab.research.google.com. Загрузите или создайте новый блокнот, и вы готовы к работе. Вы можете посмотреть это видео на Google, чтобы начать работу.

Примечание. Настоятельно рекомендуется открыть мою записную книжку, прежде чем читать о том, как реализовать. Вы можете найти оригинальный блокнот здесь (Github). И для Colab Version [рекомендуется].





Импорт и загрузка набора данных: -

Для этой проблемы у нас нет предварительно обработанных данных. Поэтому мы должны сами его предварительно обработать. Загрузите набор данных здесь. Заархивированные файлы содержат три папки: train, test и validation. Все эти папки содержат изображения разных пород собак, упорядоченные в алфавитном порядке в разных папках.

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

Следующий:-

Функция load_dataset() используется для чтения и сохранения адреса каждого изображения в наборе данных вместе с его меткой. Поскольку у нас 133 породы собак, длина нашего кодировщика One Hot будет 133. Мы могли бы напрямую считывать изображения и сохранять их в виде массива NumPy, но в этом случае мы можем потерять информацию о категории каждого изображения собаки.
Теперь создайте базу данных имен изображений вместе с их целевыми метками.

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

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

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

Теперь давайте визуализируем результаты.

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

2. Предварительная обработка набора данных: -

Теперь нам нужно прочитать изображения, используя созданную базу данных, а затем сохранить их в виде трехмерных массивов. Наряду с этим, мы должны изменить размер всех изображений до одинаковой формы, потому что Xception и ResNet принимают только 299x299 и 224x224 соответственно. Поскольку у нас есть две модели, сначала рассмотрим сеть Xception и обработаем наши изображения в соответствии с этой моделью.

Наряду с ограничением формы ввода, эти модели также имеют некоторые другие шаги предварительной обработки, но нам не о чем беспокоиться. Керас предоставляет нам функцию для этого. Я расскажу об этом [key: 1] через минуту.

3. Импорт предварительно обученной модели: -

Сначала мы будем работать с моделью Xception. Эта модель была обучена на наборе данных ImageNet для обнаружения 1000 классов изображений. Итак, последний уровень модели имеет 1000 единиц. Но нам не нужно распознавать 1000 объектов. Мы хотим спрогнозировать породу собак, в которой всего 133 класса [породы собак]. Итак, мы удалим последний слой модели Xception и заменим его слоем из 133 восприятий (единиц), чтобы предсказать породу собаки. Итак, чтобы импортировать файл Model.

Теперь у нас есть Модель без последних 1000 слоев восприятия. У нас есть два варианта: либо добавить новый слой в конце этой модели, либо использовать то, что называется горлышком бутылки, чтобы сэкономить вычисления. Позвольте мне объяснить: если мы добавим новый слой [133 восприятия] в конце этой модели и установим все остальные уровни, кроме последнего [133 perceptronlayer], как не обучаемые, то на каждом этапе прямого распространения мы должны передать Изображение от входного слоя до 100 раз на выходе [из-за количества эпох или циклов обучения]. Так что это очень избыточное вычисление. Итак, мы передадим все изображения в модель Xception [последний слой удален] только один раз и сохраним вывод второго последнего слоя этой модели относительно этих изображений. Затем мы создадим новую модель и предоставим эти выходные данные в качестве входных данных для вновь созданной Модели с выходными данными [уровень восприятия 133]. Мы ничего не изменили, но разделили Модель на две модели, чтобы сократить объем вычислений.

Ниже представлено небольшое пояснение через изображение.

Считайте это моделью Xception, а не Inception. Обратите внимание, что мы берем выходные данные первой модели и передаем их в качестве входных данных второй модели [которую мы создадим для прогнозирования породы собак]. Первая модель создаст кодировки каждого изображения, которые будут иметь решающее значение при определении породы собаки.

preprocess_input будет предварительно обрабатывать изображения в соответствии с моделью [ключ запоминания: 1] (то есть нормализовать) и предоставит их модели исключений, которая, в свою очередь, возвращает выходные данные в виде необходимых кодировок. Обратите внимание, что мы удалили последний слой, поэтому на выходе будет форма 10x10x248, которая является вторым последним слоем модели Xception.

4. Внедрение трансферного обучения: -

Теперь давайте создадим нашу модель, в которой есть только один слой, который предсказывает породу собаки. Он будет принимать входные данные из выходных данных предыдущей модели (10x10x248). Но перед подключением этих выходных данных к нашему слою мы определим промежуточный уровень, который будет преобразовывать 10x10x248 в 248 слой перцептрона. Для этого мы будем использовать GlobalAveragePoolingLayer().

Итак, у нас есть готовая модель. Пришло время скомпилировать и запустить нашу модель.

5. визуализация результатов

После обучения модели в течение 50 эпох Модель достигла точности около 99% на обучающем наборе, ~ 90% точности на проверочном наборе и 87,5% точности на тестовом наборе. Ух ты!

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

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

Я скачал изображение из Интернета и протестировал его на своей модели.

6. Сравнение моделей: -

Я создал вторую модель с InceptionV3, используя ту же процедуру. Но в этой модели мне пришлось включить дополнительный слой после GlobalAveragePoolingLayer(), потому что модель Inception намного глубже, чем Xception. Поэтому мне пришлось настроить различные параметры для решения проблемы переобучения, потому что без какой-либо надлежащей настройки Модель быстро достигла 100% точности на обучающем наборе. Пришлось потратить много времени, пробуя разные варианты. Краткое изложение этого дано в конце Блокнота. Вы можете открыть Блокнот из GitHub или Google Colab.

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

Итак, как и было обещано, у вас есть собственный классификатор пород собак.

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

Если у вас есть предложения, напишите их в ответ на эту статью.

С уважением,
М.Махьяр Али

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel