Данные г**** и их мало... гоу нагенерим.
Конец.
Repo - https://github.com/HeinrichWirth/banana-road-synth
Это было краткое содержание последующего текста.

Всем привет.
Без долгих вступлений - сразу к делу.
Есть задача: обучить модель для поиска заплаток на дороге и выбоин.
Данных мало. Разметка так себе.
Предобученная модель на наших данных работает плохо.
Да, существуют открытые датасеты. Например, RDD2022.
Но у них среднее качество разметки и другой домен.
Заплатки в России - это отдельный вид "искусства" и они не похожи на заплатки из Японии.
Плюс камеры совсем разные, и это ломает переносимость.
Вопрос простой:
как за минимальное время и небольшие деньги получить дополнительные данные?
Не хочется:
ездить на дорожной лаборатории и специально искать убитые дороги
лазить по Google Maps в поисках дефектов
а главное - размечать всё это руками
Даже 100 изображений разметить это несколько часов минимум.
Выход очевидный: пробовать синтетику.
Если у нас уже есть видео десятков километров хорошей дороги, значит, логично сделать из неё плохую. 😜
Выбор модели
Первым делом попробовал ChatGPT.
Результат ужасен.
Маска и сгенерированные выбоины/заплатки плохо совпадают.
Модель заметно перерисовывает всё изображение, и это сразу бросается в глаза (не критично, но я это запомнил).
Про контроль можно забыть.



Flux, SD и похожие решения из коробки хуже ChatGPT.
Нужно дообучать. Без этого они ощущаются как уровень моделей середины 2024 года.
В итоге осталась одна опция - Nano Banana / Pro.
(Гугл как знал: при привязке карты к AI Studio выдал $300 бесплатно на 3 месяца)
И вот тут стало интересно.
Результаты почти идеальные



Как выглядит пайплайн на практике
Сначала прошу модель сгенерировать маску потенциальных заплаток.
Важно: заплатки не существуют в оригинальном изображении.
Промпт:
Generate a binary segmentation mask of asphalt road repair patches.
The mask should represent realistic, randomly shaped road patches that DO NOT exist in the original image.
Patches must appear only on the asphalt road surface.
No patches on sidewalks, curbs, grass, buildings, cars, poles, or road markings.
Patch shapes should be irregular, organic, and varied in size, similar to real asphalt repairs.
The mask must be white (255) for patches and black (0) for everything else.
Do not modify the original image.
Do not add textures, colors, lighting, or shadows.
Output only the segmentation mask image (no text).
В примерно 8 случаях из 10 маска оказывается строго на дороге, без тротуаров, бордюров и прочего.
Дальше всё просто:
передаю оригинальное фото + маску и прошу сгенерировать заплатки строго по белым пикселям.
Ничего вне маски трогать нельзя.
Промпт
You are given two images:
(1) the original photo
(2) a binary mask where WHITE (255) indicates the exact pixels to edit and BLACK (0) indicates pixels that must remain unchanged.
Task: Generate realistic asphalt road repair patches ONLY where the mask is white.
The patches must look OLD and worn (not fresh): low-contrast, slightly blended into the existing road, almost the same color as the road.
Do NOT change anything outside the white mask.
Do NOT touch sidewalks, curbs, grass, buildings, cars, poles, or road markings.
No new objects, no extra shadows, no added text.
Output only the edited photo (no text).
И… всё.
Остаётся упаковать это в скрипт и пройтись по папке с изображениями через API.
С выбоинами логика ровно та же самая, но меняется только формулировка промпта.
Вообще, этот подход оказался рабочим не только с заплатками.
Например, мне нужно было немного дообучить модель на пешеходные переходы. Banana сгенерировала и эти данные тоже.


Где грань возможностей?
Стало интересно: а может ли модель нормально сегментировать сцену целиком?
Ответ:
ну… не совсем.
Цветовая палитра при сегментации:
Зеленый - дорожная разметка
Синий - бордюр
Красный - пешеходный переход
Белый - дорожный знак






Модель хорошо определяет дорожную разметку и даже понимает, где зебра, а где разметка для авто.
Но:
- путает бордюры, парапеты, барьеры и тротуар
- придумывает дорожные знаки там, где их нет вовсе. (Очень часто)
- путается в тенях (на этих примерах не видно)
Так что специализированные модели, которые мы обучали под задачи, справляются в разы лучше. И это нормально - Nano Banana вообще не создавалась как сегментационная модель, поэтому удивили даже такие результаты.
Погода, освещение и время суток
Дальше возник ещё один вопрос.
Не хочется ждать нужную погоду.
Не хочется ждать вечер.
Не хочется переснимать всё заново.
Можно ли просто поменять условия?
Да, можно.
И делает это модель хорошо.


AI vs человек. Про деньги.
Теперь самое важное - экономика.
Если отбросить $300 бесплатных бонусов от Google, цифры такие:
1 000 000 токенов ~ $120
одно изображение ~1K разрешения ~ 1120 токенов
итого ~13 центов за генерацию одного изображения
В моём пайплайне минимум:
генерация маски
генерация заплаток по маске
С запасом получаем ~30 центов за изображение.
Много это или мало - зависит от альтернативы.
Без генерации есть два варианта.
Первый:
ездить самим, искать убитые дороги, платить водителю, учитывать износ авто, бензин, время.
Потом всё равно платить разметчику.
По времени - несколько часов съёмки + неделя разметки (если говорим про ~800 изображений).
Второй:
искать дефекты по Google Maps.
Тоже время.
И всё равно ручная разметка, всё равно неделя.
На этом фоне для меня становится очевидно:
проще заплатить ~$150 за 500 сгенерированных изображений.
Это без оптимизаций цена.
Можно не генерировать уникальную маску для каждого кадра: достаточно 20–30 базовых масок, которые дальше отзеркаливаются, сдвигаются, дробятся на сабсемплы и проходят аугментации. В этом случае генерация вообще становится однократной.
P.S.
Совпадение, пару дней назад Waymo показала, как использует генеративную модель мира от Google для обучения своих роботакси.
Если раньше для таких задач брали игровые движки (вроде CARLA, когда речь про дороги и автопилоты или платные от Nvidea и тд), то теперь данные можно получать дешевле и проще.
