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 комментариев

avatar
Берем исходник «I want U» by Flood

&quot;I want U&quot; by Flood

Уменьшаем до 256x192

fl_256

Скармливаем автодайверу, который предлагает нам следующее:

fl-best

Гоним конверсию с помощью bmp2scr:

fl-autodiver

Что-то в этом есть =)
avatar
Наилучшие результаты будут если на вход автодайверу подавать картинку уже в спектрумовской палитре (или просто обработанную постеризацией с уровнями 2 или 3).

На плавных цветовых переходах слишком много штрафов — не факт, что оценка потерь с жёстким подсчётом тут релевантна.
avatar
Ну, вот, кстати, да.

Одна из возможных модификаций/доработок: это не перемасштабирование и приведение исходной картинки к 256x192, а перемещение окна 256x192 по всему исходному изображению с поиском наиболее хорошо подходящего под атрибутную сетку участка.
avatar
Ага, прям наипрекраснейшая идея:

Все равно надо вырезать окно в небольших пределах типа 320х240 и ползать только по нему, иначе не туда уйдет :)
avatar
Не, поиск с окном в таком случае нужно использовать без масштабирования.
avatar
так это и есть поиск окна по оригиналу без масштабирования. вместо лица лучше всего, например, конвертится жопа. т.е. в данном случае волосы.
avatar
Какой ещё поиск окна без масштабирования? Нет такого режима ещё ;) Какие флаги были включены?

А чтобы вместо лица не получить жопу — нужно воспользоваться маской повышенной важности :)
avatar
Хотя с поиском по окну маска может давать противоположный эффект: меньшие штрафы будут на участках без маски вообще.
avatar
Дак на скриншоте сделанном вручную неавтодайвером такой случай и проиллюстрирован. Ферштейн?
avatar
Ты сначала его автодайвером получи, а потом предъявляй :)
Пока такое получить в нём нельзя.
avatar
Короче, понятно, что автоматически нельзя оценить что осталось на самой выгодной картике: самая выгодная пустота или что-то полезное: таким образом, варианта решения два:
1) при «поиске самого выгодного окна» можно сохранять и показывать не 8 лучших вариантов, а произвольное количество: вслед за пустотой там рано или поздно будут наиболее выгодные значащие объекты.
2) при обрезке исходной картинки вместе с её маской, учитывать количество потерянных белых (значащих) пикселей в маске, оставшихся за пределами обрезанной области.
avatar
сейчас скорее всего глупость сморожу…
но зачем нужна вообще какая-то маска? зачем отдельно выделять критические участки белым цветом, когда можно тупо картинку под них в любом пиксельном редакторе сдвинуть, как тебе надо. Глаза-то нам зачем? ясень пень, что в других местах все равно «поплывет», ну на то он и обдуманый выбор критических мест.

На данном этапе результат совсем не впечатляет!
Работай дальше :)
avatar
Да, это глупость. Ну и сложно впечатлить того, кто не понимает что это и зачем: как бабушку фреймовым бамп-маппингом.
А если бы иеструменты не развивались, то и ArtStudio не было: poke 16384,x бы рисовали.
avatar
Ну и интересно всё-таки какой именно результат тебя «не впечатляет»? =)

Цифры рейтига картинок неправильные?
Или результат конверсии BMP2SCR?
Ну, а автодайвер-то тут при чём?

Его цель: выбрать самый подходящий под атрибутную сетку набросок, дальше надо уже рисовать вручную. Если результат не впечатляет — то претензия к рисовальщику. А если вместо рисования использовать BMP2SCR — то тут я даже не знаю к кому. В спортлото только, на нецелевое использование парсера русского текста.

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

flp-autodiver
avatar
откуда такая рьяная любовь к скриптингу?
avatar
Go — не скриптовый язык =)
avatar
имхо это кошмар вообще(
avatar
Да брось, он проще, лаконичнее чем тот же cpp, и без всяческого исторического оверхеда.
И при том с той же философией: вы не платите за то, что не используете.

(Я сначала переписал автодайвера на cpp, и уже почти было залез в boost, но вовремя остановился.)
avatar
А, ну и самое главное: практически бесплатная кроссплатформенность с нулевой поддержкой (без всяких make/pkg-congfig/условной компиляции и прочей ереси).
Чтобы скомпилить весь проект на текущей платформе (на маке) достаточно набрать в каталоге с исходником:
go build

Чтобы скомпилить весь проект на текущей платформе (на маке) для windows:
GOOS=windows GOARCH=386 go build

и там же для linux:
GOOS=linux GOARCH=386 go build

Бинарники, которые выложены в релизах — собраны все на маке. И они работают =)
avatar
Подтверждаю — линуховый бинарник молча завёлся (правда я только на хелп полюбовался, ничего не делал).

Сделал этому бинарнику objdump -dS — оказывается, он 32битный. А 64битный оно умеет? :)
avatar
Если указать GOARCH=amd64, то должен скомпилировать x64.

Подробнее о кросс-компиляции тут.
avatar
Кстати, да, я тут немножко рисковал =) Единственный непроверенный бинарник был под линукс =)

Tnx за тест =)
avatar
Да, го выглядит как эдакий универсальный комбайн — и качать сорцы умеет, и мейкать, и линковать, ну и даже компилировать. И все либы в ехешник пихает. Видимо, гугляры в него напихали все то, чего наелись в обычном рекурсивном make && make install

Вот только машинный код выглядит как gcc -O0 — не особо-то и оптимизированным.
avatar
Хотелось бы 32битный. Я на Go давным давно споткнулся.
avatar
Да, 32битные бинарники поуниверсальнее будут.

А для чего тебе go не подошёл?

У него есть свои «особенности»: отсутствие механизма исключений и дженериков, но это в рамках довольно простой утилиты мне нигде не помешало :)
avatar
в пакете Go была прога какая-то, ниасилил запускать.
avatar
Всегда есть План Б: Rust :)
avatar
Что-то по ссылке в статье какой-то слишком сложный путь описан. Вот тут более простой способ подготовки кросс-компиляторов: how to. (По ссылке darwin-specific инструкция, но даже под windows аналогичная последовательность действий сработала, думаю по linux всё также.)
avatar
Спасибо, в виде одного .exe намного удобнее!
avatar
Ой чо так сложна????? А можна штобы ето всё вот сразу ну как бы вот кнопкой раз и оно так сразу и все и там да?
  • G.D.
  • +3
avatar
Разумеется! Фронт-энд можно написать хоть на чём =)
avatar
чо и на swift тоже можно?
avatar
Говорят, что можно скомпилировать под ARM-mach-o как библиотеку и запускать хоть из Obj-C.
avatar
Чо-то очкую запускать. Запущу вот его, а программа мне напишет: ТЫ БОЛЬШЕ НЕ НУЖЕН.
avatar
Кстате, да. Я бы на месте Ози сделал проверку на «C:/Documents/Diver/» и если бы такой путь существовал бы обязательно выдал бы какую-нибудь подобную фразу :)
avatar
считай такое сообщение первоапрельской шуткой:)
avatar
))
программисты хреновы. Иконки нет, интерфейса нет, настроек нет. Визуально нет ничего. Я что должет тегами писать в тотале )) Уморили…
  • AAA
  • -3
avatar
Попроси помочь тебе написать фронт-энд на тулзу =)
avatar
я бы кстати тоже попросил :) хотя командная строка для меня не проблема :)
avatar
Ну все хона. теперь вместе с запилятором можно каждые выходные пати проводить!)
avatar
я верю, что тебе эта участь не грозит:)
разве что фоновые пикчи придется осилить ради конвертирования.
avatar
Остался последний шаг (обсуждали на цц):

for (i=0; i < 10; i++) {
    make random & send_demo --to dihalt
}
avatar
Да-да, последний шаг — Auto MMcM. но там кризис идеи, много ручной работы по подготовке заготовок) Предлагаю первично более простое решение — собрать все треки MMcM и программно развернуть их наоборот. На несколько лет хватить должно)
avatar
Достаточно запихнуть их в цепь Маркова и всего делов.
avatar
лучше б запрошенные фичи обсудили…
avatar
Состязание на технику? Почему бы и нет. Даётся всем одинаковый исходник, к участию в конкурсе принимаются входные параметры для утилит/конвертора bmp2scr и последовательность действий (всё, кроме «дорисовать немного» =)
Отличный способ отточить технические скиллы.
avatar
Да, утилита же сохраняет не только лучший, но и худший вариант. То есть максимально неподходящий под атрибутную сетку спектрума.

Хардкор/Nightmare номинация: всем выдаётся худший вариант, сконверченный BMP2SCR, и из него нужно сделать конфетку =)

Разница между best и worst в BMP2SCR:
Best:

Worst:
avatar
Блин, мелко, не видно нифига.
avatar
Worst
avatar
Джентльмены, я пас. Не вижу разницы между best и worst.
avatar
и у меня с глазами что-то :)
avatar
Сверять надо правые картинки двух комментов (результат конверсии в Bmp2SCR), левые части — одинаковы. В worst — много потерь на стыке 3х цветов — кончики клякс одного цвета окрашены в другой.
avatar
Не самый лучший пример, даже я с первого раза не заметил ничего, кроме сдвига картинки по-вертикали )))
avatar
Как-то так.

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.