Autodiver 2.0 для пользователя и программиста
Autodiver 2.0
Чуть более недели прошло с публикации "Конструируем Autodiver v1.0".
Скажу прямо: v1.0 всем хороша, за исключением одного: у неё много зависимостей без которых она не будет работать: ruby, image magick, RMagick (который под windows ещё нужно суметь правильно скомпилировать) — сплошная морока. Также определённым недостатком было то, что разработка состояла из двух частей: одна генерировала тысячи файлов, а вторая их обрабатывала.
В общем, никто кроме меня так ей и не воспользовался.
Эти и другие недостатки призвана устранить версия 2.0: она переписана на прекрасном языке Go с чудесными, лаконичными и понятными кроссплатформенными инструментами разработки.
Теперь зависимостей нет вовсе: для использования достаточно скачать исполняемый файл для своей платформы (mac,win,lin), который включает в себя всё необходимое.
Для пользователя
Если запустить программу без аргументов, она расскажет как ею пользоваться и покажет значение флагов по умолчанию:
Usage of ./autodiver_go:
./autodiver_go [-flags] image_file_name.png
./autodiver_go image_file_name.png
./autodiver_go -s=64 -ss=4 image_file_name.png
./autodiver_go -b=./best -s=10 -ss=1 image_file_name.png
-b="./best": output directory
-m=false: use mask
-maxcpu=true: allow max cpu usage
-o=true: rate all 64 offsets
-p=1: extra penalty for loosing masked pixel
-s=0: scale from 256 to (256 + <argument>)
-ss=1: scale step
Флаги должны идти после названия исполняемого файла, но до названия файла с изображением, который будет подвергаться трансмутациям и оценке.
Простейший случай использования без флагов:
./autodiver_go image_file_name.png
В данном случае будет загружено изображение из файла image_file_name.png без маски, для него будут проверены 64 варианта смещения.
Чтобы была обработана ещё и маска «повышенной значимости» пикселей нужно указать флаг -m («mask»):
./autodiver_go -m image_file_name.png
Маска будет загружена из файла с именем mask_file_name.png, находящегося в том же каталоге, что и image_file_name.png.
Маска работает следующим образом, если потерянный пиксель находится в не-чёрной области маски, то за его потерю начисляется дополнительный штраф. Размер штрафа по умолчанию = 1, но его можно изменить с помощью флага -p «penalty» (например: -p=2).
Сценарий использования: в графическом редакторе создать новый слой, там измазать белым цветом участки изображения повышенной значимости: глаза, рот, мелкие детали. Залить чёрным цветом всё остальное и сохранить файл с аналогичным именем, но с префиксом mask_. При обработке автодайвером, картинка с большей вероятностью сохранит важные участки.
Оба этапа: изменение изображения и его оценка — совмещены и выполняются одновременно, в памяти. Это значит, что на диске не будут больше создаваться десятки тысяч файлов для последующей оценки как в v1.0.
Команда:
./autodiver_go -s=64 -ss=4 image_file_name.png
Выполнит подбор для вариантов с масштабированием исходника от 256 до 256+64 (флаг -s «scale») с шагом 4 (флаг -ss «scale step») и для каждого варианта масштабирования будет ещё 64 варианта смещения.
Вращать autodiver разучился.
Результатом работы aгtodiver'а будет 8 «лучших» вариантов изображения, сохранённые в каталоге ./best, и один «худший» там же, просто для сопоставления.
Для программиста
Исходники — там же.Fork'айте, дорабатывайте =)
Чтобы скачать проект достаточно выполнить следующую команду:
go get github.com/oisee/autodiver_go
Скачать графический пакет:
go get github.com/disintegration/imaging
Скомпилировать всё:
go build github.com/oisee/autodiver_go
Что можно добавить:
- умное заполнение пограничных пикселей при смещении (чтобы новый background цвет не портил статистику для краевых знакомест).
- добавить вращение.
- добавить другие методы оценки «потери» цветов — не считать потерянными близкие цвета, или цвета, получаемые смешиванием двух основных.
- etc...
55 комментариев
Уменьшаем до 256x192
Скармливаем автодайверу, который предлагает нам следующее:
Гоним конверсию с помощью bmp2scr:
Что-то в этом есть =)
На плавных цветовых переходах слишком много штрафов — не факт, что оценка потерь с жёстким подсчётом тут релевантна.
Одна из возможных модификаций/доработок: это не перемасштабирование и приведение исходной картинки к 256x192, а перемещение окна 256x192 по всему исходному изображению с поиском наиболее хорошо подходящего под атрибутную сетку участка.
Все равно надо вырезать окно в небольших пределах типа 320х240 и ползать только по нему, иначе не туда уйдет :)
А чтобы вместо лица не получить жопу — нужно воспользоваться маской повышенной важности :)
Пока такое получить в нём нельзя.
1) при «поиске самого выгодного окна» можно сохранять и показывать не 8 лучших вариантов, а произвольное количество: вслед за пустотой там рано или поздно будут наиболее выгодные значащие объекты.
2) при обрезке исходной картинки вместе с её маской, учитывать количество потерянных белых (значащих) пикселей в маске, оставшихся за пределами обрезанной области.
но зачем нужна вообще какая-то маска? зачем отдельно выделять критические участки белым цветом, когда можно тупо картинку под них в любом пиксельном редакторе сдвинуть, как тебе надо. Глаза-то нам зачем? ясень пень, что в других местах все равно «поплывет», ну на то он и обдуманый выбор критических мест.
На данном этапе результат совсем не впечатляет!
Работай дальше :)
А если бы иеструменты не развивались, то и ArtStudio не было: poke 16384,x бы рисовали.
Цифры рейтига картинок неправильные?
Или результат конверсии BMP2SCR?
Ну, а автодайвер-то тут при чём?
Его цель: выбрать самый подходящий под атрибутную сетку набросок, дальше надо уже рисовать вручную. Если результат не впечатляет — то претензия к рисовальщику. А если вместо рисования использовать BMP2SCR — то тут я даже не знаю к кому. В спортлото только, на нецелевое использование парсера русского текста.
Ещё раз: да, возможно вручную по-наитию можно выбрать хороший вариант, но для подбора и манипуляций нужно будет потратить уйму времени — это доступно не всем. С помощью утилиты можно обработать несколько исходников за минуту и выбрать из предложенных самый перспективный вариант для дорисовывания.
И при том с той же философией: вы не платите за то, что не используете.
(Я сначала переписал автодайвера на cpp, и уже почти было залез в boost, но вовремя остановился.)
Чтобы скомпилить весь проект на текущей платформе (на маке) достаточно набрать в каталоге с исходником:
Чтобы скомпилить весь проект на текущей платформе (на маке) для windows:
и там же для linux:
Бинарники, которые выложены в релизах — собраны все на маке. И они работают =)
Сделал этому бинарнику objdump -dS — оказывается, он 32битный. А 64битный оно умеет? :)
Подробнее о кросс-компиляции тут.
Tnx за тест =)
Вот только машинный код выглядит как gcc -O0 — не особо-то и оптимизированным.
А для чего тебе go не подошёл?
У него есть свои «особенности»: отсутствие механизма исключений и дженериков, но это в рамках довольно простой утилиты мне нигде не помешало :)
программисты хреновы. Иконки нет, интерфейса нет, настроек нет. Визуально нет ничего. Я что должет тегами писать в тотале )) Уморили…
разве что фоновые пикчи придется осилить ради конвертирования.
Отличный способ отточить технические скиллы.
Хардкор/Nightmare номинация: всем выдаётся худший вариант, сконверченный BMP2SCR, и из него нужно сделать конфетку =)
Разница между best и worst в BMP2SCR:
Best:
Worst: