Libpuzzle Индексация миллионов картинок?

речь идет о libpuzzle libray для php ( http://libpuzzle.pureftpd.org/project/libpuzzle) от Mr. Frank Denis. Я пытаюсь понять, как индексировать и хранить данные в моей базе данных mysql. Генерация вектора абсолютно не проблема.

Пример:

# Compute signatures for two images
$cvec1 = puzzle_fill_cvec_from_file('img1.jpg');
$cvec2 = puzzle_fill_cvec_from_file('img2.jpg');

# Compute the distance between both signatures
$d = puzzle_vector_normalized_distance($cvec1, $cvec2);

# Are pictures similar?
if ($d < PUZZLE_CVEC_SIMILARITY_LOWER_THRESHOLD) {
  echo "Pictures are looking similar\n";
} else {
  echo "Pictures are different, distance=$d\n";
}

Мне все ясно, но как мне теперь работать, когда у меня большое количество картинок >1.000.000? Я вычисляю вектор и сохраняю его с именем файла в базе данных? Как теперь найти похожие картинки? Если я сохраняю каждый вектор в mysql, мне нужно открыть каждую запись и вычислить расстояние с помощью функции Puzzle_vector_normalized_distance.Эта процедура занимает много времени (откройте каждую запись в базе данных - поместите ее, чтобы вызвать функцию,...)

Я прочитал файл readme из библиотеки головоломок libaray и обнаружил следующее:

Будет ли он работать с базой данных, которая имеет миллионы картинок?

Типичная подпись изображения требует всего 182 байта, используя встроенный функции сжатия/распаковки.

В похожих подписях используются одинаковые «слова», т.е. одинаковые последовательности значения на одних и тех же позициях. Используя составные индексы (слово + положение), набор возможных подобных векторов резко уменьшено, и в большинстве случаев никакое векторное расстояние фактически не требует вычислить.

Индексация по словам и позициям также позволяет легко разделить данные в несколько таблиц и серверов.

Так что да, библиотека Puzzle определенно не является несовместимой с проекты, которым необходимо проиндексировать миллионы изображений.

Также я нашел это описание индексации:

---------- ИНДЕКСИРОВАНИЕ ----------- -------------

Как быстро найти похожие картинки, если их миллионы записей?

В оригинальной статье есть простой, но эффективный ответ.

Разрезать вектор на слова фиксированной длины. Например, рассмотрим следующий вектор:

[ a b c d e f g h i j k l m n o p q r s t u v w x y z ]

При длине слова (K), равной 10, вы можете получить следующие слова:

[ a b c d e f g h i j ] найдено в позиции 0 [ b c d e f g h i j k ] найдено в позиции 1 [ c d e f g h i j k l ] найдено в позиции 2 и т.д.до позиции N-1

Затем проиндексируйте свой вектор составным индексом (слово + позиция).

Даже при наличии миллионов изображений K = 10 и N = 100 должно быть достаточно, чтобы имеют очень мало записей, использующих один и тот же индекс.

Вот очень простой пример схемы базы данных:

+-----------------------------+
| signatures |
+-----------------------------+
| sig_id | signature | pic_id |
+--------+-----------+--------+

+--------------------------+
| words |
+--------------------------+
| pos_and_word | fk_sig_id |
+--------------+-----------+

Я бы рекомендовал разбить по крайней мере таблицу "words" на несколько таблицы и/или серверы.

По умолчанию (lambas=9) длина подписи составляет 544 байта. Чтобы сэкономить дискового пространства, они могут быть сжаты до 1/3 от исходного размер через функцию Puzzle_compress_cvec(). Перед использованием они должен быть распакован с помощью puzzle_uncompress_cvec().

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

Теперь у меня вопрос: как обрабатывать миллионы изображений и как быстро и эффективно их сравнивать? Я не могу понять, как "вырезание вектора" должно помочь мне с моей проблемой.

Большое спасибо - может быть, я смогу найти здесь кого-нибудь, кто работает с libpuzzle libaray.

Удачи.

22
задан barryhunter 14 March 2012 в 14:44
поделиться