Практическая практика использования объекта набора данных
В области распознавания изображений общий обучающий набор может занимать от ГБ до ТБ, при этом каждое изображение становится все больше и больше, нет возможности предварительно загрузить все изображения в память и выполнить обучение модели. В этой статье мы коснемся того, как использовать некоторые удобные функции в Keras для загрузки изображений партиями, не увеличивая объем оперативной памяти.
Мы будем работать с конкретным набором данных из конкурса в Kaggle и научимся:
- Организуйте набор данных в отформатированные каталоги
- Загружать данные прямо из каталогов с пакетными изображениями
- Обучите и оцените модель
Введение в данные
Цель конкурса - выявить отвлеченных водителей с помощью изображений, хорошо организованных в папке обучения и тестирования.
Вот несколько примеров изображений:
Внутри /imgs/train
и /imgs/test
находятся обучающие и тестовые изображения в формате jpg
с 10 различными классами с именами c0, c1, ..., c9
.
Чтобы загружать изображения прямо из каталога, нам нужно немного переформатировать папку, создав нашу обучающую и проверочную папку, в каждой из которых есть подпапки, указывающие классы в ней.
В этом случае мы разбиваем изображения в /imgs/train
на обучающий и проверочный набор и организуем их следующим образом:
| |_driver_split |_ train |_ c0 |_ c1 ... |_ c9 |_ valid |_ c0 |_ c1 ... |_ c9
Где наши изображения вложены в path_to_{train/valid}/{c0-c9}
. Чтобы загрузить изображения из каталога, нам нужно следовать следующей парадигме пути:
path_to_folder/{data_set}/{class_labels}/{actual_images}
В нашем примере это
driver_split/train/c0/img1.jpg ...
Некоторый код предварительной обработки опущен для простоты, идея здесь в том, что мы перебираем все изображения, разделяем их на обучение и проверку и строим symlink
между исходным изображением и изображением в организованной папке. Результат такой:
| |_driver_split |_ train |_ c0 |_ c1 ... |_ c9 |_ valid |_ c0 |_ c1 ... |_ c9
Загрузить изображение из каталога
Теперь, когда изображения аккуратно размещены в назначенных папках, мы можем загрузить наше изображение с помощью функции image_dataset_from_directory
:
Мы вводим путь к нашей папке, он автоматически обнаруживает ярлыки и изображения и загружает их партиями, что критично, так как он не загружает все изображения сразу, что будет стоить вам памяти.
Ключевые аргументы
labels
:inferred
означает, что метка будет выведена из имени родительской папки, в нашем случаеc0, c1, ..., c9
.label_mode
:categorical
означает, что метки будут закодированы в режиме быстрого кодирования.batch_size
: размер пакета загрузки изображений.image_size
: это изменит размер изображений в папке
Дополнительные аргументы вы можете найти в официальных документах.
После завершения загрузки вы увидите это в своей консоли,
Found 18047 files belonging to 10 classes. Found 4377 files belonging to 10 classes.
с указанием количества обнаруженных файлов и классов.
Мы также можем проверить имена наших классов и взять один пример:
Обучите и оцените модель
Для сложности мы бы обучили здесь простой Resnet, но я бы не стал вдаваться в подробности.
Во-первых, наша модель имеет значения пикселей в диапазоне от 0 до 255, нам нужно добавить перед ним дополнительный слой нормализации.
Теперь давайте создадим простой Resnet.
Наконец, давайте скомпилируем и обучим нашу модель! Полный пример написания кода можно найти в моем репо.
Ссылка
[1] https://www.kaggle.com/kweonwooj/kc03-day03-driversplit
[2] https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image_dataset_from_directory