Мы реализуем классификатор CNN, используя структуру pytorch с помощью передачи обучения от человеческого детектора.

Из этого поста вы узнаете следующее:

  1. Обнаружить объект с помощью OpenCV
  2. Разработать модель глубокого обучения CNN с нуля на pytorch
  3. Разработайте классификатор CNN, используя трансферное обучение

Мы будем следовать указанным шагам для достижения нашей цели:

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

Подробный блокнот iPython доступен здесь

Шаг 0: Импорт наборов данных

Загрузите набор данных собак. Разархивируйте папку и поместите ее в домашнюю директорию этого проекта по адресу /dog_images. Загрузите человеческий набор данных. Разархивируйте папку и поместите ее в домашний каталог по адресу /lfw.

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

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

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

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

Шаг 2: Обнаружение собак (трансферное обучение)

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

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

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

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

Net(
  (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv3): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (fc1): Linear(in_features=50176, out_features=500, bias=True)
  (fc2): Linear(in_features=500, out_features=133, bias=True)
  (dropout): Dropout(p=0.25)
  (batch_norm): BatchNorm1d(500, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)

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

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

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

Шаг 5: Проверьте свой алгоритм

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

Результаты

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

  1. Модель на основе Хаара с использованием OpenCV для обнаружения человеческого лица:

98,0%%изображений из первых 100 файлов human_files были определены как человеческое лицо.
17,0% изображения первые 100 файлов dog_file были обнаружены как человеческое лицо.

2. модель ed с использованием OpenCV для обнаружения собак:

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

3. Модель на базе ВГГ-16

Процент изображений в human_files_short, на которых обнаружена собака: 0%
Процент изображений в dog_files_short, на которых обнаружена собака: 100%

4. Модель CNN, разработанная с нуля

Средняя потеря при тестировании: 1,051463
Точность тестирования: 80% (670/836)

Отражение

В проекте мы начинаем с обнаружения объектов с использованием хаар-подобных функций с реализацией openCV и заканчиваем разработкой модели для классификации на основе CNN. В промежутках мы коснулись трансферного обучения (настройки предварительно обученной модели для нашей цели), а также разработки модели CNN с нуля.

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

Вывод

Даже после такой большой работы еще многое можно улучшить:

  1. Используйте другую предварительно обученную модель, например RESNET50: она может давать разные результаты из-за другой архитектуры.
  2. Увеличьте количество слоев в модели CNN, разработанной с нуля: это позволит модели изучить больше структур в данных, что даст лучшие результаты.
  3. Использование лучшей функции оптимизатора, такой как Адамс или Ададельта, вместо SGD: это поможет модели быстрее достичь минимума, тем самым сократив время обучения. Также может быть вероятность того, что SGD застрянет на локальных минимумах с помощью Адамса, что также может решить эту проблему.
  4. Обучение модели для большего количества эпох также может привести к повышению производительности, просто имейте в виду, что вы не должны в конечном итоге переобучать модель.