@gelerum

Как реализовать сеть по генерации геометрического изображения из скетча?

Чтобы работало это так
6209fe463dadd800797545.jpeg
Делим на задачи:
  1. Разделить входное изображение на части(часть 1 с синим кругом, часть 2 с желтым кругом)
  2. Определить расположение каждой части на изображении
  3. Определить тип фигуры в каждой части
  4. Опрделеить цвет фона, заливки фигуры, обводки фигуры

Ну а дальше написанный генератор собирает данные из нейронок в итоговую картинку
Правильно ли я понимаю, что мне нужно создать несколько нейронок для каждой задачи? Быть может такую систему можно создать иначе, без 4 отдельных сетей?
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
Погугли GAN, и хотя там технически две сети, можно воспринимать её как одну нейронку, ибо тренируются они вместе. И в общем никаких там предварительных разбиений на фигуры, цвета и прочее нет.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Нейронные сети тебе не помогут, если ты не знаешь, как извлечь исходную информацию из изображения. Да и потом, где ты найдешь несколько десятков/сотен тысяч изображений для обучения сети? Нейронки - это не магия, чтобы вжух и оно само. -_-

Я бы попробовал найти все встречающиеся цвета пикселей и кластеризовать их, но дело осложняется тем, что заранее неизвестно количество используемых цветов. После этого можно будет выделить каждую черкотню отдельно, сравнив цвет пикселя с центром того или иного кластера, а потом разделив отдельные фрагменты через поиск связных компонентов.
Далее можно взять за основу вот этот алгоритм.
ну или немного иначе

Для каждого фрагмента определи описывающий выпуклый многоугольник, чтобы избежать мути с неровной штриховкой внутри.
Затем переведи этот многоугольник в полярные координаты. Для этого найди центр масс этого многоугольника. Потом из этой точки пускаешь наружу лучи, по кругу, с некоторым шагом (скажем 1 градус), и считаешь расстояние от центра масс до точки пересечения луча с многоугольником. Ты получишь своего рода профиль фигуры, зависимость расстояния от центра фигуры от направления, в котором мы смотрим.
Этот профиль можно сравнить с профилями заранее известных фигур - треугольников, прямоугольников, эллипсов - чтобы понять, на что фрагмент походит больше всего.
Чтобы сравнение было проще, стоит сделать так. Сдвинь многоугольник так, чтобы центр масс попал в (0;0). Найди вершину многугольника, которая наиболее удалена от центра. Поверни многоугольник так, чтобы она смотрела, скажем, под уголом 45 градусов (вверх и вправо). Запомни этот угол поворота.
Потом сожми многоугольник так, чтобы он вписывался в квадрат 1 х 1 единицу. Так как ты работаешь с координатами вершин, а не с пикселями, это не проблема. Запомни, насколько ты сжал многоугольник.
Теперь, когда ориентация, размер и отношение сторон фрагмента известны, можно сравнивать его с заранее подготовленными профилями фигур - квадратом, кругом, разными треугольниками. Например, находишь разность между значением профиля фигуры и значением профиля фрагмента для этого же направления. Суммируешь эти разности по модулю. Чем меньше сумма - тем более профиль похож.
Определив наиболее похожую фигуру, растягиваешь её так же, как сжимал многоугольник. Потом поворачиваешь назад на столько же, на сколько повернул многоугольник. Потом смещаешь, чтобы центр фигуры попал на центр масс. Если всё сделано правильно, фигура ляжет "поверх" фрагмента рисовки. Осталось только её обвести тем же цветом.
С заливкой и перекрытиями будет сложнее, но их можно добавить, оттолкнувшись от этого алгоритма.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы