Имя: Пароль:
IT
 
как в SQL сделать поиск "по похожести"?
0 vde69
 
03.01.20
14:49
есть некая фотка нужно найти старые записи в базе данных по ней (даже если она редактировалась),

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

что-то не соображу как на таком примере мне организовать таблицу в базе для того, что-бы потом запросом искать (делать много колонок для этого короткого ключа не хочется, так как будут ключи 9, 16, 25, 36, 49, 56, 81, 100 байтные, может что-то поменяю, но пока планируется такой вариант)
1 Волшебник
 
модератор
03.01.20
14:51
SQL умеет только LIKE, больше он ничего не умеет.

Значит нужно иметь столько колонок, сколько потребуется. Для каждой длины ключа своя колонка.
2 zladenuw
 
03.01.20
14:53
а если 2 колонки. Ключ и ДлинаКлюча ? не ?
3 Волшебник
 
модератор
03.01.20
14:54
(2) Тогда это будет отдельная таблица - поисковый индекс
4 Garykom
 
гуру
03.01.20
14:55
(0) Только различные варианты хеширования
5 tty12
 
03.01.20
14:57
А чем хеширование то не катит?
6 vde69
 
03.01.20
14:57
(2) в прицепе это подходит, только будет
ID, key, weight

чем длинее ключ тем больше значение веса
7 vde69
 
03.01.20
14:59
(5) простой хеш обломается после первой перезаписи файла,

я сначала думал в сторону построения дерева индекса, но вариант (2) наверно подойдет
8 Garykom
 
гуру
03.01.20
14:59
(4)+ simhash лучше всего
https://habr.com/ru/company/superjob/blog/325014/
Все сведется к бинарным строкам, надо будет банально посчитать бинстроку текущего изображения и поискать в sql с минимальным числом битов отличия
9 zladenuw
 
03.01.20
15:00
(7) а почему обломается ? разве после изменения. он не будет другой ?
10 tty12
 
03.01.20
15:01
(7) Эм... CRC? Так помоему называется.
11 rphosts
 
03.01.20
15:02
(0) дял частого поиска длинной строки среди множества строки придумали хэш-функцию, возвращающую короткий код. Поиск производится в 4 этапа:
1.Подготовительный: для каждой строки в базе рассчитывается хэш-код и строится по ним индекс.
2.Для строки поиска рассчитывается хэш-код.
3.Ищется строки с таким-же хэш-кодом.
4.Среди найденого на шаге 3 производится точное сравнение
12 tty12
 
03.01.20
15:02
(7) Рабочий вариант на мой взгляд.
13 vde69
 
03.01.20
15:03
(9) читаем (0)

>>>>есть некая фотка нужно найти старые записи в базе данных по ней (даже если она редактировалась)

то есть хеш разный, фотку не нашли
14 rphosts
 
03.01.20
15:04
(13) >даже если она редактировалась
тут 100% найти без потерь и ложных срабатываний не поможет и ИИ
15 zladenuw
 
03.01.20
15:04
(13) Я думал ты хранишь все версии в бд. а раз только некоторые экземпляры. то не взлетит.
16 Волшебник
 
модератор
03.01.20
15:04
(13) Все отсканированные документы будут похожи друг на друга.
17 Garykom
 
гуру
03.01.20
15:09
(13) Дык любой https://ru.wikipedia.org/wiki/Locality-sensitive_hashing юзаем и ищем очень похожие фотки.
Понятное дело если редактировалась сильно то там уже нихрена не найти
18 vde69
 
03.01.20
15:23
я склоняюсь что-то в таком духе https://habr.com/ru/post/55926/
19 vde69
 
03.01.20
15:26
и кстати я придумал как побороться с поворотами, надо изначально повернуть изображение под определенное правило (например левый нижний угол самый темный из всех углов) а потом вычислять хеш
20 Волшебник
 
модератор
03.01.20
15:28
(18) Прелестно
21 rphosts
 
03.01.20
15:33
(19) 2 картинки, вторая - первая чуть повёрнутая... есть вполне хорошие шансы не попасть.
22 RomanYS
 
03.01.20
15:34
(18) основное "домашнее" редактирование это кадрирование - и тут не прокатит
23 Garykom
 
гуру
03.01.20
15:40
(22) Если для хэша брать только центральный квадратик? Но как позиционировать сдвижку если кадрируют неровно
24 vde69
 
03.01.20
15:42
(22) основное домашнее редактирование
поворот, красные глаза, контрастность, цветность

кадрирование редко делают
25 Волшебник
 
модератор
03.01.20
15:42
(24) кадрирование делают в первую очередь
26 Garykom
 
гуру
03.01.20
15:52
(24) Знаешь тонкость про метки девайса в каждом снимке?
Возможно там не только id устройства зашивается но и дата время и название файла, надо бы поразбираться с этим.
Тогда останется только выделить их и использовать в качестве хэша-идентификатора.
27 vde69
 
03.01.20
15:55
(26) не надежно... например на сканах старого альбома какие метки будут?
28 Garykom
 
гуру
03.01.20
15:55
(27) Думаешь сканер метки не добавляет? Хаха.
29 vde69
 
03.01.20
23:44
сделал пилотный вариант (на основе 18, но доработал под поворот и последующий md5 хеш), по первым тестам примерно 30...50% задвоено, что где-то наверно близко, по сколько обычно делается несколько фото подряд.

правда медлено работает... примерно 200 файлов за 5 минут...
30 Маргарин
 
04.01.20
01:42
(0) Что-то не очень хороший вариант. Изменят яркость или экспозицию картинки хотя бы на 1% в любую сторону, и твой ключ перестанет работать.
31 Маргарин
 
04.01.20
01:47
Лучше сделай как в гугл-фото. Там определяется что изображено на фотографии, и ищется по этим наборам признаков. Например если на искомом фото человек сидит на скамейке и сзади проезжает автобус, то через поиск будут найдены все похожие фотографии где тоже сидит человек на скамейке и есть автобус.