Аугментация данных: больше пользы из тех же картинок

Данных всегда не хватает. Аугментация бесплатно превращает одну картинку во множество — и делает сеть устойчивее.

Аугментация данных (data augmentation) — создание новых обучающих примеров из имеющихся путём преобразований, не меняющих класс объекта.

Зачем это нужно

Нейросети жадны до данных, а размечать картинки дорого. Аугментация решает проблему хитро: из одной фотографии кошки делают десятки вариантов — отражённую, чуть повёрнутую, обрезанную, темнее, светлее. Кошка осталась кошкой, но для сети это новые примеры. Эффект двойной:

  • Борьба с переобучением: сеть не «зубрит» конкретные снимки, а учит обобщённый образ.
  • Инвариантность: сеть привыкает узнавать объект под разными углами, освещением, в разном положении — как в реальном мире.

Типичные преобразования

ПреобразованиеЧему учит
горизонтальное отражениеобъект узнаётся зеркально
поворот на небольшой уголустойчивость к наклону камеры
случайный кроп/масштабобъект может быть ближе/дальше, не в центре
сдвиг яркости/контрастаразное освещение
добавление шумаустойчивость к зернистости

Отражение и яркость руками

Покажем два простейших преобразования на маленькой «картинке»: горизонтальный флип (зеркало) и сдвиг яркости.

img = [
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90],
]

def hflip(m):
    return [list(reversed(row)) for row in m]

def brighten(m, delta):
    return [[min(255, p + delta) for p in row] for row in m]

print("Исходник:")
for r in img: print(r)
print("Отражение по горизонтали:")
for r in hflip(img): print(r)
print("Ярче на 30:")
for r in brighten(img, 30): print(r)

Вывод:

Исходник:
[10, 20, 30]
[40, 50, 60]
[70, 80, 90]
Отражение по горизонтали:
[30, 20, 10]
[60, 50, 40]
[90, 80, 70]
Ярче на 30:
[40, 50, 60]
[70, 80, 90]
[100, 110, 120]

Из одной матрицы мы получили две новые — и обе по-прежнему «та же картинка» по смыслу. Так из небольшого датасета получают в разы больше обучающих примеров.

Важная оговорка

Преобразование не должно менять смысл! Горизонтальный флип безопасен для кошки, но опасен для цифр и букв: отражённая «6» превратится в нечто, похожее на «9», а зеркальная «b» — на «d». Аугментацию подбирают под задачу: для рукописных цифр не отражают, для медицины не искажают пропорции патологий.

Итог

  • Аугментация создаёт новые примеры преобразованиями, не меняющими класс.
  • Борется с переобучением и учит инвариантности к ракурсу, свету, положению.
  • Типичные приёмы: отражение, поворот, кроп, сдвиг яркости, шум.
  • Нельзя менять смысл: флип ломает цифры и буквы — выбирать под задачу.
Проверьте себя
1. Какая главная польза аугментации данных?
AУменьшение размера картинок
BРасширение датасета новыми примерами — борьба с переобучением и обучение инвариантности
CУскорение работы готовой сети
DПеревод картинок в серый
2. Почему горизонтальное отражение опасно при обучении на рукописных цифрах?
AОно замедляет обучение
BОно может изменить смысл: отражённая «6» становится похожа на «9», искажая класс
CЦифры нельзя хранить как картинки
DОтражение всегда полезно
3. Чему учит сеть случайный кроп и изменение масштаба при аугментации?
AИгнорировать объект
BУзнавать объект, даже если он ближе/дальше или находится не в центре кадра
CРаботать только с квадратными картинками
DСчитать пиксели
Поддержать проект