Как найти похожие картинки / Хабр
Веб 2.0 — отличная штука. Сайты на самообслуживании. Пользователи наполняют их собственноручно («постят контент», как сейчас выражаются). Сами напостили, сами посмеялись. А владелец сайта только платит за хостинг и стрижет купоны на рекламе. Удобно же.
Но жизнь наша так странно устроена, что плюсов без минусов не бывает, а нередко недостатки вообще являются продолжением достоинств. Есть проблемы и у самонаполняемых сайтов — баяны. В смысле, дубли.
Дубли многие посетители не любят, особенно старожилы, на зубок помнящие мемасики, появившиеся во времена превед‑медведа и олбанского йазыгга. Каждое очередное их появление они встречают фырканьем и угрозами немедленно отписаться.
Что же делать? Конечно, призвать на помощью железную машину — пусть она сама ищет баяны.
С текстом процедура более‑менее освоена. Простенькую машину для полнотекстового поиска можно найти чуть ли не в любой СУБД. Если кому‑то надо посложнее, например, учитывающую морфологию языка, — к вашим услугам Sphinx, Solr и так далее. Даже если ваши запросы простираются настолько далеко, что вы желаете искать не просто дубли, а переделки бородатых анекдотов, в которых Василий Иванович и Петька в духе времени заменены на Дарта Вейдера и Гарри Поттера, к вашим услугам td/idf, косинусы угла между векторами и прочие методы поиска плагиата.
С текстом разобрались. Но что делать с картинками? Ведь это же наверное как‑то можно? Гугл‑то ищет похожие, хоть и паршиво. Яндекс ищет, и даже получше, чем Гугл. Да что там Яндекс — на некоторых развлекательных сайтах вроде Пикабу тоже есть средства дебаянизации.
Да, можно. И не очень сложно, как ни странно, — потому что умные люди уже выполнили за нас самую сложную часть работы, придумав и испытав красивые и остроумные алгоритмы.
Как же искать дубли картинок? Очень просто.
Шаг 1. Для каждой картинки в базе составить ее цифровой отпечаток (fingerprinting) — какую‑то последовательность битов, отражающую ее содержание.
Шаг 2. Создать отпечаток для искомой картинки и сравнить его с теми, что уже лежат в нашей базе.
Вуаля! А дьявол, как водится, обитает уже в деталях.
Делай раз: создаем отпечаток
Здравый смысл подсказывает, что отпечаток не должен быть слишком длинным — чем короче, тем лучше. Его надо ведь хранить в самой базе, а потом еще и сравнивать с остальными. Если он будет размером с само изображение, и то, и другое станет делать затруднительно.
Значим, нам нужна какая‑то хэш‑функция, которая свернет содержимое рисунка в короткую строку битов.
Традиционные хэш‑функции вроде cемейства sha разумеется, отпадают. Они слишком чувствительны — даже если двоичное содержимое двух картинок различается всего на один бит, посчитанные хэши вообще не будут иметь ничего общего (хотя, как ни странно, именно sha1 используется в движке Википедии. Могли бы выдумать и получше).
О криптографических хэшах речи тем более нет. Они точно так же нервно реагируют на лишний бит, только при этом и считать их еще гораздо напряжнее.
Нам же нужно нечто, что для похожих картинок давало бы похожие хэши, да чтобы при этом еще похожесть была с точки зрения человека, а не машины. Не битовые карты были друг на друга похожи, а сама картинка. Тут стул — и там стул, тут солнце — и там оно.
И такие хэши действительно придуманы. Можно, например, с помощью методов машинного обучения распознать, что у нас нарисовано, — допустим, собачка, распознать, какой именно породы, какой расцветки и в какой позе она стоит, и потом закодировать в хэше эти признаки.
Но нам такие изыски точно ни к чему, мы обойдемся кое‑чем попроще. Нам ведь не надо классифицировать нарисованное, нам надо просто найти дубликаты.
Поэтому у нас методика будет такая: изображение обесцвечивается, то есть переводится в 50 64 оттенка серого и сильно уменьшается. Первая операция делает похожими картинки, различающиеся лишь цветами, вторая сильно сокращает объем информации для обработки и убирает второстепенные детали. Затем по получившейся картинке считается хэш.
Можно, например, посчитать средний цвет по всему изображению и выставить для каждого пиксела значение 0 или 1 — темнее или светлее он среднего. Это быстро и легко, но результаты получаются довольно посредственные.
Гораздо лучше использовать дискретное косинусное преобразование, получив в результате так называемый перцептивный хэш (perceptual hash, phash). Можно даже не писать алгоритм самому, phash уже включен в самую популярную библиотеку обработки изображений — ImageMagick.
Другой вариант — разностный хэш (difference hash, dhash). Он дает результаты чуть хуже, чем перцептивный, однако же вполне приемлемые, а считается при этом проще и быстрее. Идея та же самая, но при этом в битах кодируется разница соседних пикселей — положительная она или отрицательная.
Можно, разумеется, выдумать что‑нибудь еще в том же духе, но надо ли?
Делай два: сравниваем хэши
Это совсем легко. Говоря умными словами, используем расстояние Хэмминга, а выражаясь по-простому, считаем, сколько битов в двух хэшах различаются.
Если, к примеру, вы используете MySQL или ее младшую сестру Марию, то это можно сделать с помощью встроенной функции:
SELECT * FROM images WHERE BIT_COUNT(newMem ^ hash) <= 6
newMem тут — dhash (или phash) новой картинки, дубли которой мы хотим найти, hash — соответственно хэш картинки, уже лежащей в базе. Крышка символизирует побитовый XOR, а число 6 получено опытным путем.
Вот для наглядности пример исходной картинки.
Идиллическая сцена на пляже ДжеметеА вот различные ее искажения и извращения, с посчитанными для них расстояниями Хэмминга (расстояния приведены для исходных картинок размером 3000х2000, для размещения на сайте я их ужал):
Уменьшаем яркость — 1Убираем все цвета — 1Делаем цвета кислотными — 0Немного обрезаем правый край — 6Слегка подрезаем со всех сторон — 1Добавляем надпись — 2Подкручиваем резкость — 1Делаем зеркало — 37Как видите, хэш (в данном случае — dhash) отлично справляется с небольшими изменениями в исходном изображении — такими, которые берутся от легкого редактирования, конечно, а не от сознательных попыток обмануть алгоритм. Не потянул он только зеркальное переворачивание изображения, но ведь нам никто не мешает взять картинку, вызывающую сомнение, отзеркалить ее и прогнать по базе еще раз.
Если на вашем сайте собираются пользователи, размещающие на нем свои любовно собранные фотографии старых трамваев с бугелями, русских печек, спасательных лодок на пляже, выращенных собственноручно лимонных деревьев и тому подобные захватывающие вещи, — то есть, серьезные, солидные люди, а не подростки, из больного тщеславия возжелавшие сломать систему, то большего, чем dhash, вам и не требуется.
Делай два: сравниваем хэши по-настоящему
Очевидно, что запрос SQL, показанный выше, приведен тут чисто для блезиру. Если вам надо сравнить сто хэшей, он годится, но уже на тысяче, пожалуй, задумается. Почему — понятно: он сравнивает тестовый хэш со всеми остальными по очереди и из‑за вызова функции не может использовать индексы базы.
Положение усугубляется еще и тем, что алгоритм вычисления хэшей слегка недетерминированный и даже для одинаковых картинок может давать чуть различающиеся результаты — всего на один‑два бита, но и этого достаточно, чтобы даже поиск совершенно одинаковых картинок нельзя было провести с помощью простого запроса на равенство.
Да и с индексами тоже все непонятно — нам нужен такой, чтобы показывал расстояние Хэмминга от… От чего? То‑то и оно. Очевидно, тут нужно что‑то хитрое.
Такие индексы, вернее, деревья, в природе существуют. Например, есть такая экзотика, как vp‑tree (vantage point tree), что можно художественно перевести как «дерево с точками удобного наблюдения за другими точками». Понять его принцип несложно — это обычное двоичное дерево, только точки в нем группируются по удалению друг от друга. Не так радостно с построением дерева и поиском по нему — с первого раза врубиться в алгоритм нелегко, но это не самая большая проблема. Куда хуже, что такое дерево строится один раз и при добавлении новых точек или удалении старых его приходится перестраивать чуть ли не целиком. Это означает, что для использования на сайте, где постоянно добавляется новый материал и нередко удаляется старый, оно не очень подходит.
А как с этим справляется Гугл? О, Гугл, а вернее, работавший на него Мозес Чарикар (Moses Charikar), придумал весьма изящную вещь под названием Simhash, которая куда проще запутанных пространственных деревьев. Вот смотрите:
Допустим для конкретики, что наш хэш состоит из 64 битов. Разобьем их на 8 байтов.
Мы хотим найти хэши, отстоящие на расстояние не более 6 битов от проверяемого. Но это означает, что даже если все 6 отличающихся битов находятся в разных байтах хэша, то все равно, как ни крути, какие‑то два байта будут в обоих хэшах полностью совпадать.
Вот они — два совпадающих байтаА это значит, что мы можем заранее отобрать из базы те хэши, которые совпадают с нашим проверяемым в каких-то двух байтах, и высчитать расстояние только для них. Это прилично сокращает объем работ — раз в 200-300.
Как же это сделать?
Согласно оригинальной идее, нужно завести для хэшей дополнительные таблицы, число которых будет равно числу возможных сочетаний двух байтов из восьми, в нашем случае = 28. В каждой таблице хранятся одни и те же хэши, но с переставленными байтами. В основной в первом и втором байте — первый и второй байт хэша, в первой дополнительной — первый и третий, во второй — первый и четвертый, и так далее, пока мы не переберем все комбинации. Вот, на случай, если вам лень их считать самим.
{1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 8}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}, {2, 8}, {3, 4}, {3, 5}, {3, 6}, {3, 7}, {3, 8}, {4, 5}, {4, 6}, {4, 7}, {4, 8}, {5, 6}, {5, 7}, {5, 8}, {6, 7}, {6, 8}, {7, 8}
А теперь мы отсортируем эти таблицы по первым двум байтам и сможем воспользоваться двоичным поиском, отобрав с его помощью кандидатов на последующее сравнение!
Впрочем, в этом месте мы можем уклониться от совета уважаемого автора. hash) <= 6
Запрос для человека, конечно, длинноват, но база смотрит на него по‑другому, и оптимизировать его ей не сложно, задействовав индексы по полям b1…b8.
Сочетания 2 по 8, разумеется, не написаны на скрижалях, это всего лишь один из вариантов, хотя и практически удобный. В зависимости от предполагаемого числа хранящихся изображений и расстояния Хэмминга, на котором мы хотим искать, можно разбить хэш на другое количество частей, не обязательно даже одинаковой длины.
Немного практических цифр. На моей старенькой, отпраздновавшей уже десятилетие машине, создание разностного хэша в nodejs занимает примерно полторы секунды, из которых секунда уходит на уменьшение изображения с помощью ImageMagick.
Поиск одного хэша по базе в 30.000 фотографий (больше котиков и фигуристых девушек у меня не нашлось) требует примерно двух секунд, из которых секунда уходит опять же на уменьшение исходного изображения. Это без индексов — я поленился для прототипа их создавать — так что задел для масштабирования поиска имеется. Хватит ли его на миллион‑другой фотографий — вопрос открытый. Если у вас есть столько разных фоточек, было бы интересно узнать ваши впечатления.
Ну и напоследок еще один вопрос. Что делать, если мы хотим найти более удаленные в смысле Хэмминга фотографии — различающиеся не на 6 битов, а на 20 или 30? Отвечаю: это уже совсем иная задача — если по‑английски, то не near‑duplicate search, а similarity detection, и совсем другая история, для которой описанные методы не подходят и надо придумывать что‑то еще.
Картинки с самокатами, которыми сложно удивить
Каждый год наше сообщество пополняется новыми участниками. В порыве душевного подъёма новички часто решают поделиться найденными в сети забавными фотографиями с самокатами, чем вызывают недовольство более опытных самокатчиков. Собрали самые популярные картинки с самокатами.
Необычные самокатчики
Стремительная бабушка на самокате лишь подтверждает мнение, что самокат подходит для людей любого возраста. По распространённому мнению – она спешит на помощь внуку, попавшему в беду.
Некоторых домашних любимцев хозяева весьма удачно приучают к самокату. У собак получается неплохо, причём независимо от размера.
Это самокатчика на просторах интернета окрестили «призрачным гонщиком». Хотроды на фоне намекают, что парень знает что делает, извлекая огонь из своего самоката. Хорошая иллюстрация прочности американских самокатов.
Необычные самокаты
На самом деле – это бранчборд, самокат из коряги. На фото самый первый прототип 2011 года, названный TheORIGIN.
Забавные «гибриды» от любителей мастерить в гараже нередко вызывают удивление тех, кто только только начинает интересоваться самокатами.
На этих фотографиях начала XX века мотосамокат марки «Autoped». Слева – команда американских почтальонов, а справа – Леди Флоренс Норман, участница английского движения за равноправие женщин.
Fliz bike, смелый концепт немецких дизайнеров Тома Хомброка и Юри Спеттера, провоцирует вопросы не только у велосипедистов, но и у самокатчиков. Получится футбайк наоборот.
Деревянные скутеры с Филиппин также не остаются без внимания. Жители региона Банаю используют их в качестве транспорта, а также проводят семикилометровую гонку по спускам вдоль рисовых полей.
Lopifit – это гибрид электровелосипеда и беговой дорожки. Так заявляет производитель, хотя от футбайка тут гораздо больше. Электромотор может поддерживать скорость до 25 км/ч. и позволяет «пройти» на одной зарядке 55 километров. Вес Lopifit составляет 55 килограммов, а цена – 1900 евро.
Знаменитости
Актёр Хью Джекман – большой любитель самокатов и обладатель целой коллекции. В сети вы найдёте множество его фотографий на самых разных самокатах, в том числе и семейные прогулки. Да-да, «Росомаха на самокате».
Питер Динклэйдж, исполнитель роли Тириона Ланнистера в сериале «Игра престолов», не раз был замечен на своём Micro. Одна из картинок породила огромное количество забавных коллажей.
← Вернуться к теме
Поддержите Let’s Kick!
Вы можете поддержать Let’s Kick через сервис Boosty, оформив один трёх вариантов ежемесячной подписки или сделав единовременное пожертвование.
Пожертвование также можно сделать с помощью сервиса YooMoney. Полученные средства мы используем для поддержания работы сайта и развития сообщества. В качестве благодарности мы подарим вам Самокарту, если у вас её ещё нет. Просто оставьте ваше e-mail в комментарии к переводу и получите карту на заезде Let’s Kick.
база, Стоковые Фотографии и Роялти-Фри Изображения база
, Стоковые Фотографии и Роялти-Фри Изображения база | Depositphotos Изображения ВидеоРедакцииМузыка и звуковые эффекты Инструменты ПредприятиеЦены ФотоВойтиРегистрация
Векторы baseTop Collection baseeverest
базовый лагерь эвереста
Эверест
Эверест
Гималаи
Эверест
марс
астронавт
база данных
будущее
туристическое снаряжение
цифровой маркетинг
привлекательный бейсболистконцепция кибербезопасности
инвестирование
прыжок
900 441-100 из 38 687
БейсджампингОснова размазывает диапазон цветов на белом фонеТон текстуры основы изолированы на белом фонеКрупный план бейсбольной биты, перчатки и мяча, лежащих на зеленом полеВид бейсбольного алмаза в сумерках. Бейсджампинг с гор в ИталииПрессованная пудра и кисточка для макияжа на белом фоне с разбросанным FoundationRadio Relay Link, Mobile Base Station. Мазки разных цветов сделаны различными косметическими продуктами, изолированными на белом фоне. Текстура разноцветных штрихов различной косметики для макияжа на белом фонеТолько векторные изображения пудра и кисточка для макияжа на белом фонеБежевая жидкая основа макияжа изолирована на белом фоне.0008 Проверьте в Топ-Коллекции
Бесплатно
Макияж базовая краска на фонеДва косметических мазка макияжа. Размазывает образцы цвета жидкой основы. Совершенство кожи. Концепция красоты, косметологии и макияжа. Шаблон дизайна, плакат для рекламы. Изолированные на белом фоне. Copy spaceПопробуйте разные ключевые слова
everest Сломанная и прессованная пудра для лица с кистью на белом фоне. Макияж базовой краски на фоне. Набор различных оттенков основы на белом фоне, вид сверху. Косметическая жидкая основа на белом.0008 Free Liquid Foundation Smudge On White Background.Make up Foundation smudge white isolated backgroundПятна пудры на белом фонеМягкие бежевые штрихи и текстура маркера для лица или акриловой краски на белом фонеОбразцы цвета основы на белом фонеПопробуйте разные ключевые слова
everest base лагерь Плюшевая кисть для макияжа на белом фоне с разбросанной пудрой для лицаМягко бежевые штрихи и текстура маркера для лица или акриловой краской на белом фонеЖидкий фон для макияжаОснова размазывает диапазон цветов на белом фонеРассеянный порошок и контурный продукт на белом фонеЖидкие штрихи для основы на белом фонеСделать базовая краска на фоне Контурная палитра с кистями для макияжа на белом фонеЗеленый цвет, исправляющий консилер, размазывает пятно, изолированное на белом фоне.Попробуйте разные ключевые слова
Эверест Рамка из кистей для макияжа с пудрой на белом фоне Косметическая жидкая основа, консилер или увлажняющий крем, изолированные на белом фоне Оттенки основы на белом фоне. Крупный план различных тонов жидкой основы, текстуры продукта для макияжа. Высокое качествоОттенки фонда на белом фоне. Крупный план различных тонов жидкой основы, текстуры продукта для макияжа. Высокое качествоКисть и бежевая пудра для лица на белом фонеОбразец жидкого тонального крема на белом фоне, вид сверхуМазки жидкого тонального крема на белом фонеШтрихи бежевого и кремового тонального крема на белом Пятна жидкого тонального крема на белом фонеОбразец цвета основы на белом фонеПопробуйте разные ключевые слова
mt everest Разбросанная пудра с кистью на белом фонеБежевый мазок кремовой основы на белом фоне. Концепция индустрии моды и красоты. — ИзображениеМасок базового тонального крема на белом фонеСмазанный жидкий тональный крем, изолированный на беломКонтурная палитра с кистью на белом фонеМакияж пятно тонального крема белый изолированный фонЖидкие пятна тонального крема, изолированные на белом фонеНабор кистей в ряд на белом фоне с разбросанной пудрой для лицаОснова для макияжа косметикаБежевый жидкий тональный макияж изолированные на белом фоне.Попробуйте разные ключевые слова
Гималаи Рамка из кистей для макияжа на белом фоне с разбросанной пудрой. Образцы крема на белом фоне. Образцы тонального крема для лица, текстура консилера для лица. Мазки макияжа, косметика, палитра цветов основы. Макет. Мазки основы и кисти для макияжа на белом фоне Тон текстуры основы Мазки жидкой основы изолированы на белом фоне Линия разбросанной пудры и кисти для макияжа на белом фоне Пятна жидкой основы, мазки и штрихи в виде текстур макияжа изолированы на белом фоне, набор красоты и косметики Образцы основы различных оттенки на белом фоне. Место для текстаПопробуйте разные ключевые слова
гора Эверест Косметическая кисть с бежевой и кремовой основой для макияжа, изолированных на белом Мазок краски косметических продуктов на белом фоне Образец крема для лица, изолированных на белом фонеСлоновая кость косметический крем салфетки, изолированные на белом. Косметический мазок текстуры лосьона по уходу за кожей. Крем для рук с коллагеном. Увлажняющий продукт для ухода за кожей красоты. Сломанные кусочки пудры для лица и кисти для макияжа на белом фоне Образец крема для лица изолирован на белом Макияж базовая краска на фоне Бейсболист достигает базы во время игры на кортеБесплатно
Образцы тонального крема, изолированные на белом Жидкая бежевая основа для макияжа на белом фоне РазмазанныйСледующая страница лагерь
базовый лагерь
гора эверест
гора эверест
гималаи
гора эверест
марс
астронавт
база данных
будущее
туристическое снаряжение
цифровой маркетинг
привлекательный бейсболист
концепция кибербезопасности
инвестирование
прыжок
900 44Похожие поиски изображений
- лагеря на Эвересте,
- горная палатка,
- миграция базы данных
Исключить визуализацию
ЛюдиЛюбой пол
Любой возраст
Любая этническая принадлежность
Без лица
Точка ВидУгол камеры
Дата добавленияВ любое время
УчастникВведите имя
Редакционный ЦветНовый
Происхождение и местоположение Сезон, время суток Исключить ключевые словаВы используете устаревший браузер. Чтобы работать в Интернете быстрее и безопаснее, бесплатно обновитесь сегодня.
фотографий военных баз и премиальных изображений в высоком разрешении
- Изображения
Креатив
Редакционные
Видео
Креативный
Редакционный
- ТВОРЧЕСКИЙ
- РЕДАКЦИОННЫЙ
- ВИДЕО
Лучшее соответствие
Новые
Самые старые
Самые популярные
ДИАПАЗОН ДАТЛюбая датаПоследние 24 часаПоследние 48 часовПоследние 72 часаПоследние 7 днейПоследние 30 днейПоследние 12 месяцаПользовательский диапазон дат
ТИП ЛИЦЕНЗИИ Безвозмездная Управляемая правамиРФ и РМ
ОРИЕНТАЦИЯРАЗРЕШЕНИЕ ИЗОБРАЖЕНИЯ ЛЮДИЧИСЛО ЧЕЛОВЕК СОСТАВ ЭТНИЧЕСКАЯ ПРИНАДЛЕЖНОСТЬСТИЛЬ ИЗОБРАЖЕНИЯФОТОГРАФЫСБОРНИКИ- 9013 3
военный городок
военные
военно-воздушные силы
военный лагерь
военная база форт худ
значок военной базы
жилая военная база
военная база воздушная
военная база пустыня
удаленная военная база
- 90 254 военная база вектор
военная база дом
вид с воздуха военная база
Фон военной базы
Вход на военную базу
Ариал военной базы
военная база дрон
США военная база
военная база лагерь
военная база рабочая
военная база афганистан
здания военной базы
9 0046ворота военной базы
военная база семья
военная база Иллюстрация
военная база вид сверху
военная база в Калифорнии
военная база в китае
военная база в великобритании