Мы реализуем классификатор CNN, используя структуру pytorch с помощью передачи обучения от человеческого детектора.
Из этого поста вы узнаете следующее:
- Обнаружить объект с помощью OpenCV
- Разработать модель глубокого обучения CNN с нуля на pytorch
- Разработайте классификатор 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: Проверьте свой алгоритм
В этом разделе мы рассмотрим наш новый алгоритм! На какую собаку, по мнению алгоритма, похож вы? Если у вас есть собака, точно ли она предсказывает породу вашей собаки? Если у вас есть кошка, ошибочно ли она думает, что ваша кошка — собака?
Результаты
Проделав так много работы по разработке моделей, мы получаем следующие результаты:
- Модель на основе Хаара с использованием 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 всегда приходят на помощь, чтобы поддерживать согласованность в трансформации.
Вывод
Даже после такой большой работы еще многое можно улучшить:
- Используйте другую предварительно обученную модель, например RESNET50: она может давать разные результаты из-за другой архитектуры.
- Увеличьте количество слоев в модели CNN, разработанной с нуля: это позволит модели изучить больше структур в данных, что даст лучшие результаты.
- Использование лучшей функции оптимизатора, такой как Адамс или Ададельта, вместо SGD: это поможет модели быстрее достичь минимума, тем самым сократив время обучения. Также может быть вероятность того, что SGD застрянет на локальных минимумах с помощью Адамса, что также может решить эту проблему.
- Обучение модели для большего количества эпох также может привести к повышению производительности, просто имейте в виду, что вы не должны в конечном итоге переобучать модель.