Alex 'AdUser' Z
8 years ago
2 changed files with 67 additions and 0 deletions
@ -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/вот это всё) |
Loading…
Reference in new issue