Практическая практика использования объекта набора данных

В области распознавания изображений общий обучающий набор может занимать от ГБ до ТБ, при этом каждое изображение становится все больше и больше, нет возможности предварительно загрузить все изображения в память и выполнить обучение модели. В этой статье мы коснемся того, как использовать некоторые удобные функции в 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

[3] https://keras.io/api/preprocessing/image/