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

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

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

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

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

Мысли про технические статьи

Мысли про технические статьи

Давно не писал никакие технические статьи себе на сайт, надо бы возобновить эту деятельность, у меня накопились некоторые темы про библиотеку Matplotlib. Но сейчас не об этом.

Я тут подумал, есть ли вообще сегодня смысл писать такие статьи? Раньше читатели находили эти статьи через поисковики, когда нужно было решить какую-то проблему. Пользователь написал запрос в поисковике, зашел на сайт, почитал нужную статью, если заинтересовало на сайте что-то еще, подписался на RSS или канал в Телеграме. А сейчас для таких задач сайты со статьями не нужны — ИИ очень даже неплохо решит проблему, даже гугл сначала предлагает ответ от ИИ, а потом уже ссылки на сайты. Если проблема экзотическая и ИИ начнет галлюцинировать, то тогда можно идти в большой интернет и искать решение проблемы. Но вероятность того, что кто-то опишет в статье ваш экзотический случай, но при этом ИИ не обучится на этой статье и на ее основе не даст хороший ответ, со временем стремится к нулю.

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

И это я еще не говорю о ситуации, когда тексты статей пишет ИИ с такой страшной скоростью, с которой белковый разум конкурировать не может. Но это давняя проблема захламления интернета.

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

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

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

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

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

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

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

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

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

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

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

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

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