You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.5 KiB

tags title
devel, libsimdb Новый проект -- libsimdb, библиотека для поиска визуально похожих изображений

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


Итак, исходная задача -- есть архив с десятками тысяч картинок, надо найти там дубли (в том числе разного размера, качества и формата), оставить наилучшее из группы, остальное удалить.

Надо сказать, что идея не новая, востребованная и кое-где уже реализованная:

  • wine + ImageDupeless (древняя вендовая софтина) -- если б оно было под линукс, проблема была бы закрыта. Недостатки: нужен вайн, гуй прибит гвоздями, исходников разумеется нет
  • findimagedupes (perl + inline::c) -- честно ищет похожие, но у него просто ебическая скорость обработки, даже с "оптимизацией" через inline::c
  • gthumb -- т.н. "поиск дубликатов" сравнивает файлы тупо по md5
  • imgseek -- тут уже целый демон со встроенным вебсервером. (потенициально оттуда можно портировать алгоритмы сравнения). Проект похоже мёртв, сайт лежит, код на сорсфорже, последний коммит в 2013м.

Мне хотелось именно чёткое отделение нужного функционала в библиотеку, без лишних зависимостей. А на основе этой библиотеки уже строить инструменты.

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

Основной принцип работы -- сравнение битовых карт яркости, с некоторыми оптимизациями. Теоретически библиотека может обрабатывать до INT_MAX изображений, но на практике, максимально тестировавшийся объём -- примерно 1.8 миллиона изображений. Скорость -- приличная, на таком объёме поиск работает за время до 2х секунд, без учёта времени сэмплирования исходного изображения.

Размер базы -- по 48 байт на запись, для в/у объёма это будет порядка 86,5 Мб.

У библиотеки чисто-сишный интерфейс, работа сделана через opaque handle + набор функций для работы с ним. Записи адресуются по числовому id, поиск выдаёт их же. Что вы будете делать с этими номерами - уже ваша забота.

Все видимые функции и структуры снабжены doxygen'овскими комментами. Утилита писалась в том числе для проверки удобства работы с api. На версии до 0.4 даже не смотрите, там треш и угар в коде, писалось изначально "для себя", в стиле "похер как, лишь бы работало".

Собственно, код:

Из планируемого для библиотеки:

  • хотелось бы аналог imagedupeless (гуёвое искоробочное решение, на qt без kde)
  • поковырять imgseek, там интересные алгоритмы
  • возможно стоит добавить сравнение по цветовым картам, это улучшит точность поиска, но раздует базу в 2,5-3 раза

Для утилиты:

  • --xdev (не переходить границу фс)
  • --links (не следовать по сылкам)
  • сохранение результатов между запусками в каком-либо виде. Мой архив с нуля считать очень долго.
  • улучшение группировки (не только "первая попавшаяся")
  • "настырный поиск" (не исключать уже сгруппированные)
  • вывод в машиночитаемом виде (json/yaml/вот это всё)