Автоматическая классификация изображений, полученных с помощью парсера, с использованием сверточной нейронной сети (CNN)
Я создал программу, которая классифицирует изображения, полученные автоматически из поиска 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%. Конечно, с такими разными объектами получилось лучше... Нана Секи милая, а почтовый ящик нет.
График обучения и функция потерь выглядят хорошо. В итоге мы получили удовлетворительный результат.