diff --git a/articles/2017/02/08/libsimdb/index.markdown b/articles/2017/02/08/libsimdb/index.markdown new file mode 100644 index 0000000..6af8444 --- /dev/null +++ b/articles/2017/02/08/libsimdb/index.markdown @@ -0,0 +1,64 @@ +--- +tags: devel, libsimdb +title: Новый проект -- libsimdb, библиотека для поиска визуально похожих изображений +--- + +Эта идея периодически всплывала в голове, поскольку минимум раз в год я перебираю свой архив контента. +Но, поскольку это именно что "раз в год", реализация неоднократно откладывалась. + +--- + +Итак, исходная задача -- есть архив с десятками тысяч картинок, надо найти там дубли +(в том числе разного размера, качества и формата), оставить наилучшее из группы, остальное удалить. + +Надо сказать, что идея не новая, востребованная и кое-где уже реализованная: + +* wine + ImageDupeless (древняя вендовая софтина) -- если б оно было под линукс, проблема была бы закрыта. +Недостатки: нужен вайн, гуй прибит гвоздями, исходников разумеется нет +* [findimagedupes](http://www.jhnc.org/findimagedupes/) (perl + inline::c) -- честно ищет похожие, но у него просто ебическая скорость обработки, даже с "оптимизацией" через inline::c +* [gthumb](https://wiki.gnome.org/Apps/gthumb) -- т.н. "поиск дубликатов" сравнивает файлы тупо по md5 +* [imgseek](http://www.imgseek.net) -- тут уже целый демон со встроенным вебсервером. (потенициально оттуда можно портировать алгоритмы сравнения). +Проект похоже мёртв, сайт лежит, код на сорсфорже, последний коммит в 2013м. + +Мне хотелось именно чёткое отделение нужного функционала в библиотеку, без лишних зависимостей. +А на основе этой библиотеки уже строить инструменты. + +Два года назад я таки решил, что так жить дальше нельзя, и взялся за дело сам. +Результат выкладываю в открытый доступ, может кому пригодится. + +Основной принцип работы -- сравнение битовых карт яркости, с некоторыми оптимизациями. +Теоретически библиотека может обрабатывать до `INT_MAX` изображений, +но на практике, максимально тестировавшийся объём -- примерно 1.8 миллиона изображений. +Скорость -- приличная, на таком объёме поиск работает за время до 2х секунд, +без учёта времени сэмплирования исходного изображения. + +Размер базы -- по 48 байт на запись, для в/у объёма это будет порядка 86,5 Мб. + +У библиотеки чисто-сишный интерфейс, работа сделана через opaque handle + набор функций для работы с ним. +Записи адресуются по числовому id, поиск выдаёт их же. +Что вы будете делать с этими номерами - уже ваша забота. + +Все видимые функции и структуры снабжены doxygen'овскими комментами. +Утилита писалась в том числе для проверки удобства работы с api. +На версии до 0.4 даже не смотрите, там треш и угар в коде, +писалось изначально "для себя", в стиле "похер как, лишь бы работало". + +Собственно, код: + +* сама [библиотека](http://linuxdv.org/git/?p=libsimdb.git;a=summary) +* и простенькая [утилита](http://linuxdv.org/git/?p=simdb-fdupes.git;a=summary) к ней, аналог [fdupes](https://en.wikipedia.org/wiki/Fdupes) + +Из планируемого для библиотеки: + +* хотелось бы аналог imagedupeless (гуёвое искоробочное решение, на qt без kde) +* поковырять imgseek, там интересные алгоритмы +* возможно стоит добавить сравнение по цветовым картам, это улучшит точность поиска, но раздует базу в 2,5-3 раза + +Для утилиты: + +* --xdev (не переходить границу фс) +* --links (не следовать по сылкам) +* сохранение результатов между запусками в каком-либо виде. Мой архив с нуля считать очень долго. +* улучшение группировки (не только "первая попавшаяся") +* "настырный поиск" (не исключать уже сгруппированные) +* вывод в машиночитаемом виде (json/yaml/вот это всё) diff --git a/projects/index.markdown b/projects/index.markdown index af7b09b..4fd9d3a 100644 --- a/projects/index.markdown +++ b/projects/index.markdown @@ -13,3 +13,6 @@ title: Проекты * [анонс, 2016-03-17](/articles/2016/03/17/f2b/) * [отчёт о разработке, 2016-09-11](/projects/f2b/2016-09-11/) * [отчёт о разработке, 2017-01-04](/projects/f2b/2017-01-04/) + +* libsimdb, библиотека для поиска визуально похожих изображений + * [анонс, 2017-02-08](/articles/2017/02/08/libsimdb/)