Как я пытался векторизовать картинки

Как я пытался векторизовать картинки

В последнее время работа над очередной версией OutWiker у меня в основном заключается в том, что я перерисовываю растровые картинки, которые используются в качестве изображений на кнопках и в качестве значков в дереве заметок. Картинки для кнопок я уже все перевел в векторный формат, а вот значков для заметок такое количество, что в обозримом будущем векторизовать их все вряд ли удастся. В комментариях спрашивали, почему бы не попробовать применить какой-нибудь софт для векторизации, на самом деле я пробовал, но проблема заключается в том, что исходные картинки имеют размер всего 16×16 пикселей, и векторизаторы создают месиво из каких-то размытых пятен. Честно говоря, тут их винить не стоит — если увеличить исходную картинку каким-нибудь примитивным алгоритмом масштабирования, то результат будет примерно такой же. Это уже наш мозг, глядя на набор из 256 точек (16×16) допридумывает то, что там изобразил художник. Когда я рисовал векторные значки, которые должны были бы выглядеть в маленьком размере так же, как исходная картинка, приходилось напрягать воображение и дорисовывать то, что на исходной картинке не имело четких контуров.

Тогда родилась идея использовать нейронные сети, чтобы увеличить картинку до большего размера, чтобы векторизатор мог качественно сделать свою работу. В этом посте покажу, что из этого получилось.

Читать далее ‘Как я пытался векторизовать картинки’ »

Про генерацию кода искусственным интеллектом

Про генерацию кода искусственным интеллектом

Понадобилось мне для OutWiker сделать новый контрол для выбора цвета. Это должен быть выпадающий список (в простонародье — ComboBox), который вместо текста отображал бы прямоугольники разных цветов. Я очень не люблю делать свои контролы, но в какую сторону копать было понятно. Решил эту задачу переложить на братьев наших меньших (а в перспективе — больших), то есть на искусственный интеллект, и попросить его сгенерировать код.

Начал с Copilot. Результат меня прям очень впечатлил. Первоначальный запрос был такой:

«Напиши код компонента на Python с использованием библиотеки wxPython, который использует wx.adv.OwnerDrawnComboBox, чтобы выбирать цвет с помощью выпадающего списка. Каждый элемент выпадающего списка должен отображаться в виде прямоугольника своего цвета. Напиши код приложения, который этот компонент использует.»

Код получился почти сразу рабочий, в течение нескольких запросов поправили некоторые косяки и даже улучшили внешний вид. Через полчаса в первом приближении я получил то, что хотел и потом буду исходники допиливать напильником. После этого даже не особо надеясь, что ИИ поймет, что мне надо, написал ему еще одну хотелку:

«Пусть теперь нулевой элемент будет обозначать «цвет по умолчанию» и выводиться текстом, а последний элемент списка — «Выбрать цвет» и тоже выводиться текстом.»

Удивительно, но он сделал именно то, что я имел в виду. В процессе общения поправили некоторые мелочи, и оно заработало.

После этого мне стало интересно сравнить результат с другими нейронками. Начал с Яндекс GPT 4. Результат получился унылый. Работающего контрола от него я так и не добился. В выпадающем списке цветные прямоугольники он не смог нарисовать (хотя честно пытался, но все время что-то было не то).

Попробовал после этого нейронку от Сбера — GigaChat. С ним пришлось помучиться подольше, чем с Copilot, — приходилось часто указывать конкретные строки, где ИИ был не прав, и что там должно быть. Но в итоге контрол начал делать то, что от него требуется, хотя некоторые оформительские моменты придется за ним все-таки править руками. А на дополнительной хотелке нейронка ушла в бесконечный цикл и начала писать без передыху по три одинаковые строчки, которые к делу вообще не относятся. В другой раз по этому же запросу у нее перепутались код и комментарии к нему. Ну ладно, с бонусом она не справилась, но в целом тоже молодец.

Еще я на днях локально себе поставил опенсорсную нейронку Llama 3 (запускал через ollama). Код, который она генерила, тоже с ходу не заработал. Но еще у меня и комп для нее слабоват. Сначала ИИ отвечал относительно шустро, но если надо было исправить ошибку, то он начинал думать минут 10, и результат совсем не впечатлял. В общем, у меня не хватило терпения заставить эту нейронку написать рабочий код.

PS. Если кому интересно, то вот код, который в итоге получился у Copilot. Для получения этого кода понадобилось 7 запросов. И код, который получился у GigaChat . Сколько понадобилось запросов для получения этого кода не знаю, потому что история не сохранилась.

Для запуска этих исходников нужна библиотека wxPython.