CoderCastrov logo
CoderCastrov
Питон

Автоматическая классификация изображений, полученных с помощью парсера, с использованием сверточной нейронной сети (CNN)

Автоматическая классификация изображений, полученных с помощью парсера, с использованием сверточной нейронной сети (CNN)
просмотров
3 мин чтение
#Питон

Я создал программу, которая классифицирует изображения, полученные автоматически из поиска Google, с использованием сверточной нейронной сети (CNN) с двумя сверточными слоями.

Я использовал язык программирования Python и библиотеку Keras для реализации CNN.

Код: https://github.com/asatty/cnn_scraping_image

Шаги

Шаги выполнения программы следующие:

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

Структура проекта

.├── README.md├── img├── learning_curve└── src ├── cnn.py └── get_img.py

В папке img хранятся полученные изображения, в папке learning_curve - графики обучения, а в папке src - код на Python.

Загрузка изображений из поиска Google

Для загрузки изображений используется скрипт get_img.py. Он принимает аргументы командной строки, и пример команды выглядит следующим образом:

python get_img.py dog cat 100

Эта команда пытается загрузить 100 изображений собак и 100 изображений кошек.

Структура проекта изменится следующим образом:

├── img│ ├── cat│ │ ├── 000001.png│ │ ├── 000002.jpg│ │ ├── (другие изображения опущены)│ ├── dog│ │ ├── 000001.png│ │ ├── 000002.jpg│ │ ├── (другие изображения опущены)

В результате было загружено 71 изображение собак и 76 изображений кошек.

Обучение с использованием CNN

Запустите cnn.py, чтобы обучить модель на 80% изображений из директории.

Модель обучения имеет следующую структуру:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 100, 100, 64)      832       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 50, 50, 64)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 50, 50, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 50, 50, 32)        8224      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 25, 25, 32)        0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 25, 25, 32)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 20000)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               5120256   
_________________________________________________________________
dropout_3 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 514       
=================================================================

Модель содержит два сверточных слоя и три слоя dropout.

Получение результатов

Результаты также получаются в файле cnn.py. В случае классификации собак и кошек с 30 эпохами получили следующие результаты:

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

График обучения сохраняется в директорию с именем learning_curve.

График обучения

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

Обучение на совершенно разных данных

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

Давайте попробуем классифицировать Нана Секи и почтовый ящик.

Нана Секи и почтовый ящик

Так как это совершенно разные объекты, у нас должно получиться.

В результате точность составила 87%. Конечно, с такими разными объектами получилось лучше... Нана Секи милая, а почтовый ящик нет.

График обучения (Нана Секи и почтовый ящик)

График обучения и функция потерь выглядят хорошо. В итоге мы получили удовлетворительный результат.