Нужен хороший алгоритм для категоризации 8 ГБ изображений

У меня около 150 000 картинок, и некоторые из них - дубликаты. Я решил, что алгоритм SSIM - хороший выбор для сравнения двух изображений и проверки их дублирования. Однако, если я хочу таким образом найти дубликаты, мне придется сравнить 150 000 * 149 999 снимков, что займет вечность.

Итак, сейчас я ищу быстрый и эффективный алгоритм для создания среднего значения для каждого изображения и последующего сравнения изображений, которые близки к их среднему значению.

Вкратце: я ищу эффективный способ категоризации изображений!

Я планирую использовать для этой задачи библиотеку C ++ CImg, потому что она быстрая.

Спасибо!


person moccajoghurt    schedule 17.12.2012    source источник
comment
Действительно ли повторяющиеся изображения дублируются (одинаковые по ширине и высоте) или их размер может быть изменен как версия исходного изображения?   -  person Vincent Mimoun-Prat    schedule 17.12.2012
comment
Картинки могут иметь небольшие отличия и иметь одинаковую ширину, высота может отличаться.   -  person moccajoghurt    schedule 17.12.2012
comment
Нет ли метода сортировки этих фотографий по ширине?   -  person Salih Erikci    schedule 17.12.2012
comment
Разве вы не можете тогда просто отсортировать изображения по ширине? Сравнивать друг с другом нужно только изображения одинаковой ширины.   -  person jalf    schedule 17.12.2012
comment
Есть изображения, которые различаются по высоте, но в основном это одно и то же изображение, только с несвязанным прямоугольником внизу, который меняет высоту.   -  person moccajoghurt    schedule 17.12.2012
comment
@jalf: Я могу представить, что многие изображения могут иметь одинаковую ширину, возможно, все они ... Мой вопрос был больше, чтобы помочь выбрать тип алгоритма, который можно было бы использовать.   -  person Vincent Mimoun-Prat    schedule 17.12.2012
comment
Тем не менее, если это однократная операция, я думаю, что первым шагом будет рассмотрение распределения ширины изображений. Для тех значений ширины, которые имеют только управляемое количество изображений, вы можете просто запустить все n^2 сравнения. Если остались какие-то группы, которые слишком велики для этого (например, если половина изображений одинаковой ширины), подумайте о том, чтобы сделать что-то, что требует реальных размышлений с вашей стороны ;-)   -  person Steve Jessop    schedule 17.12.2012
comment
@ user1910856: Это в основном одна и та же картинка или в точности одна и та же картинка, кроме поля внизу? Я спрашиваю, потому что в зависимости от ответа подходящая техника будет совершенно другой.   -  person Yaniv    schedule 18.12.2012
comment
Второй комментарий пояснил, что идентичные изображения на самом деле немного отличаются. Кроме того, использование SSIM должно прояснить это. Если бы изображения были одинаковыми, за исключением высоты, некоторая простая предварительная обработка и любое хеширование легко решили бы эту проблему.   -  person mmgp    schedule 18.12.2012


Ответы (4)


Я бы попробовал подход, похожий на хэш / отпечаток пальца:

  • Создание отпечатка пальца для каждого изображения, содержащего также соответствующие атрибуты изображения, такие как размер и количество компонентов для метафайла или базы данных. Отпечаток пальца может быть вычислен из общего фрагмента изображения, это может быть спектрограмма, сжатая с потерями, простой вектор, содержащий элементы разрешения по частоте БПФ, гистограмма или другой метод (я понятия не имею, что подходит лучше, это больше всего вероятно, очень зависим от содержания).

  • Как упоминал Литтлстеви, предварительная группировка с использованием атрибутов изображения, таких как размер и количество цветовых компонентов, значительно сократит количество (бинарных) сравнений, которое будет (n*(n-1))/2 для каждой группы.

  • Сравнение отпечатков пальцев с соответствующими допусками для дальнейшего разделения на подгруппы (обратите внимание на случаи, когда одно изображение имеет совпадения в нескольких группах).

  • OpenCV может сделать финальное совпадение:

    Как обнаружить Солнце из космического неба в OpenCv?

Связанные вопросы относительно сравнения изображений с использованием OpenCV:

person Sam    schedule 17.12.2012

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

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

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

person Vincent Mimoun-Prat    schedule 17.12.2012

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

Первая проблема, которую вы должны решить, - это отказаться от нижнего блока с почти идентичными изображениями разной высоты. Почему эта коробка там? Это равномерный цвет фона? Предварительно обработайте изображения, чтобы удалить такие нижние блоки. Если это проблематично, объясните, почему. Я буду считать, что эти ящики отныне сняты.

SSIM (структурное сходство) может быть хорошим подходом для обнаружения ваших почти дубликатов, но у него нет шансов быть быстрее, чем более простой алгоритм, такой как NRMSE, описанный в Сравнение изображения в URL-адресе с изображением в файловой системе в Python. Таким образом, способ, возможно, ускорить процесс (хотя по своей природе он остается квадратичным), состоит в том, чтобы сначала преобразовать данное изображение в оттенки серого и рассматривать только небольшое центральное окно из него, например 50x50. Примените гауссовский фильтр к этому центральному окну, чтобы незначительные структуры (например, шум) в основном подавлялись. Поскольку у вас есть довольно много изображений для сравнения, я бы применил грубую бинаризацию в этом сглаженном центральном окне в виде: если значение v больше половины максимально возможного значения, то превратите его в белый, в противном случае превратите его в черный. Теперь у вас есть 2500 бит для каждого изображения. Следующим шагом может быть следующее: вычислить расстояние Хэмминга от этих 2500 бит до общей битовой комбинации, 2500 бит 1 здесь будут работать. Повторите этот процесс для всех ваших изображений. Для каждого изображения у вас есть расстояние Хэмминга.

Теперь давайте найдем почти идентичные изображения. Во-первых, рассмотрите возможность объединения найденных расстояний Хэмминга в k разных слотах. Таким образом, все изображения, попавшие в одну и ту же корзину, далее рассматриваются для сравнения. Таким образом, если изображение a попадает в корзину k_i, а изображение b попадает в корзину k_j, i != j, мы отбрасываем a как похожий на b. Если в одном и том же бункере слишком много изображений, описанный выше процесс требует уточнений и / или необходимо уменьшить интервал для каждого бункера. Чтобы еще больше ускорить процесс, сначала рассмотрите возможность применения NRMSE между всеми изображениями в одной и той же ячейке, и только те, которые дают высокое значение, наконец, будут сравниваться SSIM.

person mmgp    schedule 17.12.2012
comment
Я не согласен с тем, что хеширование бессмысленно. Точное хеширование бессмысленно, но хеширование с учетом местоположения на самом деле отличный кандидат для такого рода проблем. - person Yaniv; 18.12.2012
comment
Итак, мы согласны с тем, что хеширование бессмысленно. Теперь, для любого другого слова, которое я использовал, я уверен, что можно найти какое-нибудь _1 _-_ 2_, которое делает что-то отличное от необработанного слова blah. Я был бы согласен с вашей идеей, если бы вы содержательно описали, как здесь применяется _4 _-_ 5_. - person mmgp; 18.12.2012
comment
вы утверждали, что любая форма хеширования бессмысленна; Я просто указал, что некоторые формы хеширования на самом деле здесь очень полезны. На странице Википедии в качестве одного из приложений упоминается идентификация сходства изображений. Что касается того, как это применяется, рассмотрите свою технику SSIM, как описано выше, и битовую выборку для генерации нескольких LSH-хэшей. Затем вы можете использовать количество совпадающих хэшей между изображениями как сигнал о том, что они могут быть почти дублированными. Это может быть быстрее, чем упомянутая выше сортировка. - person Yaniv; 18.12.2012
comment
SSIM применяется только после всего упомянутого, поэтому в вашем предложении есть некоторое противоречие. Метод биннинга может быть выполнен за линейное время, я действительно сомневаюсь, что вы сможете полностью применить LSH за (суб) линейное время, начиная с исходных изображений. Мне кажется, что последняя часть вашего предложения - применить LSH к тем 2500 битам, к которым я пришел. В таком случае он может быть полезен, но остается бесполезным в качестве первого шага во всей схеме сравнения. Так что либо я неправильно понял все, что вы сказали, либо это применимо только после того, как метод достиг двоичного представления. - person mmgp; 18.12.2012
comment
Я думаю, что мы в основном согласны, кажущееся разногласие - это просто вопрос разных толкований. - person Yaniv; 18.12.2012

MarvinLabs уже указала на идею хеширования первых N строк.

Если вы используете хороший хэш (например, MD5) над первыми N (скажем, 20) строками, вы можете быть уверены, что коллизии хешей идентифицируют идентичные изображения. поместите хеш вместе с другим уникальным идентификатором изображения (имя файла?) в std :: multimap. эта мульти-карта будет стоить вам в зависимости от длины пути от 10 МБ до 100 МБ и может легко храниться в памяти. вы можете делать свои отчеты после хеширования. если вы параноик, вы делаете еще одно сравнение изображений на предмет столкновений. если все изображения не получены с одной и той же камеры видеонаблюдения, вероятность ложного срабатывания меньше, чем ошибка чтения с диска.

person stefan    schedule 17.12.2012